framefields 2.5.3 → 2.5.5

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 (448) hide show
  1. package/dist/audio/index.d.mts +4 -4
  2. package/dist/audio/index.mjs +10 -10
  3. package/dist/{audio-2ew5y0Bl.d.mts → audio-B5mdR8vv.d.mts} +3 -3
  4. package/dist/{audio-2ew5y0Bl.d.mts.map → audio-B5mdR8vv.d.mts.map} +1 -1
  5. package/dist/{audio-DrUskzwZ.mjs → audio-C9euVW4K.mjs} +3 -3
  6. package/dist/{audio-DrUskzwZ.mjs.map → audio-C9euVW4K.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-BPOi5xb_.mjs.map +1 -1
  10. package/dist/{dist-Bf0H4lp1.mjs → dist-BuirkW-f.mjs} +11 -3
  11. package/dist/dist-BuirkW-f.mjs.map +1 -0
  12. package/dist/{dist-DG65RDhc.mjs → dist-DBdxM6xv.mjs} +5 -6
  13. package/dist/dist-DBdxM6xv.mjs.map +1 -0
  14. package/dist/effects/index.d.mts +4 -4
  15. package/dist/effects/index.mjs +35 -35
  16. package/dist/{effects-Z-brb-n7.mjs → effects-B263lgUi.mjs} +2 -2
  17. package/dist/{effects-Z-brb-n7.mjs.map → effects-B263lgUi.mjs.map} +1 -1
  18. package/dist/fonts/index.mjs +2 -2
  19. package/dist/{fonts-DqYgk_1a.mjs → fonts-DNx6ps2p.mjs} +2 -2
  20. package/dist/{fonts-DqYgk_1a.mjs.map → fonts-DNx6ps2p.mjs.map} +1 -1
  21. package/dist/{gpu-CevnCkZC.mjs → gpu-BRBIoxMC.mjs} +2 -2
  22. package/dist/{gpu-CevnCkZC.mjs.map → gpu-BRBIoxMC.mjs.map} +1 -1
  23. package/dist/{index-D1C735Wp.d.mts → index-3Vdef2KE.d.mts} +3 -3
  24. package/dist/{index-D1C735Wp.d.mts.map → index-3Vdef2KE.d.mts.map} +1 -1
  25. package/dist/{index-COQTaniR.d.mts → index-B4o6F1JC.d.mts} +2 -2
  26. package/dist/{index-COQTaniR.d.mts.map → index-B4o6F1JC.d.mts.map} +1 -1
  27. package/dist/{index-KqW22NHL.d.mts → index-BhzlG_1Q.d.mts} +2 -2
  28. package/dist/{index-KqW22NHL.d.mts.map → index-BhzlG_1Q.d.mts.map} +1 -1
  29. package/dist/{index-DSGFMpwL.d.mts → index-D-Gnyffj.d.mts} +4 -4
  30. package/dist/{index-DSGFMpwL.d.mts.map → index-D-Gnyffj.d.mts.map} +1 -1
  31. package/dist/{index-tCKz9Tku.d.mts → index-N1tMc5Z9.d.mts} +54 -54
  32. package/dist/index-N1tMc5Z9.d.mts.map +1 -0
  33. package/dist/{index-CfMylY3O.d.mts → index-o8LxWdwz.d.mts} +3 -3
  34. package/dist/{index-CfMylY3O.d.mts.map → index-o8LxWdwz.d.mts.map} +1 -1
  35. package/dist/{index-CZK6CFLy.d.mts → index-ocZc12ZS.d.mts} +17 -17
  36. package/dist/index-ocZc12ZS.d.mts.map +1 -0
  37. package/dist/index.d.mts +10 -10
  38. package/dist/index.mjs +51 -51
  39. package/dist/preview/index.d.mts +3 -3
  40. package/dist/preview/index.mjs +10 -10
  41. package/dist/{preview-DVw2jLDh.mjs → preview-ChR8Z8Fm.mjs} +2 -2
  42. package/dist/{preview-DVw2jLDh.mjs.map → preview-ChR8Z8Fm.mjs.map} +1 -1
  43. package/dist/preview-engine/audio.mjs +1 -1
  44. package/dist/preview-engine/{chunk-MCFYUKAJ.mjs → chunk-2LQCQ3OT.mjs} +8 -8
  45. package/dist/preview-engine/{chunk-PR37RCNO.mjs → chunk-2TCJSHFA.mjs} +1 -1
  46. package/dist/preview-engine/{chunk-JMOJKT5W.mjs → chunk-2YGR5YCN.mjs} +1 -1
  47. package/dist/preview-engine/{chunk-LNJYHSYX.mjs → chunk-3KHD67Q3.mjs} +1 -1
  48. package/dist/preview-engine/chunk-3SR6BI4B.mjs +1 -0
  49. package/dist/preview-engine/{chunk-NXKXOSE6.mjs → chunk-4INGTMZ5.mjs} +1 -1
  50. package/dist/preview-engine/{chunk-T4VP45AP.mjs → chunk-4JX5LBE2.mjs} +1 -1
  51. package/dist/preview-engine/{chunk-7JYMNGNK.mjs → chunk-5NT7WWJR.mjs} +1 -1
  52. package/dist/preview-engine/{chunk-NB55FW7D.mjs → chunk-6PMATELR.mjs} +1 -1
  53. package/dist/preview-engine/{chunk-45XGWIOY.mjs → chunk-AKT4YQWL.mjs} +1 -1
  54. package/dist/preview-engine/{chunk-RNFYEZLL.mjs → chunk-ALSOO22Q.mjs} +1 -1
  55. package/dist/preview-engine/{chunk-3AYICEZ5.mjs → chunk-B7J72YSP.mjs} +1 -1
  56. package/dist/preview-engine/{chunk-I3ZTDIVM.mjs → chunk-BBHRXV75.mjs} +1 -1
  57. package/dist/preview-engine/{chunk-NHQR76WL.mjs → chunk-DDFWN7DI.mjs} +1 -1
  58. package/dist/preview-engine/{chunk-ZVUTFXDR.mjs → chunk-DOCFOSA6.mjs} +1 -1
  59. package/dist/preview-engine/{chunk-YJ24W73B.mjs → chunk-FZLKPBKS.mjs} +1 -1
  60. package/dist/preview-engine/{chunk-EU7CFSB5.mjs → chunk-GQIRV466.mjs} +1 -1
  61. package/dist/preview-engine/{chunk-DWHQSNSJ.mjs → chunk-IIOHF7MH.mjs} +1 -1
  62. package/dist/preview-engine/{chunk-WUMVCQYI.mjs → chunk-J24VHZS6.mjs} +1 -1
  63. package/dist/preview-engine/{chunk-2WOCQNZX.mjs → chunk-JD4TBC6Z.mjs} +8 -8
  64. package/dist/preview-engine/{chunk-X6BJLPW6.mjs → chunk-JTT3YX7W.mjs} +1 -1
  65. package/dist/preview-engine/{chunk-XJ4CQIZZ.mjs → chunk-KWTTANYN.mjs} +1 -1
  66. package/dist/preview-engine/{chunk-QCUGWPYP.mjs → chunk-LN3YAWUD.mjs} +1 -1
  67. package/dist/preview-engine/{chunk-M6ZKK6ZU.mjs → chunk-LYSU6S4O.mjs} +1 -1
  68. package/dist/preview-engine/{chunk-TE2QAKKF.mjs → chunk-MJCK5FLZ.mjs} +1 -1
  69. package/dist/preview-engine/{chunk-24H3QVYB.mjs → chunk-MMVFX42U.mjs} +1 -1
  70. package/dist/preview-engine/{chunk-25T3M6MI.mjs → chunk-MUOJMF7M.mjs} +1 -1
  71. package/dist/preview-engine/{chunk-B555EGEU.mjs → chunk-NQZRPPUU.mjs} +1 -1
  72. package/dist/preview-engine/{chunk-VTE3IISK.mjs → chunk-OXXRKNHW.mjs} +1 -1
  73. package/dist/preview-engine/{chunk-DUEY7AXY.mjs → chunk-PJMX2GFY.mjs} +1 -1
  74. package/dist/preview-engine/{chunk-MA4YVA2E.mjs → chunk-Q7JN4EHX.mjs} +1 -1
  75. package/dist/preview-engine/{chunk-YSXMXD3F.mjs → chunk-Q7XC3FI7.mjs} +1 -1
  76. package/dist/preview-engine/{chunk-UXCTWFKK.mjs → chunk-QPBTLJ5W.mjs} +1 -1
  77. package/dist/preview-engine/{chunk-LQVACZDE.mjs → chunk-QRYCB6E3.mjs} +1 -1
  78. package/dist/preview-engine/{chunk-2QQQTZHS.mjs → chunk-RDEQ4LQU.mjs} +1 -1
  79. package/dist/preview-engine/{chunk-KKBJ7X3T.mjs → chunk-RF62TV3G.mjs} +1 -1
  80. package/dist/preview-engine/{chunk-CE6CG5BH.mjs → chunk-RHXZXWJ4.mjs} +1 -1
  81. package/dist/preview-engine/{chunk-BNO5JAEZ.mjs → chunk-RKNV5N7D.mjs} +1 -1
  82. package/dist/preview-engine/{chunk-PXWCGXTF.mjs → chunk-SP22JWN2.mjs} +1 -1
  83. package/dist/preview-engine/{chunk-NYEDWUFS.mjs → chunk-SQ52PBF3.mjs} +1 -1
  84. package/dist/preview-engine/{chunk-QYIKOOFI.mjs → chunk-SVE3XWO7.mjs} +1 -1
  85. package/dist/preview-engine/{chunk-QJYAIQYU.mjs → chunk-SXNCNG4L.mjs} +1 -1
  86. package/dist/preview-engine/{chunk-VH5V54RA.mjs → chunk-TPFDAOW7.mjs} +1 -1
  87. package/dist/preview-engine/{chunk-ENS4KUJV.mjs → chunk-UEQIO6AH.mjs} +1 -1
  88. package/dist/preview-engine/{chunk-XYRBFLFF.mjs → chunk-ULPLHKM2.mjs} +1 -1
  89. package/dist/preview-engine/{chunk-MCR7XMNQ.mjs → chunk-ULVX4VYT.mjs} +1 -1
  90. package/dist/preview-engine/{chunk-ZAIVXGSS.mjs → chunk-UQD2UE6I.mjs} +1 -1
  91. package/dist/preview-engine/{chunk-QP24X77K.mjs → chunk-VY6ST4QX.mjs} +1 -1
  92. package/dist/preview-engine/{chunk-7BUKVFWB.mjs → chunk-W2EZFV4Q.mjs} +1 -1
  93. package/dist/preview-engine/{chunk-P734GD7D.mjs → chunk-WDWHOXSA.mjs} +1 -1
  94. package/dist/preview-engine/{chunk-2RZ6S4SW.mjs → chunk-YEPYVASB.mjs} +1 -1
  95. package/dist/preview-engine/{chunk-5FTCPTOX.mjs → chunk-ZJLNXN7W.mjs} +8 -8
  96. package/dist/preview-engine/{chunk-FAEWI3LF.mjs → chunk-ZZAZF6VC.mjs} +1 -1
  97. package/dist/preview-engine/components.mjs +1 -1
  98. package/dist/preview-engine/effects.mjs +1 -1
  99. package/dist/preview-engine/fonts.mjs +1 -1
  100. package/dist/preview-engine/framefields.mjs +1 -1
  101. package/dist/preview-engine/player.mjs +1 -1
  102. package/dist/preview-engine/renderers-4CRXZJ5G.mjs +1 -0
  103. package/dist/preview-engine/{renderers-WPBTAU2E.mjs → renderers-4RVSLTCX.mjs} +1 -1
  104. package/dist/preview-engine/{renderers-W5CTR4B5.mjs → renderers-56TGEFDK.mjs} +1 -1
  105. package/dist/preview-engine/renderers-5QF4OLFQ.mjs +1 -0
  106. package/dist/preview-engine/renderers-5SOW6OVE.mjs +1 -0
  107. package/dist/preview-engine/renderers-6M2HPY2J.mjs +1 -0
  108. package/dist/preview-engine/{renderers-DZZFIYYA.mjs → renderers-7GMW52G3.mjs} +1 -1
  109. package/dist/preview-engine/renderers-7HT5NW7W.mjs +1 -0
  110. package/dist/preview-engine/{renderers-KV3TTCO6.mjs → renderers-7SW2AHM2.mjs} +1 -1
  111. package/dist/preview-engine/{renderers-BNXTSIXJ.mjs → renderers-ART3EGSZ.mjs} +1 -1
  112. package/dist/preview-engine/{renderers-6NFRKHNO.mjs → renderers-ATTGUTYY.mjs} +1 -1
  113. package/dist/preview-engine/renderers-AYWCRBQC.mjs +1 -0
  114. package/dist/preview-engine/renderers-BA6ZCPI5.mjs +1 -0
  115. package/dist/preview-engine/{renderers-AKZAAGR7.mjs → renderers-BAS7RXTC.mjs} +1 -1
  116. package/dist/preview-engine/{renderers-CLLR5MOQ.mjs → renderers-BWRNCXR6.mjs} +1 -1
  117. package/dist/preview-engine/{renderers-N7T34SCI.mjs → renderers-C3YXNKNM.mjs} +1 -1
  118. package/dist/preview-engine/renderers-CZTCW4FC.mjs +1 -0
  119. package/dist/preview-engine/{renderers-C7SJ3M6S.mjs → renderers-D2XEQ2YY.mjs} +1 -1
  120. package/dist/preview-engine/renderers-DFIJYBW2.mjs +1 -0
  121. package/dist/preview-engine/{renderers-DHKB5LI6.mjs → renderers-EJGF3PYQ.mjs} +1 -1
  122. package/dist/preview-engine/renderers-EJN6M6DO.mjs +1 -0
  123. package/dist/preview-engine/{renderers-MKEXNBCW.mjs → renderers-EK3HQUUF.mjs} +1 -1
  124. package/dist/preview-engine/{renderers-O56IOD7J.mjs → renderers-EQDINUMT.mjs} +1 -1
  125. package/dist/preview-engine/{renderers-VYK2BJID.mjs → renderers-FC7G7KU7.mjs} +1 -1
  126. package/dist/preview-engine/{renderers-BQLYS4TM.mjs → renderers-FD3ZT73R.mjs} +1 -1
  127. package/dist/preview-engine/{renderers-TASYN62K.mjs → renderers-FYI6QNUH.mjs} +1 -1
  128. package/dist/preview-engine/renderers-G34C5J27.mjs +1 -0
  129. package/dist/preview-engine/{renderers-ROSSJ7Y2.mjs → renderers-GHP7SL5M.mjs} +1 -1
  130. package/dist/preview-engine/renderers-GKVTNDVH.mjs +1 -0
  131. package/dist/preview-engine/{renderers-MPCYLXXU.mjs → renderers-GY4R467B.mjs} +1 -1
  132. package/dist/preview-engine/{renderers-TAMDNTEQ.mjs → renderers-H2UI7YEO.mjs} +1 -1
  133. package/dist/preview-engine/{renderers-6PVGRTXV.mjs → renderers-HBIBRZD7.mjs} +1 -1
  134. package/dist/preview-engine/{renderers-GF77N2KM.mjs → renderers-HMNCIEU3.mjs} +1 -1
  135. package/dist/preview-engine/{renderers-SIBP54WK.mjs → renderers-HZBYQKIQ.mjs} +1 -1
  136. package/dist/preview-engine/renderers-IK7ZJJKJ.mjs +1 -0
  137. package/dist/preview-engine/renderers-ISASPH6T.mjs +1 -0
  138. package/dist/preview-engine/renderers-IW5MWDBI.mjs +1 -0
  139. package/dist/preview-engine/renderers-K2PI4WJS.mjs +1 -0
  140. package/dist/preview-engine/renderers-KESHVFL2.mjs +1 -0
  141. package/dist/preview-engine/renderers-KTZZVAB2.mjs +1 -0
  142. package/dist/preview-engine/renderers-KY5CJEOV.mjs +1 -0
  143. package/dist/preview-engine/{renderers-MS4HG3M4.mjs → renderers-LTV5RFDJ.mjs} +1 -1
  144. package/dist/preview-engine/{renderers-CEJP6Q7F.mjs → renderers-LV6LLULR.mjs} +1 -1
  145. package/dist/preview-engine/renderers-M5W6SUQD.mjs +1 -0
  146. package/dist/preview-engine/{renderers-H3ZM2TOA.mjs → renderers-MEM3REMI.mjs} +1 -1
  147. package/dist/preview-engine/{renderers-EJATUIUP.mjs → renderers-N36R42RL.mjs} +1 -1
  148. package/dist/preview-engine/{renderers-UVABXXQF.mjs → renderers-NTKSN32T.mjs} +1 -1
  149. package/dist/preview-engine/renderers-O5XMWFPY.mjs +1 -0
  150. package/dist/preview-engine/{renderers-QO2RHF7F.mjs → renderers-P2FTCDZ7.mjs} +1 -1
  151. package/dist/preview-engine/{renderers-L7EITUCD.mjs → renderers-PYDOSDEY.mjs} +1 -1
  152. package/dist/preview-engine/renderers-QJA35PKC.mjs +1 -0
  153. package/dist/preview-engine/{renderers-TWZHTKW7.mjs → renderers-RDHHVXRE.mjs} +1 -1
  154. package/dist/preview-engine/{renderers-RRJ2DX2W.mjs → renderers-SY435YU3.mjs} +1 -1
  155. package/dist/preview-engine/renderers-TJIFTQHV.mjs +1 -0
  156. package/dist/preview-engine/renderers-TN4XN436.mjs +1 -0
  157. package/dist/preview-engine/renderers-UDYLCYCB.mjs +1 -0
  158. package/dist/preview-engine/renderers-WZ7SFIBZ.mjs +1 -0
  159. package/dist/preview-engine/renderers-WZEV464O.mjs +228 -0
  160. package/dist/preview-engine/renderers-X6QNDC6R.mjs +1 -0
  161. package/dist/preview-engine/renderers-X6RNTJOV.mjs +1 -0
  162. package/dist/preview-engine/{renderers-QPFZBLDI.mjs → renderers-Y3N7236P.mjs} +1 -1
  163. package/dist/preview-engine/{renderers-XSPU2BIQ.mjs → renderers-YBTWN76S.mjs} +1 -1
  164. package/dist/preview-engine/{renderers-T62TXGVO.mjs → renderers-YK74777T.mjs} +1 -1
  165. package/dist/preview-engine/renderers-YP3ASXIJ.mjs +1 -0
  166. package/dist/preview-engine/renderers-YVJAG3PD.mjs +1 -0
  167. package/dist/preview-engine/{renderers-4RFB2LG2.mjs → renderers-ZAMSS7QN.mjs} +1 -1
  168. package/dist/preview-engine/{renderers-FOHW7RWH.mjs → renderers-ZDMDDWLN.mjs} +1 -1
  169. package/dist/preview-engine/renderers-ZPPZNMKJ.mjs +1 -0
  170. package/dist/preview-engine/signals.mjs +1 -1
  171. package/dist/{program-4mAVgg3c.mjs → program-O2bWX0cs.mjs} +2 -2
  172. package/dist/{program-4mAVgg3c.mjs.map → program-O2bWX0cs.mjs.map} +1 -1
  173. package/dist/registry/card-stack.json +3 -2
  174. package/dist/registry/chat-thread.json +4 -3
  175. package/dist/registry/index.json +3 -2
  176. package/dist/renderer/index.d.mts +2 -2
  177. package/dist/renderer/index.mjs +2 -2
  178. package/dist/renderer-0441BN0U.mjs +5 -0
  179. package/dist/{renderer-RiWi7y5C.mjs → renderer-1NoJLLDa.mjs} +4 -4
  180. package/dist/{renderer-RiWi7y5C.mjs.map → renderer-1NoJLLDa.mjs.map} +1 -1
  181. package/dist/renderer-3qDgFc-W.mjs +5 -0
  182. package/dist/renderer-6AIqTN5Z.mjs +5 -0
  183. package/dist/{renderer-zdpn1Hkk.mjs → renderer-8_d6YNnE.mjs} +3 -3
  184. package/dist/{renderer-zdpn1Hkk.mjs.map → renderer-8_d6YNnE.mjs.map} +1 -1
  185. package/dist/{renderer-DTXAa2pL.mjs → renderer-B0IJirDs.mjs} +4 -4
  186. package/dist/{renderer-DTXAa2pL.mjs.map → renderer-B0IJirDs.mjs.map} +1 -1
  187. package/dist/{renderer-_vcT__tW.mjs → renderer-B2no_9zi.mjs} +4 -4
  188. package/dist/{renderer-_vcT__tW.mjs.map → renderer-B2no_9zi.mjs.map} +1 -1
  189. package/dist/{renderer-CkJXq4bD.mjs → renderer-B5ZdkcMi.mjs} +3 -3
  190. package/dist/{renderer-CkJXq4bD.mjs.map → renderer-B5ZdkcMi.mjs.map} +1 -1
  191. package/dist/renderer-B7MZ5R7u.mjs +5 -0
  192. package/dist/{renderer-Bh0dwc8n.mjs → renderer-B7vXnBUo.mjs} +4 -4
  193. package/dist/{renderer-Bh0dwc8n.mjs.map → renderer-B7vXnBUo.mjs.map} +1 -1
  194. package/dist/renderer-BE2rIA4B.mjs +5 -0
  195. package/dist/renderer-BIQ81ln4.mjs +5 -0
  196. package/dist/{renderer-BIYJKdwA.mjs → renderer-BKJ8cywK.mjs} +3 -3
  197. package/dist/{renderer-BIYJKdwA.mjs.map → renderer-BKJ8cywK.mjs.map} +1 -1
  198. package/dist/renderer-BKm3_Ob3.mjs +5 -0
  199. package/dist/{renderer-DPzair18.mjs → renderer-BMiZIGkZ.mjs} +2 -2
  200. package/dist/renderer-BNdT1Wwf.mjs +5 -0
  201. package/dist/{renderer-C1sFg34Y.mjs → renderer-BNs31kME.mjs} +4 -4
  202. package/dist/{renderer-C1sFg34Y.mjs.map → renderer-BNs31kME.mjs.map} +1 -1
  203. package/dist/renderer-BQycs1q_.mjs +5 -0
  204. package/dist/{renderer-Bt_j2Zi6.mjs → renderer-BStETpqC.mjs} +3 -3
  205. package/dist/{renderer-Bt_j2Zi6.mjs.map → renderer-BStETpqC.mjs.map} +1 -1
  206. package/dist/{renderer-CT_3Fegr.mjs → renderer-BWNQQZ12.mjs} +4 -4
  207. package/dist/{renderer-CT_3Fegr.mjs.map → renderer-BWNQQZ12.mjs.map} +1 -1
  208. package/dist/{renderer-C8-NmotX.mjs → renderer-BZ5uOfoX.mjs} +3 -3
  209. package/dist/{renderer-C8-NmotX.mjs.map → renderer-BZ5uOfoX.mjs.map} +1 -1
  210. package/dist/{renderer-Ddg3dJmu.mjs → renderer-Bag1LFos.mjs} +4 -4
  211. package/dist/{renderer-Ddg3dJmu.mjs.map → renderer-Bag1LFos.mjs.map} +1 -1
  212. package/dist/{renderer-CvYxxS_X.mjs → renderer-BfQdc3RM.mjs} +73 -73
  213. package/dist/{renderer-CvYxxS_X.mjs.map → renderer-BfQdc3RM.mjs.map} +1 -1
  214. package/dist/{renderer-C9r0-KY4.mjs → renderer-BgmO1Dzw.mjs} +11 -2
  215. package/dist/{renderer-C9r0-KY4.mjs.map → renderer-BgmO1Dzw.mjs.map} +1 -1
  216. package/dist/renderer-Bj7MxXfk.mjs +5 -0
  217. package/dist/renderer-BjRAGYYC.mjs +5 -0
  218. package/dist/{renderer-BIt-At3v.mjs → renderer-BlU3Sh_0.mjs} +4 -4
  219. package/dist/{renderer-BIt-At3v.mjs.map → renderer-BlU3Sh_0.mjs.map} +1 -1
  220. package/dist/renderer-BqE2BQ_X.mjs +5 -0
  221. package/dist/{renderer-CxkUI9s_.mjs → renderer-BrKgtYq4.mjs} +4 -4
  222. package/dist/{renderer-CxkUI9s_.mjs.map → renderer-BrKgtYq4.mjs.map} +1 -1
  223. package/dist/{renderer-NL2IZShC.mjs → renderer-Bs6BaMLf.mjs} +4 -4
  224. package/dist/{renderer-NL2IZShC.mjs.map → renderer-Bs6BaMLf.mjs.map} +1 -1
  225. package/dist/renderer-BsewLDHZ.mjs +3 -0
  226. package/dist/{renderer-Bk7vVfTu.mjs → renderer-BvA4sQz5.mjs} +3 -3
  227. package/dist/{renderer-Bk7vVfTu.mjs.map → renderer-BvA4sQz5.mjs.map} +1 -1
  228. package/dist/{renderer-BwRLXhxJ.mjs → renderer-Bvizxddu.mjs} +3 -3
  229. package/dist/{renderer-BwRLXhxJ.mjs.map → renderer-Bvizxddu.mjs.map} +1 -1
  230. package/dist/{renderer-D-FwaV1R.mjs → renderer-Bwxm-kWL.mjs} +2 -2
  231. package/dist/renderer-Bz5BMkOE.mjs +5 -0
  232. package/dist/{renderer-CE9N4EEI.d.mts → renderer-C-dcd14F.d.mts} +2 -2
  233. package/dist/{renderer-CE9N4EEI.d.mts.map → renderer-C-dcd14F.d.mts.map} +1 -1
  234. package/dist/{renderer-BcSSAzc4.mjs → renderer-C2MaJKfY.mjs} +4 -4
  235. package/dist/{renderer-BcSSAzc4.mjs.map → renderer-C2MaJKfY.mjs.map} +1 -1
  236. package/dist/{renderer-C4pS7aAI.mjs → renderer-C3tdjg8B.mjs} +4 -4
  237. package/dist/{renderer-C4pS7aAI.mjs.map → renderer-C3tdjg8B.mjs.map} +1 -1
  238. package/dist/{renderer-C4f_X1Qc.mjs → renderer-C5QYI1Wu.mjs} +3 -3
  239. package/dist/{renderer-C4f_X1Qc.mjs.map → renderer-C5QYI1Wu.mjs.map} +1 -1
  240. package/dist/{renderer-DPVEs5ME.mjs → renderer-C6n8y6Pw.mjs} +4 -4
  241. package/dist/{renderer-DPVEs5ME.mjs.map → renderer-C6n8y6Pw.mjs.map} +1 -1
  242. package/dist/{renderer-BKayVZhL.mjs → renderer-C8pJFxcL.mjs} +3 -3
  243. package/dist/{renderer-BKayVZhL.mjs.map → renderer-C8pJFxcL.mjs.map} +1 -1
  244. package/dist/{renderer-CTvPNRMH.mjs → renderer-CA_CwisV.mjs} +3 -3
  245. package/dist/{renderer-CTvPNRMH.mjs.map → renderer-CA_CwisV.mjs.map} +1 -1
  246. package/dist/renderer-CDOSfB9H.mjs +5 -0
  247. package/dist/{renderer-C0P8ZRiC.mjs → renderer-CEAmByVW.mjs} +3 -3
  248. package/dist/{renderer-C0P8ZRiC.mjs.map → renderer-CEAmByVW.mjs.map} +1 -1
  249. package/dist/{renderer-C7HIJcJK.mjs → renderer-CFCR_7bq.mjs} +4 -4
  250. package/dist/{renderer-C7HIJcJK.mjs.map → renderer-CFCR_7bq.mjs.map} +1 -1
  251. package/dist/{renderer-Y5JmTL8J.mjs → renderer-CFRTJ7cT.mjs} +3 -3
  252. package/dist/{renderer-Y5JmTL8J.mjs.map → renderer-CFRTJ7cT.mjs.map} +1 -1
  253. package/dist/{renderer-Cm9fEQsw.mjs → renderer-CPSg6eEQ.mjs} +3 -3
  254. package/dist/{renderer-Cm9fEQsw.mjs.map → renderer-CPSg6eEQ.mjs.map} +1 -1
  255. package/dist/renderer-CT26yQT-.mjs +5 -0
  256. package/dist/{renderer-B8PNlKEM.mjs → renderer-CTy0bSsl.mjs} +4 -4
  257. package/dist/{renderer-B8PNlKEM.mjs.map → renderer-CTy0bSsl.mjs.map} +1 -1
  258. package/dist/{renderer-Dkt1oh9H.mjs → renderer-CVbNiH03.mjs} +4 -4
  259. package/dist/{renderer-Dkt1oh9H.mjs.map → renderer-CVbNiH03.mjs.map} +1 -1
  260. package/dist/renderer-CZeAbz48.mjs +5 -0
  261. package/dist/{renderer-DYdll3xW.mjs → renderer-CbxfSmYE.mjs} +4 -4
  262. package/dist/{renderer-DYdll3xW.mjs.map → renderer-CbxfSmYE.mjs.map} +1 -1
  263. package/dist/{renderer-nLPfvY3-.mjs → renderer-CdxNwGeb.mjs} +2 -2
  264. package/dist/{renderer-nLPfvY3-.mjs.map → renderer-CdxNwGeb.mjs.map} +1 -1
  265. package/dist/{renderer-Cb5uDZm0.mjs → renderer-Cg2xS8h8.mjs} +3 -3
  266. package/dist/{renderer-Cb5uDZm0.mjs.map → renderer-Cg2xS8h8.mjs.map} +1 -1
  267. package/dist/{renderer-CJ2-jEy7.mjs → renderer-CnclEQdA.mjs} +3 -3
  268. package/dist/{renderer-CJ2-jEy7.mjs.map → renderer-CnclEQdA.mjs.map} +1 -1
  269. package/dist/{renderer-CgMnZYTM.mjs → renderer-CpDaUeCN.mjs} +4 -4
  270. package/dist/{renderer-CgMnZYTM.mjs.map → renderer-CpDaUeCN.mjs.map} +1 -1
  271. package/dist/{renderer-Du8z4UrN.mjs → renderer-CqJou_2L.mjs} +3 -3
  272. package/dist/{renderer-Du8z4UrN.mjs.map → renderer-CqJou_2L.mjs.map} +1 -1
  273. package/dist/{renderer-CxOaqnho.mjs → renderer-CrKYlipx.mjs} +3 -3
  274. package/dist/{renderer-CxOaqnho.mjs.map → renderer-CrKYlipx.mjs.map} +1 -1
  275. package/dist/{renderer-CPl1wOrj.mjs → renderer-D3FJcRA3.mjs} +3 -3
  276. package/dist/{renderer-CPl1wOrj.mjs.map → renderer-D3FJcRA3.mjs.map} +1 -1
  277. package/dist/renderer-D50b7kip.mjs +5 -0
  278. package/dist/renderer-D5LmrO96.mjs +5 -0
  279. package/dist/{renderer-vc8t_z-y.mjs → renderer-D8m3fuRp.mjs} +3 -3
  280. package/dist/{renderer-vc8t_z-y.mjs.map → renderer-D8m3fuRp.mjs.map} +1 -1
  281. package/dist/{renderer-BpBhvMi1.mjs → renderer-DADTT3ym.mjs} +2 -2
  282. package/dist/renderer-DCvqZ5o_.mjs +5 -0
  283. package/dist/{renderer-BBA-iCi-.mjs → renderer-DGOY-LBR.mjs} +34 -9
  284. package/dist/renderer-DGOY-LBR.mjs.map +1 -0
  285. package/dist/{renderer-Cz5SOnJr.mjs → renderer-DHdFVpdH.mjs} +3 -3
  286. package/dist/{renderer-Cz5SOnJr.mjs.map → renderer-DHdFVpdH.mjs.map} +1 -1
  287. package/dist/renderer-DJGJeGEn.mjs +5 -0
  288. package/dist/{renderer-BjxceNBj.mjs → renderer-DO1TeUqV.mjs} +4 -4
  289. package/dist/{renderer-BjxceNBj.mjs.map → renderer-DO1TeUqV.mjs.map} +1 -1
  290. package/dist/renderer-DONvNNXi.mjs +5 -0
  291. package/dist/renderer-DPaSo--Y.mjs +6 -0
  292. package/dist/{renderer-D0iSbNza.mjs → renderer-DTPmvL1i.mjs} +4 -4
  293. package/dist/{renderer-D0iSbNza.mjs.map → renderer-DTPmvL1i.mjs.map} +1 -1
  294. package/dist/{renderer-CWnhRMOq.mjs → renderer-DVGVcDvB.mjs} +4 -4
  295. package/dist/{renderer-CWnhRMOq.mjs.map → renderer-DVGVcDvB.mjs.map} +1 -1
  296. package/dist/{renderer-Cjw6lyaK.mjs → renderer-DW21AyEv.mjs} +4 -4
  297. package/dist/{renderer-Cjw6lyaK.mjs.map → renderer-DW21AyEv.mjs.map} +1 -1
  298. package/dist/{renderer-B9iVE2GG.mjs → renderer-DWG6EXGj.mjs} +4 -4
  299. package/dist/{renderer-B9iVE2GG.mjs.map → renderer-DWG6EXGj.mjs.map} +1 -1
  300. package/dist/{renderer-De7gno9X.mjs → renderer-Daqvhwjp.mjs} +4 -4
  301. package/dist/{renderer-De7gno9X.mjs.map → renderer-Daqvhwjp.mjs.map} +1 -1
  302. package/dist/{renderer-5-9DPis6.mjs → renderer-DcApNxER.mjs} +3 -3
  303. package/dist/{renderer-5-9DPis6.mjs.map → renderer-DcApNxER.mjs.map} +1 -1
  304. package/dist/{renderer-CGKKjJ5Q.mjs → renderer-DdkPY4hO.mjs} +3 -3
  305. package/dist/{renderer-CGKKjJ5Q.mjs.map → renderer-DdkPY4hO.mjs.map} +1 -1
  306. package/dist/renderer-DfYYokhr.mjs +5 -0
  307. package/dist/{renderer-C5h2TSjH.mjs → renderer-Dk0okoS3.mjs} +3 -3
  308. package/dist/{renderer-C5h2TSjH.mjs.map → renderer-Dk0okoS3.mjs.map} +1 -1
  309. package/dist/{renderer-B9m7xIPo.mjs → renderer-DkM6Ikdf.mjs} +4 -4
  310. package/dist/{renderer-B9m7xIPo.mjs.map → renderer-DkM6Ikdf.mjs.map} +1 -1
  311. package/dist/{renderer-T2dd9a2L.mjs → renderer-DkOxEQsg.mjs} +4 -4
  312. package/dist/{renderer-T2dd9a2L.mjs.map → renderer-DkOxEQsg.mjs.map} +1 -1
  313. package/dist/renderer-DlIJhdEM.mjs +5 -0
  314. package/dist/{renderer-BmX2CmyO.mjs → renderer-DmTxEeMh.mjs} +4 -4
  315. package/dist/{renderer-BmX2CmyO.mjs.map → renderer-DmTxEeMh.mjs.map} +1 -1
  316. package/dist/renderer-DqD3nMtv.mjs +5 -0
  317. package/dist/renderer-DrIl-uGt.mjs +5 -0
  318. package/dist/{renderer-khVVYoVF.mjs → renderer-DsnV8tpW.mjs} +4 -4
  319. package/dist/{renderer-khVVYoVF.mjs.map → renderer-DsnV8tpW.mjs.map} +1 -1
  320. package/dist/{renderer-wEXBnlr1.mjs → renderer-DtqiWq1m.mjs} +4 -4
  321. package/dist/{renderer-wEXBnlr1.mjs.map → renderer-DtqiWq1m.mjs.map} +1 -1
  322. package/dist/{renderer-wIsJb2eO.mjs → renderer-Duorbrb8.mjs} +2 -2
  323. package/dist/{renderer-wIsJb2eO.mjs.map → renderer-Duorbrb8.mjs.map} +1 -1
  324. package/dist/{renderer-CjcrhBB2.mjs → renderer-Dw3K8KT9.mjs} +3 -3
  325. package/dist/{renderer-CjcrhBB2.mjs.map → renderer-Dw3K8KT9.mjs.map} +1 -1
  326. package/dist/{renderer-4P-DCjk2.mjs → renderer-Dwh0jaor.mjs} +4 -4
  327. package/dist/{renderer-4P-DCjk2.mjs.map → renderer-Dwh0jaor.mjs.map} +1 -1
  328. package/dist/renderer-DyCB3Q1d.mjs +5 -0
  329. package/dist/renderer-DyJ-iSv6.mjs +5 -0
  330. package/dist/{renderer-DnT62IDK.mjs → renderer-Dz4muMyE.mjs} +3 -3
  331. package/dist/{renderer-DnT62IDK.mjs.map → renderer-Dz4muMyE.mjs.map} +1 -1
  332. package/dist/renderer-Dzs0jV0G.mjs +5 -0
  333. package/dist/{renderer-B9yv3R1y.mjs → renderer-H4-8sBjl.mjs} +3 -3
  334. package/dist/{renderer-B9yv3R1y.mjs.map → renderer-H4-8sBjl.mjs.map} +1 -1
  335. package/dist/renderer-HIKXw5-Y.mjs +5 -0
  336. package/dist/renderer-Jgt2g8Wp.mjs +5 -0
  337. package/dist/renderer-KnZWmT-M.mjs +5 -0
  338. package/dist/renderer-OMSXddG9.mjs +5 -0
  339. package/dist/renderer-P78xh6OV.mjs +5 -0
  340. package/dist/{renderer-BVtQzjgT.mjs → renderer-PhjHSS97.mjs} +3 -3
  341. package/dist/{renderer-BVtQzjgT.mjs.map → renderer-PhjHSS97.mjs.map} +1 -1
  342. package/dist/{renderer-9gjn790a.mjs → renderer-QQDU1b0Z.mjs} +4 -4
  343. package/dist/{renderer-9gjn790a.mjs.map → renderer-QQDU1b0Z.mjs.map} +1 -1
  344. package/dist/{renderer-BWqQxZNk.mjs → renderer-R5Lg65F8.mjs} +2 -2
  345. package/dist/{renderer-D22g6ION.mjs → renderer-RbMM6Njv.mjs} +4 -4
  346. package/dist/{renderer-D22g6ION.mjs.map → renderer-RbMM6Njv.mjs.map} +1 -1
  347. package/dist/{renderer-92IAZzBU.d.mts → renderer-WTvo3wo9.d.mts} +18 -4
  348. package/dist/renderer-WTvo3wo9.d.mts.map +1 -0
  349. package/dist/renderer-WyaqnVMz.mjs +3 -0
  350. package/dist/{renderer-B9AZ6R1U.mjs → renderer-YBwN9uyj.mjs} +172 -8
  351. package/dist/renderer-YBwN9uyj.mjs.map +1 -0
  352. package/dist/{renderer-CXa6SWXy.mjs → renderer-YFHESw3v.mjs} +4 -4
  353. package/dist/{renderer-CXa6SWXy.mjs.map → renderer-YFHESw3v.mjs.map} +1 -1
  354. package/dist/renderer-gaFP1Kak.mjs +5 -0
  355. package/dist/{renderer-PNIgmWft.mjs → renderer-kFtcuY9J.mjs} +2 -2
  356. package/dist/{renderer-PNIgmWft.mjs.map → renderer-kFtcuY9J.mjs.map} +1 -1
  357. package/dist/renderer-lQ8gH7Zd.mjs +5 -0
  358. package/dist/{renderer-MQPiZQXN.mjs → renderer-oR1LvHeO.mjs} +3 -3
  359. package/dist/{renderer-MQPiZQXN.mjs.map → renderer-oR1LvHeO.mjs.map} +1 -1
  360. package/dist/{renderer-CuwVuVKG.mjs → renderer-tcS585Iy.mjs} +3 -3
  361. package/dist/{renderer-CuwVuVKG.mjs.map → renderer-tcS585Iy.mjs.map} +1 -1
  362. package/dist/{renderer-Datqywo_.mjs → renderer-x1xlZaH_.mjs} +4 -4
  363. package/dist/{renderer-Datqywo_.mjs.map → renderer-x1xlZaH_.mjs.map} +1 -1
  364. package/dist/{renderers-CP8CFWDs-BbLkcJTN.mjs → renderers-CP8CFWDs-EZZPEbhW.mjs} +3 -3
  365. package/dist/{renderers-CP8CFWDs-BbLkcJTN.mjs.map → renderers-CP8CFWDs-EZZPEbhW.mjs.map} +1 -1
  366. package/dist/signals/index.d.mts +5 -5
  367. package/dist/signals/index.mjs +5 -5
  368. package/dist/{src-WAnxhDYD.mjs → src-r7Suenhp.mjs} +8 -8
  369. package/dist/{src-WAnxhDYD.mjs.map → src-r7Suenhp.mjs.map} +1 -1
  370. package/package.json +58 -58
  371. package/dist/dist-Bf0H4lp1.mjs.map +0 -1
  372. package/dist/dist-DG65RDhc.mjs.map +0 -1
  373. package/dist/index-CZK6CFLy.d.mts.map +0 -1
  374. package/dist/index-tCKz9Tku.d.mts.map +0 -1
  375. package/dist/preview-engine/chunk-I6E3AKLS.mjs +0 -1
  376. package/dist/preview-engine/renderers-2S5ZWL2J.mjs +0 -1
  377. package/dist/preview-engine/renderers-37CN7O4S.mjs +0 -1
  378. package/dist/preview-engine/renderers-3UGG2IMP.mjs +0 -1
  379. package/dist/preview-engine/renderers-7MPBAHYA.mjs +0 -1
  380. package/dist/preview-engine/renderers-AFTYMS3H.mjs +0 -1
  381. package/dist/preview-engine/renderers-AYEWAW7F.mjs +0 -1
  382. package/dist/preview-engine/renderers-BILNWTUC.mjs +0 -228
  383. package/dist/preview-engine/renderers-DUF2CTX6.mjs +0 -1
  384. package/dist/preview-engine/renderers-EIJFIY6L.mjs +0 -1
  385. package/dist/preview-engine/renderers-EOMMSENQ.mjs +0 -1
  386. package/dist/preview-engine/renderers-JXBZPQKP.mjs +0 -1
  387. package/dist/preview-engine/renderers-LD3COS4X.mjs +0 -1
  388. package/dist/preview-engine/renderers-MCTBJEL7.mjs +0 -1
  389. package/dist/preview-engine/renderers-OZGEXW2X.mjs +0 -1
  390. package/dist/preview-engine/renderers-PSEDMUBV.mjs +0 -1
  391. package/dist/preview-engine/renderers-PVUROEGR.mjs +0 -1
  392. package/dist/preview-engine/renderers-QBVVTQV6.mjs +0 -1
  393. package/dist/preview-engine/renderers-R4U2TK6P.mjs +0 -1
  394. package/dist/preview-engine/renderers-RBLNDAO4.mjs +0 -1
  395. package/dist/preview-engine/renderers-RM25AXWZ.mjs +0 -1
  396. package/dist/preview-engine/renderers-RYRFCEYT.mjs +0 -1
  397. package/dist/preview-engine/renderers-SKT7AGGE.mjs +0 -1
  398. package/dist/preview-engine/renderers-SRU6QXLN.mjs +0 -1
  399. package/dist/preview-engine/renderers-TBP2EKJ4.mjs +0 -1
  400. package/dist/preview-engine/renderers-UQHKFGDX.mjs +0 -1
  401. package/dist/preview-engine/renderers-WDV7ENJA.mjs +0 -1
  402. package/dist/preview-engine/renderers-WNBDSSJ3.mjs +0 -1
  403. package/dist/preview-engine/renderers-WTC2RNGU.mjs +0 -1
  404. package/dist/preview-engine/renderers-XVUOO7B6.mjs +0 -1
  405. package/dist/preview-engine/renderers-YHOQUEHD.mjs +0 -1
  406. package/dist/preview-engine/renderers-YPFM5UJO.mjs +0 -1
  407. package/dist/preview-engine/renderers-YW3LBALW.mjs +0 -1
  408. package/dist/renderer-1ymN1FIT.mjs +0 -5
  409. package/dist/renderer-92IAZzBU.d.mts.map +0 -1
  410. package/dist/renderer-B-43EuKb.mjs +0 -5
  411. package/dist/renderer-B-v5ZboU.mjs +0 -5
  412. package/dist/renderer-B9AZ6R1U.mjs.map +0 -1
  413. package/dist/renderer-BBA-iCi-.mjs.map +0 -1
  414. package/dist/renderer-BKF8Sfbg.mjs +0 -3
  415. package/dist/renderer-BTB8ifgH.mjs +0 -5
  416. package/dist/renderer-BYxzR6Hp.mjs +0 -5
  417. package/dist/renderer-BcGhO_Mw.mjs +0 -5
  418. package/dist/renderer-Bk3RgiFg.mjs +0 -5
  419. package/dist/renderer-BvItCxkw.mjs +0 -5
  420. package/dist/renderer-BvcqncI2.mjs +0 -3
  421. package/dist/renderer-CCnfPHqk.mjs +0 -5
  422. package/dist/renderer-CIoWQNaA.mjs +0 -5
  423. package/dist/renderer-CMwQtIIq.mjs +0 -5
  424. package/dist/renderer-CN8kRB90.mjs +0 -6
  425. package/dist/renderer-CPKBDif1.mjs +0 -5
  426. package/dist/renderer-CamsHxEP.mjs +0 -5
  427. package/dist/renderer-CeQormOH.mjs +0 -5
  428. package/dist/renderer-Cex4eMtv.mjs +0 -5
  429. package/dist/renderer-CjyTrNlr.mjs +0 -5
  430. package/dist/renderer-Clv9TO6C.mjs +0 -5
  431. package/dist/renderer-D4LnJk-M.mjs +0 -5
  432. package/dist/renderer-D5OfQ8Ut.mjs +0 -5
  433. package/dist/renderer-DBYssktC.mjs +0 -5
  434. package/dist/renderer-DC-Aj3me.mjs +0 -5
  435. package/dist/renderer-DG97_Aoc.mjs +0 -5
  436. package/dist/renderer-DS4UGjcS.mjs +0 -5
  437. package/dist/renderer-DdG6ibtM.mjs +0 -5
  438. package/dist/renderer-DhZi4f3t.mjs +0 -5
  439. package/dist/renderer-MgLekf6d.mjs +0 -5
  440. package/dist/renderer-Qvs-1lWh.mjs +0 -5
  441. package/dist/renderer-bN7dOErt.mjs +0 -5
  442. package/dist/renderer-jWKVmReU.mjs +0 -5
  443. package/dist/renderer-lk-At57G.mjs +0 -5
  444. package/dist/renderer-qi8Slwfo.mjs +0 -5
  445. package/dist/renderer-qxOH4JH1.mjs +0 -5
  446. package/dist/renderer-t30NpmIl.mjs +0 -5
  447. package/dist/renderer-wKW4HWRx.mjs +0 -5
  448. package/dist/renderer-ydjPm8bp.mjs +0 -5
@@ -247,6 +247,15 @@ const webgpuRegistry = (() => {
247
247
  function registerWebGPURenderer(op, renderer) {
248
248
  webgpuRegistry.register(op, renderer);
249
249
  }
250
+ /**
251
+ * How far an operation's effect draws past its pixels, from its registered
252
+ * renderer; `null` when unknown: no renderer, no `reach`, or no answer.
253
+ */
254
+ function effectReach(operation) {
255
+ const op = operation.op;
256
+ if (typeof op !== "string") return null;
257
+ return webgpuRegistry.get(op)?.reach?.(operation) ?? null;
258
+ }
250
259
  registerWebGPURenderer("TextureSource", (args) => {
251
260
  const op = args.props.virtualMedia.operation;
252
261
  if (op?.sourceTexture) args.ctx.renderer.drawTexture(args.pass, op.sourceTexture, {
@@ -273,5 +282,5 @@ const audioRegistry = (() => {
273
282
  })();
274
283
 
275
284
  //#endregion
276
- export { resolveFrameNumber as a, solveHomography as c, registerWebGPURenderer as i, unwrapFrameParam as l, defineRenderer as n, resolveHandleParam as o, isHandleConnected as r, resolveSignalField as s, audioRegistry as t, webgpuRegistry as u };
277
- //# sourceMappingURL=renderer-C9r0-KY4.mjs.map
285
+ export { registerWebGPURenderer as a, resolveSignalField as c, webgpuRegistry as d, isHandleConnected as i, solveHomography as l, defineRenderer as n, resolveFrameNumber as o, effectReach as r, resolveHandleParam as s, audioRegistry as t, unwrapFrameParam as u };
286
+ //# sourceMappingURL=renderer-BgmO1Dzw.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-C9r0-KY4.mjs","names":[],"sources":["../../node-sdk/dist/renderer.mjs"],"sourcesContent":["import { isSignal, resolveBoolean, resolveNumber, resolveParam, resolveString } from \"@framefields/core\";\n\n//#region renderer/homography.ts\n/**\n* Computes an 8-parameter 3x3 homography matrix mapping destination coordinates (quad)\n* to normalized source coordinates (unit square [0, 1]^2).\n*\n* The homography H maps destination (x, y) to source (u, v):\n* u = (h00*x + h01*y + h02) / (h20*x + h21*y + h22)\n* v = (h10*x + h11*y + h12) / (h20*x + h21*y + h22)\n*\n* Resulting array: [h00, h01, h02, h10, h11, h12, h20, h21, 1.0]\n*/\nfunction solveHomography(dstPoints, srcPoints = [\n\t{\n\t\tx: 0,\n\t\ty: 0\n\t},\n\t{\n\t\tx: 1,\n\t\ty: 0\n\t},\n\t{\n\t\tx: 0,\n\t\ty: 1\n\t},\n\t{\n\t\tx: 1,\n\t\ty: 1\n\t}\n]) {\n\tconst A = [];\n\tconst B = [];\n\tfor (let i = 0; i < 4; i++) {\n\t\tconst xi = dstPoints[i]?.x ?? 0;\n\t\tconst yi = dstPoints[i]?.y ?? 0;\n\t\tconst ui = srcPoints[i]?.x ?? 0;\n\t\tconst vi = srcPoints[i]?.y ?? 0;\n\t\tA.push([\n\t\t\txi,\n\t\t\tyi,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-xi * ui,\n\t\t\t-yi * ui\n\t\t]);\n\t\tB.push(ui);\n\t\tA.push([\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\txi,\n\t\t\tyi,\n\t\t\t1,\n\t\t\t-xi * vi,\n\t\t\t-yi * vi\n\t\t]);\n\t\tB.push(vi);\n\t}\n\tconst n = 8;\n\tfor (let i = 0; i < n; i++) {\n\t\tlet maxRow = i;\n\t\tlet maxVal = Math.abs(A[i][i]);\n\t\tfor (let k = i + 1; k < n; k++) if (Math.abs(A[k][i]) > maxVal) {\n\t\t\tmaxVal = Math.abs(A[k][i]);\n\t\t\tmaxRow = k;\n\t\t}\n\t\tconst tempRow = A[i];\n\t\tA[i] = A[maxRow];\n\t\tA[maxRow] = tempRow;\n\t\tconst tempB = B[i];\n\t\tB[i] = B[maxRow];\n\t\tB[maxRow] = tempB;\n\t\tconst pivot = A[i][i];\n\t\tif (Math.abs(pivot) < 1e-12) A[i][i] = pivot < 0 ? -1e-12 : 1e-12;\n\t\tfor (let k = i + 1; k < n; k++) {\n\t\t\tconst factor = A[k][i] / A[i][i];\n\t\t\tfor (let j = i; j < n; j++) A[k][j] -= factor * A[i][j];\n\t\t\tB[k] -= factor * B[i];\n\t\t}\n\t}\n\tconst h = new Array(8).fill(0);\n\tfor (let i = n - 1; i >= 0; i--) {\n\t\tlet sum = B[i];\n\t\tfor (let j = i + 1; j < n; j++) sum -= A[i][j] * h[j];\n\t\th[i] = sum / A[i][i];\n\t}\n\treturn [\n\t\th[0],\n\t\th[1],\n\t\th[2],\n\t\th[3],\n\t\th[4],\n\t\th[5],\n\t\th[6],\n\t\th[7],\n\t\t1\n\t];\n}\n\n//#endregion\n//#region renderer/index.ts\n/**\n* A numeric node parameter at `frame`: a number, a signal-like `get(ctx)` or\n* `{ value }`, a `(ctx) => number` function, or anything `Number()` accepts;\n* `fallback` when none of those yields a finite number.\n*/\nfunction resolveFrameNumber(val, fallback, frame, fps) {\n\tif (val === void 0 || val === null) return fallback;\n\tif (typeof val === \"number\") return Number.isFinite(val) ? val : fallback;\n\tif (typeof val === \"object\" && val !== null) {\n\t\tif (\"get\" in val && typeof val.get === \"function\") try {\n\t\t\tconst res = val.get({\n\t\t\t\tframe,\n\t\t\t\tfps,\n\t\t\t\ttime: fps > 0 ? frame / fps : 0,\n\t\t\t\tduration: 0,\n\t\t\t\tdurationMs: 0,\n\t\t\t\tprogress: 0,\n\t\t\t\tdeltaTime: fps > 0 ? 1 / fps : 0\n\t\t\t});\n\t\t\tconst n$1 = Number(res);\n\t\t\tif (Number.isFinite(n$1)) return n$1;\n\t\t} catch {}\n\t\tif (\"value\" in val) {\n\t\t\tconst n$1 = Number(val.value);\n\t\t\tif (Number.isFinite(n$1)) return n$1;\n\t\t}\n\t}\n\tif (typeof val === \"function\") try {\n\t\tconst n$1 = Number(val({\n\t\t\tframe,\n\t\t\tfps,\n\t\t\ttime: fps > 0 ? frame / fps : 0\n\t\t}));\n\t\tif (Number.isFinite(n$1)) return n$1;\n\t} catch {}\n\tconst n = Number(val);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/**\n* A static node parameter at `frame`: calls `get(ctx)` / `(frame, fps)`\n* functions and reads `{ value }` wrappers, keeping a signal's GPU texture\n* binding when it has one. Anything else is returned as-is.\n*/\nfunction unwrapFrameParam(raw, frame, fps) {\n\tif (raw === void 0 || raw === null) return { value: raw };\n\tif (typeof raw === \"function\") return { value: raw(frame, fps) };\n\tif (typeof raw !== \"object\") return { value: raw };\n\tconst obj = raw;\n\tif (typeof obj.get === \"function\") return { value: obj.get({\n\t\tframe,\n\t\tfps\n\t}) };\n\tif (\"value\" in obj) {\n\t\tconst sig = raw;\n\t\treturn {\n\t\t\tvalue: sig.value,\n\t\t\tgpuTextureView: sig.gpuBinding?.textureView\n\t\t};\n\t}\n\treturn { value: raw };\n}\n/**\n* A numeric parameter fed through `handleId`: a connected Number (clamped), a\n* connected Signal (sampled on the GPU, `val` stays `fallbackVal`), or else\n* `fallbackVal` clamped to [clampMin, clampMax].\n*/\nfunction resolveHandleParam(inputs, handleId, fallbackVal, clampMin, clampMax) {\n\tconst clamp = (v) => Math.max(clampMin, Math.min(clampMax, v));\n\tconst input = handleId ? inputs?.[handleId] : void 0;\n\tif (input?.connectionValid) {\n\t\tconst outputItem = input.outputItem;\n\t\tif (outputItem?.type === \"Number\") return {\n\t\t\tval: clamp(typeof outputItem.data === \"number\" ? outputItem.data : outputItem.data?.value ?? fallbackVal),\n\t\t\thasStaticSig: false,\n\t\t\tsd: null,\n\t\t\thandleId\n\t\t};\n\t\tif (outputItem?.type === \"Signal\" && outputItem.data) return {\n\t\t\tval: fallbackVal,\n\t\t\thasStaticSig: true,\n\t\t\tsd: outputItem.data,\n\t\t\thandleId\n\t\t};\n\t}\n\treturn {\n\t\tval: clamp(fallbackVal),\n\t\thasStaticSig: false,\n\t\tsd: null,\n\t\thandleId\n\t};\n}\n/**\n* A numeric field `fieldName` of a node operation, fed through its\n* `${fieldName}HandleId` input: a connected Signal/Numeric (`sd`, sampled on\n* the GPU; `value` is its offset), a connected Number, or the operation's own\n* value — each clamped to [minVal, maxVal].\n*/\nfunction resolveSignalField(op, fieldName, defaultValue, minVal = Number.NEGATIVE_INFINITY, maxVal = Number.POSITIVE_INFINITY) {\n\tconst clamp = (v) => Math.max(minVal, Math.min(maxVal, v));\n\tconst fields = op;\n\tconst handleId = fields[`${fieldName}HandleId`];\n\tconst signalInput = handleId ? op.inputs?.[handleId] : null;\n\tconst outputType = signalInput?.connectionValid ? signalInput.outputItem?.type : void 0;\n\tconst hasSignal = outputType === \"Signal\" || outputType === \"Numeric\";\n\tconst sd = hasSignal && signalInput?.outputItem?.data ? signalInput.outputItem.data : null;\n\tlet value = defaultValue;\n\tif (!hasSignal) {\n\t\tconst raw = outputType === \"Number\" ? signalInput?.outputItem?.data : fields[fieldName];\n\t\tvalue = clamp(Number(raw ?? defaultValue));\n\t} else if (sd) value = clamp(Number(sd.offset ?? defaultValue));\n\treturn {\n\t\thasSignal,\n\t\tsd,\n\t\tvalue\n\t};\n}\n/**\n* Whether the handle whose id is stored at `op[handleIdKey]` has a valid\n* Signal or Number connection.\n*/\nfunction isHandleConnected(op, handleIdKey) {\n\tconst handleId = op[handleIdKey];\n\tif (typeof handleId !== \"string\" || !handleId) return false;\n\tconst input = op.inputs?.[handleId];\n\treturn Boolean(input?.connectionValid && input.outputItem && (input.outputItem.type === \"Signal\" || input.outputItem.type === \"Number\"));\n}\nfunction defineRenderer(plugin) {\n\treturn Object.freeze(plugin);\n}\nconst GLOBAL_WEBGPU_REGISTRY_KEY = Symbol.for(\"framefields.webgpuRegistry\");\nvar WebGPURegistry = class {\n\trenderers = /* @__PURE__ */ new Map();\n\tregister(op, renderer) {\n\t\tthis.renderers.set(op, renderer);\n\t}\n\tget(op) {\n\t\treturn this.renderers.get(op);\n\t}\n\thas(op) {\n\t\treturn this.renderers.has(op);\n\t}\n};\nconst webgpuRegistry = (() => {\n\tconst g = globalThis;\n\tif (!g[GLOBAL_WEBGPU_REGISTRY_KEY]) g[GLOBAL_WEBGPU_REGISTRY_KEY] = new WebGPURegistry();\n\treturn g[GLOBAL_WEBGPU_REGISTRY_KEY];\n})();\nfunction registerWebGPURenderer(op, renderer) {\n\twebgpuRegistry.register(op, renderer);\n}\nregisterWebGPURenderer(\"TextureSource\", (args) => {\n\tconst op = args.props.virtualMedia.operation;\n\tif (op?.sourceTexture) args.ctx.renderer.drawTexture(args.pass, op.sourceTexture, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: args.targetWidth,\n\t\theight: args.targetHeight\n\t}, { opacity: Number(op.opacity ?? 1) });\n});\nvar AudioProcessorRegistry = class {\n\tprocessors = /* @__PURE__ */ new Map();\n\tregister(opType, processor) {\n\t\tthis.processors.set(opType, processor);\n\t}\n\tget(opType) {\n\t\treturn this.processors.get(opType) || null;\n\t}\n};\nconst GLOBAL_AUDIO_KEY = Symbol.for(\"framefields.audioRegistry\");\nconst audioRegistry = (() => {\n\tconst g = globalThis;\n\tif (!g[GLOBAL_AUDIO_KEY]) g[GLOBAL_AUDIO_KEY] = new AudioProcessorRegistry();\n\treturn g[GLOBAL_AUDIO_KEY];\n})();\n\n//#endregion\nexport { WebGPURegistry, audioRegistry, defineRenderer, isHandleConnected, isSignal, registerWebGPURenderer, resolveBoolean, resolveFrameNumber, resolveHandleParam, resolveNumber, resolveParam, resolveSignalField, resolveString, solveHomography, unwrapFrameParam, webgpuRegistry };\n//# sourceMappingURL=renderer.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-BgmO1Dzw.mjs","names":[],"sources":["../../node-sdk/dist/renderer.mjs"],"sourcesContent":["import { isSignal, resolveBoolean, resolveNumber, resolveParam, resolveString } from \"@framefields/core\";\n\n//#region renderer/homography.ts\n/**\n* Computes an 8-parameter 3x3 homography matrix mapping destination coordinates (quad)\n* to normalized source coordinates (unit square [0, 1]^2).\n*\n* The homography H maps destination (x, y) to source (u, v):\n* u = (h00*x + h01*y + h02) / (h20*x + h21*y + h22)\n* v = (h10*x + h11*y + h12) / (h20*x + h21*y + h22)\n*\n* Resulting array: [h00, h01, h02, h10, h11, h12, h20, h21, 1.0]\n*/\nfunction solveHomography(dstPoints, srcPoints = [\n\t{\n\t\tx: 0,\n\t\ty: 0\n\t},\n\t{\n\t\tx: 1,\n\t\ty: 0\n\t},\n\t{\n\t\tx: 0,\n\t\ty: 1\n\t},\n\t{\n\t\tx: 1,\n\t\ty: 1\n\t}\n]) {\n\tconst A = [];\n\tconst B = [];\n\tfor (let i = 0; i < 4; i++) {\n\t\tconst xi = dstPoints[i]?.x ?? 0;\n\t\tconst yi = dstPoints[i]?.y ?? 0;\n\t\tconst ui = srcPoints[i]?.x ?? 0;\n\t\tconst vi = srcPoints[i]?.y ?? 0;\n\t\tA.push([\n\t\t\txi,\n\t\t\tyi,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-xi * ui,\n\t\t\t-yi * ui\n\t\t]);\n\t\tB.push(ui);\n\t\tA.push([\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\txi,\n\t\t\tyi,\n\t\t\t1,\n\t\t\t-xi * vi,\n\t\t\t-yi * vi\n\t\t]);\n\t\tB.push(vi);\n\t}\n\tconst n = 8;\n\tfor (let i = 0; i < n; i++) {\n\t\tlet maxRow = i;\n\t\tlet maxVal = Math.abs(A[i][i]);\n\t\tfor (let k = i + 1; k < n; k++) if (Math.abs(A[k][i]) > maxVal) {\n\t\t\tmaxVal = Math.abs(A[k][i]);\n\t\t\tmaxRow = k;\n\t\t}\n\t\tconst tempRow = A[i];\n\t\tA[i] = A[maxRow];\n\t\tA[maxRow] = tempRow;\n\t\tconst tempB = B[i];\n\t\tB[i] = B[maxRow];\n\t\tB[maxRow] = tempB;\n\t\tconst pivot = A[i][i];\n\t\tif (Math.abs(pivot) < 1e-12) A[i][i] = pivot < 0 ? -1e-12 : 1e-12;\n\t\tfor (let k = i + 1; k < n; k++) {\n\t\t\tconst factor = A[k][i] / A[i][i];\n\t\t\tfor (let j = i; j < n; j++) A[k][j] -= factor * A[i][j];\n\t\t\tB[k] -= factor * B[i];\n\t\t}\n\t}\n\tconst h = new Array(8).fill(0);\n\tfor (let i = n - 1; i >= 0; i--) {\n\t\tlet sum = B[i];\n\t\tfor (let j = i + 1; j < n; j++) sum -= A[i][j] * h[j];\n\t\th[i] = sum / A[i][i];\n\t}\n\treturn [\n\t\th[0],\n\t\th[1],\n\t\th[2],\n\t\th[3],\n\t\th[4],\n\t\th[5],\n\t\th[6],\n\t\th[7],\n\t\t1\n\t];\n}\n\n//#endregion\n//#region renderer/index.ts\n/**\n* A numeric node parameter at `frame`: a number, a signal-like `get(ctx)` or\n* `{ value }`, a `(ctx) => number` function, or anything `Number()` accepts;\n* `fallback` when none of those yields a finite number.\n*/\nfunction resolveFrameNumber(val, fallback, frame, fps) {\n\tif (val === void 0 || val === null) return fallback;\n\tif (typeof val === \"number\") return Number.isFinite(val) ? val : fallback;\n\tif (typeof val === \"object\" && val !== null) {\n\t\tif (\"get\" in val && typeof val.get === \"function\") try {\n\t\t\tconst res = val.get({\n\t\t\t\tframe,\n\t\t\t\tfps,\n\t\t\t\ttime: fps > 0 ? frame / fps : 0,\n\t\t\t\tduration: 0,\n\t\t\t\tdurationMs: 0,\n\t\t\t\tprogress: 0,\n\t\t\t\tdeltaTime: fps > 0 ? 1 / fps : 0\n\t\t\t});\n\t\t\tconst n$1 = Number(res);\n\t\t\tif (Number.isFinite(n$1)) return n$1;\n\t\t} catch {}\n\t\tif (\"value\" in val) {\n\t\t\tconst n$1 = Number(val.value);\n\t\t\tif (Number.isFinite(n$1)) return n$1;\n\t\t}\n\t}\n\tif (typeof val === \"function\") try {\n\t\tconst n$1 = Number(val({\n\t\t\tframe,\n\t\t\tfps,\n\t\t\ttime: fps > 0 ? frame / fps : 0\n\t\t}));\n\t\tif (Number.isFinite(n$1)) return n$1;\n\t} catch {}\n\tconst n = Number(val);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/**\n* A static node parameter at `frame`: calls `get(ctx)` / `(frame, fps)`\n* functions and reads `{ value }` wrappers, keeping a signal's GPU texture\n* binding when it has one. Anything else is returned as-is.\n*/\nfunction unwrapFrameParam(raw, frame, fps) {\n\tif (raw === void 0 || raw === null) return { value: raw };\n\tif (typeof raw === \"function\") return { value: raw(frame, fps) };\n\tif (typeof raw !== \"object\") return { value: raw };\n\tconst obj = raw;\n\tif (typeof obj.get === \"function\") return { value: obj.get({\n\t\tframe,\n\t\tfps\n\t}) };\n\tif (\"value\" in obj) {\n\t\tconst sig = raw;\n\t\treturn {\n\t\t\tvalue: sig.value,\n\t\t\tgpuTextureView: sig.gpuBinding?.textureView\n\t\t};\n\t}\n\treturn { value: raw };\n}\n/**\n* A numeric parameter fed through `handleId`: a connected Number (clamped), a\n* connected Signal (sampled on the GPU, `val` stays `fallbackVal`), or else\n* `fallbackVal` clamped to [clampMin, clampMax].\n*/\nfunction resolveHandleParam(inputs, handleId, fallbackVal, clampMin, clampMax) {\n\tconst clamp = (v) => Math.max(clampMin, Math.min(clampMax, v));\n\tconst input = handleId ? inputs?.[handleId] : void 0;\n\tif (input?.connectionValid) {\n\t\tconst outputItem = input.outputItem;\n\t\tif (outputItem?.type === \"Number\") return {\n\t\t\tval: clamp(typeof outputItem.data === \"number\" ? outputItem.data : outputItem.data?.value ?? fallbackVal),\n\t\t\thasStaticSig: false,\n\t\t\tsd: null,\n\t\t\thandleId\n\t\t};\n\t\tif (outputItem?.type === \"Signal\" && outputItem.data) return {\n\t\t\tval: fallbackVal,\n\t\t\thasStaticSig: true,\n\t\t\tsd: outputItem.data,\n\t\t\thandleId\n\t\t};\n\t}\n\treturn {\n\t\tval: clamp(fallbackVal),\n\t\thasStaticSig: false,\n\t\tsd: null,\n\t\thandleId\n\t};\n}\n/**\n* A numeric field `fieldName` of a node operation, fed through its\n* `${fieldName}HandleId` input: a connected Signal/Numeric (`sd`, sampled on\n* the GPU; `value` is its offset), a connected Number, or the operation's own\n* value — each clamped to [minVal, maxVal].\n*/\nfunction resolveSignalField(op, fieldName, defaultValue, minVal = Number.NEGATIVE_INFINITY, maxVal = Number.POSITIVE_INFINITY) {\n\tconst clamp = (v) => Math.max(minVal, Math.min(maxVal, v));\n\tconst fields = op;\n\tconst handleId = fields[`${fieldName}HandleId`];\n\tconst signalInput = handleId ? op.inputs?.[handleId] : null;\n\tconst outputType = signalInput?.connectionValid ? signalInput.outputItem?.type : void 0;\n\tconst hasSignal = outputType === \"Signal\" || outputType === \"Numeric\";\n\tconst sd = hasSignal && signalInput?.outputItem?.data ? signalInput.outputItem.data : null;\n\tlet value = defaultValue;\n\tif (!hasSignal) {\n\t\tconst raw = outputType === \"Number\" ? signalInput?.outputItem?.data : fields[fieldName];\n\t\tvalue = clamp(Number(raw ?? defaultValue));\n\t} else if (sd) value = clamp(Number(sd.offset ?? defaultValue));\n\treturn {\n\t\thasSignal,\n\t\tsd,\n\t\tvalue\n\t};\n}\n/**\n* Whether the handle whose id is stored at `op[handleIdKey]` has a valid\n* Signal or Number connection.\n*/\nfunction isHandleConnected(op, handleIdKey) {\n\tconst handleId = op[handleIdKey];\n\tif (typeof handleId !== \"string\" || !handleId) return false;\n\tconst input = op.inputs?.[handleId];\n\treturn Boolean(input?.connectionValid && input.outputItem && (input.outputItem.type === \"Signal\" || input.outputItem.type === \"Number\"));\n}\nfunction defineRenderer(plugin) {\n\treturn Object.freeze(plugin);\n}\nconst GLOBAL_WEBGPU_REGISTRY_KEY = Symbol.for(\"framefields.webgpuRegistry\");\nvar WebGPURegistry = class {\n\trenderers = /* @__PURE__ */ new Map();\n\tregister(op, renderer) {\n\t\tthis.renderers.set(op, renderer);\n\t}\n\tget(op) {\n\t\treturn this.renderers.get(op);\n\t}\n\thas(op) {\n\t\treturn this.renderers.has(op);\n\t}\n};\nconst webgpuRegistry = (() => {\n\tconst g = globalThis;\n\tif (!g[GLOBAL_WEBGPU_REGISTRY_KEY]) g[GLOBAL_WEBGPU_REGISTRY_KEY] = new WebGPURegistry();\n\treturn g[GLOBAL_WEBGPU_REGISTRY_KEY];\n})();\nfunction registerWebGPURenderer(op, renderer) {\n\twebgpuRegistry.register(op, renderer);\n}\n/**\n* How far an operation's effect draws past its pixels, from its registered\n* renderer; `null` when unknown: no renderer, no `reach`, or no answer.\n*/\nfunction effectReach(operation) {\n\tconst op = operation.op;\n\tif (typeof op !== \"string\") return null;\n\treturn webgpuRegistry.get(op)?.reach?.(operation) ?? null;\n}\nregisterWebGPURenderer(\"TextureSource\", (args) => {\n\tconst op = args.props.virtualMedia.operation;\n\tif (op?.sourceTexture) args.ctx.renderer.drawTexture(args.pass, op.sourceTexture, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: args.targetWidth,\n\t\theight: args.targetHeight\n\t}, { opacity: Number(op.opacity ?? 1) });\n});\nvar AudioProcessorRegistry = class {\n\tprocessors = /* @__PURE__ */ new Map();\n\tregister(opType, processor) {\n\t\tthis.processors.set(opType, processor);\n\t}\n\tget(opType) {\n\t\treturn this.processors.get(opType) || null;\n\t}\n};\nconst GLOBAL_AUDIO_KEY = Symbol.for(\"framefields.audioRegistry\");\nconst audioRegistry = (() => {\n\tconst g = globalThis;\n\tif (!g[GLOBAL_AUDIO_KEY]) g[GLOBAL_AUDIO_KEY] = new AudioProcessorRegistry();\n\treturn g[GLOBAL_AUDIO_KEY];\n})();\n\n//#endregion\nexport { WebGPURegistry, audioRegistry, defineRenderer, effectReach, isHandleConnected, isSignal, registerWebGPURenderer, resolveBoolean, resolveFrameNumber, resolveHandleParam, resolveNumber, resolveParam, resolveSignalField, resolveString, solveHomography, unwrapFrameParam, webgpuRegistry };\n//# sourceMappingURL=renderer.mjs.map"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-D7gtBK74.mjs";
2
+ import "./dist-BuirkW-f.mjs";
3
+ import { t as renderers_default } from "./renderer-BKJ8cywK.mjs";
4
+
5
+ export { renderers_default as default };
@@ -0,0 +1,5 @@
1
+ import "./chunk-D7gtBK74.mjs";
2
+ import "./dist-BuirkW-f.mjs";
3
+ import { n as renderers_default, t as WebGPURenderer } from "./renderer-BZ5uOfoX.mjs";
4
+
5
+ export { WebGPURenderer, renderers_default as default };
@@ -1,8 +1,8 @@
1
1
  import "./chunk-D7gtBK74.mjs";
2
2
  import { Ot as getActiveMediaMetadata } from "./dist-D021IFfp.mjs";
3
- import { n as defineRenderer } from "./renderer-C9r0-KY4.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";
3
+ import { n as defineRenderer } from "./renderer-BgmO1Dzw.mjs";
4
+ import "./dist-BuirkW-f.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-BRBIoxMC.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-BIt-At3v.mjs.map
254
+ //# sourceMappingURL=renderer-BlU3Sh_0.mjs.map
@@ -1 +1 @@
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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"}
1
+ {"version":3,"file":"renderer-BlU3Sh_0.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,5 @@
1
+ import "./chunk-D7gtBK74.mjs";
2
+ import "./dist-BuirkW-f.mjs";
3
+ import { t as renderers_default } from "./renderer-DVGVcDvB.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,7 +1,7 @@
1
1
  import "./chunk-D7gtBK74.mjs";
2
- import { n as defineRenderer } from "./renderer-C9r0-KY4.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";
2
+ import { n as defineRenderer } from "./renderer-BgmO1Dzw.mjs";
3
+ import "./dist-BuirkW-f.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-BRBIoxMC.mjs";
5
5
 
6
6
  //#region ../../nodes/node-dither/dist/renderers-v80Aclc6.mjs
7
7
  const OP = "Dither";
@@ -217,4 +217,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: DitherWebGPURenderer })
217
217
 
218
218
  //#endregion
219
219
  export { DitherWebGPURenderer, renderers_default as default };
220
- //# sourceMappingURL=renderer-CxkUI9s_.mjs.map
220
+ //# sourceMappingURL=renderer-BrKgtYq4.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CxkUI9s_.mjs","names":[],"sources":["../../../nodes/node-dither/dist/renderers-v80Aclc6.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 = \"Dither\";\nconst UNIFORM_FLOATS = 16;\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>, 4> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet mode = u32(u.v[1].x + 0.5);\n\tlet levels = u.v[1].y;\n\tlet scale = u.v[1].z;\n\tlet monochrome = u.v[1].w;\n\tlet dark = u.v[2];\n\tlet light = u.v[3];\n\n\tlet R = res();\n\tlet s = max(scale, 1.0);\n\tlet cellp = floor(in.uv * R / s);\n\tlet c = texelS(cellp * s + s * 0.5);\n\tvar t = bayer8(cellp);\n\tif (mode == 1u) { t = hash12(cellp); }\n\tif (mode == 2u) { t = clamp(length(fract(cellp / 4.0) - 0.5) * 1.414, 0.0, 1.0); }\n\tlet n = max(levels - 1.0, 1.0);\n\tvar rgb : vec3<f32>;\n\tif (monochrome > 0.5) {\n\t\tlet q = clamp(floor(luma(c.rgb) * n + t) / n, 0.0, 1.0);\n\t\trgb = mix(dark.rgb, light.rgb, q);\n\t} else {\n\t\trgb = clamp(floor(c.rgb * n + vec3<f32>(t)) / n, vec3<f32>(0.0), vec3<f32>(1.0));\n\t}\n\treturn premul(vec4<f32>(rgb, c.a));\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\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] = Math.max(0, [\n\t\t\"bayer\",\n\t\t\"noise\",\n\t\t\"halftone\"\n\t].indexOf(String(raw.mode ?? \"bayer\")));\n\tdata[5] = num(raw.levels, 2);\n\tdata[6] = num(raw.scale, 2);\n\tdata[7] = raw.monochrome === void 0 ? 1 : raw.monochrome ? 1 : 0;\n\tdata.set(hexToRgba(String(raw.dark ?? \"#111111\")), 8);\n\tdata.set(hexToRgba(String(raw.light ?? \"#f2efe6\")), 12);\n}\nconst DitherWebGPURenderer = 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: DitherWebGPURenderer });\n\n//#endregion\nexport { DitherWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-v80Aclc6.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-BrKgtYq4.mjs","names":[],"sources":["../../../nodes/node-dither/dist/renderers-v80Aclc6.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 = \"Dither\";\nconst UNIFORM_FLOATS = 16;\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>, 4> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet mode = u32(u.v[1].x + 0.5);\n\tlet levels = u.v[1].y;\n\tlet scale = u.v[1].z;\n\tlet monochrome = u.v[1].w;\n\tlet dark = u.v[2];\n\tlet light = u.v[3];\n\n\tlet R = res();\n\tlet s = max(scale, 1.0);\n\tlet cellp = floor(in.uv * R / s);\n\tlet c = texelS(cellp * s + s * 0.5);\n\tvar t = bayer8(cellp);\n\tif (mode == 1u) { t = hash12(cellp); }\n\tif (mode == 2u) { t = clamp(length(fract(cellp / 4.0) - 0.5) * 1.414, 0.0, 1.0); }\n\tlet n = max(levels - 1.0, 1.0);\n\tvar rgb : vec3<f32>;\n\tif (monochrome > 0.5) {\n\t\tlet q = clamp(floor(luma(c.rgb) * n + t) / n, 0.0, 1.0);\n\t\trgb = mix(dark.rgb, light.rgb, q);\n\t} else {\n\t\trgb = clamp(floor(c.rgb * n + vec3<f32>(t)) / n, vec3<f32>(0.0), vec3<f32>(1.0));\n\t}\n\treturn premul(vec4<f32>(rgb, c.a));\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\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] = Math.max(0, [\n\t\t\"bayer\",\n\t\t\"noise\",\n\t\t\"halftone\"\n\t].indexOf(String(raw.mode ?? \"bayer\")));\n\tdata[5] = num(raw.levels, 2);\n\tdata[6] = num(raw.scale, 2);\n\tdata[7] = raw.monochrome === void 0 ? 1 : raw.monochrome ? 1 : 0;\n\tdata.set(hexToRgba(String(raw.dark ?? \"#111111\")), 8);\n\tdata.set(hexToRgba(String(raw.light ?? \"#f2efe6\")), 12);\n}\nconst DitherWebGPURenderer = 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: DitherWebGPURenderer });\n\n//#endregion\nexport { DitherWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-v80Aclc6.mjs.map"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import "./chunk-D7gtBK74.mjs";
2
- import { n as defineRenderer } from "./renderer-C9r0-KY4.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";
2
+ import { n as defineRenderer } from "./renderer-BgmO1Dzw.mjs";
3
+ import "./dist-BuirkW-f.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-BRBIoxMC.mjs";
5
5
 
6
6
  //#region ../../nodes/node-ascii/dist/renderers-Cc5sWRRu.mjs
7
7
  const OP = "Ascii";
@@ -220,4 +220,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: AsciiWebGPURenderer });
220
220
 
221
221
  //#endregion
222
222
  export { AsciiWebGPURenderer, renderers_default as default };
223
- //# sourceMappingURL=renderer-NL2IZShC.mjs.map
223
+ //# sourceMappingURL=renderer-Bs6BaMLf.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-NL2IZShC.mjs","names":[],"sources":["../../../nodes/node-ascii/dist/renderers-Cc5sWRRu.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 = \"Ascii\";\nconst UNIFORM_FLOATS = 16;\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>, 4> };\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); }\nconst GLYPH_BITS = array<u32, 10>(0u, 4194304u, 131200u, 14336u, 459200u, 145536u, 332096u, 11512810u, 27070835u, 15652782u);\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 cellSize = u.v[1].x;\n\tlet colorMode = u32(u.v[1].y + 0.5);\n\tlet fg = u.v[2];\n\tlet bg = u.v[3];\n\tlet contrast = u.v[1].z;\n\tlet invert = u.v[1].w;\n\n\tlet R = res();\n\tlet cs = max(cellSize, 2.0);\n\tlet cp = floor(in.uv * R / cs);\n\tlet col = sampleS((cp + 0.5) * cs / R);\n\tvar l = clamp((luma(col.rgb) - 0.5) * contrast + 0.5, 0.0, 1.0) * col.a;\n\tif (invert > 0.5) { l = 1.0 - l; }\n\tlet idx = min(u32(l * 9.999), 9u);\n\tlet f = in.uv * R / cs - cp;\n\tlet gx = i32(floor(f.x * 6.0));\n\tlet gy = i32(floor(f.y * 6.0));\n\tvar on = 0.0;\n\tif (gx < 5 && gy < 5) {\n\t\ton = f32((GLYPH_BITS[idx] >> u32(gy * 5 + gx)) & 1u);\n\t}\n\tvar fgc = fg.rgb;\n\tif (colorMode == 1u) { fgc = col.rgb * 1.25; }\n\tif (colorMode == 2u) { fgc = vec3<f32>(0.25, 1.0, 0.45) * (0.4 + 0.6 * l); }\n\treturn vec4<f32>(mix(bg.rgb, fgc, on), 1.0);\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\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.cellSize, 10);\n\tdata[5] = Math.max(0, [\n\t\t\"mono\",\n\t\t\"source\",\n\t\t\"green\"\n\t].indexOf(String(raw.colorMode ?? \"mono\")));\n\tdata.set(hexToRgba(String(raw.fg ?? \"#e8e8e8\")), 8);\n\tdata.set(hexToRgba(String(raw.bg ?? \"#0b0b0b\")), 12);\n\tdata[6] = num(raw.contrast, 1.2);\n\tdata[7] = raw.invert === void 0 ? 0 : raw.invert ? 1 : 0;\n}\nconst AsciiWebGPURenderer = 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: AsciiWebGPURenderer });\n\n//#endregion\nexport { AsciiWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-Cc5sWRRu.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-Bs6BaMLf.mjs","names":[],"sources":["../../../nodes/node-ascii/dist/renderers-Cc5sWRRu.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 = \"Ascii\";\nconst UNIFORM_FLOATS = 16;\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>, 4> };\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); }\nconst GLYPH_BITS = array<u32, 10>(0u, 4194304u, 131200u, 14336u, 459200u, 145536u, 332096u, 11512810u, 27070835u, 15652782u);\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 cellSize = u.v[1].x;\n\tlet colorMode = u32(u.v[1].y + 0.5);\n\tlet fg = u.v[2];\n\tlet bg = u.v[3];\n\tlet contrast = u.v[1].z;\n\tlet invert = u.v[1].w;\n\n\tlet R = res();\n\tlet cs = max(cellSize, 2.0);\n\tlet cp = floor(in.uv * R / cs);\n\tlet col = sampleS((cp + 0.5) * cs / R);\n\tvar l = clamp((luma(col.rgb) - 0.5) * contrast + 0.5, 0.0, 1.0) * col.a;\n\tif (invert > 0.5) { l = 1.0 - l; }\n\tlet idx = min(u32(l * 9.999), 9u);\n\tlet f = in.uv * R / cs - cp;\n\tlet gx = i32(floor(f.x * 6.0));\n\tlet gy = i32(floor(f.y * 6.0));\n\tvar on = 0.0;\n\tif (gx < 5 && gy < 5) {\n\t\ton = f32((GLYPH_BITS[idx] >> u32(gy * 5 + gx)) & 1u);\n\t}\n\tvar fgc = fg.rgb;\n\tif (colorMode == 1u) { fgc = col.rgb * 1.25; }\n\tif (colorMode == 2u) { fgc = vec3<f32>(0.25, 1.0, 0.45) * (0.4 + 0.6 * l); }\n\treturn vec4<f32>(mix(bg.rgb, fgc, on), 1.0);\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\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.cellSize, 10);\n\tdata[5] = Math.max(0, [\n\t\t\"mono\",\n\t\t\"source\",\n\t\t\"green\"\n\t].indexOf(String(raw.colorMode ?? \"mono\")));\n\tdata.set(hexToRgba(String(raw.fg ?? \"#e8e8e8\")), 8);\n\tdata.set(hexToRgba(String(raw.bg ?? \"#0b0b0b\")), 12);\n\tdata[6] = num(raw.contrast, 1.2);\n\tdata[7] = raw.invert === void 0 ? 0 : raw.invert ? 1 : 0;\n}\nconst AsciiWebGPURenderer = 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: AsciiWebGPURenderer });\n\n//#endregion\nexport { AsciiWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-Cc5sWRRu.mjs.map"],"mappings":";;;;;;AAIA,MAAM,KAAK;AACX,MAAM,iBAAiB;;AAEvB,MAAM,SAAS,CAAC;;;;;EAKd,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2ErB;AACF,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,UAAU,GAAG;AAC/B,MAAK,KAAK,KAAK,IAAI,GAAG;EACrB;EACA;EACA;EACA,CAAC,QAAQ,OAAO,IAAI,aAAa,OAAO,CAAC,CAAC;AAC3C,MAAK,IAAI,UAAU,OAAO,IAAI,MAAM,UAAU,CAAC,EAAE,EAAE;AACnD,MAAK,IAAI,UAAU,OAAO,IAAI,MAAM,UAAU,CAAC,EAAE,GAAG;AACpD,MAAK,KAAK,IAAI,IAAI,UAAU,IAAI;AAChC,MAAK,KAAK,IAAI,WAAW,KAAK,IAAI,IAAI,IAAI,SAAS,IAAI;;AAExD,MAAM,sBAAsB,OAAO,SAAS;CAC3C,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,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { t as renderers_default } from "./renderer-CdxNwGeb.mjs";
2
+
3
+ export { renderers_default as default };
@@ -1,5 +1,5 @@
1
- import { Fn as signalRegistry, K as parseColor } from "./dist-Bf0H4lp1.mjs";
2
- import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-CevnCkZC.mjs";
1
+ import { In as signalRegistry, q as parseColor } from "./dist-BuirkW-f.mjs";
2
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-BRBIoxMC.mjs";
3
3
 
4
4
  //#region ../../nodes/node-gradient-map/dist/renderers-DDdRKrlK.mjs
5
5
  const deviceResourceCache = /* @__PURE__ */ new WeakMap();
@@ -206,4 +206,4 @@ var renderers_default = { WebGPURenderer: GradientMapWebGPURenderer };
206
206
 
207
207
  //#endregion
208
208
  export { renderers_default as n, GradientMapWebGPURenderer as t };
209
- //# sourceMappingURL=renderer-Bk7vVfTu.mjs.map
209
+ //# sourceMappingURL=renderer-BvA4sQz5.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-Bk7vVfTu.mjs","names":[],"sources":["../../../nodes/node-gradient-map/dist/renderers-DDdRKrlK.mjs"],"sourcesContent":["import { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTiming } from \"@framefields/node-sdk/gpu\";\nimport { parseColor, signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst WGSL_GRADIENT_MAP_SHADER = `\nstruct GradientStop {\n\tpos : vec4<f32>,\n\tcol : vec4<f32>,\n};\n\nstruct GradientMapUniforms {\n\tnumStops : f32,\n\tisSmooth : f32,\n\tdither : f32,\n\topacity : f32,\n\n\thasOpacitySig : f32,\n\tpad0 : f32,\n\tpad1 : f32,\n\tpad2 : f32,\n\n\tstops : array<GradientStop, 16>,\n};\n\n@group(0) @binding(0) var<uniform> u : GradientMapUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(2) @binding(0) var opacitySigTex : texture_2d<f32>;\n@group(2) @binding(1) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn ditherNoise(pos: vec2<f32>) -> f32 {\n\tlet p = fract(pos * vec2<f32>(0.1031, 0.1030));\n\tlet d = dot(p, p.yx + 33.33);\n\treturn fract((p.x + p.y) * d) - 0.5;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tif (color.a <= 0.00001) {\n\t\treturn color;\n\t}\n\n\tlet alpha = color.a;\n\tlet rgb = color.rgb / max(alpha, 0.0001);\n\n\t// ITU-R BT.709 Luminance\n\tvar lum = dot(rgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n\n\tif (u.dither > 0.5) {\n\t\tlet d = ditherNoise(in.pos.xy) * (1.0 / 255.0);\n\t\tlum = clamp(lum + d, 0.0, 1.0);\n\t} else {\n\t\tlum = clamp(lum, 0.0, 1.0);\n\t}\n\n\tlet count = i32(clamp(u.numStops, 2.0, 16.0));\n\tvar gradColor = u.stops[0].col.rgb;\n\n\tif (lum <= u.stops[0].pos.x) {\n\t\tgradColor = u.stops[0].col.rgb;\n\t} else if (lum >= u.stops[count - 1].pos.x) {\n\t\tgradColor = u.stops[count - 1].col.rgb;\n\t} else {\n\t\tfor (var i = 0; i < 15; i = i + 1) {\n\t\t\tif (i >= count - 1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tlet p0 = u.stops[i].pos.x;\n\t\t\tlet p1 = u.stops[i + 1].pos.x;\n\n\t\t\tif (lum >= p0 && lum <= p1) {\n\t\t\t\tlet range = max(p1 - p0, 1e-5);\n\t\t\t\tlet t = clamp((lum - p0) / range, 0.0, 1.0);\n\t\t\t\tif (u.isSmooth > 0.5) {\n\t\t\t\t\tgradColor = mix(u.stops[i].col.rgb, u.stops[i + 1].col.rgb, t);\n\t\t\t\t} else {\n\t\t\t\t\tgradColor = u.stops[i].col.rgb;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tvar opacity = u.opacity;\n\tif (u.hasOpacitySig > 0.5) {\n\t\topacity = textureSampleLevel(opacitySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\topacity = clamp(opacity, 0.0, 1.0);\n\n\tlet finalRgb = mix(rgb, gradColor, opacity);\n\treturn vec4<f32>(finalRgb * alpha, alpha);\n}\n`;\nfunction getGradientMapResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"], \"GradientMapUniformLayout\");\n\tconst textureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"], \"GradientMapTextureLayout\");\n\tconst signalLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"], \"GradientMapSignalLayout\");\n\tres = {\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tlabel: \"GradientMapPipeline\",\n\t\t\tmodule: device.createShaderModule({\n\t\t\t\tlabel: \"GradientMapShaderModule\",\n\t\t\t\tcode: WGSL_GRADIENT_MAP_SHADER\n\t\t\t}),\n\t\t\tlayouts: [\n\t\t\t\tuniformLayout,\n\t\t\t\ttextureLayout,\n\t\t\t\tsignalLayout\n\t\t\t],\n\t\t\tformat\n\t\t}),\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalLayout\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst uniformBufferData = new Float32Array(136);\nconst GradientMapWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"GradientMap\" || !props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst childMedia = props.virtualMedia.children[0];\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst sortedStops = [...Array.isArray(op.stops) ? op.stops : [{\n\t\tposition: 0,\n\t\tcolor: \"#000000\"\n\t}, {\n\t\tposition: 1,\n\t\tcolor: \"#ffffff\"\n\t}]].sort((a, b) => a.position - b.position);\n\tconst numStops = Math.min(Math.max(sortedStops.length, 2), 16);\n\tconst opacityHandleId = op.opacityHandleId;\n\tconst opacitySignalInput = opacityHandleId ? op.inputs?.[opacityHandleId] : null;\n\tconst hasOpacitySig = !!(opacitySignalInput?.connectionValid && opacitySignalInput.outputItem?.type === \"Signal\");\n\tconst opacitySigData = hasOpacitySig ? opacitySignalInput?.outputItem?.data : null;\n\tlet opacityVal = Number(op.opacity ?? 1);\n\tif (!hasOpacitySig && opacitySignalInput?.connectionValid && opacitySignalInput.outputItem?.type === \"Number\") opacityVal = Number(opacitySignalInput.outputItem.data ?? 1);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tlet opacityView;\n\tif (hasOpacitySig && opacitySigData) opacityView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, opacitySigData.nodeId ?? \"gradient_map_opacity\", elapsedSeconds, durationSeconds, opacitySigData, width, height, props.renderId, frame, fps);\n\telse opacityView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tuniformBufferData.fill(0);\n\tuniformBufferData[0] = numStops;\n\tuniformBufferData[1] = op.smooth === false ? 0 : 1;\n\tuniformBufferData[2] = op.dither === false ? 0 : 1;\n\tuniformBufferData[3] = opacityVal;\n\tuniformBufferData[4] = hasOpacitySig ? 1 : 0;\n\tuniformBufferData[5] = 0;\n\tuniformBufferData[6] = 0;\n\tuniformBufferData[7] = 0;\n\tfor (let i = 0; i < 16; i++) {\n\t\tconst stop = sortedStops[Math.min(i, numStops - 1)];\n\t\tconst baseIdx = 8 + i * 8;\n\t\tconst parsed = parseColor(stop.color);\n\t\tuniformBufferData[baseIdx + 0] = stop.position;\n\t\tuniformBufferData[baseIdx + 1] = 0;\n\t\tuniformBufferData[baseIdx + 2] = 0;\n\t\tuniformBufferData[baseIdx + 3] = 0;\n\t\tuniformBufferData[baseIdx + 4] = parsed.r;\n\t\tuniformBufferData[baseIdx + 5] = parsed.g;\n\t\tuniformBufferData[baseIdx + 6] = parsed.b;\n\t\tuniformBufferData[baseIdx + 7] = parsed.a;\n\t}\n\tconst { pipeline, uniformLayout, textureLayout, signalLayout } = getGradientMapResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst buffer = ctx.renderer.getTemporaryBuffer(uniformBufferData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uniformLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, textureLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: signalLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: opacityView\n\t\t\t}, {\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t}]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, props.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = { WebGPURenderer: GradientMapWebGPURenderer };\n\n//#endregion\nexport { GradientMapWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-DDdRKrlK.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-BvA4sQz5.mjs","names":[],"sources":["../../../nodes/node-gradient-map/dist/renderers-DDdRKrlK.mjs"],"sourcesContent":["import { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTiming } from \"@framefields/node-sdk/gpu\";\nimport { parseColor, signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst WGSL_GRADIENT_MAP_SHADER = `\nstruct GradientStop {\n\tpos : vec4<f32>,\n\tcol : vec4<f32>,\n};\n\nstruct GradientMapUniforms {\n\tnumStops : f32,\n\tisSmooth : f32,\n\tdither : f32,\n\topacity : f32,\n\n\thasOpacitySig : f32,\n\tpad0 : f32,\n\tpad1 : f32,\n\tpad2 : f32,\n\n\tstops : array<GradientStop, 16>,\n};\n\n@group(0) @binding(0) var<uniform> u : GradientMapUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(2) @binding(0) var opacitySigTex : texture_2d<f32>;\n@group(2) @binding(1) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn ditherNoise(pos: vec2<f32>) -> f32 {\n\tlet p = fract(pos * vec2<f32>(0.1031, 0.1030));\n\tlet d = dot(p, p.yx + 33.33);\n\treturn fract((p.x + p.y) * d) - 0.5;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tif (color.a <= 0.00001) {\n\t\treturn color;\n\t}\n\n\tlet alpha = color.a;\n\tlet rgb = color.rgb / max(alpha, 0.0001);\n\n\t// ITU-R BT.709 Luminance\n\tvar lum = dot(rgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n\n\tif (u.dither > 0.5) {\n\t\tlet d = ditherNoise(in.pos.xy) * (1.0 / 255.0);\n\t\tlum = clamp(lum + d, 0.0, 1.0);\n\t} else {\n\t\tlum = clamp(lum, 0.0, 1.0);\n\t}\n\n\tlet count = i32(clamp(u.numStops, 2.0, 16.0));\n\tvar gradColor = u.stops[0].col.rgb;\n\n\tif (lum <= u.stops[0].pos.x) {\n\t\tgradColor = u.stops[0].col.rgb;\n\t} else if (lum >= u.stops[count - 1].pos.x) {\n\t\tgradColor = u.stops[count - 1].col.rgb;\n\t} else {\n\t\tfor (var i = 0; i < 15; i = i + 1) {\n\t\t\tif (i >= count - 1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tlet p0 = u.stops[i].pos.x;\n\t\t\tlet p1 = u.stops[i + 1].pos.x;\n\n\t\t\tif (lum >= p0 && lum <= p1) {\n\t\t\t\tlet range = max(p1 - p0, 1e-5);\n\t\t\t\tlet t = clamp((lum - p0) / range, 0.0, 1.0);\n\t\t\t\tif (u.isSmooth > 0.5) {\n\t\t\t\t\tgradColor = mix(u.stops[i].col.rgb, u.stops[i + 1].col.rgb, t);\n\t\t\t\t} else {\n\t\t\t\t\tgradColor = u.stops[i].col.rgb;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tvar opacity = u.opacity;\n\tif (u.hasOpacitySig > 0.5) {\n\t\topacity = textureSampleLevel(opacitySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\topacity = clamp(opacity, 0.0, 1.0);\n\n\tlet finalRgb = mix(rgb, gradColor, opacity);\n\treturn vec4<f32>(finalRgb * alpha, alpha);\n}\n`;\nfunction getGradientMapResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"], \"GradientMapUniformLayout\");\n\tconst textureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"], \"GradientMapTextureLayout\");\n\tconst signalLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"], \"GradientMapSignalLayout\");\n\tres = {\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tlabel: \"GradientMapPipeline\",\n\t\t\tmodule: device.createShaderModule({\n\t\t\t\tlabel: \"GradientMapShaderModule\",\n\t\t\t\tcode: WGSL_GRADIENT_MAP_SHADER\n\t\t\t}),\n\t\t\tlayouts: [\n\t\t\t\tuniformLayout,\n\t\t\t\ttextureLayout,\n\t\t\t\tsignalLayout\n\t\t\t],\n\t\t\tformat\n\t\t}),\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalLayout\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst uniformBufferData = new Float32Array(136);\nconst GradientMapWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"GradientMap\" || !props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst childMedia = props.virtualMedia.children[0];\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst sortedStops = [...Array.isArray(op.stops) ? op.stops : [{\n\t\tposition: 0,\n\t\tcolor: \"#000000\"\n\t}, {\n\t\tposition: 1,\n\t\tcolor: \"#ffffff\"\n\t}]].sort((a, b) => a.position - b.position);\n\tconst numStops = Math.min(Math.max(sortedStops.length, 2), 16);\n\tconst opacityHandleId = op.opacityHandleId;\n\tconst opacitySignalInput = opacityHandleId ? op.inputs?.[opacityHandleId] : null;\n\tconst hasOpacitySig = !!(opacitySignalInput?.connectionValid && opacitySignalInput.outputItem?.type === \"Signal\");\n\tconst opacitySigData = hasOpacitySig ? opacitySignalInput?.outputItem?.data : null;\n\tlet opacityVal = Number(op.opacity ?? 1);\n\tif (!hasOpacitySig && opacitySignalInput?.connectionValid && opacitySignalInput.outputItem?.type === \"Number\") opacityVal = Number(opacitySignalInput.outputItem.data ?? 1);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tlet opacityView;\n\tif (hasOpacitySig && opacitySigData) opacityView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, opacitySigData.nodeId ?? \"gradient_map_opacity\", elapsedSeconds, durationSeconds, opacitySigData, width, height, props.renderId, frame, fps);\n\telse opacityView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tuniformBufferData.fill(0);\n\tuniformBufferData[0] = numStops;\n\tuniformBufferData[1] = op.smooth === false ? 0 : 1;\n\tuniformBufferData[2] = op.dither === false ? 0 : 1;\n\tuniformBufferData[3] = opacityVal;\n\tuniformBufferData[4] = hasOpacitySig ? 1 : 0;\n\tuniformBufferData[5] = 0;\n\tuniformBufferData[6] = 0;\n\tuniformBufferData[7] = 0;\n\tfor (let i = 0; i < 16; i++) {\n\t\tconst stop = sortedStops[Math.min(i, numStops - 1)];\n\t\tconst baseIdx = 8 + i * 8;\n\t\tconst parsed = parseColor(stop.color);\n\t\tuniformBufferData[baseIdx + 0] = stop.position;\n\t\tuniformBufferData[baseIdx + 1] = 0;\n\t\tuniformBufferData[baseIdx + 2] = 0;\n\t\tuniformBufferData[baseIdx + 3] = 0;\n\t\tuniformBufferData[baseIdx + 4] = parsed.r;\n\t\tuniformBufferData[baseIdx + 5] = parsed.g;\n\t\tuniformBufferData[baseIdx + 6] = parsed.b;\n\t\tuniformBufferData[baseIdx + 7] = parsed.a;\n\t}\n\tconst { pipeline, uniformLayout, textureLayout, signalLayout } = getGradientMapResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst buffer = ctx.renderer.getTemporaryBuffer(uniformBufferData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uniformLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, textureLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: signalLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: opacityView\n\t\t\t}, {\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t}]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, props.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = { WebGPURenderer: GradientMapWebGPURenderer };\n\n//#endregion\nexport { GradientMapWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-DDdRKrlK.mjs.map"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { cn as resolveNumber } from "./dist-D021IFfp.mjs";
2
- import { n as defineRenderer, r as isHandleConnected } from "./renderer-C9r0-KY4.mjs";
3
- import { g as WebGPUAudioProcessor } from "./dist-Bf0H4lp1.mjs";
2
+ import { i as isHandleConnected, n as defineRenderer } from "./renderer-BgmO1Dzw.mjs";
3
+ import { g as WebGPUAudioProcessor } from "./dist-BuirkW-f.mjs";
4
4
 
5
5
  //#region ../../nodes/node-audio-noise-gate/dist/renderers-AuTJmGew.mjs
6
6
  const PARAM_ORDER = [
@@ -279,4 +279,4 @@ var renderers_default = defineRenderer({ audioProcessor: noiseGateAudioProcessor
279
279
 
280
280
  //#endregion
281
281
  export { renderers_default as t };
282
- //# sourceMappingURL=renderer-BwRLXhxJ.mjs.map
282
+ //# sourceMappingURL=renderer-Bvizxddu.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-BwRLXhxJ.mjs","names":[],"sources":["../../../nodes/node-audio-noise-gate/dist/renderers-AuTJmGew.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveNumber } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"threshold\",\n\t\"attack\",\n\t\"hold\",\n\t\"release\",\n\t\"range\"\n];\nconst NOISE_GATE_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n threshold : f32,\n attack : f32,\n hold : f32,\n release : f32,\n closedGain : f32,\n windowLength : f32,\n hasThresholdSig : f32,\n hasAttackSig : f32,\n hasHoldSig : f32,\n hasReleaseSig : f32,\n hasRangeSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var<storage, read> inputChannels : array<f32>;\n@group(0) @binding(2) var<storage, read_write> outputChannels : array<f32>;\n@group(0) @binding(3) var<storage, read_write> state : array<f32>;\n@group(0) @binding(4) var<storage, read> thresholdSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> attackSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> holdSignal : array<f32>;\n@group(0) @binding(7) var<storage, read> releaseSignal : array<f32>;\n@group(0) @binding(8) var<storage, read> rangeSignal : array<f32>;\n\nfn log10(x: f32) -> f32 {\n return log(x) * 0.4342944819032518f;\n}\n\nfn tanh(x: f32) -> f32 {\n let exp2x = exp(2.0f * x);\n return (exp2x - 1.0f) / (exp2x + 1.0f);\n}\n\nfn is_nan_or_inf(v: f32) -> bool {\n return (v != v) || (abs(v) > 3.402823466e+38f);\n}\n\n@compute @workgroup_size(1)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n if (gid.x != 0u) { return; }\n\n let numSamples = u32(u.numSamples);\n let numChannels = u32(u.numChannels);\n let windowLength = u32(u.windowLength);\n\n var gateState = u32(state[0]); // 0=CLOSED, 1=ATTACK, 2=OPEN, 3=HOLD, 4=RELEASE\n if (is_nan_or_inf(state[0])) { gateState = 0u; }\n\n var currentGain = state[1];\n if (is_nan_or_inf(currentGain)) { currentGain = 0.0f; }\n\n var gainAtTransition = state[2];\n if (is_nan_or_inf(gainAtTransition)) { gainAtTransition = 0.0f; }\n\n var attackSamplesLeft = i32(state[3]);\n var holdSamplesLeft = i32(state[4]);\n var releaseSamplesLeft = i32(state[5]);\n var writeIndex = u32(state[6]);\n var sumSquares = state[7];\n if (is_nan_or_inf(sumSquares)) { sumSquares = 0.0f; }\n\n let sampleRate = u.sampleRate;\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n // 1. Dynamic Parameter Modulation & Anti-Explosion Clamping\n var effThreshold = u.threshold;\n if (u.hasThresholdSig > 0.5f) {\n effThreshold = thresholdSignal[index];\n }\n effThreshold = clamp(effThreshold, -120.0f, 0.0f);\n\n var effAttack = u.attack;\n if (u.hasAttackSig > 0.5f) {\n effAttack = attackSignal[index];\n }\n effAttack = clamp(effAttack, 0.0001f, 5.0f);\n\n var effHold = u.hold;\n if (u.hasHoldSig > 0.5f) {\n effHold = holdSignal[index];\n }\n effHold = clamp(effHold, 0.001f, 10.0f);\n\n var effRelease = u.release;\n if (u.hasReleaseSig > 0.5f) {\n effRelease = releaseSignal[index];\n }\n effRelease = clamp(effRelease, 0.01f, 10.0f);\n\n var effRange = u.closedGain;\n if (u.hasRangeSig > 0.5f) {\n let rDb = clamp(rangeSignal[index], -120.0f, 0.0f);\n effRange = select(0.0f, pow(10.0f, rDb / 20.0f), rDb > -96.0f);\n }\n effRange = clamp(effRange, 0.0f, 1.0f);\n\n // 2. Peak & RMS Window Calculation\n var peak = 0.0f;\n for (var c = 0u; c < numChannels; c = c + 1u) {\n var val = abs(inputChannels[c * numSamples + index]);\n if (is_nan_or_inf(val)) { val = 0.0f; }\n if (val > peak) {\n peak = val;\n }\n }\n\n let inputPowerSq = peak * peak;\n let oldestSq = state[8u + writeIndex];\n state[8u + writeIndex] = inputPowerSq;\n sumSquares = max(0.0f, sumSquares - oldestSq + inputPowerSq);\n writeIndex = (writeIndex + 1u) % windowLength;\n\n if (writeIndex == 0u) {\n var sum = 0.0f;\n for (var j = 0u; j < windowLength; j = j + 1u) {\n sum = sum + state[8u + j];\n }\n sumSquares = sum;\n }\n\n let rms = sqrt(sumSquares / f32(windowLength));\n let db = 20.0f * log10(max(rms, 1e-9f));\n\n let signalAboveThreshold = db >= effThreshold;\n\n if (signalAboveThreshold) {\n if (gateState == 0u || gateState == 4u) {\n gateState = 1u; // ATTACK\n gainAtTransition = currentGain;\n var samples = i32(round(effAttack * sampleRate));\n if (samples <= 0) { samples = 1; }\n attackSamplesLeft = samples;\n } else if (gateState == 3u) {\n gateState = 2u; // OPEN\n currentGain = 1.0f;\n }\n } else {\n if (gateState == 2u || gateState == 1u) {\n gateState = 3u; // HOLD\n var samples = i32(round(effHold * sampleRate));\n if (samples <= 0) { samples = 1; }\n holdSamplesLeft = samples;\n }\n }\n\n if (gateState == 0u) {\n currentGain = effRange;\n } else if (gateState == 2u) {\n currentGain = 1.0f;\n } else if (gateState == 1u) {\n var totalAttackSamples = i32(round(effAttack * sampleRate));\n if (totalAttackSamples <= 0) { totalAttackSamples = 1; }\n let progress = 1.0f - f32(attackSamplesLeft) / f32(totalAttackSamples);\n currentGain = gainAtTransition + progress * (1.0f - gainAtTransition);\n\n attackSamplesLeft = attackSamplesLeft - 1;\n if (attackSamplesLeft <= 0) {\n gateState = 2u;\n currentGain = 1.0f;\n }\n } else if (gateState == 3u) {\n currentGain = 1.0f;\n holdSamplesLeft = holdSamplesLeft - 1;\n if (holdSamplesLeft <= 0) {\n gateState = 4u; // RELEASE\n gainAtTransition = 1.0f;\n var samples = i32(round(effRelease * sampleRate));\n if (samples <= 0) { samples = 1; }\n releaseSamplesLeft = samples;\n }\n } else if (gateState == 4u) {\n var totalReleaseSamples = i32(round(effRelease * sampleRate));\n if (totalReleaseSamples <= 0) { totalReleaseSamples = 1; }\n let progress = 1.0f - f32(releaseSamplesLeft) / f32(totalReleaseSamples);\n currentGain = gainAtTransition + progress * (effRange - gainAtTransition);\n\n releaseSamplesLeft = releaseSamplesLeft - 1;\n if (releaseSamplesLeft <= 0) {\n gateState = 0u;\n currentGain = effRange;\n }\n }\n\n currentGain = clamp(currentGain, 0.0f, 1.0f);\n\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let sampleIndex = c * numSamples + index;\n var inVal = inputChannels[sampleIndex];\n if (is_nan_or_inf(inVal)) { inVal = 0.0f; }\n\n var outVal = inVal * currentGain;\n if (is_nan_or_inf(outVal)) { outVal = 0.0f; }\n\n if (outVal > 1.0f) {\n outVal = 1.0f;\n } else if (outVal < -1.0f) {\n outVal = -1.0f;\n } else if (outVal > 0.9f) {\n outVal = 0.9f + 0.1f * tanh((outVal - 0.9f) / 0.1f);\n } else if (outVal < -0.9f) {\n outVal = -0.9f + 0.1f * tanh((outVal + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = outVal;\n }\n }\n\n state[0] = f32(gateState);\n state[1] = currentGain;\n state[2] = gainAtTransition;\n state[3] = f32(attackSamplesLeft);\n state[4] = f32(holdSamplesLeft);\n state[5] = f32(releaseSamplesLeft);\n state[6] = f32(writeIndex);\n state[7] = sumSquares;\n}\n`;\nconst noiseGateAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Noise Gate.\");\n\tconst op = virtualMedia.operation || {};\n\tconst threshold = resolveNumber(op.threshold, -40);\n\tconst attack = resolveNumber(op.attack, .005);\n\tconst hold = resolveNumber(op.hold, .05);\n\tconst release = resolveNumber(op.release, .1);\n\tconst range = resolveNumber(op.range, -80);\n\tconst closedGain = range <= -96 ? 0 : 10 ** (range / 20);\n\tconst hasThresholdSig = isHandleConnected(op, \"thresholdHandleId\") ? 1 : 0;\n\tconst hasAttackSig = isHandleConnected(op, \"attackHandleId\") ? 1 : 0;\n\tconst hasHoldSig = isHandleConnected(op, \"holdHandleId\") ? 1 : 0;\n\tconst hasReleaseSig = isHandleConnected(op, \"releaseHandleId\") ? 1 : 0;\n\tconst hasRangeSig = isHandleConnected(op, \"rangeHandleId\") ? 1 : 0;\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst windowLength = Math.max(1, Math.round(.01 * sampleRate));\n\tconst nodeId = op.id || \"audio-noise-gate\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = 8 + windowLength;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, NOISE_GATE_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\tthreshold,\n\t\tattack,\n\t\thold,\n\t\trelease,\n\t\tclosedGain,\n\t\twindowLength,\n\t\thasThresholdSig,\n\t\thasAttackSig,\n\t\thasHoldSig,\n\t\thasReleaseSig,\n\t\thasRangeSig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels\n\t], 16, stateFloatCount, ctx?.renderId, true, ctx?.elapsedMs, ctx?.durationMs, void 0, void 0, PARAM_ORDER);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: noiseGateAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-AuTJmGew.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;CACA;CACA;AACD,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+NzC,MAAM,0BAA0B,OAAO,UAAU,YAAY,cAAc,QAAQ;AAClF,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,+CAA+C;CACjF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,YAAY,cAAc,GAAG,WAAW,IAAI;CAClD,MAAM,SAAS,cAAc,GAAG,QAAQ,KAAK;CAC7C,MAAM,OAAO,cAAc,GAAG,MAAM,IAAI;CACxC,MAAM,UAAU,cAAc,GAAG,SAAS,GAAG;CAC7C,MAAM,QAAQ,cAAc,GAAG,OAAO,IAAI;CAC1C,MAAM,aAAa,SAAS,MAAM,IAAI,OAAO,QAAQ;CACrD,MAAM,kBAAkB,kBAAkB,IAAI,oBAAoB,GAAG,IAAI;CACzE,MAAM,eAAe,kBAAkB,IAAI,iBAAiB,GAAG,IAAI;CACnE,MAAM,aAAa,kBAAkB,IAAI,eAAe,GAAG,IAAI;CAC/D,MAAM,gBAAgB,kBAAkB,IAAI,kBAAkB,GAAG,IAAI;CACrE,MAAM,cAAc,kBAAkB,IAAI,gBAAgB,GAAG,IAAI;CACjE,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,WAAW,CAAC;CAC9D,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,IAAI;AAC5B,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,kCAAkC;EACxI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,iBAAiB,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK3G,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,yBAAyB,CAAC"}
1
+ {"version":3,"file":"renderer-Bvizxddu.mjs","names":[],"sources":["../../../nodes/node-audio-noise-gate/dist/renderers-AuTJmGew.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveNumber } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"threshold\",\n\t\"attack\",\n\t\"hold\",\n\t\"release\",\n\t\"range\"\n];\nconst NOISE_GATE_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n threshold : f32,\n attack : f32,\n hold : f32,\n release : f32,\n closedGain : f32,\n windowLength : f32,\n hasThresholdSig : f32,\n hasAttackSig : f32,\n hasHoldSig : f32,\n hasReleaseSig : f32,\n hasRangeSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var<storage, read> inputChannels : array<f32>;\n@group(0) @binding(2) var<storage, read_write> outputChannels : array<f32>;\n@group(0) @binding(3) var<storage, read_write> state : array<f32>;\n@group(0) @binding(4) var<storage, read> thresholdSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> attackSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> holdSignal : array<f32>;\n@group(0) @binding(7) var<storage, read> releaseSignal : array<f32>;\n@group(0) @binding(8) var<storage, read> rangeSignal : array<f32>;\n\nfn log10(x: f32) -> f32 {\n return log(x) * 0.4342944819032518f;\n}\n\nfn tanh(x: f32) -> f32 {\n let exp2x = exp(2.0f * x);\n return (exp2x - 1.0f) / (exp2x + 1.0f);\n}\n\nfn is_nan_or_inf(v: f32) -> bool {\n return (v != v) || (abs(v) > 3.402823466e+38f);\n}\n\n@compute @workgroup_size(1)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n if (gid.x != 0u) { return; }\n\n let numSamples = u32(u.numSamples);\n let numChannels = u32(u.numChannels);\n let windowLength = u32(u.windowLength);\n\n var gateState = u32(state[0]); // 0=CLOSED, 1=ATTACK, 2=OPEN, 3=HOLD, 4=RELEASE\n if (is_nan_or_inf(state[0])) { gateState = 0u; }\n\n var currentGain = state[1];\n if (is_nan_or_inf(currentGain)) { currentGain = 0.0f; }\n\n var gainAtTransition = state[2];\n if (is_nan_or_inf(gainAtTransition)) { gainAtTransition = 0.0f; }\n\n var attackSamplesLeft = i32(state[3]);\n var holdSamplesLeft = i32(state[4]);\n var releaseSamplesLeft = i32(state[5]);\n var writeIndex = u32(state[6]);\n var sumSquares = state[7];\n if (is_nan_or_inf(sumSquares)) { sumSquares = 0.0f; }\n\n let sampleRate = u.sampleRate;\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n // 1. Dynamic Parameter Modulation & Anti-Explosion Clamping\n var effThreshold = u.threshold;\n if (u.hasThresholdSig > 0.5f) {\n effThreshold = thresholdSignal[index];\n }\n effThreshold = clamp(effThreshold, -120.0f, 0.0f);\n\n var effAttack = u.attack;\n if (u.hasAttackSig > 0.5f) {\n effAttack = attackSignal[index];\n }\n effAttack = clamp(effAttack, 0.0001f, 5.0f);\n\n var effHold = u.hold;\n if (u.hasHoldSig > 0.5f) {\n effHold = holdSignal[index];\n }\n effHold = clamp(effHold, 0.001f, 10.0f);\n\n var effRelease = u.release;\n if (u.hasReleaseSig > 0.5f) {\n effRelease = releaseSignal[index];\n }\n effRelease = clamp(effRelease, 0.01f, 10.0f);\n\n var effRange = u.closedGain;\n if (u.hasRangeSig > 0.5f) {\n let rDb = clamp(rangeSignal[index], -120.0f, 0.0f);\n effRange = select(0.0f, pow(10.0f, rDb / 20.0f), rDb > -96.0f);\n }\n effRange = clamp(effRange, 0.0f, 1.0f);\n\n // 2. Peak & RMS Window Calculation\n var peak = 0.0f;\n for (var c = 0u; c < numChannels; c = c + 1u) {\n var val = abs(inputChannels[c * numSamples + index]);\n if (is_nan_or_inf(val)) { val = 0.0f; }\n if (val > peak) {\n peak = val;\n }\n }\n\n let inputPowerSq = peak * peak;\n let oldestSq = state[8u + writeIndex];\n state[8u + writeIndex] = inputPowerSq;\n sumSquares = max(0.0f, sumSquares - oldestSq + inputPowerSq);\n writeIndex = (writeIndex + 1u) % windowLength;\n\n if (writeIndex == 0u) {\n var sum = 0.0f;\n for (var j = 0u; j < windowLength; j = j + 1u) {\n sum = sum + state[8u + j];\n }\n sumSquares = sum;\n }\n\n let rms = sqrt(sumSquares / f32(windowLength));\n let db = 20.0f * log10(max(rms, 1e-9f));\n\n let signalAboveThreshold = db >= effThreshold;\n\n if (signalAboveThreshold) {\n if (gateState == 0u || gateState == 4u) {\n gateState = 1u; // ATTACK\n gainAtTransition = currentGain;\n var samples = i32(round(effAttack * sampleRate));\n if (samples <= 0) { samples = 1; }\n attackSamplesLeft = samples;\n } else if (gateState == 3u) {\n gateState = 2u; // OPEN\n currentGain = 1.0f;\n }\n } else {\n if (gateState == 2u || gateState == 1u) {\n gateState = 3u; // HOLD\n var samples = i32(round(effHold * sampleRate));\n if (samples <= 0) { samples = 1; }\n holdSamplesLeft = samples;\n }\n }\n\n if (gateState == 0u) {\n currentGain = effRange;\n } else if (gateState == 2u) {\n currentGain = 1.0f;\n } else if (gateState == 1u) {\n var totalAttackSamples = i32(round(effAttack * sampleRate));\n if (totalAttackSamples <= 0) { totalAttackSamples = 1; }\n let progress = 1.0f - f32(attackSamplesLeft) / f32(totalAttackSamples);\n currentGain = gainAtTransition + progress * (1.0f - gainAtTransition);\n\n attackSamplesLeft = attackSamplesLeft - 1;\n if (attackSamplesLeft <= 0) {\n gateState = 2u;\n currentGain = 1.0f;\n }\n } else if (gateState == 3u) {\n currentGain = 1.0f;\n holdSamplesLeft = holdSamplesLeft - 1;\n if (holdSamplesLeft <= 0) {\n gateState = 4u; // RELEASE\n gainAtTransition = 1.0f;\n var samples = i32(round(effRelease * sampleRate));\n if (samples <= 0) { samples = 1; }\n releaseSamplesLeft = samples;\n }\n } else if (gateState == 4u) {\n var totalReleaseSamples = i32(round(effRelease * sampleRate));\n if (totalReleaseSamples <= 0) { totalReleaseSamples = 1; }\n let progress = 1.0f - f32(releaseSamplesLeft) / f32(totalReleaseSamples);\n currentGain = gainAtTransition + progress * (effRange - gainAtTransition);\n\n releaseSamplesLeft = releaseSamplesLeft - 1;\n if (releaseSamplesLeft <= 0) {\n gateState = 0u;\n currentGain = effRange;\n }\n }\n\n currentGain = clamp(currentGain, 0.0f, 1.0f);\n\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let sampleIndex = c * numSamples + index;\n var inVal = inputChannels[sampleIndex];\n if (is_nan_or_inf(inVal)) { inVal = 0.0f; }\n\n var outVal = inVal * currentGain;\n if (is_nan_or_inf(outVal)) { outVal = 0.0f; }\n\n if (outVal > 1.0f) {\n outVal = 1.0f;\n } else if (outVal < -1.0f) {\n outVal = -1.0f;\n } else if (outVal > 0.9f) {\n outVal = 0.9f + 0.1f * tanh((outVal - 0.9f) / 0.1f);\n } else if (outVal < -0.9f) {\n outVal = -0.9f + 0.1f * tanh((outVal + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = outVal;\n }\n }\n\n state[0] = f32(gateState);\n state[1] = currentGain;\n state[2] = gainAtTransition;\n state[3] = f32(attackSamplesLeft);\n state[4] = f32(holdSamplesLeft);\n state[5] = f32(releaseSamplesLeft);\n state[6] = f32(writeIndex);\n state[7] = sumSquares;\n}\n`;\nconst noiseGateAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Noise Gate.\");\n\tconst op = virtualMedia.operation || {};\n\tconst threshold = resolveNumber(op.threshold, -40);\n\tconst attack = resolveNumber(op.attack, .005);\n\tconst hold = resolveNumber(op.hold, .05);\n\tconst release = resolveNumber(op.release, .1);\n\tconst range = resolveNumber(op.range, -80);\n\tconst closedGain = range <= -96 ? 0 : 10 ** (range / 20);\n\tconst hasThresholdSig = isHandleConnected(op, \"thresholdHandleId\") ? 1 : 0;\n\tconst hasAttackSig = isHandleConnected(op, \"attackHandleId\") ? 1 : 0;\n\tconst hasHoldSig = isHandleConnected(op, \"holdHandleId\") ? 1 : 0;\n\tconst hasReleaseSig = isHandleConnected(op, \"releaseHandleId\") ? 1 : 0;\n\tconst hasRangeSig = isHandleConnected(op, \"rangeHandleId\") ? 1 : 0;\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst windowLength = Math.max(1, Math.round(.01 * sampleRate));\n\tconst nodeId = op.id || \"audio-noise-gate\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = 8 + windowLength;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, NOISE_GATE_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\tthreshold,\n\t\tattack,\n\t\thold,\n\t\trelease,\n\t\tclosedGain,\n\t\twindowLength,\n\t\thasThresholdSig,\n\t\thasAttackSig,\n\t\thasHoldSig,\n\t\thasReleaseSig,\n\t\thasRangeSig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels\n\t], 16, stateFloatCount, ctx?.renderId, true, ctx?.elapsedMs, ctx?.durationMs, void 0, void 0, PARAM_ORDER);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: noiseGateAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-AuTJmGew.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;CACA;CACA;AACD,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+NzC,MAAM,0BAA0B,OAAO,UAAU,YAAY,cAAc,QAAQ;AAClF,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,+CAA+C;CACjF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,YAAY,cAAc,GAAG,WAAW,IAAI;CAClD,MAAM,SAAS,cAAc,GAAG,QAAQ,KAAK;CAC7C,MAAM,OAAO,cAAc,GAAG,MAAM,IAAI;CACxC,MAAM,UAAU,cAAc,GAAG,SAAS,GAAG;CAC7C,MAAM,QAAQ,cAAc,GAAG,OAAO,IAAI;CAC1C,MAAM,aAAa,SAAS,MAAM,IAAI,OAAO,QAAQ;CACrD,MAAM,kBAAkB,kBAAkB,IAAI,oBAAoB,GAAG,IAAI;CACzE,MAAM,eAAe,kBAAkB,IAAI,iBAAiB,GAAG,IAAI;CACnE,MAAM,aAAa,kBAAkB,IAAI,eAAe,GAAG,IAAI;CAC/D,MAAM,gBAAgB,kBAAkB,IAAI,kBAAkB,GAAG,IAAI;CACrE,MAAM,cAAc,kBAAkB,IAAI,gBAAgB,GAAG,IAAI;CACjE,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,WAAW,CAAC;CAC9D,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,IAAI;AAC5B,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,kCAAkC;EACxI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,iBAAiB,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK3G,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,yBAAyB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import "./chunk-D7gtBK74.mjs";
2
- import "./dist-Bf0H4lp1.mjs";
3
- import { n as renderers_default, t as GradientMapWebGPURenderer } from "./renderer-Bk7vVfTu.mjs";
2
+ import "./dist-BuirkW-f.mjs";
3
+ import { n as renderers_default, t as GradientMapWebGPURenderer } from "./renderer-BvA4sQz5.mjs";
4
4
 
5
5
  export { GradientMapWebGPURenderer, renderers_default as default };
@@ -0,0 +1,5 @@
1
+ import "./chunk-D7gtBK74.mjs";
2
+ import "./dist-BuirkW-f.mjs";
3
+ import { t as renderers_default } from "./renderer-DdkPY4hO.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,4 +1,4 @@
1
- import { n as NodeRendererPlugin } from "./renderer-92IAZzBU.mjs";
1
+ import { n as NodeRendererPlugin } from "./renderer-WTvo3wo9.mjs";
2
2
 
3
3
  //#region ../../nodes/node-audio-signal-extractor/dist/renderer.d.mts
4
4
  //#region src/renderers/index.d.ts
@@ -7,4 +7,4 @@ declare const _default: Readonly<NodeRendererPlugin>;
7
7
 
8
8
  //#endregion
9
9
  export { _default as t };
10
- //# sourceMappingURL=renderer-CE9N4EEI.d.mts.map
10
+ //# sourceMappingURL=renderer-C-dcd14F.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CE9N4EEI.d.mts","names":["_framefields_node_sdk_renderer0","_default","NodeRendererPlugin","Readonly","default"],"sources":["../../../nodes/node-audio-signal-extractor/dist/renderer.d.mts"],"sourcesContent":["import * as _framefields_node_sdk_renderer0 from \"@framefields/node-sdk/renderer\";\n\n//#region src/renderers/index.d.ts\ndeclare const _default: Readonly<_framefields_node_sdk_renderer0.NodeRendererPlugin>;\n//#endregion\nexport { _default as default };\n//# sourceMappingURL=renderer.d.mts.map"],"mappings":";;;;AAAkF,cAGpEC,QAAsE,EAA5DE,QAASH,CAAAA,kBAAD,CAAA"}
1
+ {"version":3,"file":"renderer-C-dcd14F.d.mts","names":["_framefields_node_sdk_renderer0","_default","NodeRendererPlugin","Readonly","default"],"sources":["../../../nodes/node-audio-signal-extractor/dist/renderer.d.mts"],"sourcesContent":["import * as _framefields_node_sdk_renderer0 from \"@framefields/node-sdk/renderer\";\n\n//#region src/renderers/index.d.ts\ndeclare const _default: Readonly<_framefields_node_sdk_renderer0.NodeRendererPlugin>;\n//#endregion\nexport { _default as default };\n//# sourceMappingURL=renderer.d.mts.map"],"mappings":";;;;AAAkF,cAGpEC,QAAsE,EAA5DE,QAASH,CAAAA,kBAAD,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import "./chunk-D7gtBK74.mjs";
2
- import { n as defineRenderer } from "./renderer-C9r0-KY4.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";
2
+ import { n as defineRenderer } from "./renderer-BgmO1Dzw.mjs";
3
+ import "./dist-BuirkW-f.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-BRBIoxMC.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-BcSSAzc4.mjs.map
308
+ //# sourceMappingURL=renderer-C2MaJKfY.mjs.map