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
@@ -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-contour/dist/renderers-CJmaeupk.mjs
7
7
  const OP = "Contour";
@@ -219,4 +219,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: ContourWebGPURenderer }
219
219
 
220
220
  //#endregion
221
221
  export { ContourWebGPURenderer, renderers_default as default };
222
- //# sourceMappingURL=renderer-CXa6SWXy.mjs.map
222
+ //# sourceMappingURL=renderer-YFHESw3v.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CXa6SWXy.mjs","names":[],"sources":["../../../nodes/node-contour/dist/renderers-CJmaeupk.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 = \"Contour\";\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 levels = u.v[1].x;\n\tlet lineWidth = u.v[1].y;\n\tlet lineColor = u.v[2];\n\tlet fill = u32(u.v[1].z + 0.5);\n\tlet fillColor = u.v[3];\n\tlet smoothing = u.v[1].w;\n\n\tlet R = res();\n\tlet s = smoothing / R;\n\tvar lsum = 0.0;\n\tfor (var j = -1; j <= 1; j++) {\n\t\tfor (var i = -1; i <= 1; i++) {\n\t\t\tlsum += luma(sampleS(in.uv + vec2<f32>(f32(i), f32(j)) * s).rgb);\n\t\t}\n\t}\n\tlet h = lsum / 9.0 * levels;\n\tlet w = max(fwidth(h), 1e-4);\n\tlet d = abs(fract(h - 0.5) - 0.5) / w;\n\tlet line = 1.0 - smoothstep(lineWidth * 0.5, lineWidth * 0.5 + 1.0, d);\n\tlet c = sampleS(in.uv);\n\tvar base = vec4<f32>(c.rgb, c.a);\n\tif (fill == 1u) { base = vec4<f32>(fillColor.rgb, 1.0); }\n\tif (fill == 2u) { base = vec4<f32>(lineColor.rgb, 0.0); }\n\tlet rgb = mix(base.rgb, lineColor.rgb, line);\n\treturn premul(vec4<f32>(rgb, max(base.a, line * select(1.0, c.a, fill == 0u))));\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.levels, 14);\n\tdata[5] = num(raw.lineWidth, 1.2);\n\tdata.set(hexToRgba(String(raw.lineColor ?? \"#2b1d0e\")), 8);\n\tdata[6] = Math.max(0, [\n\t\t\"source\",\n\t\t\"flat\",\n\t\t\"none\"\n\t].indexOf(String(raw.fill ?? \"source\")));\n\tdata.set(hexToRgba(String(raw.fillColor ?? \"#f3ead8\")), 12);\n\tdata[7] = num(raw.smoothing, 2);\n}\nconst ContourWebGPURenderer = 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: ContourWebGPURenderer });\n\n//#endregion\nexport { ContourWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-CJmaeupk.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-YFHESw3v.mjs","names":[],"sources":["../../../nodes/node-contour/dist/renderers-CJmaeupk.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 = \"Contour\";\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 levels = u.v[1].x;\n\tlet lineWidth = u.v[1].y;\n\tlet lineColor = u.v[2];\n\tlet fill = u32(u.v[1].z + 0.5);\n\tlet fillColor = u.v[3];\n\tlet smoothing = u.v[1].w;\n\n\tlet R = res();\n\tlet s = smoothing / R;\n\tvar lsum = 0.0;\n\tfor (var j = -1; j <= 1; j++) {\n\t\tfor (var i = -1; i <= 1; i++) {\n\t\t\tlsum += luma(sampleS(in.uv + vec2<f32>(f32(i), f32(j)) * s).rgb);\n\t\t}\n\t}\n\tlet h = lsum / 9.0 * levels;\n\tlet w = max(fwidth(h), 1e-4);\n\tlet d = abs(fract(h - 0.5) - 0.5) / w;\n\tlet line = 1.0 - smoothstep(lineWidth * 0.5, lineWidth * 0.5 + 1.0, d);\n\tlet c = sampleS(in.uv);\n\tvar base = vec4<f32>(c.rgb, c.a);\n\tif (fill == 1u) { base = vec4<f32>(fillColor.rgb, 1.0); }\n\tif (fill == 2u) { base = vec4<f32>(lineColor.rgb, 0.0); }\n\tlet rgb = mix(base.rgb, lineColor.rgb, line);\n\treturn premul(vec4<f32>(rgb, max(base.a, line * select(1.0, c.a, fill == 0u))));\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.levels, 14);\n\tdata[5] = num(raw.lineWidth, 1.2);\n\tdata.set(hexToRgba(String(raw.lineColor ?? \"#2b1d0e\")), 8);\n\tdata[6] = Math.max(0, [\n\t\t\"source\",\n\t\t\"flat\",\n\t\t\"none\"\n\t].indexOf(String(raw.fill ?? \"source\")));\n\tdata.set(hexToRgba(String(raw.fillColor ?? \"#f3ead8\")), 12);\n\tdata[7] = num(raw.smoothing, 2);\n}\nconst ContourWebGPURenderer = 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: ContourWebGPURenderer });\n\n//#endregion\nexport { ContourWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-CJmaeupk.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-D8m3fuRp.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,4 +1,4 @@
1
- import { n as defineRenderer } from "./renderer-C9r0-KY4.mjs";
1
+ import { n as defineRenderer } from "./renderer-BgmO1Dzw.mjs";
2
2
 
3
3
  //#region ../../nodes/node-particles/dist/renderers-C4F7TVQQ.mjs
4
4
  function isParticleProgram(value) {
@@ -655,4 +655,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: ParticlesWebGPURenderer
655
655
 
656
656
  //#endregion
657
657
  export { ParticlesWebGPURenderer, renderers_default as default };
658
- //# sourceMappingURL=renderer-PNIgmWft.mjs.map
658
+ //# sourceMappingURL=renderer-kFtcuY9J.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-PNIgmWft.mjs","names":[],"sources":["../../../nodes/node-particles/dist/renderers-C4F7TVQQ.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\n\n//#region src/shared/program.ts\nfunction isParticleProgram(value) {\n\treturn typeof value === \"object\" && value !== null && \"particleStatic\" in value && typeof value.particleFrame === \"function\";\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst PARTICLE_BYTES = 32;\nconst PARAM_VEC4S = 32;\nconst MAX_ATTRACTORS = 8;\nconst MAX_COLORS = 8;\nconst SNAPSHOT_EVERY = 24;\nconst MAX_SNAPSHOTS = 64;\nconst WORKGROUP = 64;\nconst COMMON_WGSL = `\nstruct Particle {\n\tpos : vec2<f32>,\n\tvel : vec2<f32>,\n\tage : f32,\n\tlife : f32,\n\tjitter : f32,\n\t_pad : f32,\n};\n\nstruct Params { v : array<vec4<f32>, ${PARAM_VEC4S}> };\n`;\nconst SIM_WGSL = `\n${COMMON_WGSL}\n@group(0) @binding(0) var<uniform> P : Params;\n@group(0) @binding(1) var<storage, read_write> particles : array<Particle>;\n@group(0) @binding(2) var<storage, read> mask : array<f32>;\n\nfn pcg(v : u32) -> u32 {\n\tlet state = v * 747796405u + 2891336453u;\n\tlet word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\n\treturn (word >> 22u) ^ word;\n}\nfn rnd(idx : u32, channel : u32, seed : u32) -> f32 {\n\treturn f32(pcg(idx * 16u + channel + pcg(seed))) / 4294967295.0;\n}\n\nfn hash2(p : vec2<f32>) -> f32 {\n\tlet q = fract(p * vec2<f32>(0.1031, 0.1030));\n\tlet r = q + dot(q, q.yx + 33.33);\n\treturn fract((r.x + r.y) * r.x);\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\tlet a = hash2(i);\n\tlet b = hash2(i + vec2<f32>(1.0, 0.0));\n\tlet c = hash2(i + vec2<f32>(0.0, 1.0));\n\tlet d = hash2(i + vec2<f32>(1.0, 1.0));\n\treturn mix(mix(a, b, u.x), mix(c, d, u.x), u.y);\n}\nfn fbm(p : vec2<f32>) -> f32 {\n\treturn vnoise(p) * 0.6 + vnoise(p * 2.03 + 17.0) * 0.3 + vnoise(p * 4.01 + 41.0) * 0.1;\n}\n// Divergence-free flow: the curl of a scalar noise field.\nfn curl(p : vec2<f32>) -> vec2<f32> {\n\tlet e = 0.02;\n\tlet dx = fbm(p + vec2<f32>(e, 0.0)) - fbm(p - vec2<f32>(e, 0.0));\n\tlet dy = fbm(p + vec2<f32>(0.0, e)) - fbm(p - vec2<f32>(0.0, e));\n\treturn vec2<f32>(dy, -dx) / (2.0 * e);\n}\n\nfn maskAt(cell : vec2<f32>, offset : u32) -> f32 {\n\tlet w = i32(P.v[18].x);\n\tlet h = i32(P.v[18].y);\n\tlet c0 = vec2<i32>(floor(cell));\n\tlet t = cell - floor(cell);\n\tvar s = 0.0;\n\tfor (var k = 0; k < 4; k++) {\n\t\tlet o = vec2<i32>(k & 1, k >> 1);\n\t\tlet c = c0 + o;\n\t\tvar v = 0.0;\n\t\tif (c.x >= 0 && c.y >= 0 && c.x < w && c.y < h) {\n\t\t\tv = mask[offset + u32(c.y * w + c.x)];\n\t\t}\n\t\tlet wx = select(1.0 - t.x, t.x, o.x == 1);\n\t\tlet wy = select(1.0 - t.y, t.y, o.y == 1);\n\t\ts += v * wx * wy;\n\t}\n\treturn s;\n}\n\nfn spawn(i : u32, idx : u32, birthFrac : f32) {\n\tlet birthAge = birthFrac * P.v[1].z;\n\tlet seed = u32(P.v[1].y);\n\tlet shape = u32(P.v[4].x);\n\tlet ex = P.v[4].y; let ey = P.v[4].z; let ew = P.v[4].w;\n\tlet eh = P.v[5].x; let er = P.v[5].y;\n\tlet r0 = rnd(idx, 0u, seed); let r1 = rnd(idx, 1u, seed);\n\tvar pos = vec2<f32>(ex, ey);\n\tvar center = vec2<f32>(ex, ey);\n\tif (shape == 1u) { pos = vec2<f32>(ex + ew * r0, ey + eh * r0); center = vec2<f32>(ex + ew * 0.5, ey + eh * 0.5); }\n\telse if (shape == 2u) { pos = vec2<f32>(ex + ew * r0, ey + eh * r1); center = vec2<f32>(ex + ew * 0.5, ey + eh * 0.5); }\n\telse if (shape == 3u) {\n\t\tlet a = r0 * 6.2831853; let rr = er * sqrt(r1);\n\t\tpos = vec2<f32>(ex + cos(a) * rr, ey + sin(a) * rr);\n\t} else if (shape == 4u) {\n\t\tlet a = r0 * 6.2831853;\n\t\tpos = vec2<f32>(ex + cos(a) * er, ey + sin(a) * er);\n\t}\n\tlet radial = P.v[1].w > 0.5;\n\tvar dir = P.v[6].x + (rnd(idx, 2u, seed) - 0.5) * P.v[6].y;\n\tif (radial) {\n\t\tlet d = pos - center;\n\t\tif (dot(d, d) > 1e-6) { dir = atan2(d.y, d.x) + (rnd(idx, 2u, seed) - 0.5) * P.v[6].y; }\n\t}\n\t// A moving emitter: older births of the frame start nearer last frame's spot.\n\tif (P.v[30].z > 0.5) { pos += (P.v[30].xy - vec2<f32>(ex, ey)) * birthFrac; }\n\tlet speed = mix(P.v[5].z, P.v[5].w, rnd(idx, 3u, seed));\n\tlet vel = vec2<f32>(cos(dir), sin(dir)) * speed;\n\tvar p : Particle;\n\tp.vel = vel;\n\tp.pos = pos + vel * birthAge;\n\tp.age = birthAge;\n\tp.life = mix(P.v[6].z, P.v[6].w, rnd(idx, 4u, seed));\n\tp.jitter = 1.0 - P.v[16].w * rnd(idx, 5u, seed);\n\tp._pad = 0.0;\n\tparticles[i] = p;\n}\n\n@compute @workgroup_size(${WORKGROUP})\nfn simulate(@builtin(global_invocation_id) gid : vec3<u32>) {\n\tlet i = gid.x;\n\tlet maxN = u32(P.v[1].x);\n\tif (i >= maxN) { return; }\n\tlet dt = P.v[0].x;\n\tlet time = P.v[0].y;\n\tlet emitStart = u32(P.v[0].z);\n\tlet emitCount = u32(P.v[0].w);\n\tlet frameDt = P.v[1].z;\n\n\tif (emitCount > 0u) {\n\t\tlet k = (i + maxN - (emitStart % maxN)) % maxN;\n\t\tif (k < emitCount) {\n\t\t\t// Births spread over the frame, oldest first.\n\t\t\tspawn(i, emitStart + k, 1.0 - (f32(k) + 0.5) / f32(emitCount));\n\t\t\treturn;\n\t\t}\n\t}\n\n\tvar p = particles[i];\n\tif (p.life <= 0.0) { return; }\n\tp.age += dt;\n\tif (p.age >= p.life) { p.life = 0.0; particles[i] = p; return; }\n\n\tvar acc = vec2<f32>(P.v[2].z, P.v[2].w);\n\tlet ns = P.v[3].y;\n\tif (ns != 0.0) {\n\t\tlet sc = max(P.v[3].z, 1.0);\n\t\tacc += curl(p.pos / sc + vec2<f32>(time * P.v[3].w, time * P.v[3].w * 0.7)) * ns;\n\t}\n\tlet nAttr = u32(P.v[7].w);\n\tfor (var a = 0u; a < nAttr; a++) {\n\t\tlet at = P.v[8u + a];\n\t\tlet d = at.xy - p.pos;\n\t\tlet dist = length(d) + 1e-3;\n\t\tlet fall = exp(-(dist * dist) / max(at.w * at.w, 1.0));\n\t\tacc += d / dist * at.z * fall;\n\t}\n\tif (P.v[16].x > 0.5) {\n\t\t// Silhouette push: out along the gradient, harder where it just arrived.\n\t\tlet comp = p.pos + P.v[18].zw;\n\t\tlet cell = (comp - P.v[17].xy) / P.v[17].zw - 0.5;\n\t\tlet cellCount = u32(P.v[18].x * P.v[18].y);\n\t\tlet a0 = maskAt(cell, 0u);\n\t\tif (a0 > 0.02) {\n\t\t\tlet gx = maskAt(cell + vec2<f32>(1.0, 0.0), 0u) - maskAt(cell - vec2<f32>(1.0, 0.0), 0u);\n\t\t\tlet gy = maskAt(cell + vec2<f32>(0.0, 1.0), 0u) - maskAt(cell - vec2<f32>(0.0, 1.0), 0u);\n\t\t\tlet g = vec2<f32>(gx, gy);\n\t\t\tlet gl = length(g);\n\t\t\tif (gl > 1e-5) {\n\t\t\t\tlet before = maskAt(cell, cellCount);\n\t\t\t\tlet k = a0 * P.v[16].y + max(0.0, a0 - before) * P.v[16].z;\n\t\t\t\tacc -= g / gl * k;\n\t\t\t}\n\t\t}\n\t}\n\n\tp.vel += acc * dt;\n\tp.vel *= exp(-P.v[3].x * dt);\n\tp.pos += p.vel * dt;\n\n\tlet w = P.v[2].x; let h = P.v[2].y;\n\tlet floorY = P.v[7].y;\n\tlet bounce = P.v[7].z;\n\tif (floorY >= 0.0 && p.pos.y > floorY) { p.pos.y = floorY; p.vel.y = -abs(p.vel.y) * bounce; p.vel.x *= 0.9; }\n\tlet mode = u32(P.v[7].x);\n\tif (mode == 1u) {\n\t\tif (p.pos.x < 0.0 || p.pos.y < 0.0 || p.pos.x > w || p.pos.y > h) { p.life = 0.0; }\n\t} else if (mode == 2u) {\n\t\tif (p.pos.x < 0.0) { p.pos.x = 0.0; p.vel.x = abs(p.vel.x) * bounce; }\n\t\tif (p.pos.x > w) { p.pos.x = w; p.vel.x = -abs(p.vel.x) * bounce; }\n\t\tif (p.pos.y < 0.0) { p.pos.y = 0.0; p.vel.y = abs(p.vel.y) * bounce; }\n\t\tif (p.pos.y > h) { p.pos.y = h; p.vel.y = -abs(p.vel.y) * bounce; }\n\t} else if (mode == 3u) {\n\t\tp.pos = vec2<f32>(p.pos.x - floor(p.pos.x / w) * w, p.pos.y - floor(p.pos.y / h) * h);\n\t}\n\tparticles[i] = p;\n}\n`;\nconst DRAW_WGSL = `\n${COMMON_WGSL}\n@group(0) @binding(0) var<uniform> P : Params;\n@group(0) @binding(1) var<storage, read> particles : array<Particle>;\n\nstruct VOut {\n\t@builtin(position) pos : vec4<f32>,\n\t@location(0) uv : vec2<f32>,\n\t@location(1) color : vec4<f32>,\n\t@location(2) aspect : f32,\n};\n\nfn gradient(t : f32) -> vec4<f32> {\n\tlet n = i32(P.v[21].x);\n\tif (n <= 1) { return P.v[22]; }\n\tlet x = clamp(t, 0.0, 1.0) * f32(n - 1);\n\tlet i = min(i32(floor(x)), n - 2);\n\treturn mix(P.v[22 + i], P.v[23 + i], x - f32(i));\n}\n\n@vertex\nfn vs(@builtin(vertex_index) vi : u32, @builtin(instance_index) ii : u32) -> VOut {\n\tvar out : VOut;\n\tlet p = particles[ii];\n\tif (p.life <= 0.0) {\n\t\tout.pos = vec4<f32>(2.0, 2.0, 0.0, 1.0);\n\t\tout.color = vec4<f32>(0.0);\n\t\treturn out;\n\t}\n\tlet t = p.age / p.life;\n\tlet size = mix(P.v[19].x, P.v[19].y, t) * p.jitter;\n\tvar corner = vec2<f32>(0.0);\n\tswitch (vi) {\n\t\tcase 0u: { corner = vec2<f32>(-1.0, -1.0); }\n\t\tcase 1u: { corner = vec2<f32>(1.0, -1.0); }\n\t\tcase 2u: { corner = vec2<f32>(-1.0, 1.0); }\n\t\tcase 3u: { corner = vec2<f32>(-1.0, 1.0); }\n\t\tcase 4u: { corner = vec2<f32>(1.0, -1.0); }\n\t\tdefault: { corner = vec2<f32>(1.0, 1.0); }\n\t}\n\tlet speed = length(p.vel);\n\tvar axisX = vec2<f32>(1.0, 0.0);\n\tvar halfLen = size * 0.5;\n\tlet shape = u32(P.v[20].x);\n\tif (shape == 3u && speed > 1e-3) {\n\t\taxisX = p.vel / speed;\n\t\thalfLen = size * 0.5 + speed * P.v[20].y * 0.5;\n\t}\n\tlet axisY = vec2<f32>(-axisX.y, axisX.x);\n\tlet local = axisX * corner.x * halfLen + axisY * corner.y * size * 0.5;\n\tlet px = (p.pos + local) * P.v[21].yz;\n\tlet tsize = P.v[2].xy * P.v[21].yz;\n\tout.pos = vec4<f32>(px.x / tsize.x * 2.0 - 1.0, 1.0 - px.y / tsize.y * 2.0, 0.0, 1.0);\n\tout.uv = corner;\n\tout.aspect = halfLen / max(size * 0.5, 1e-3);\n\n\tvar c = gradient(t);\n\tif (P.v[20].z > 0.5) { c = gradient(speed / max(P.v[20].w, 1e-3)); }\n\tlet fadeIn = max(P.v[19].z, 1e-4);\n\tlet fadeOut = max(P.v[19].w, 1e-4);\n\tlet a = c.a * smoothstep(0.0, fadeIn, t) * (1.0 - smoothstep(1.0 - fadeOut, 1.0, t)) * P.v[21].w;\n\tout.color = vec4<f32>(c.rgb * a, a);\n\treturn out;\n}\n\n@fragment\nfn fs(in : VOut) -> @location(0) vec4<f32> {\n\tlet shape = u32(P.v[20].x);\n\tvar m = 1.0;\n\tif (shape == 0u) {\n\t\tlet d = length(in.uv);\n\t\tlet e = max(fwidth(d), 1e-3);\n\t\tm = 1.0 - smoothstep(1.0 - e, 1.0, d);\n\t} else if (shape == 1u) {\n\t\tlet d = length(in.uv);\n\t\tm = exp(-3.5 * d * d) * (1.0 - smoothstep(0.9, 1.0, d));\n\t} else if (shape == 3u) {\n\t\t// A capsule along the motion, soft at the sides.\n\t\tlet ax = abs(in.uv.x) * in.aspect;\n\t\tlet ex = max(ax - (in.aspect - 1.0), 0.0);\n\t\tlet d = length(vec2<f32>(ex, in.uv.y));\n\t\tm = 1.0 - smoothstep(0.5, 1.0, d);\n\t}\n\treturn in.color * m;\n}\n`;\nconst pipelines = /* @__PURE__ */ new WeakMap();\nfunction getPipelines(device) {\n\tlet p = pipelines.get(device);\n\tif (p) return p;\n\tconst simLayout = device.createBindGroupLayout({\n\t\tlabel: \"particles_sim_layout\",\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tvisibility: GPUShaderStage.COMPUTE,\n\t\t\t\tbuffer: { type: \"uniform\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tvisibility: GPUShaderStage.COMPUTE,\n\t\t\t\tbuffer: { type: \"storage\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tvisibility: GPUShaderStage.COMPUTE,\n\t\t\t\tbuffer: { type: \"read-only-storage\" }\n\t\t\t}\n\t\t]\n\t});\n\tp = {\n\t\tsimLayout,\n\t\tsim: device.createComputePipeline({\n\t\t\tlabel: \"particles_sim\",\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [simLayout] }),\n\t\t\tcompute: {\n\t\t\t\tmodule: device.createShaderModule({\n\t\t\t\t\tlabel: \"particles_sim.wgsl\",\n\t\t\t\t\tcode: SIM_WGSL\n\t\t\t\t}),\n\t\t\t\tentryPoint: \"simulate\"\n\t\t\t}\n\t\t}),\n\t\tdrawLayout: device.createBindGroupLayout({\n\t\t\tlabel: \"particles_draw_layout\",\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tvisibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n\t\t\t\tbuffer: { type: \"uniform\" }\n\t\t\t}, {\n\t\t\t\tbinding: 1,\n\t\t\t\tvisibility: GPUShaderStage.VERTEX,\n\t\t\t\tbuffer: { type: \"read-only-storage\" }\n\t\t\t}]\n\t\t}),\n\t\tdraw: /* @__PURE__ */ new Map(),\n\t\tdrawModule: device.createShaderModule({\n\t\t\tlabel: \"particles_draw.wgsl\",\n\t\t\tcode: DRAW_WGSL\n\t\t})\n\t};\n\tpipelines.set(device, p);\n\treturn p;\n}\nconst BLENDS = {\n\tnormal: {\n\t\tcolor: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\toperation: \"add\"\n\t\t},\n\t\talpha: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\toperation: \"add\"\n\t\t}\n\t},\n\tadd: {\n\t\tcolor: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one\",\n\t\t\toperation: \"add\"\n\t\t},\n\t\talpha: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one\",\n\t\t\toperation: \"add\"\n\t\t}\n\t},\n\tscreen: {\n\t\tcolor: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one-minus-src\",\n\t\t\toperation: \"add\"\n\t\t},\n\t\talpha: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\toperation: \"add\"\n\t\t}\n\t}\n};\nfunction drawPipeline(device, format, blend) {\n\tconst p = getPipelines(device);\n\tconst key = `${format}|${blend}`;\n\tlet pipe = p.draw.get(key);\n\tif (!pipe) {\n\t\tpipe = device.createRenderPipeline({\n\t\t\tlabel: `particles_draw_${blend}`,\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [p.drawLayout] }),\n\t\t\tvertex: {\n\t\t\t\tmodule: p.drawModule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule: p.drawModule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{\n\t\t\t\t\tformat,\n\t\t\t\t\tblend: BLENDS[blend]\n\t\t\t\t}]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-list\" }\n\t\t});\n\t\tp.draw.set(key, pipe);\n\t}\n\treturn pipe;\n}\nconst SHAPES = {\n\tcircle: 0,\n\tsoft: 1,\n\tsquare: 2,\n\tspark: 3\n};\nconst EMITTERS = {\n\tpoint: 0,\n\tline: 1,\n\trect: 2,\n\tcircle: 3,\n\tring: 4\n};\nconst BOUNDS = {\n\tnone: 0,\n\tkill: 1,\n\tbounce: 2,\n\twrap: 3\n};\n/** Packs static settings and one frame's inputs into the shared parameter block. */\nfunction packParams(s, f, out, sim, view) {\n\tout.fill(0);\n\tconst v = (i, a, b, c, d) => out.set([\n\t\ta,\n\t\tb,\n\t\tc,\n\t\td\n\t], i * 4);\n\tconst deg = Math.PI / 180;\n\tv(0, sim.dt, sim.time, sim.emitStart, sim.emitCount);\n\tv(1, s.max, s.seed, sim.frameDt, s.emitter.radial ? 1 : 0);\n\tv(2, s.layer.width, s.layer.height, f.gravity[0], f.gravity[1]);\n\tv(3, f.drag, f.noise.strength, f.noise.scale, f.noise.speed);\n\tconst e = s.emitter;\n\tconst ex = f.emitter?.x ?? e.x;\n\tconst ey = f.emitter?.y ?? e.y;\n\tv(4, EMITTERS[e.shape], ex, ey, e.width);\n\tif (f.emitter) v(30, f.emitter.previousX, f.emitter.previousY, 1, 0);\n\tv(5, e.height, e.radius, s.speed[0], s.speed[1]);\n\tv(6, s.direction * deg, s.spread * deg, s.lifetime[0], s.lifetime[1]);\n\tconst attractors = f.attractors.slice(0, MAX_ATTRACTORS);\n\tv(7, BOUNDS[s.bounds], s.floor ?? -1, s.bounce, attractors.length);\n\tfor (const [i, a] of attractors.entries()) v(8 + i, a.x, a.y, a.strength, a.radius);\n\tconst m = f.push?.mask;\n\tv(16, m ? 1 : 0, f.push?.strength ?? 0, f.push?.sweep ?? 0, s.sizeJitter);\n\tv(17, m?.originX ?? 0, m?.originY ?? 0, m?.scaleX ?? 1, m?.scaleY ?? 1);\n\tv(18, m?.width ?? 0, m?.height ?? 0, s.layer.x, s.layer.y);\n\tv(19, s.size[0], s.size[1], s.fade[0], s.fade[1]);\n\tv(20, SHAPES[s.shape], s.stretch, s.colorBySpeed !== null ? 1 : 0, s.colorBySpeed ?? 1);\n\tconst colors = s.colors.slice(0, MAX_COLORS);\n\tv(21, colors.length, view.scaleX, view.scaleY, s.opacity);\n\tfor (const [i, c] of colors.entries()) v(22 + i, c[0], c[1], c[2], c[3]);\n}\nfunction stateFor(program, device) {\n\tconst existing = program.particleState;\n\tif (existing && existing.device === device) return existing;\n\tconst s = program.particleStatic;\n\tconst state = {\n\t\tdevice,\n\t\tparticles: device.createBuffer({\n\t\t\tlabel: \"particles\",\n\t\t\tsize: s.max * PARTICLE_BYTES,\n\t\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST\n\t\t}),\n\t\tframe: -1,\n\t\temitted: 0,\n\t\tcarry: 0,\n\t\tsnapshots: /* @__PURE__ */ new Map(),\n\t\tmaskBuffer: null,\n\t\tmaskSize: 0,\n\t\tubo: device.createBuffer({\n\t\t\tlabel: \"particles_params\",\n\t\t\tsize: PARAM_VEC4S * 16,\n\t\t\tusage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n\t\t})\n\t};\n\tprogram.particleState = state;\n\treturn state;\n}\n/** Uploads this frame's (and the previous frame's) silhouette; a 1-float buffer when there is none. */\nfunction uploadMask(state, f) {\n\tconst m = f.push?.mask;\n\tconst cells = m ? m.width * m.height : 0;\n\tconst size = Math.max(16, cells * 2 * 4);\n\tif (!state.maskBuffer || state.maskSize < size) {\n\t\tstate.maskBuffer?.destroy();\n\t\tstate.maskBuffer = state.device.createBuffer({\n\t\t\tlabel: \"particles_mask\",\n\t\t\tsize,\n\t\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST\n\t\t});\n\t\tstate.maskSize = size;\n\t}\n\tif (m) {\n\t\tconst both = new Float32Array(cells * 2);\n\t\tboth.set(m.data.subarray(0, cells));\n\t\tboth.set((f.push?.previous ?? m).data.subarray(0, cells), cells);\n\t\tstate.device.queue.writeBuffer(state.maskBuffer, 0, both);\n\t}\n\treturn state.maskBuffer;\n}\n/** Steps the system from the frame it holds to `frame` (layer-local), restoring a snapshot to go back. */\nfunction advance(program, state, frame, compositionStart, fps) {\n\tconst { device } = state;\n\tconst s = program.particleStatic;\n\tif (frame < state.frame || state.frame < 0) {\n\t\tlet best = -1;\n\t\tfor (const k of state.snapshots.keys()) if (k <= frame && k > best) best = k;\n\t\tconst encoder = device.createCommandEncoder({ label: \"particles_restore\" });\n\t\tif (best >= 0) {\n\t\t\tconst snap = state.snapshots.get(best);\n\t\t\tencoder.copyBufferToBuffer(snap.buffer, 0, state.particles, 0, s.max * PARTICLE_BYTES);\n\t\t\tstate.emitted = snap.emitted;\n\t\t\tstate.carry = snap.carry;\n\t\t\tstate.frame = best;\n\t\t} else {\n\t\t\tencoder.clearBuffer(state.particles);\n\t\t\tstate.emitted = 0;\n\t\t\tstate.carry = 0;\n\t\t\tstate.frame = -1;\n\t\t}\n\t\tdevice.queue.submit([encoder.finish()]);\n\t}\n\tconst p = getPipelines(device);\n\tconst params = new Float32Array(PARAM_VEC4S * 4);\n\tconst substeps = Math.max(1, Math.round(s.substeps));\n\tconst frameDt = 1 / fps;\n\tconst prewarmFrames = Math.round(s.prewarm * fps);\n\tfor (let f = state.frame + 1; f <= frame; f++) {\n\t\tconst steps = f === 0 ? prewarmFrames + 1 : 1;\n\t\tfor (let w = 0; w < steps; w++) {\n\t\t\tconst simFrame = f === 0 ? w - prewarmFrames : f;\n\t\t\tconst inputs = program.particleFrame(compositionStart + Math.max(0, simFrame), fps);\n\t\t\tstate.carry += Math.max(0, inputs.rate) * frameDt;\n\t\t\tlet born = Math.floor(state.carry);\n\t\t\tstate.carry -= born;\n\t\t\tborn += Math.max(0, Math.round(inputs.burst));\n\t\t\tborn = Math.min(born, s.max);\n\t\t\tconst mask = uploadMask(state, inputs);\n\t\t\tconst bindGroup = device.createBindGroup({\n\t\t\t\tlayout: p.simLayout,\n\t\t\t\tentries: [\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 0,\n\t\t\t\t\t\tresource: { buffer: state.ubo }\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 1,\n\t\t\t\t\t\tresource: { buffer: state.particles }\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 2,\n\t\t\t\t\t\tresource: { buffer: mask }\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t});\n\t\t\tfor (let k = 0; k < substeps; k++) {\n\t\t\t\tpackParams(s, inputs, params, {\n\t\t\t\t\tdt: frameDt / substeps,\n\t\t\t\t\ttime: (simFrame + k / substeps) * frameDt,\n\t\t\t\t\temitStart: state.emitted,\n\t\t\t\t\temitCount: k === 0 ? born : 0,\n\t\t\t\t\tframeDt\n\t\t\t\t}, {\n\t\t\t\t\tscaleX: 1,\n\t\t\t\t\tscaleY: 1\n\t\t\t\t});\n\t\t\t\tdevice.queue.writeBuffer(state.ubo, 0, params);\n\t\t\t\tconst encoder = device.createCommandEncoder({ label: \"particles_step\" });\n\t\t\t\tconst pass = encoder.beginComputePass({ label: \"particles_sim\" });\n\t\t\t\tpass.setPipeline(p.sim);\n\t\t\t\tpass.setBindGroup(0, bindGroup);\n\t\t\t\tpass.dispatchWorkgroups(Math.ceil(s.max / WORKGROUP));\n\t\t\t\tpass.end();\n\t\t\t\tdevice.queue.submit([encoder.finish()]);\n\t\t\t}\n\t\t\tstate.emitted += born;\n\t\t}\n\t\tstate.frame = f;\n\t\tif (f % SNAPSHOT_EVERY === 0 && !state.snapshots.has(f) && state.snapshots.size < MAX_SNAPSHOTS) {\n\t\t\tconst buffer = device.createBuffer({\n\t\t\t\tlabel: `particles_snapshot_${f}`,\n\t\t\t\tsize: s.max * PARTICLE_BYTES,\n\t\t\t\tusage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST\n\t\t\t});\n\t\t\tconst encoder = device.createCommandEncoder({ label: \"particles_snapshot\" });\n\t\t\tencoder.copyBufferToBuffer(state.particles, 0, buffer, 0, s.max * PARTICLE_BYTES);\n\t\t\tdevice.queue.submit([encoder.finish()]);\n\t\t\tstate.snapshots.set(f, {\n\t\t\t\tbuffer,\n\t\t\t\temitted: state.emitted,\n\t\t\t\tcarry: state.carry\n\t\t\t});\n\t\t}\n\t}\n}\nconst ParticlesWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Particles\" || !isParticleProgram(op.effect)) return;\n\tconst program = op.effect;\n\tconst s = program.particleStatic;\n\tconst fps = props.fps || 30;\n\tconst local = Math.max(0, Math.round(props.frame ?? 0));\n\tconst compositionFrame = Math.round(props.compositionFrame ?? local);\n\tconst compositionStart = compositionFrame - local;\n\tconst state = stateFor(program, ctx.device);\n\tadvance(program, state, local, compositionStart, fps);\n\tpass.end();\n\tconst params = new Float32Array(PARAM_VEC4S * 4);\n\tpackParams(s, program.particleFrame(compositionFrame, fps), params, {\n\t\tdt: 0,\n\t\ttime: 0,\n\t\temitStart: 0,\n\t\temitCount: 0,\n\t\tframeDt: 1 / fps\n\t}, {\n\t\tscaleX: targetWidth / s.layer.width,\n\t\tscaleY: targetHeight / s.layer.height\n\t});\n\tconst ubo = ctx.renderer.getTemporaryBuffer(params);\n\tconst draw = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"load\");\n\tdraw.setPipeline(drawPipeline(ctx.device, ctx.renderer.format, s.blend));\n\tdraw.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: getPipelines(ctx.device).drawLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: ubo }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: { buffer: state.particles }\n\t\t}]\n\t}));\n\tdraw.draw(6, s.max);\n\tdraw.end();\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ParticlesWebGPURenderer });\n\n//#endregion\nexport { ParticlesWebGPURenderer as n, isParticleProgram as r, renderers_default as t };\n//# sourceMappingURL=renderers-C4F7TVQQ.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-kFtcuY9J.mjs","names":[],"sources":["../../../nodes/node-particles/dist/renderers-C4F7TVQQ.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\n\n//#region src/shared/program.ts\nfunction isParticleProgram(value) {\n\treturn typeof value === \"object\" && value !== null && \"particleStatic\" in value && typeof value.particleFrame === \"function\";\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst PARTICLE_BYTES = 32;\nconst PARAM_VEC4S = 32;\nconst MAX_ATTRACTORS = 8;\nconst MAX_COLORS = 8;\nconst SNAPSHOT_EVERY = 24;\nconst MAX_SNAPSHOTS = 64;\nconst WORKGROUP = 64;\nconst COMMON_WGSL = `\nstruct Particle {\n\tpos : vec2<f32>,\n\tvel : vec2<f32>,\n\tage : f32,\n\tlife : f32,\n\tjitter : f32,\n\t_pad : f32,\n};\n\nstruct Params { v : array<vec4<f32>, ${PARAM_VEC4S}> };\n`;\nconst SIM_WGSL = `\n${COMMON_WGSL}\n@group(0) @binding(0) var<uniform> P : Params;\n@group(0) @binding(1) var<storage, read_write> particles : array<Particle>;\n@group(0) @binding(2) var<storage, read> mask : array<f32>;\n\nfn pcg(v : u32) -> u32 {\n\tlet state = v * 747796405u + 2891336453u;\n\tlet word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\n\treturn (word >> 22u) ^ word;\n}\nfn rnd(idx : u32, channel : u32, seed : u32) -> f32 {\n\treturn f32(pcg(idx * 16u + channel + pcg(seed))) / 4294967295.0;\n}\n\nfn hash2(p : vec2<f32>) -> f32 {\n\tlet q = fract(p * vec2<f32>(0.1031, 0.1030));\n\tlet r = q + dot(q, q.yx + 33.33);\n\treturn fract((r.x + r.y) * r.x);\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\tlet a = hash2(i);\n\tlet b = hash2(i + vec2<f32>(1.0, 0.0));\n\tlet c = hash2(i + vec2<f32>(0.0, 1.0));\n\tlet d = hash2(i + vec2<f32>(1.0, 1.0));\n\treturn mix(mix(a, b, u.x), mix(c, d, u.x), u.y);\n}\nfn fbm(p : vec2<f32>) -> f32 {\n\treturn vnoise(p) * 0.6 + vnoise(p * 2.03 + 17.0) * 0.3 + vnoise(p * 4.01 + 41.0) * 0.1;\n}\n// Divergence-free flow: the curl of a scalar noise field.\nfn curl(p : vec2<f32>) -> vec2<f32> {\n\tlet e = 0.02;\n\tlet dx = fbm(p + vec2<f32>(e, 0.0)) - fbm(p - vec2<f32>(e, 0.0));\n\tlet dy = fbm(p + vec2<f32>(0.0, e)) - fbm(p - vec2<f32>(0.0, e));\n\treturn vec2<f32>(dy, -dx) / (2.0 * e);\n}\n\nfn maskAt(cell : vec2<f32>, offset : u32) -> f32 {\n\tlet w = i32(P.v[18].x);\n\tlet h = i32(P.v[18].y);\n\tlet c0 = vec2<i32>(floor(cell));\n\tlet t = cell - floor(cell);\n\tvar s = 0.0;\n\tfor (var k = 0; k < 4; k++) {\n\t\tlet o = vec2<i32>(k & 1, k >> 1);\n\t\tlet c = c0 + o;\n\t\tvar v = 0.0;\n\t\tif (c.x >= 0 && c.y >= 0 && c.x < w && c.y < h) {\n\t\t\tv = mask[offset + u32(c.y * w + c.x)];\n\t\t}\n\t\tlet wx = select(1.0 - t.x, t.x, o.x == 1);\n\t\tlet wy = select(1.0 - t.y, t.y, o.y == 1);\n\t\ts += v * wx * wy;\n\t}\n\treturn s;\n}\n\nfn spawn(i : u32, idx : u32, birthFrac : f32) {\n\tlet birthAge = birthFrac * P.v[1].z;\n\tlet seed = u32(P.v[1].y);\n\tlet shape = u32(P.v[4].x);\n\tlet ex = P.v[4].y; let ey = P.v[4].z; let ew = P.v[4].w;\n\tlet eh = P.v[5].x; let er = P.v[5].y;\n\tlet r0 = rnd(idx, 0u, seed); let r1 = rnd(idx, 1u, seed);\n\tvar pos = vec2<f32>(ex, ey);\n\tvar center = vec2<f32>(ex, ey);\n\tif (shape == 1u) { pos = vec2<f32>(ex + ew * r0, ey + eh * r0); center = vec2<f32>(ex + ew * 0.5, ey + eh * 0.5); }\n\telse if (shape == 2u) { pos = vec2<f32>(ex + ew * r0, ey + eh * r1); center = vec2<f32>(ex + ew * 0.5, ey + eh * 0.5); }\n\telse if (shape == 3u) {\n\t\tlet a = r0 * 6.2831853; let rr = er * sqrt(r1);\n\t\tpos = vec2<f32>(ex + cos(a) * rr, ey + sin(a) * rr);\n\t} else if (shape == 4u) {\n\t\tlet a = r0 * 6.2831853;\n\t\tpos = vec2<f32>(ex + cos(a) * er, ey + sin(a) * er);\n\t}\n\tlet radial = P.v[1].w > 0.5;\n\tvar dir = P.v[6].x + (rnd(idx, 2u, seed) - 0.5) * P.v[6].y;\n\tif (radial) {\n\t\tlet d = pos - center;\n\t\tif (dot(d, d) > 1e-6) { dir = atan2(d.y, d.x) + (rnd(idx, 2u, seed) - 0.5) * P.v[6].y; }\n\t}\n\t// A moving emitter: older births of the frame start nearer last frame's spot.\n\tif (P.v[30].z > 0.5) { pos += (P.v[30].xy - vec2<f32>(ex, ey)) * birthFrac; }\n\tlet speed = mix(P.v[5].z, P.v[5].w, rnd(idx, 3u, seed));\n\tlet vel = vec2<f32>(cos(dir), sin(dir)) * speed;\n\tvar p : Particle;\n\tp.vel = vel;\n\tp.pos = pos + vel * birthAge;\n\tp.age = birthAge;\n\tp.life = mix(P.v[6].z, P.v[6].w, rnd(idx, 4u, seed));\n\tp.jitter = 1.0 - P.v[16].w * rnd(idx, 5u, seed);\n\tp._pad = 0.0;\n\tparticles[i] = p;\n}\n\n@compute @workgroup_size(${WORKGROUP})\nfn simulate(@builtin(global_invocation_id) gid : vec3<u32>) {\n\tlet i = gid.x;\n\tlet maxN = u32(P.v[1].x);\n\tif (i >= maxN) { return; }\n\tlet dt = P.v[0].x;\n\tlet time = P.v[0].y;\n\tlet emitStart = u32(P.v[0].z);\n\tlet emitCount = u32(P.v[0].w);\n\tlet frameDt = P.v[1].z;\n\n\tif (emitCount > 0u) {\n\t\tlet k = (i + maxN - (emitStart % maxN)) % maxN;\n\t\tif (k < emitCount) {\n\t\t\t// Births spread over the frame, oldest first.\n\t\t\tspawn(i, emitStart + k, 1.0 - (f32(k) + 0.5) / f32(emitCount));\n\t\t\treturn;\n\t\t}\n\t}\n\n\tvar p = particles[i];\n\tif (p.life <= 0.0) { return; }\n\tp.age += dt;\n\tif (p.age >= p.life) { p.life = 0.0; particles[i] = p; return; }\n\n\tvar acc = vec2<f32>(P.v[2].z, P.v[2].w);\n\tlet ns = P.v[3].y;\n\tif (ns != 0.0) {\n\t\tlet sc = max(P.v[3].z, 1.0);\n\t\tacc += curl(p.pos / sc + vec2<f32>(time * P.v[3].w, time * P.v[3].w * 0.7)) * ns;\n\t}\n\tlet nAttr = u32(P.v[7].w);\n\tfor (var a = 0u; a < nAttr; a++) {\n\t\tlet at = P.v[8u + a];\n\t\tlet d = at.xy - p.pos;\n\t\tlet dist = length(d) + 1e-3;\n\t\tlet fall = exp(-(dist * dist) / max(at.w * at.w, 1.0));\n\t\tacc += d / dist * at.z * fall;\n\t}\n\tif (P.v[16].x > 0.5) {\n\t\t// Silhouette push: out along the gradient, harder where it just arrived.\n\t\tlet comp = p.pos + P.v[18].zw;\n\t\tlet cell = (comp - P.v[17].xy) / P.v[17].zw - 0.5;\n\t\tlet cellCount = u32(P.v[18].x * P.v[18].y);\n\t\tlet a0 = maskAt(cell, 0u);\n\t\tif (a0 > 0.02) {\n\t\t\tlet gx = maskAt(cell + vec2<f32>(1.0, 0.0), 0u) - maskAt(cell - vec2<f32>(1.0, 0.0), 0u);\n\t\t\tlet gy = maskAt(cell + vec2<f32>(0.0, 1.0), 0u) - maskAt(cell - vec2<f32>(0.0, 1.0), 0u);\n\t\t\tlet g = vec2<f32>(gx, gy);\n\t\t\tlet gl = length(g);\n\t\t\tif (gl > 1e-5) {\n\t\t\t\tlet before = maskAt(cell, cellCount);\n\t\t\t\tlet k = a0 * P.v[16].y + max(0.0, a0 - before) * P.v[16].z;\n\t\t\t\tacc -= g / gl * k;\n\t\t\t}\n\t\t}\n\t}\n\n\tp.vel += acc * dt;\n\tp.vel *= exp(-P.v[3].x * dt);\n\tp.pos += p.vel * dt;\n\n\tlet w = P.v[2].x; let h = P.v[2].y;\n\tlet floorY = P.v[7].y;\n\tlet bounce = P.v[7].z;\n\tif (floorY >= 0.0 && p.pos.y > floorY) { p.pos.y = floorY; p.vel.y = -abs(p.vel.y) * bounce; p.vel.x *= 0.9; }\n\tlet mode = u32(P.v[7].x);\n\tif (mode == 1u) {\n\t\tif (p.pos.x < 0.0 || p.pos.y < 0.0 || p.pos.x > w || p.pos.y > h) { p.life = 0.0; }\n\t} else if (mode == 2u) {\n\t\tif (p.pos.x < 0.0) { p.pos.x = 0.0; p.vel.x = abs(p.vel.x) * bounce; }\n\t\tif (p.pos.x > w) { p.pos.x = w; p.vel.x = -abs(p.vel.x) * bounce; }\n\t\tif (p.pos.y < 0.0) { p.pos.y = 0.0; p.vel.y = abs(p.vel.y) * bounce; }\n\t\tif (p.pos.y > h) { p.pos.y = h; p.vel.y = -abs(p.vel.y) * bounce; }\n\t} else if (mode == 3u) {\n\t\tp.pos = vec2<f32>(p.pos.x - floor(p.pos.x / w) * w, p.pos.y - floor(p.pos.y / h) * h);\n\t}\n\tparticles[i] = p;\n}\n`;\nconst DRAW_WGSL = `\n${COMMON_WGSL}\n@group(0) @binding(0) var<uniform> P : Params;\n@group(0) @binding(1) var<storage, read> particles : array<Particle>;\n\nstruct VOut {\n\t@builtin(position) pos : vec4<f32>,\n\t@location(0) uv : vec2<f32>,\n\t@location(1) color : vec4<f32>,\n\t@location(2) aspect : f32,\n};\n\nfn gradient(t : f32) -> vec4<f32> {\n\tlet n = i32(P.v[21].x);\n\tif (n <= 1) { return P.v[22]; }\n\tlet x = clamp(t, 0.0, 1.0) * f32(n - 1);\n\tlet i = min(i32(floor(x)), n - 2);\n\treturn mix(P.v[22 + i], P.v[23 + i], x - f32(i));\n}\n\n@vertex\nfn vs(@builtin(vertex_index) vi : u32, @builtin(instance_index) ii : u32) -> VOut {\n\tvar out : VOut;\n\tlet p = particles[ii];\n\tif (p.life <= 0.0) {\n\t\tout.pos = vec4<f32>(2.0, 2.0, 0.0, 1.0);\n\t\tout.color = vec4<f32>(0.0);\n\t\treturn out;\n\t}\n\tlet t = p.age / p.life;\n\tlet size = mix(P.v[19].x, P.v[19].y, t) * p.jitter;\n\tvar corner = vec2<f32>(0.0);\n\tswitch (vi) {\n\t\tcase 0u: { corner = vec2<f32>(-1.0, -1.0); }\n\t\tcase 1u: { corner = vec2<f32>(1.0, -1.0); }\n\t\tcase 2u: { corner = vec2<f32>(-1.0, 1.0); }\n\t\tcase 3u: { corner = vec2<f32>(-1.0, 1.0); }\n\t\tcase 4u: { corner = vec2<f32>(1.0, -1.0); }\n\t\tdefault: { corner = vec2<f32>(1.0, 1.0); }\n\t}\n\tlet speed = length(p.vel);\n\tvar axisX = vec2<f32>(1.0, 0.0);\n\tvar halfLen = size * 0.5;\n\tlet shape = u32(P.v[20].x);\n\tif (shape == 3u && speed > 1e-3) {\n\t\taxisX = p.vel / speed;\n\t\thalfLen = size * 0.5 + speed * P.v[20].y * 0.5;\n\t}\n\tlet axisY = vec2<f32>(-axisX.y, axisX.x);\n\tlet local = axisX * corner.x * halfLen + axisY * corner.y * size * 0.5;\n\tlet px = (p.pos + local) * P.v[21].yz;\n\tlet tsize = P.v[2].xy * P.v[21].yz;\n\tout.pos = vec4<f32>(px.x / tsize.x * 2.0 - 1.0, 1.0 - px.y / tsize.y * 2.0, 0.0, 1.0);\n\tout.uv = corner;\n\tout.aspect = halfLen / max(size * 0.5, 1e-3);\n\n\tvar c = gradient(t);\n\tif (P.v[20].z > 0.5) { c = gradient(speed / max(P.v[20].w, 1e-3)); }\n\tlet fadeIn = max(P.v[19].z, 1e-4);\n\tlet fadeOut = max(P.v[19].w, 1e-4);\n\tlet a = c.a * smoothstep(0.0, fadeIn, t) * (1.0 - smoothstep(1.0 - fadeOut, 1.0, t)) * P.v[21].w;\n\tout.color = vec4<f32>(c.rgb * a, a);\n\treturn out;\n}\n\n@fragment\nfn fs(in : VOut) -> @location(0) vec4<f32> {\n\tlet shape = u32(P.v[20].x);\n\tvar m = 1.0;\n\tif (shape == 0u) {\n\t\tlet d = length(in.uv);\n\t\tlet e = max(fwidth(d), 1e-3);\n\t\tm = 1.0 - smoothstep(1.0 - e, 1.0, d);\n\t} else if (shape == 1u) {\n\t\tlet d = length(in.uv);\n\t\tm = exp(-3.5 * d * d) * (1.0 - smoothstep(0.9, 1.0, d));\n\t} else if (shape == 3u) {\n\t\t// A capsule along the motion, soft at the sides.\n\t\tlet ax = abs(in.uv.x) * in.aspect;\n\t\tlet ex = max(ax - (in.aspect - 1.0), 0.0);\n\t\tlet d = length(vec2<f32>(ex, in.uv.y));\n\t\tm = 1.0 - smoothstep(0.5, 1.0, d);\n\t}\n\treturn in.color * m;\n}\n`;\nconst pipelines = /* @__PURE__ */ new WeakMap();\nfunction getPipelines(device) {\n\tlet p = pipelines.get(device);\n\tif (p) return p;\n\tconst simLayout = device.createBindGroupLayout({\n\t\tlabel: \"particles_sim_layout\",\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tvisibility: GPUShaderStage.COMPUTE,\n\t\t\t\tbuffer: { type: \"uniform\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tvisibility: GPUShaderStage.COMPUTE,\n\t\t\t\tbuffer: { type: \"storage\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tvisibility: GPUShaderStage.COMPUTE,\n\t\t\t\tbuffer: { type: \"read-only-storage\" }\n\t\t\t}\n\t\t]\n\t});\n\tp = {\n\t\tsimLayout,\n\t\tsim: device.createComputePipeline({\n\t\t\tlabel: \"particles_sim\",\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [simLayout] }),\n\t\t\tcompute: {\n\t\t\t\tmodule: device.createShaderModule({\n\t\t\t\t\tlabel: \"particles_sim.wgsl\",\n\t\t\t\t\tcode: SIM_WGSL\n\t\t\t\t}),\n\t\t\t\tentryPoint: \"simulate\"\n\t\t\t}\n\t\t}),\n\t\tdrawLayout: device.createBindGroupLayout({\n\t\t\tlabel: \"particles_draw_layout\",\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tvisibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n\t\t\t\tbuffer: { type: \"uniform\" }\n\t\t\t}, {\n\t\t\t\tbinding: 1,\n\t\t\t\tvisibility: GPUShaderStage.VERTEX,\n\t\t\t\tbuffer: { type: \"read-only-storage\" }\n\t\t\t}]\n\t\t}),\n\t\tdraw: /* @__PURE__ */ new Map(),\n\t\tdrawModule: device.createShaderModule({\n\t\t\tlabel: \"particles_draw.wgsl\",\n\t\t\tcode: DRAW_WGSL\n\t\t})\n\t};\n\tpipelines.set(device, p);\n\treturn p;\n}\nconst BLENDS = {\n\tnormal: {\n\t\tcolor: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\toperation: \"add\"\n\t\t},\n\t\talpha: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\toperation: \"add\"\n\t\t}\n\t},\n\tadd: {\n\t\tcolor: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one\",\n\t\t\toperation: \"add\"\n\t\t},\n\t\talpha: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one\",\n\t\t\toperation: \"add\"\n\t\t}\n\t},\n\tscreen: {\n\t\tcolor: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one-minus-src\",\n\t\t\toperation: \"add\"\n\t\t},\n\t\talpha: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\toperation: \"add\"\n\t\t}\n\t}\n};\nfunction drawPipeline(device, format, blend) {\n\tconst p = getPipelines(device);\n\tconst key = `${format}|${blend}`;\n\tlet pipe = p.draw.get(key);\n\tif (!pipe) {\n\t\tpipe = device.createRenderPipeline({\n\t\t\tlabel: `particles_draw_${blend}`,\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [p.drawLayout] }),\n\t\t\tvertex: {\n\t\t\t\tmodule: p.drawModule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule: p.drawModule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{\n\t\t\t\t\tformat,\n\t\t\t\t\tblend: BLENDS[blend]\n\t\t\t\t}]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-list\" }\n\t\t});\n\t\tp.draw.set(key, pipe);\n\t}\n\treturn pipe;\n}\nconst SHAPES = {\n\tcircle: 0,\n\tsoft: 1,\n\tsquare: 2,\n\tspark: 3\n};\nconst EMITTERS = {\n\tpoint: 0,\n\tline: 1,\n\trect: 2,\n\tcircle: 3,\n\tring: 4\n};\nconst BOUNDS = {\n\tnone: 0,\n\tkill: 1,\n\tbounce: 2,\n\twrap: 3\n};\n/** Packs static settings and one frame's inputs into the shared parameter block. */\nfunction packParams(s, f, out, sim, view) {\n\tout.fill(0);\n\tconst v = (i, a, b, c, d) => out.set([\n\t\ta,\n\t\tb,\n\t\tc,\n\t\td\n\t], i * 4);\n\tconst deg = Math.PI / 180;\n\tv(0, sim.dt, sim.time, sim.emitStart, sim.emitCount);\n\tv(1, s.max, s.seed, sim.frameDt, s.emitter.radial ? 1 : 0);\n\tv(2, s.layer.width, s.layer.height, f.gravity[0], f.gravity[1]);\n\tv(3, f.drag, f.noise.strength, f.noise.scale, f.noise.speed);\n\tconst e = s.emitter;\n\tconst ex = f.emitter?.x ?? e.x;\n\tconst ey = f.emitter?.y ?? e.y;\n\tv(4, EMITTERS[e.shape], ex, ey, e.width);\n\tif (f.emitter) v(30, f.emitter.previousX, f.emitter.previousY, 1, 0);\n\tv(5, e.height, e.radius, s.speed[0], s.speed[1]);\n\tv(6, s.direction * deg, s.spread * deg, s.lifetime[0], s.lifetime[1]);\n\tconst attractors = f.attractors.slice(0, MAX_ATTRACTORS);\n\tv(7, BOUNDS[s.bounds], s.floor ?? -1, s.bounce, attractors.length);\n\tfor (const [i, a] of attractors.entries()) v(8 + i, a.x, a.y, a.strength, a.radius);\n\tconst m = f.push?.mask;\n\tv(16, m ? 1 : 0, f.push?.strength ?? 0, f.push?.sweep ?? 0, s.sizeJitter);\n\tv(17, m?.originX ?? 0, m?.originY ?? 0, m?.scaleX ?? 1, m?.scaleY ?? 1);\n\tv(18, m?.width ?? 0, m?.height ?? 0, s.layer.x, s.layer.y);\n\tv(19, s.size[0], s.size[1], s.fade[0], s.fade[1]);\n\tv(20, SHAPES[s.shape], s.stretch, s.colorBySpeed !== null ? 1 : 0, s.colorBySpeed ?? 1);\n\tconst colors = s.colors.slice(0, MAX_COLORS);\n\tv(21, colors.length, view.scaleX, view.scaleY, s.opacity);\n\tfor (const [i, c] of colors.entries()) v(22 + i, c[0], c[1], c[2], c[3]);\n}\nfunction stateFor(program, device) {\n\tconst existing = program.particleState;\n\tif (existing && existing.device === device) return existing;\n\tconst s = program.particleStatic;\n\tconst state = {\n\t\tdevice,\n\t\tparticles: device.createBuffer({\n\t\t\tlabel: \"particles\",\n\t\t\tsize: s.max * PARTICLE_BYTES,\n\t\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST\n\t\t}),\n\t\tframe: -1,\n\t\temitted: 0,\n\t\tcarry: 0,\n\t\tsnapshots: /* @__PURE__ */ new Map(),\n\t\tmaskBuffer: null,\n\t\tmaskSize: 0,\n\t\tubo: device.createBuffer({\n\t\t\tlabel: \"particles_params\",\n\t\t\tsize: PARAM_VEC4S * 16,\n\t\t\tusage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n\t\t})\n\t};\n\tprogram.particleState = state;\n\treturn state;\n}\n/** Uploads this frame's (and the previous frame's) silhouette; a 1-float buffer when there is none. */\nfunction uploadMask(state, f) {\n\tconst m = f.push?.mask;\n\tconst cells = m ? m.width * m.height : 0;\n\tconst size = Math.max(16, cells * 2 * 4);\n\tif (!state.maskBuffer || state.maskSize < size) {\n\t\tstate.maskBuffer?.destroy();\n\t\tstate.maskBuffer = state.device.createBuffer({\n\t\t\tlabel: \"particles_mask\",\n\t\t\tsize,\n\t\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST\n\t\t});\n\t\tstate.maskSize = size;\n\t}\n\tif (m) {\n\t\tconst both = new Float32Array(cells * 2);\n\t\tboth.set(m.data.subarray(0, cells));\n\t\tboth.set((f.push?.previous ?? m).data.subarray(0, cells), cells);\n\t\tstate.device.queue.writeBuffer(state.maskBuffer, 0, both);\n\t}\n\treturn state.maskBuffer;\n}\n/** Steps the system from the frame it holds to `frame` (layer-local), restoring a snapshot to go back. */\nfunction advance(program, state, frame, compositionStart, fps) {\n\tconst { device } = state;\n\tconst s = program.particleStatic;\n\tif (frame < state.frame || state.frame < 0) {\n\t\tlet best = -1;\n\t\tfor (const k of state.snapshots.keys()) if (k <= frame && k > best) best = k;\n\t\tconst encoder = device.createCommandEncoder({ label: \"particles_restore\" });\n\t\tif (best >= 0) {\n\t\t\tconst snap = state.snapshots.get(best);\n\t\t\tencoder.copyBufferToBuffer(snap.buffer, 0, state.particles, 0, s.max * PARTICLE_BYTES);\n\t\t\tstate.emitted = snap.emitted;\n\t\t\tstate.carry = snap.carry;\n\t\t\tstate.frame = best;\n\t\t} else {\n\t\t\tencoder.clearBuffer(state.particles);\n\t\t\tstate.emitted = 0;\n\t\t\tstate.carry = 0;\n\t\t\tstate.frame = -1;\n\t\t}\n\t\tdevice.queue.submit([encoder.finish()]);\n\t}\n\tconst p = getPipelines(device);\n\tconst params = new Float32Array(PARAM_VEC4S * 4);\n\tconst substeps = Math.max(1, Math.round(s.substeps));\n\tconst frameDt = 1 / fps;\n\tconst prewarmFrames = Math.round(s.prewarm * fps);\n\tfor (let f = state.frame + 1; f <= frame; f++) {\n\t\tconst steps = f === 0 ? prewarmFrames + 1 : 1;\n\t\tfor (let w = 0; w < steps; w++) {\n\t\t\tconst simFrame = f === 0 ? w - prewarmFrames : f;\n\t\t\tconst inputs = program.particleFrame(compositionStart + Math.max(0, simFrame), fps);\n\t\t\tstate.carry += Math.max(0, inputs.rate) * frameDt;\n\t\t\tlet born = Math.floor(state.carry);\n\t\t\tstate.carry -= born;\n\t\t\tborn += Math.max(0, Math.round(inputs.burst));\n\t\t\tborn = Math.min(born, s.max);\n\t\t\tconst mask = uploadMask(state, inputs);\n\t\t\tconst bindGroup = device.createBindGroup({\n\t\t\t\tlayout: p.simLayout,\n\t\t\t\tentries: [\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 0,\n\t\t\t\t\t\tresource: { buffer: state.ubo }\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 1,\n\t\t\t\t\t\tresource: { buffer: state.particles }\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 2,\n\t\t\t\t\t\tresource: { buffer: mask }\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t});\n\t\t\tfor (let k = 0; k < substeps; k++) {\n\t\t\t\tpackParams(s, inputs, params, {\n\t\t\t\t\tdt: frameDt / substeps,\n\t\t\t\t\ttime: (simFrame + k / substeps) * frameDt,\n\t\t\t\t\temitStart: state.emitted,\n\t\t\t\t\temitCount: k === 0 ? born : 0,\n\t\t\t\t\tframeDt\n\t\t\t\t}, {\n\t\t\t\t\tscaleX: 1,\n\t\t\t\t\tscaleY: 1\n\t\t\t\t});\n\t\t\t\tdevice.queue.writeBuffer(state.ubo, 0, params);\n\t\t\t\tconst encoder = device.createCommandEncoder({ label: \"particles_step\" });\n\t\t\t\tconst pass = encoder.beginComputePass({ label: \"particles_sim\" });\n\t\t\t\tpass.setPipeline(p.sim);\n\t\t\t\tpass.setBindGroup(0, bindGroup);\n\t\t\t\tpass.dispatchWorkgroups(Math.ceil(s.max / WORKGROUP));\n\t\t\t\tpass.end();\n\t\t\t\tdevice.queue.submit([encoder.finish()]);\n\t\t\t}\n\t\t\tstate.emitted += born;\n\t\t}\n\t\tstate.frame = f;\n\t\tif (f % SNAPSHOT_EVERY === 0 && !state.snapshots.has(f) && state.snapshots.size < MAX_SNAPSHOTS) {\n\t\t\tconst buffer = device.createBuffer({\n\t\t\t\tlabel: `particles_snapshot_${f}`,\n\t\t\t\tsize: s.max * PARTICLE_BYTES,\n\t\t\t\tusage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST\n\t\t\t});\n\t\t\tconst encoder = device.createCommandEncoder({ label: \"particles_snapshot\" });\n\t\t\tencoder.copyBufferToBuffer(state.particles, 0, buffer, 0, s.max * PARTICLE_BYTES);\n\t\t\tdevice.queue.submit([encoder.finish()]);\n\t\t\tstate.snapshots.set(f, {\n\t\t\t\tbuffer,\n\t\t\t\temitted: state.emitted,\n\t\t\t\tcarry: state.carry\n\t\t\t});\n\t\t}\n\t}\n}\nconst ParticlesWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Particles\" || !isParticleProgram(op.effect)) return;\n\tconst program = op.effect;\n\tconst s = program.particleStatic;\n\tconst fps = props.fps || 30;\n\tconst local = Math.max(0, Math.round(props.frame ?? 0));\n\tconst compositionFrame = Math.round(props.compositionFrame ?? local);\n\tconst compositionStart = compositionFrame - local;\n\tconst state = stateFor(program, ctx.device);\n\tadvance(program, state, local, compositionStart, fps);\n\tpass.end();\n\tconst params = new Float32Array(PARAM_VEC4S * 4);\n\tpackParams(s, program.particleFrame(compositionFrame, fps), params, {\n\t\tdt: 0,\n\t\ttime: 0,\n\t\temitStart: 0,\n\t\temitCount: 0,\n\t\tframeDt: 1 / fps\n\t}, {\n\t\tscaleX: targetWidth / s.layer.width,\n\t\tscaleY: targetHeight / s.layer.height\n\t});\n\tconst ubo = ctx.renderer.getTemporaryBuffer(params);\n\tconst draw = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"load\");\n\tdraw.setPipeline(drawPipeline(ctx.device, ctx.renderer.format, s.blend));\n\tdraw.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: getPipelines(ctx.device).drawLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: ubo }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: { buffer: state.particles }\n\t\t}]\n\t}));\n\tdraw.draw(6, s.max);\n\tdraw.end();\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ParticlesWebGPURenderer });\n\n//#endregion\nexport { ParticlesWebGPURenderer as n, isParticleProgram as r, renderers_default as t };\n//# sourceMappingURL=renderers-C4F7TVQQ.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-Dk0okoS3.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,6 +1,6 @@
1
- import { l as unwrapFrameParam, n as defineRenderer } from "./renderer-C9r0-KY4.mjs";
1
+ import { n as defineRenderer, u as unwrapFrameParam } from "./renderer-BgmO1Dzw.mjs";
2
2
  import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-BPOi5xb_.mjs";
3
- import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass } from "./gpu-CevnCkZC.mjs";
3
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass } from "./gpu-BRBIoxMC.mjs";
4
4
  import { z } from "zod";
5
5
 
6
6
  //#region ../../nodes/node-patch-heal/dist/renderers-i-B6z1sf.mjs
@@ -561,4 +561,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: PatchHealWebGPURenderer
561
561
 
562
562
  //#endregion
563
563
  export { renderers_default as n, PatchHealWebGPURenderer as t };
564
- //# sourceMappingURL=renderer-MQPiZQXN.mjs.map
564
+ //# sourceMappingURL=renderer-oR1LvHeO.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-MQPiZQXN.mjs","names":[],"sources":["../../../nodes/node-patch-heal/dist/renderers-i-B6z1sf.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { ImageResultSchema, VideoResultSchema, configBuilder, unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { z } from \"zod\";\n\n//#region src/shared/config.ts\nconst MAX_RADIUS = 500;\nconst MAX_FEATHER = 100;\nconst MAX_OFFSET = 4096;\nconst PatchItemSchema = z.object({\n\tid: z.string().default(\"patch\"),\n\tcenterX: z.number().min(0).max(1).default(.5),\n\tcenterY: z.number().min(0).max(1).default(.5),\n\toffsetX: z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(50),\n\toffsetY: z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(0),\n\tradius: z.number().min(1).max(MAX_RADIUS).default(25),\n\tsourceRadius: z.number().min(1).max(MAX_RADIUS).default(25),\n\tfeather: z.number().min(0).max(MAX_FEATHER).default(50),\n\topacity: z.number().min(0).max(1).default(1),\n\tmode: z.enum([\n\t\t\"Clone\",\n\t\t\"SeamlessHeal\",\n\t\t\"TextureTransfer\"\n\t]).default(\"SeamlessHeal\")\n});\nconst patchHealConfig = configBuilder().field(\"patches\", z.array(PatchItemSchema).optional(), {\n\tlabel: \"Patches\",\n\tdescription: \"List of patch healing operations applied sequentially.\"\n}).field(\"centerX\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center X Signal\",\n\tdescription: \"Horizontal normalized position of destination patch (0.0 to 1.0).\"\n}).field(\"centerY\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center Y Signal\",\n\tdescription: \"Vertical normalized position of destination patch (0.0 to 1.0).\"\n}).field(\"offsetX\", z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(50), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Source Offset X Signal\",\n\tdescription: \"Horizontal pixel distance from destination to sample source patch.\"\n}).field(\"offsetY\", z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Source Offset Y Signal\",\n\tdescription: \"Vertical pixel distance from destination to sample source patch.\"\n}).field(\"radius\", z.number().min(1).max(MAX_RADIUS).default(25), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Target Radius Signal\",\n\tdescription: \"Radius of the destination circular patch in pixels (used when no explicit Mask input is connected).\"\n}).field(\"sourceRadius\", z.number().min(1).max(MAX_RADIUS).default(25), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Source Radius Signal\",\n\tdescription: \"Radius of the source sample circular patch in pixels.\"\n}).field(\"feather\", z.number().min(0).max(MAX_FEATHER).default(50), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Feather Signal\",\n\tdescription: \"Softness edge falloff percentage (0–100%).\"\n}).field(\"opacity\", z.number().min(0).max(1).default(1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Opacity Signal\",\n\tdescription: \"Blending opacity of the healed patch (0.0–1.0).\"\n}).field(\"mode\", z.enum([\n\t\"Clone\",\n\t\"SeamlessHeal\",\n\t\"TextureTransfer\"\n]).default(\"SeamlessHeal\"), {\n\tlabel: \"Healing Mode\",\n\tdescription: \"Healing algorithm: Clone (direct stamp), SeamlessHeal (Poisson color/lighting blend), TextureTransfer (luminance structure matching).\"\n}).build();\nconst PatchHealNodeConfigSchema = patchHealConfig.schema;\nfunction normalizePatches(config) {\n\tif (config?.patches && config.patches.length > 0) return config.patches.map((p, idx) => ({\n\t\tid: p.id || `patch-${idx + 1}`,\n\t\tcenterX: p.centerX ?? .5,\n\t\tcenterY: p.centerY ?? .5,\n\t\toffsetX: p.offsetX ?? 50,\n\t\toffsetY: p.offsetY ?? 0,\n\t\tradius: p.radius ?? 25,\n\t\tsourceRadius: p.sourceRadius ?? p.radius ?? 25,\n\t\tfeather: p.feather ?? 50,\n\t\topacity: p.opacity ?? 1,\n\t\tmode: p.mode ?? \"SeamlessHeal\"\n\t}));\n\tconst fallbackRadius = config?.radius ?? 25;\n\treturn [{\n\t\tid: \"patch-1\",\n\t\tcenterX: config?.centerX ?? .5,\n\t\tcenterY: config?.centerY ?? .5,\n\t\toffsetX: config?.offsetX ?? 50,\n\t\toffsetY: config?.offsetY ?? 0,\n\t\tradius: fallbackRadius,\n\t\tsourceRadius: config?.sourceRadius ?? fallbackRadius,\n\t\tfeather: config?.feather ?? 50,\n\t\topacity: config?.opacity ?? 1,\n\t\tmode: config?.mode ?? \"SeamlessHeal\"\n\t}];\n}\nconst PatchHealResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst PATCH_HEAL_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_FULLSCREEN_VS = `\nstruct VertexOutput {\n @builtin(position) position : vec4<f32>,\n @location(0) uv : vec2<f32>,\n};\n\n@vertex\nfn vs_main(@builtin(vertex_index) vertexIndex : u32) -> VertexOutput {\n var pos = array<vec2<f32>, 4>(\n vec2<f32>(-1.0, 1.0),\n vec2<f32>( 1.0, 1.0),\n vec2<f32>(-1.0, -1.0),\n vec2<f32>( 1.0, -1.0)\n );\n var uvs = array<vec2<f32>, 4>(\n vec2<f32>(0.0, 0.0),\n vec2<f32>(1.0, 0.0),\n vec2<f32>(0.0, 1.0),\n vec2<f32>(1.0, 1.0)\n );\n var output : VertexOutput;\n output.position = vec4<f32>(pos[vertexIndex], 0.0, 1.0);\n output.uv = uvs[vertexIndex];\n return output;\n}\n`;\nconst WGSL_PATCHHEAL_FS = `\n\nstruct PatchHealUniforms {\n offsetX : f32,\n offsetY : f32,\n centerX : f32,\n centerY : f32,\n\n radius : f32,\n sourceRadius : f32,\n feather : f32,\n opacity : f32,\n\n mode : f32,\n hasMask : f32,\n hasOffsetXSig : f32,\n hasOffsetYSig : f32,\n\n hasCenterXSig : f32,\n hasCenterYSig : f32,\n hasRadiusSig : f32,\n hasSourceRadSig : f32,\n\n hasFeatherSig : f32,\n hasOpacitySig : f32,\n pad0 : f32,\n pad1 : f32,\n};\n\n\n@group(0) @binding(0) var<uniform> u : PatchHealUniforms;\n\n@group(1) @binding(0) var srcTex : texture_2d<f32>;\n@group(1) @binding(1) var maskTex : texture_2d<f32>;\n@group(1) @binding(2) var samp : sampler;\n\n@group(2) @binding(0) var offsetXSigTex : texture_2d<f32>;\n@group(2) @binding(1) var offsetYSigTex : texture_2d<f32>;\n@group(2) @binding(2) var centerXSigTex : texture_2d<f32>;\n@group(2) @binding(3) var centerYSigTex : texture_2d<f32>;\n@group(2) @binding(4) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(5) var sourceRadSigTex : texture_2d<f32>;\n@group(2) @binding(6) var featherSigTex : texture_2d<f32>;\n@group(2) @binding(7) var opacitySigTex : texture_2d<f32>;\n@group(2) @binding(8) var signalSamp : sampler;\n\nfn getLuminance(c : vec3<f32>) -> f32 {\n return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722));\n}\n\nfn sampleBoxBlur(tex : texture_2d<f32>, smp : sampler, centerUv : vec2<f32>, blurPx : f32, dims : vec2<f32>) -> vec4<f32> {\n let texel = 1.0 / dims;\n let stepSize = max(1.0, blurPx / 3.0);\n var accum = vec4<f32>(0.0);\n var count = 0.0;\n\n for (var y = -2; y <= 2; y++) {\n for (var x = -2; x <= 2; x++) {\n let offset = vec2<f32>(f32(x) * stepSize, f32(y) * stepSize) * texel;\n let sampleUv = clamp(centerUv + offset, vec2<f32>(0.0), vec2<f32>(1.0));\n accum += textureSampleLevel(tex, smp, sampleUv, 0.0);\n count += 1.0;\n }\n }\n return accum / count;\n}\n\n@fragment\nfn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {\n let dimensions = vec2<f32>(textureDimensions(srcTex));\n\n var offsetX = u.offsetX;\n if (u.hasOffsetXSig > 0.5) {\n offsetX = textureSampleLevel(offsetXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var offsetY = u.offsetY;\n if (u.hasOffsetYSig > 0.5) {\n offsetY = textureSampleLevel(offsetYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var centerX = u.centerX;\n if (u.hasCenterXSig > 0.5) {\n centerX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var centerY = u.centerY;\n if (u.hasCenterYSig > 0.5) {\n centerY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var radius = u.radius;\n if (u.hasRadiusSig > 0.5) {\n radius = textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var sourceRadius = u.sourceRadius;\n if (u.hasSourceRadSig > 0.5) {\n sourceRadius = textureSampleLevel(sourceRadSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var feather = u.feather;\n if (u.hasFeatherSig > 0.5) {\n feather = textureSampleLevel(featherSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var opacity = u.opacity;\n if (u.hasOpacitySig > 0.5) {\n opacity = textureSampleLevel(opacitySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n let dstCol = textureSampleLevel(srcTex, samp, in.uv, 0.0);\n\n // Calculate mask weight (either from explicit mask or procedural circular patch)\n var maskWeight = 0.0;\n let targetCenterUV = vec2<f32>(centerX, centerY);\n\n if (u.hasMask > 0.5) {\n let maskCol = textureSampleLevel(maskTex, samp, in.uv, 0.0);\n maskWeight = max(maskCol.a, max(maskCol.r, max(maskCol.g, maskCol.b)));\n } else {\n let distPx = length((in.uv - targetCenterUV) * dimensions);\n let innerRadius = radius * max(0.0, 1.0 - feather / 100.0);\n maskWeight = 1.0 - smoothstep(innerRadius, max(innerRadius + 0.001, radius), distPx);\n }\n\n let blendWeight = clamp(maskWeight * opacity, 0.0, 1.0);\n if (blendWeight < 1e-4) {\n return dstCol;\n }\n\n // Compute source sample coordinate (scaling from sourceRadius to target radius if different)\n let sourceCenterUV = targetCenterUV + vec2<f32>(offsetX, offsetY) / dimensions;\n let srcScale = max(1.0, sourceRadius) / max(1.0, radius);\n let uvFromTargetCenter = in.uv - targetCenterUV;\n let srcUV = clamp(sourceCenterUV + uvFromTargetCenter * srcScale, vec2<f32>(0.0), vec2<f32>(1.0));\n let srcCol = textureSampleLevel(srcTex, samp, srcUV, 0.0);\n\n var healedCol = srcCol;\n\n if (u.mode > 0.5 && u.mode < 1.5) {\n // Mode 1: Seamless Heal (Poisson gradient / local illumination matching)\n let blurRadius = max(4.0, radius * 0.4);\n let srcBlur = sampleBoxBlur(srcTex, samp, srcUV, blurRadius, dimensions);\n let dstBlur = sampleBoxBlur(srcTex, samp, in.uv, blurRadius, dimensions);\n\n let srcDetail = srcCol.rgb - srcBlur.rgb;\n let healedRgb = dstBlur.rgb + srcDetail;\n let clampedRgb = clamp(healedRgb, vec3<f32>(0.0), vec3<f32>(srcCol.a));\n healedCol = vec4<f32>(clampedRgb, srcCol.a);\n } else if (u.mode >= 1.5) {\n // Mode 2: Texture Transfer (Luminance structure matching)\n let blurRadius = max(4.0, radius * 0.4);\n let srcBlur = sampleBoxBlur(srcTex, samp, srcUV, blurRadius, dimensions);\n\n let lumaSrc = getLuminance(srcCol.rgb);\n let lumaSrcBlur = getLuminance(srcBlur.rgb);\n let lumaDelta = lumaSrc - lumaSrcBlur;\n\n let healedRgb = dstCol.rgb + vec3<f32>(lumaDelta);\n let clampedRgb = clamp(healedRgb, vec3<f32>(0.0), vec3<f32>(dstCol.a));\n healedCol = vec4<f32>(clampedRgb, dstCol.a);\n }\n\n return mix(dstCol, healedCol, blendWeight);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getDeviceResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst textureLayout = texturesLayout(device, 2);\n\tconst signalTextureLayout = texturesLayout(device, 8);\n\tres = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalTextureLayout,\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tmodule: device.createShaderModule({ code: `${WGSL_FULLSCREEN_VS}\\n${WGSL_PATCHHEAL_FS}` }),\n\t\t\tlayouts: device.createPipelineLayout({ bindGroupLayouts: [\n\t\t\t\tuniformLayout,\n\t\t\t\ttextureLayout,\n\t\t\t\tsignalTextureLayout\n\t\t\t] }),\n\t\t\tformat,\n\t\t\tblend: {\n\t\t\t\tcolor: {\n\t\t\t\t\tsrcFactor: \"one\",\n\t\t\t\t\tdstFactor: \"zero\",\n\t\t\t\t\toperation: \"add\"\n\t\t\t\t},\n\t\t\t\talpha: {\n\t\t\t\t\tsrcFactor: \"one\",\n\t\t\t\t\tdstFactor: \"zero\",\n\t\t\t\t\toperation: \"add\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tvertexEntryPoint: \"vs_main\",\n\t\t\tfragmentEntryPoint: \"fs_main\"\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst PatchHealWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"PatchHeal\" || !op) return;\n\tconst childMedia = props.virtualMedia?.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"patch_heal_node\";\n\tconst { texture: tmpSrcTex, view: tmpSrcView } = await drawChildToTexture(args, childMedia, { props: {\n\t\t...props,\n\t\tvirtualMedia: childMedia,\n\t\trenderId: `${props.renderId}-src`\n\t} });\n\tlet maskTex = null;\n\tif (op.maskMedia) ({texture: maskTex} = await drawChildToTexture(args, op.maskMedia, {\n\t\tprops: {\n\t\t\t...props,\n\t\t\tvirtualMedia: op.maskMedia,\n\t\t\trenderId: `${props.renderId}-mask`,\n\t\t\texcludeTextures: [...props.excludeTextures || [], tmpSrcTex]\n\t\t},\n\t\texclude: [tmpSrcTex]\n\t}));\n\tconst { pipeline, uniformLayout: uLayout, textureLayout: tLayout, signalTextureLayout: sigLayout } = getDeviceResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst patches = normalizePatches(op);\n\tconst resolveBindable = (configKey, fallbackVal, minVal, maxVal) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && (input.outputItem?.type === \"Signal\" || input.outputItem?.type === \"Numeric\"));\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = fallbackVal;\n\t\tlet hasStaticSig = false;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") {\n\t\t\tconst numVal = typeof input.outputItem.data === \"number\" ? input.outputItem.data : input.outputItem.data?.value ?? fallbackVal;\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(numVal)));\n\t\t} else {\n\t\t\tconst rawVal = unwrapFrameParam(fallbackVal, compositionFrame, fps).value;\n\t\t\tconst numVal = Number(rawVal ?? fallbackVal);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, isNaN(numVal) ? fallbackVal : numVal));\n\t\t}\n\t\telse if (sd) {\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(sd.offset ?? 0)));\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd\n\t\t};\n\t};\n\tconst dummyMaskView = maskTex ? maskTex.createView() : tmpSrcView;\n\tlet currentInputTex = tmpSrcTex;\n\tconst pingTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpSrcTex,\n\t\t...maskTex ? [maskTex] : [],\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst pongTex = patches.length > 1 ? ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpSrcTex,\n\t\tpingTex,\n\t\t...maskTex ? [maskTex] : [],\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]) : pingTex;\n\tfor (let i = 0; i < patches.length; i++) {\n\t\tconst patch = patches[i];\n\t\tconst isFirstPatch = i === 0;\n\t\tconst centerXRes = isFirstPatch ? resolveBindable(\"centerX\", patch.centerX, 0, 1) : {\n\t\t\tval: patch.centerX,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst centerYRes = isFirstPatch ? resolveBindable(\"centerY\", patch.centerY, 0, 1) : {\n\t\t\tval: patch.centerY,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst offsetXRes = isFirstPatch ? resolveBindable(\"offsetX\", patch.offsetX, -MAX_OFFSET, MAX_OFFSET) : {\n\t\t\tval: patch.offsetX,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst offsetYRes = isFirstPatch ? resolveBindable(\"offsetY\", patch.offsetY, -MAX_OFFSET, MAX_OFFSET) : {\n\t\t\tval: patch.offsetY,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst radiusRes = isFirstPatch ? resolveBindable(\"radius\", patch.radius, 1, MAX_RADIUS) : {\n\t\t\tval: patch.radius,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst sourceRadiusRes = isFirstPatch ? resolveBindable(\"sourceRadius\", patch.sourceRadius ?? patch.radius, 1, MAX_RADIUS) : {\n\t\t\tval: patch.sourceRadius ?? patch.radius,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst featherRes = isFirstPatch ? resolveBindable(\"feather\", patch.feather, 0, MAX_FEATHER) : {\n\t\t\tval: patch.feather,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst opacityRes = isFirstPatch ? resolveBindable(\"opacity\", patch.opacity, 0, 1) : {\n\t\t\tval: patch.opacity,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst signalContext = {\n\t\t\targs,\n\t\t\twidth,\n\t\t\theight,\n\t\t\tframe,\n\t\t\tfps,\n\t\t\telapsedSeconds,\n\t\t\tdurationSeconds\n\t\t};\n\t\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\t\tconst offsetXView = getSignalView(offsetXRes, \"offsetX_sig\");\n\t\tconst offsetYView = getSignalView(offsetYRes, \"offsetY_sig\");\n\t\tconst centerXView = getSignalView(centerXRes, \"centerX_sig\");\n\t\tconst centerYView = getSignalView(centerYRes, \"centerY_sig\");\n\t\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\t\tconst sourceRadiusView = getSignalView(sourceRadiusRes, \"sourceRadius_sig\");\n\t\tconst featherView = getSignalView(featherRes, \"feather_sig\");\n\t\tconst opacityView = getSignalView(opacityRes, \"opacity_sig\");\n\t\tconst modeNum = patch.mode === \"Clone\" ? 0 : patch.mode === \"TextureTransfer\" ? 2 : 1;\n\t\tconst patchData = new Float32Array(20);\n\t\tpatchData[0] = offsetXRes.val;\n\t\tpatchData[1] = offsetYRes.val;\n\t\tpatchData[2] = centerXRes.val;\n\t\tpatchData[3] = centerYRes.val;\n\t\tpatchData[4] = radiusRes.val;\n\t\tpatchData[5] = sourceRadiusRes.val;\n\t\tpatchData[6] = featherRes.val;\n\t\tpatchData[7] = opacityRes.val;\n\t\tpatchData[8] = modeNum;\n\t\tpatchData[9] = maskTex ? 1 : 0;\n\t\tpatchData[10] = offsetXRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[11] = offsetYRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[12] = centerXRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[13] = centerYRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[14] = radiusRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[15] = sourceRadiusRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[16] = featherRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[17] = opacityRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[18] = 0;\n\t\tpatchData[19] = 0;\n\t\tconst uBuffer = ctx.renderer.getTemporaryBuffer(patchData);\n\t\tconst destinationTex = i % 2 === 0 ? pingTex : pongTex;\n\t\tconst texBindGroup = ctx.device.createBindGroup({\n\t\t\tlayout: tLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: currentInputTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: dummyMaskView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t});\n\t\tconst sigBindGroup = ctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: offsetXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: offsetYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: centerXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: centerYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: radiusView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: sourceRadiusView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\n\t\t\t\t\tresource: featherView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 7,\n\t\t\t\t\tresource: opacityView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 8,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t});\n\t\tdrawFullscreenPass(encoder, destinationTex.createView(), pipeline, [\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: uLayout,\n\t\t\t\tentries: [{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: uBuffer }\n\t\t\t\t}]\n\t\t\t}),\n\t\t\ttexBindGroup,\n\t\t\tsigBindGroup\n\t\t]);\n\t\tcurrentInputTex = destinationTex;\n\t}\n\tdrawTextureToTarget(args, currentInputTex);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: PatchHealWebGPURenderer });\n\n//#endregion\nexport { MAX_RADIUS as a, PatchHealResultSchema as c, patchHealConfig as d, MAX_OFFSET as i, PatchItemSchema as l, PatchHealWebGPURenderer as n, PATCH_HEAL_OUTPUT_TYPE_MAP as o, MAX_FEATHER as r, PatchHealNodeConfigSchema as s, renderers_default as t, normalizePatches as u };\n//# sourceMappingURL=renderers-i-B6z1sf.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-oR1LvHeO.mjs","names":[],"sources":["../../../nodes/node-patch-heal/dist/renderers-i-B6z1sf.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { ImageResultSchema, VideoResultSchema, configBuilder, unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { z } from \"zod\";\n\n//#region src/shared/config.ts\nconst MAX_RADIUS = 500;\nconst MAX_FEATHER = 100;\nconst MAX_OFFSET = 4096;\nconst PatchItemSchema = z.object({\n\tid: z.string().default(\"patch\"),\n\tcenterX: z.number().min(0).max(1).default(.5),\n\tcenterY: z.number().min(0).max(1).default(.5),\n\toffsetX: z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(50),\n\toffsetY: z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(0),\n\tradius: z.number().min(1).max(MAX_RADIUS).default(25),\n\tsourceRadius: z.number().min(1).max(MAX_RADIUS).default(25),\n\tfeather: z.number().min(0).max(MAX_FEATHER).default(50),\n\topacity: z.number().min(0).max(1).default(1),\n\tmode: z.enum([\n\t\t\"Clone\",\n\t\t\"SeamlessHeal\",\n\t\t\"TextureTransfer\"\n\t]).default(\"SeamlessHeal\")\n});\nconst patchHealConfig = configBuilder().field(\"patches\", z.array(PatchItemSchema).optional(), {\n\tlabel: \"Patches\",\n\tdescription: \"List of patch healing operations applied sequentially.\"\n}).field(\"centerX\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center X Signal\",\n\tdescription: \"Horizontal normalized position of destination patch (0.0 to 1.0).\"\n}).field(\"centerY\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center Y Signal\",\n\tdescription: \"Vertical normalized position of destination patch (0.0 to 1.0).\"\n}).field(\"offsetX\", z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(50), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Source Offset X Signal\",\n\tdescription: \"Horizontal pixel distance from destination to sample source patch.\"\n}).field(\"offsetY\", z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Source Offset Y Signal\",\n\tdescription: \"Vertical pixel distance from destination to sample source patch.\"\n}).field(\"radius\", z.number().min(1).max(MAX_RADIUS).default(25), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Target Radius Signal\",\n\tdescription: \"Radius of the destination circular patch in pixels (used when no explicit Mask input is connected).\"\n}).field(\"sourceRadius\", z.number().min(1).max(MAX_RADIUS).default(25), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Source Radius Signal\",\n\tdescription: \"Radius of the source sample circular patch in pixels.\"\n}).field(\"feather\", z.number().min(0).max(MAX_FEATHER).default(50), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Feather Signal\",\n\tdescription: \"Softness edge falloff percentage (0–100%).\"\n}).field(\"opacity\", z.number().min(0).max(1).default(1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Opacity Signal\",\n\tdescription: \"Blending opacity of the healed patch (0.0–1.0).\"\n}).field(\"mode\", z.enum([\n\t\"Clone\",\n\t\"SeamlessHeal\",\n\t\"TextureTransfer\"\n]).default(\"SeamlessHeal\"), {\n\tlabel: \"Healing Mode\",\n\tdescription: \"Healing algorithm: Clone (direct stamp), SeamlessHeal (Poisson color/lighting blend), TextureTransfer (luminance structure matching).\"\n}).build();\nconst PatchHealNodeConfigSchema = patchHealConfig.schema;\nfunction normalizePatches(config) {\n\tif (config?.patches && config.patches.length > 0) return config.patches.map((p, idx) => ({\n\t\tid: p.id || `patch-${idx + 1}`,\n\t\tcenterX: p.centerX ?? .5,\n\t\tcenterY: p.centerY ?? .5,\n\t\toffsetX: p.offsetX ?? 50,\n\t\toffsetY: p.offsetY ?? 0,\n\t\tradius: p.radius ?? 25,\n\t\tsourceRadius: p.sourceRadius ?? p.radius ?? 25,\n\t\tfeather: p.feather ?? 50,\n\t\topacity: p.opacity ?? 1,\n\t\tmode: p.mode ?? \"SeamlessHeal\"\n\t}));\n\tconst fallbackRadius = config?.radius ?? 25;\n\treturn [{\n\t\tid: \"patch-1\",\n\t\tcenterX: config?.centerX ?? .5,\n\t\tcenterY: config?.centerY ?? .5,\n\t\toffsetX: config?.offsetX ?? 50,\n\t\toffsetY: config?.offsetY ?? 0,\n\t\tradius: fallbackRadius,\n\t\tsourceRadius: config?.sourceRadius ?? fallbackRadius,\n\t\tfeather: config?.feather ?? 50,\n\t\topacity: config?.opacity ?? 1,\n\t\tmode: config?.mode ?? \"SeamlessHeal\"\n\t}];\n}\nconst PatchHealResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst PATCH_HEAL_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_FULLSCREEN_VS = `\nstruct VertexOutput {\n @builtin(position) position : vec4<f32>,\n @location(0) uv : vec2<f32>,\n};\n\n@vertex\nfn vs_main(@builtin(vertex_index) vertexIndex : u32) -> VertexOutput {\n var pos = array<vec2<f32>, 4>(\n vec2<f32>(-1.0, 1.0),\n vec2<f32>( 1.0, 1.0),\n vec2<f32>(-1.0, -1.0),\n vec2<f32>( 1.0, -1.0)\n );\n var uvs = array<vec2<f32>, 4>(\n vec2<f32>(0.0, 0.0),\n vec2<f32>(1.0, 0.0),\n vec2<f32>(0.0, 1.0),\n vec2<f32>(1.0, 1.0)\n );\n var output : VertexOutput;\n output.position = vec4<f32>(pos[vertexIndex], 0.0, 1.0);\n output.uv = uvs[vertexIndex];\n return output;\n}\n`;\nconst WGSL_PATCHHEAL_FS = `\n\nstruct PatchHealUniforms {\n offsetX : f32,\n offsetY : f32,\n centerX : f32,\n centerY : f32,\n\n radius : f32,\n sourceRadius : f32,\n feather : f32,\n opacity : f32,\n\n mode : f32,\n hasMask : f32,\n hasOffsetXSig : f32,\n hasOffsetYSig : f32,\n\n hasCenterXSig : f32,\n hasCenterYSig : f32,\n hasRadiusSig : f32,\n hasSourceRadSig : f32,\n\n hasFeatherSig : f32,\n hasOpacitySig : f32,\n pad0 : f32,\n pad1 : f32,\n};\n\n\n@group(0) @binding(0) var<uniform> u : PatchHealUniforms;\n\n@group(1) @binding(0) var srcTex : texture_2d<f32>;\n@group(1) @binding(1) var maskTex : texture_2d<f32>;\n@group(1) @binding(2) var samp : sampler;\n\n@group(2) @binding(0) var offsetXSigTex : texture_2d<f32>;\n@group(2) @binding(1) var offsetYSigTex : texture_2d<f32>;\n@group(2) @binding(2) var centerXSigTex : texture_2d<f32>;\n@group(2) @binding(3) var centerYSigTex : texture_2d<f32>;\n@group(2) @binding(4) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(5) var sourceRadSigTex : texture_2d<f32>;\n@group(2) @binding(6) var featherSigTex : texture_2d<f32>;\n@group(2) @binding(7) var opacitySigTex : texture_2d<f32>;\n@group(2) @binding(8) var signalSamp : sampler;\n\nfn getLuminance(c : vec3<f32>) -> f32 {\n return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722));\n}\n\nfn sampleBoxBlur(tex : texture_2d<f32>, smp : sampler, centerUv : vec2<f32>, blurPx : f32, dims : vec2<f32>) -> vec4<f32> {\n let texel = 1.0 / dims;\n let stepSize = max(1.0, blurPx / 3.0);\n var accum = vec4<f32>(0.0);\n var count = 0.0;\n\n for (var y = -2; y <= 2; y++) {\n for (var x = -2; x <= 2; x++) {\n let offset = vec2<f32>(f32(x) * stepSize, f32(y) * stepSize) * texel;\n let sampleUv = clamp(centerUv + offset, vec2<f32>(0.0), vec2<f32>(1.0));\n accum += textureSampleLevel(tex, smp, sampleUv, 0.0);\n count += 1.0;\n }\n }\n return accum / count;\n}\n\n@fragment\nfn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {\n let dimensions = vec2<f32>(textureDimensions(srcTex));\n\n var offsetX = u.offsetX;\n if (u.hasOffsetXSig > 0.5) {\n offsetX = textureSampleLevel(offsetXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var offsetY = u.offsetY;\n if (u.hasOffsetYSig > 0.5) {\n offsetY = textureSampleLevel(offsetYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var centerX = u.centerX;\n if (u.hasCenterXSig > 0.5) {\n centerX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var centerY = u.centerY;\n if (u.hasCenterYSig > 0.5) {\n centerY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var radius = u.radius;\n if (u.hasRadiusSig > 0.5) {\n radius = textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var sourceRadius = u.sourceRadius;\n if (u.hasSourceRadSig > 0.5) {\n sourceRadius = textureSampleLevel(sourceRadSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var feather = u.feather;\n if (u.hasFeatherSig > 0.5) {\n feather = textureSampleLevel(featherSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var opacity = u.opacity;\n if (u.hasOpacitySig > 0.5) {\n opacity = textureSampleLevel(opacitySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n let dstCol = textureSampleLevel(srcTex, samp, in.uv, 0.0);\n\n // Calculate mask weight (either from explicit mask or procedural circular patch)\n var maskWeight = 0.0;\n let targetCenterUV = vec2<f32>(centerX, centerY);\n\n if (u.hasMask > 0.5) {\n let maskCol = textureSampleLevel(maskTex, samp, in.uv, 0.0);\n maskWeight = max(maskCol.a, max(maskCol.r, max(maskCol.g, maskCol.b)));\n } else {\n let distPx = length((in.uv - targetCenterUV) * dimensions);\n let innerRadius = radius * max(0.0, 1.0 - feather / 100.0);\n maskWeight = 1.0 - smoothstep(innerRadius, max(innerRadius + 0.001, radius), distPx);\n }\n\n let blendWeight = clamp(maskWeight * opacity, 0.0, 1.0);\n if (blendWeight < 1e-4) {\n return dstCol;\n }\n\n // Compute source sample coordinate (scaling from sourceRadius to target radius if different)\n let sourceCenterUV = targetCenterUV + vec2<f32>(offsetX, offsetY) / dimensions;\n let srcScale = max(1.0, sourceRadius) / max(1.0, radius);\n let uvFromTargetCenter = in.uv - targetCenterUV;\n let srcUV = clamp(sourceCenterUV + uvFromTargetCenter * srcScale, vec2<f32>(0.0), vec2<f32>(1.0));\n let srcCol = textureSampleLevel(srcTex, samp, srcUV, 0.0);\n\n var healedCol = srcCol;\n\n if (u.mode > 0.5 && u.mode < 1.5) {\n // Mode 1: Seamless Heal (Poisson gradient / local illumination matching)\n let blurRadius = max(4.0, radius * 0.4);\n let srcBlur = sampleBoxBlur(srcTex, samp, srcUV, blurRadius, dimensions);\n let dstBlur = sampleBoxBlur(srcTex, samp, in.uv, blurRadius, dimensions);\n\n let srcDetail = srcCol.rgb - srcBlur.rgb;\n let healedRgb = dstBlur.rgb + srcDetail;\n let clampedRgb = clamp(healedRgb, vec3<f32>(0.0), vec3<f32>(srcCol.a));\n healedCol = vec4<f32>(clampedRgb, srcCol.a);\n } else if (u.mode >= 1.5) {\n // Mode 2: Texture Transfer (Luminance structure matching)\n let blurRadius = max(4.0, radius * 0.4);\n let srcBlur = sampleBoxBlur(srcTex, samp, srcUV, blurRadius, dimensions);\n\n let lumaSrc = getLuminance(srcCol.rgb);\n let lumaSrcBlur = getLuminance(srcBlur.rgb);\n let lumaDelta = lumaSrc - lumaSrcBlur;\n\n let healedRgb = dstCol.rgb + vec3<f32>(lumaDelta);\n let clampedRgb = clamp(healedRgb, vec3<f32>(0.0), vec3<f32>(dstCol.a));\n healedCol = vec4<f32>(clampedRgb, dstCol.a);\n }\n\n return mix(dstCol, healedCol, blendWeight);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getDeviceResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst textureLayout = texturesLayout(device, 2);\n\tconst signalTextureLayout = texturesLayout(device, 8);\n\tres = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalTextureLayout,\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tmodule: device.createShaderModule({ code: `${WGSL_FULLSCREEN_VS}\\n${WGSL_PATCHHEAL_FS}` }),\n\t\t\tlayouts: device.createPipelineLayout({ bindGroupLayouts: [\n\t\t\t\tuniformLayout,\n\t\t\t\ttextureLayout,\n\t\t\t\tsignalTextureLayout\n\t\t\t] }),\n\t\t\tformat,\n\t\t\tblend: {\n\t\t\t\tcolor: {\n\t\t\t\t\tsrcFactor: \"one\",\n\t\t\t\t\tdstFactor: \"zero\",\n\t\t\t\t\toperation: \"add\"\n\t\t\t\t},\n\t\t\t\talpha: {\n\t\t\t\t\tsrcFactor: \"one\",\n\t\t\t\t\tdstFactor: \"zero\",\n\t\t\t\t\toperation: \"add\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tvertexEntryPoint: \"vs_main\",\n\t\t\tfragmentEntryPoint: \"fs_main\"\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst PatchHealWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"PatchHeal\" || !op) return;\n\tconst childMedia = props.virtualMedia?.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"patch_heal_node\";\n\tconst { texture: tmpSrcTex, view: tmpSrcView } = await drawChildToTexture(args, childMedia, { props: {\n\t\t...props,\n\t\tvirtualMedia: childMedia,\n\t\trenderId: `${props.renderId}-src`\n\t} });\n\tlet maskTex = null;\n\tif (op.maskMedia) ({texture: maskTex} = await drawChildToTexture(args, op.maskMedia, {\n\t\tprops: {\n\t\t\t...props,\n\t\t\tvirtualMedia: op.maskMedia,\n\t\t\trenderId: `${props.renderId}-mask`,\n\t\t\texcludeTextures: [...props.excludeTextures || [], tmpSrcTex]\n\t\t},\n\t\texclude: [tmpSrcTex]\n\t}));\n\tconst { pipeline, uniformLayout: uLayout, textureLayout: tLayout, signalTextureLayout: sigLayout } = getDeviceResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst patches = normalizePatches(op);\n\tconst resolveBindable = (configKey, fallbackVal, minVal, maxVal) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && (input.outputItem?.type === \"Signal\" || input.outputItem?.type === \"Numeric\"));\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = fallbackVal;\n\t\tlet hasStaticSig = false;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") {\n\t\t\tconst numVal = typeof input.outputItem.data === \"number\" ? input.outputItem.data : input.outputItem.data?.value ?? fallbackVal;\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(numVal)));\n\t\t} else {\n\t\t\tconst rawVal = unwrapFrameParam(fallbackVal, compositionFrame, fps).value;\n\t\t\tconst numVal = Number(rawVal ?? fallbackVal);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, isNaN(numVal) ? fallbackVal : numVal));\n\t\t}\n\t\telse if (sd) {\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(sd.offset ?? 0)));\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd\n\t\t};\n\t};\n\tconst dummyMaskView = maskTex ? maskTex.createView() : tmpSrcView;\n\tlet currentInputTex = tmpSrcTex;\n\tconst pingTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpSrcTex,\n\t\t...maskTex ? [maskTex] : [],\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst pongTex = patches.length > 1 ? ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpSrcTex,\n\t\tpingTex,\n\t\t...maskTex ? [maskTex] : [],\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]) : pingTex;\n\tfor (let i = 0; i < patches.length; i++) {\n\t\tconst patch = patches[i];\n\t\tconst isFirstPatch = i === 0;\n\t\tconst centerXRes = isFirstPatch ? resolveBindable(\"centerX\", patch.centerX, 0, 1) : {\n\t\t\tval: patch.centerX,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst centerYRes = isFirstPatch ? resolveBindable(\"centerY\", patch.centerY, 0, 1) : {\n\t\t\tval: patch.centerY,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst offsetXRes = isFirstPatch ? resolveBindable(\"offsetX\", patch.offsetX, -MAX_OFFSET, MAX_OFFSET) : {\n\t\t\tval: patch.offsetX,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst offsetYRes = isFirstPatch ? resolveBindable(\"offsetY\", patch.offsetY, -MAX_OFFSET, MAX_OFFSET) : {\n\t\t\tval: patch.offsetY,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst radiusRes = isFirstPatch ? resolveBindable(\"radius\", patch.radius, 1, MAX_RADIUS) : {\n\t\t\tval: patch.radius,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst sourceRadiusRes = isFirstPatch ? resolveBindable(\"sourceRadius\", patch.sourceRadius ?? patch.radius, 1, MAX_RADIUS) : {\n\t\t\tval: patch.sourceRadius ?? patch.radius,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst featherRes = isFirstPatch ? resolveBindable(\"feather\", patch.feather, 0, MAX_FEATHER) : {\n\t\t\tval: patch.feather,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst opacityRes = isFirstPatch ? resolveBindable(\"opacity\", patch.opacity, 0, 1) : {\n\t\t\tval: patch.opacity,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst signalContext = {\n\t\t\targs,\n\t\t\twidth,\n\t\t\theight,\n\t\t\tframe,\n\t\t\tfps,\n\t\t\telapsedSeconds,\n\t\t\tdurationSeconds\n\t\t};\n\t\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\t\tconst offsetXView = getSignalView(offsetXRes, \"offsetX_sig\");\n\t\tconst offsetYView = getSignalView(offsetYRes, \"offsetY_sig\");\n\t\tconst centerXView = getSignalView(centerXRes, \"centerX_sig\");\n\t\tconst centerYView = getSignalView(centerYRes, \"centerY_sig\");\n\t\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\t\tconst sourceRadiusView = getSignalView(sourceRadiusRes, \"sourceRadius_sig\");\n\t\tconst featherView = getSignalView(featherRes, \"feather_sig\");\n\t\tconst opacityView = getSignalView(opacityRes, \"opacity_sig\");\n\t\tconst modeNum = patch.mode === \"Clone\" ? 0 : patch.mode === \"TextureTransfer\" ? 2 : 1;\n\t\tconst patchData = new Float32Array(20);\n\t\tpatchData[0] = offsetXRes.val;\n\t\tpatchData[1] = offsetYRes.val;\n\t\tpatchData[2] = centerXRes.val;\n\t\tpatchData[3] = centerYRes.val;\n\t\tpatchData[4] = radiusRes.val;\n\t\tpatchData[5] = sourceRadiusRes.val;\n\t\tpatchData[6] = featherRes.val;\n\t\tpatchData[7] = opacityRes.val;\n\t\tpatchData[8] = modeNum;\n\t\tpatchData[9] = maskTex ? 1 : 0;\n\t\tpatchData[10] = offsetXRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[11] = offsetYRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[12] = centerXRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[13] = centerYRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[14] = radiusRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[15] = sourceRadiusRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[16] = featherRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[17] = opacityRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[18] = 0;\n\t\tpatchData[19] = 0;\n\t\tconst uBuffer = ctx.renderer.getTemporaryBuffer(patchData);\n\t\tconst destinationTex = i % 2 === 0 ? pingTex : pongTex;\n\t\tconst texBindGroup = ctx.device.createBindGroup({\n\t\t\tlayout: tLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: currentInputTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: dummyMaskView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t});\n\t\tconst sigBindGroup = ctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: offsetXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: offsetYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: centerXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: centerYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: radiusView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: sourceRadiusView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\n\t\t\t\t\tresource: featherView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 7,\n\t\t\t\t\tresource: opacityView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 8,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t});\n\t\tdrawFullscreenPass(encoder, destinationTex.createView(), pipeline, [\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: uLayout,\n\t\t\t\tentries: [{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: uBuffer }\n\t\t\t\t}]\n\t\t\t}),\n\t\t\ttexBindGroup,\n\t\t\tsigBindGroup\n\t\t]);\n\t\tcurrentInputTex = destinationTex;\n\t}\n\tdrawTextureToTarget(args, currentInputTex);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: PatchHealWebGPURenderer });\n\n//#endregion\nexport { MAX_RADIUS as a, PatchHealResultSchema as c, patchHealConfig as d, MAX_OFFSET as i, PatchItemSchema as l, PatchHealWebGPURenderer as n, PATCH_HEAL_OUTPUT_TYPE_MAP as o, MAX_FEATHER as r, PatchHealNodeConfigSchema as s, renderers_default as t, normalizePatches as u };\n//# sourceMappingURL=renderers-i-B6z1sf.mjs.map"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { n as defineRenderer } from "./renderer-C9r0-KY4.mjs";
2
- import { a as createFullscreenPipeline, i as beginTargetPass, l as fragmentBindGroupLayout, o as drawChildToTexture, r as STRAIGHT_ALPHA_BLEND, t as FULLSCREEN_QUAD_WGSL } from "./gpu-CevnCkZC.mjs";
1
+ import { n as defineRenderer } from "./renderer-BgmO1Dzw.mjs";
2
+ import { a as createFullscreenPipeline, i as beginTargetPass, l as fragmentBindGroupLayout, o as drawChildToTexture, r as STRAIGHT_ALPHA_BLEND, t as FULLSCREEN_QUAD_WGSL } from "./gpu-BRBIoxMC.mjs";
3
3
 
4
4
  //#region ../../nodes/node-liquify/dist/renderers-C4bNr5l9.mjs
5
5
  const MAX_OPERATIONS = 1024;
@@ -184,4 +184,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: LiquifyWebGPURenderer }
184
184
 
185
185
  //#endregion
186
186
  export { renderers_default as n, LiquifyWebGPURenderer as t };
187
- //# sourceMappingURL=renderer-CuwVuVKG.mjs.map
187
+ //# sourceMappingURL=renderer-tcS585Iy.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CuwVuVKG.mjs","names":[],"sources":["../../../nodes/node-liquify/dist/renderers-C4bNr5l9.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, STRAIGHT_ALPHA_BLEND, beginTargetPass, createFullscreenPipeline, drawChildToTexture, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst MAX_OPERATIONS = 1024;\nconst LIQUIFY_SHADER = `\nstruct LiquifyOpData {\n\topType : f32, // 0=Push, 1=Pull, 2=Bloat, 3=Pucker, 4=TwirlCW, 5=TwirlCCW\n\tx : f32,\n\ty : f32,\n\tradius : f32,\n\tstrength : f32,\n\tdx : f32,\n\tdy : f32,\n\t_pad : f32,\n};\n\nstruct LiquifyUniforms {\n\topCount : f32,\n\taspectRatio : f32,\n\topacity : f32,\n\t_pad0 : f32,\n\tops : array<LiquifyOpData, 1024>,\n};\n\n@group(0) @binding(0) var<uniform> u : LiquifyUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nconst PI = 3.141592653589793;\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tvar currentUV = in.uv;\n\tlet count = u32(u.opCount);\n\tlet aspect = u.aspectRatio;\n\n\tfor (var i = 0u; i < count && i < 1024u; i = i + 1u) {\n\t\tlet op = u.ops[i];\n\t\tlet center = vec2<f32>(op.x, op.y);\n\t\tlet delta = currentUV - center;\n\t\tlet deltaAspect = vec2<f32>(delta.x * aspect, delta.y);\n\t\tlet dist = length(deltaAspect);\n\n\t\tif (dist < op.radius && op.radius > 0.0001) {\n\t\t\tlet t = dist / op.radius;\n\t\t\tlet falloff = (1.0 - t * t) * (1.0 - t * t);\n\t\t\tlet s = op.strength;\n\n\t\t\tif (op.opType < 0.5) {\n\t\t\t\t// 0 = Push\n\t\t\t\tlet shift = vec2<f32>(op.dx, op.dy) * s * falloff;\n\t\t\t\tcurrentUV = currentUV - shift;\n\t\t\t} else if (op.opType < 1.5) {\n\t\t\t\t// 1 = Pull\n\t\t\t\tlet shift = vec2<f32>(op.dx, op.dy) * s * falloff;\n\t\t\t\tcurrentUV = currentUV + shift;\n\t\t\t} else if (op.opType < 2.5) {\n\t\t\t\t// 2 = Bloat\n\t\t\t\tlet factor = 1.0 - s * falloff * 0.45;\n\t\t\t\tcurrentUV = center + delta * factor;\n\t\t\t} else if (op.opType < 3.5) {\n\t\t\t\t// 3 = Pucker\n\t\t\t\tlet factor = 1.0 + s * falloff * 0.45;\n\t\t\t\tcurrentUV = center + delta * factor;\n\t\t\t} else if (op.opType < 4.5) {\n\t\t\t\t// 4 = TwirlCW\n\t\t\t\tlet angle = -s * PI * falloff;\n\t\t\t\tlet cosA = cos(angle);\n\t\t\t\tlet sinA = sin(angle);\n\t\t\t\tlet rotated = vec2<f32>(delta.x * cosA - delta.y * sinA, delta.x * sinA + delta.y * cosA);\n\t\t\t\tcurrentUV = center + rotated;\n\t\t\t} else {\n\t\t\t\t// 5 = TwirlCCW\n\t\t\t\tlet angle = s * PI * falloff;\n\t\t\t\tlet cosA = cos(angle);\n\t\t\t\tlet sinA = sin(angle);\n\t\t\t\tlet rotated = vec2<f32>(delta.x * cosA - delta.y * sinA, delta.x * sinA + delta.y * cosA);\n\t\t\t\tcurrentUV = center + rotated;\n\t\t\t}\n\t\t}\n\t}\n\n\tlet clampedUV = clamp(currentUV, vec2<f32>(0.0), vec2<f32>(1.0));\n\tlet sampledColor = textureSampleLevel(tex, samp, clampedUV, 0.0);\n\treturn sampledColor;\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getLiquifyResources(device, format) {\n\tlet layouts = deviceResourceCache.get(device);\n\tif (!layouts) {\n\t\tlayouts = {\n\t\t\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"], \"LiquifyUniformLayout\"),\n\t\t\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"], \"LiquifyTextureLayout\"),\n\t\t\tpipelineCache: /* @__PURE__ */ new Map()\n\t\t};\n\t\tdeviceResourceCache.set(device, layouts);\n\t}\n\tconst cacheKey = format;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: \"liquify.wgsl\",\n\t\t\tcode: LIQUIFY_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `LiquifyPipeline_${format}`,\n\t\t\tmodule,\n\t\t\tlayouts: [layouts.uniformLayout, layouts.singleTextureLayout],\n\t\t\tformat,\n\t\t\tblend: STRAIGHT_ALPHA_BLEND\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tliquifyPipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout\n\t};\n}\nconst TYPE_ENUM_MAP = {\n\tPush: 0,\n\tPull: 1,\n\tBloat: 2,\n\tPucker: 3,\n\tTwirlCW: 4,\n\tTwirlCCW: 5\n};\nconst LiquifyWebGPURenderer = async (args) => {\n\tconst { ctx, pass, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Liquify\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst aspectRatio = height > 0 ? width / height : 1;\n\tconst { texture: childTexture } = await drawChildToTexture(args, childMedia, { props: {\n\t\t...props,\n\t\tvirtualMedia: childMedia,\n\t\tcontainerWidth: width,\n\t\tcontainerHeight: height\n\t} });\n\tconst operations = op.operations || [];\n\tconst opCount = Math.min(operations.length, MAX_OPERATIONS);\n\tconst uniformData = new Float32Array(4 + MAX_OPERATIONS * 8);\n\tuniformData[0] = opCount;\n\tuniformData[1] = aspectRatio;\n\tuniformData[2] = 1;\n\tuniformData[3] = 0;\n\tfor (let i = 0; i < opCount; i++) {\n\t\tconst item = operations[i];\n\t\tif (!item) continue;\n\t\tconst offset = 4 + i * 8;\n\t\tuniformData[offset + 0] = TYPE_ENUM_MAP[item.type] ?? 2;\n\t\tuniformData[offset + 1] = item.x;\n\t\tuniformData[offset + 2] = item.y;\n\t\tuniformData[offset + 3] = item.radius ?? .15;\n\t\tuniformData[offset + 4] = item.strength ?? .5;\n\t\tuniformData[offset + 5] = item.dx ?? 0;\n\t\tuniformData[offset + 6] = item.dy ?? 0;\n\t\tuniformData[offset + 7] = 0;\n\t}\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst resources = getLiquifyResources(ctx.device, ctx.renderer.format);\n\tconst uniformBindGroup = ctx.device.createBindGroup({\n\t\tlayout: resources.uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t});\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst textureBindGroup = ctx.renderer.bindGroupCache.getBindGroup(ctx.device, resources.singleTextureLayout, childTexture, sampler);\n\tconst outPass = beginTargetPass(args);\n\toutPass.setPipeline(resources.liquifyPipeline);\n\toutPass.setBindGroup(0, uniformBindGroup);\n\toutPass.setBindGroup(1, textureBindGroup);\n\toutPass.draw(4, 1, 0, 0);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: LiquifyWebGPURenderer });\n\n//#endregion\nexport { LiquifyWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-C4bNr5l9.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-tcS585Iy.mjs","names":[],"sources":["../../../nodes/node-liquify/dist/renderers-C4bNr5l9.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, STRAIGHT_ALPHA_BLEND, beginTargetPass, createFullscreenPipeline, drawChildToTexture, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst MAX_OPERATIONS = 1024;\nconst LIQUIFY_SHADER = `\nstruct LiquifyOpData {\n\topType : f32, // 0=Push, 1=Pull, 2=Bloat, 3=Pucker, 4=TwirlCW, 5=TwirlCCW\n\tx : f32,\n\ty : f32,\n\tradius : f32,\n\tstrength : f32,\n\tdx : f32,\n\tdy : f32,\n\t_pad : f32,\n};\n\nstruct LiquifyUniforms {\n\topCount : f32,\n\taspectRatio : f32,\n\topacity : f32,\n\t_pad0 : f32,\n\tops : array<LiquifyOpData, 1024>,\n};\n\n@group(0) @binding(0) var<uniform> u : LiquifyUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nconst PI = 3.141592653589793;\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tvar currentUV = in.uv;\n\tlet count = u32(u.opCount);\n\tlet aspect = u.aspectRatio;\n\n\tfor (var i = 0u; i < count && i < 1024u; i = i + 1u) {\n\t\tlet op = u.ops[i];\n\t\tlet center = vec2<f32>(op.x, op.y);\n\t\tlet delta = currentUV - center;\n\t\tlet deltaAspect = vec2<f32>(delta.x * aspect, delta.y);\n\t\tlet dist = length(deltaAspect);\n\n\t\tif (dist < op.radius && op.radius > 0.0001) {\n\t\t\tlet t = dist / op.radius;\n\t\t\tlet falloff = (1.0 - t * t) * (1.0 - t * t);\n\t\t\tlet s = op.strength;\n\n\t\t\tif (op.opType < 0.5) {\n\t\t\t\t// 0 = Push\n\t\t\t\tlet shift = vec2<f32>(op.dx, op.dy) * s * falloff;\n\t\t\t\tcurrentUV = currentUV - shift;\n\t\t\t} else if (op.opType < 1.5) {\n\t\t\t\t// 1 = Pull\n\t\t\t\tlet shift = vec2<f32>(op.dx, op.dy) * s * falloff;\n\t\t\t\tcurrentUV = currentUV + shift;\n\t\t\t} else if (op.opType < 2.5) {\n\t\t\t\t// 2 = Bloat\n\t\t\t\tlet factor = 1.0 - s * falloff * 0.45;\n\t\t\t\tcurrentUV = center + delta * factor;\n\t\t\t} else if (op.opType < 3.5) {\n\t\t\t\t// 3 = Pucker\n\t\t\t\tlet factor = 1.0 + s * falloff * 0.45;\n\t\t\t\tcurrentUV = center + delta * factor;\n\t\t\t} else if (op.opType < 4.5) {\n\t\t\t\t// 4 = TwirlCW\n\t\t\t\tlet angle = -s * PI * falloff;\n\t\t\t\tlet cosA = cos(angle);\n\t\t\t\tlet sinA = sin(angle);\n\t\t\t\tlet rotated = vec2<f32>(delta.x * cosA - delta.y * sinA, delta.x * sinA + delta.y * cosA);\n\t\t\t\tcurrentUV = center + rotated;\n\t\t\t} else {\n\t\t\t\t// 5 = TwirlCCW\n\t\t\t\tlet angle = s * PI * falloff;\n\t\t\t\tlet cosA = cos(angle);\n\t\t\t\tlet sinA = sin(angle);\n\t\t\t\tlet rotated = vec2<f32>(delta.x * cosA - delta.y * sinA, delta.x * sinA + delta.y * cosA);\n\t\t\t\tcurrentUV = center + rotated;\n\t\t\t}\n\t\t}\n\t}\n\n\tlet clampedUV = clamp(currentUV, vec2<f32>(0.0), vec2<f32>(1.0));\n\tlet sampledColor = textureSampleLevel(tex, samp, clampedUV, 0.0);\n\treturn sampledColor;\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getLiquifyResources(device, format) {\n\tlet layouts = deviceResourceCache.get(device);\n\tif (!layouts) {\n\t\tlayouts = {\n\t\t\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"], \"LiquifyUniformLayout\"),\n\t\t\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"], \"LiquifyTextureLayout\"),\n\t\t\tpipelineCache: /* @__PURE__ */ new Map()\n\t\t};\n\t\tdeviceResourceCache.set(device, layouts);\n\t}\n\tconst cacheKey = format;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: \"liquify.wgsl\",\n\t\t\tcode: LIQUIFY_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `LiquifyPipeline_${format}`,\n\t\t\tmodule,\n\t\t\tlayouts: [layouts.uniformLayout, layouts.singleTextureLayout],\n\t\t\tformat,\n\t\t\tblend: STRAIGHT_ALPHA_BLEND\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tliquifyPipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout\n\t};\n}\nconst TYPE_ENUM_MAP = {\n\tPush: 0,\n\tPull: 1,\n\tBloat: 2,\n\tPucker: 3,\n\tTwirlCW: 4,\n\tTwirlCCW: 5\n};\nconst LiquifyWebGPURenderer = async (args) => {\n\tconst { ctx, pass, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Liquify\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst aspectRatio = height > 0 ? width / height : 1;\n\tconst { texture: childTexture } = await drawChildToTexture(args, childMedia, { props: {\n\t\t...props,\n\t\tvirtualMedia: childMedia,\n\t\tcontainerWidth: width,\n\t\tcontainerHeight: height\n\t} });\n\tconst operations = op.operations || [];\n\tconst opCount = Math.min(operations.length, MAX_OPERATIONS);\n\tconst uniformData = new Float32Array(4 + MAX_OPERATIONS * 8);\n\tuniformData[0] = opCount;\n\tuniformData[1] = aspectRatio;\n\tuniformData[2] = 1;\n\tuniformData[3] = 0;\n\tfor (let i = 0; i < opCount; i++) {\n\t\tconst item = operations[i];\n\t\tif (!item) continue;\n\t\tconst offset = 4 + i * 8;\n\t\tuniformData[offset + 0] = TYPE_ENUM_MAP[item.type] ?? 2;\n\t\tuniformData[offset + 1] = item.x;\n\t\tuniformData[offset + 2] = item.y;\n\t\tuniformData[offset + 3] = item.radius ?? .15;\n\t\tuniformData[offset + 4] = item.strength ?? .5;\n\t\tuniformData[offset + 5] = item.dx ?? 0;\n\t\tuniformData[offset + 6] = item.dy ?? 0;\n\t\tuniformData[offset + 7] = 0;\n\t}\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst resources = getLiquifyResources(ctx.device, ctx.renderer.format);\n\tconst uniformBindGroup = ctx.device.createBindGroup({\n\t\tlayout: resources.uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t});\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst textureBindGroup = ctx.renderer.bindGroupCache.getBindGroup(ctx.device, resources.singleTextureLayout, childTexture, sampler);\n\tconst outPass = beginTargetPass(args);\n\toutPass.setPipeline(resources.liquifyPipeline);\n\toutPass.setBindGroup(0, uniformBindGroup);\n\toutPass.setBindGroup(1, textureBindGroup);\n\toutPass.draw(4, 1, 0, 0);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: LiquifyWebGPURenderer });\n\n//#endregion\nexport { LiquifyWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-C4bNr5l9.mjs.map"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { n as defineRenderer } from "./renderer-C9r0-KY4.mjs";
2
- import { Fn as signalRegistry } from "./dist-Bf0H4lp1.mjs";
3
- import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CevnCkZC.mjs";
1
+ import { n as defineRenderer } from "./renderer-BgmO1Dzw.mjs";
2
+ import { In as signalRegistry } from "./dist-BuirkW-f.mjs";
3
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-BRBIoxMC.mjs";
4
4
 
5
5
  //#region ../../nodes/node-colorkey/dist/renderers-eo_mW2uK.mjs
6
6
  const COLORKEY_SHADER = `
@@ -279,4 +279,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: ColorKeyWebGPURenderer
279
279
 
280
280
  //#endregion
281
281
  export { renderers_default as t };
282
- //# sourceMappingURL=renderer-Datqywo_.mjs.map
282
+ //# sourceMappingURL=renderer-x1xlZaH_.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-Datqywo_.mjs","names":[],"sources":["../../../nodes/node-colorkey/dist/renderers-eo_mW2uK.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst COLORKEY_SHADER = `\nstruct ColorKeyUniforms {\n\tsimilarity : f32,\n\tsmoothness : f32,\n\tspillSuppression : f32,\n\tcolorSpace : f32, // 0 for YUV, 1 for RGB\n\tspillSuppressionType : f32, // 0 for Desaturate, 1 for Neutralize, 2 for None\n\tkeyR : f32,\n\tkeyG : f32,\n\tkeyB : f32,\n\thasSimilaritySig : f32,\n\thasSmoothnessSig : f32,\n\thasSpillSig : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : ColorKeyUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\n@group(2) @binding(0) var similaritySigTex : texture_2d<f32>;\n@group(2) @binding(1) var smoothnessSigTex : texture_2d<f32>;\n@group(2) @binding(2) var spillSigTex : texture_2d<f32>;\n@group(2) @binding(3) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn rgb2yuv(rgb: vec3<f32>) -> vec3<f32> {\n\tlet y = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b;\n\tlet u = -0.169 * rgb.r - 0.331 * rgb.g + 0.500 * rgb.b;\n\tlet v = 0.500 * rgb.r - 0.419 * rgb.g - 0.081 * rgb.b;\n\treturn vec3<f32>(y, u, v);\n}\n\nfn yuv2rgb(yuv: vec3<f32>) -> vec3<f32> {\n\tlet r = yuv.x + 1.402 * yuv.z;\n\tlet g = yuv.x - 0.344 * yuv.y - 0.714 * yuv.z;\n\tlet b = yuv.x + 1.772 * yuv.y;\n\treturn vec3<f32>(r, g, b);\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet src_color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tif (src_color.a < 1e-5) {\n\t\treturn src_color;\n\t}\n\n\t// Unpremultiply alpha for keying and grading\n\tlet unpremult_rgb = src_color.rgb / src_color.a;\n\n\t// Resolve dynamic signals if connected, otherwise use static uniform values\n\tvar similarity = u.similarity;\n\tif (u.hasSimilaritySig > 0.5) {\n\t\tsimilarity = textureSampleLevel(similaritySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tvar smoothness = u.smoothness;\n\tif (u.hasSmoothnessSig > 0.5) {\n\t\tsmoothness = textureSampleLevel(smoothnessSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tvar spillSuppression = u.spillSuppression;\n\tif (u.hasSpillSig > 0.5) {\n\t\tspillSuppression = textureSampleLevel(spillSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet keyColor = vec3<f32>(u.keyR, u.keyG, u.keyB);\n\n\t// 1. Calculate similarity distance\n\tvar dist = 0.0;\n\tif (u.colorSpace < 0.5) {\n\t\t// YUV (Chroma Distance)\n\t\tlet C_yuv = rgb2yuv(unpremult_rgb);\n\t\tlet K_yuv = rgb2yuv(keyColor);\n\t\tdist = distance(C_yuv.yz, K_yuv.yz);\n\t} else {\n\t\t// RGB (Exact Distance)\n\t\tdist = distance(unpremult_rgb, keyColor);\n\t}\n\n\t// 2. Calculate transparency mask\n\tvar mask = 0.0;\n\tif (smoothness < 0.0001) {\n\t\tmask = select(0.0, 1.0, dist >= similarity);\n\t} else {\n\t\tmask = smoothstep(similarity, similarity + smoothness, dist);\n\t}\n\n\t// 3. Apply spill suppression\n\tvar final_rgb = unpremult_rgb;\n\tif (u.spillSuppressionType < 2.5) { // 0 for Desaturate, 1 for Neutralize, 2 for None\n\t\tlet C_yuv = rgb2yuv(unpremult_rgb);\n\t\tlet K_yuv = rgb2yuv(keyColor);\n\t\tlet K_chroma = K_yuv.yz;\n\t\tlet K_len_sq = dot(K_chroma, K_chroma);\n\n\t\tif (K_len_sq > 1e-6) {\n\t\t\tlet C_chroma = C_yuv.yz;\n\t\t\tlet proj = dot(C_chroma, K_chroma) / K_len_sq;\n\t\t\tif (proj > 0.0) {\n\t\t\t\tlet C_para = proj * K_chroma;\n\t\t\t\tvar C_chroma_suppressed = C_chroma;\n\n\t\t\t\tif (u.spillSuppressionType < 0.5) {\n\t\t\t\t\t// Desaturate\n\t\t\t\t\tC_chroma_suppressed = C_chroma - spillSuppression * C_para;\n\t\t\t\t} else {\n\t\t\t\t\t// Neutralize (completely shift to neutral gray chroma)\n\t\t\t\t\tC_chroma_suppressed = C_chroma - C_para;\n\t\t\t\t}\n\n\t\t\t\tfinal_rgb = yuv2rgb(vec3<f32>(C_yuv.x, C_chroma_suppressed.x, C_chroma_suppressed.y));\n\t\t\t}\n\t\t}\n\t}\n\n\tlet final_alpha = src_color.a * mask;\n\treturn vec4<f32>(clamp(final_rgb, vec3<f32>(0.0), vec3<f32>(1.0)) * final_alpha, final_alpha);\n}\n`;\nconst colorKeyData = new Float32Array(12);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 3),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getColorKeyResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `colorkey_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst colorKeyModule = device.createShaderModule({\n\t\t\tlabel: `colorkey_${format}.wgsl`,\n\t\t\tcode: COLORKEY_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `ColorKeyPipeline_${format}`,\n\t\t\tmodule: colorKeyModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tcolorKeyPipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nfunction hexToRgb(hex) {\n\tlet h = hex.replace(\"#\", \"\");\n\tif (h.length === 3) h = h.split(\"\").map((c) => c + c).join(\"\");\n\treturn [\n\t\tparseInt(h.substring(0, 2), 16) / 255,\n\t\tparseInt(h.substring(2, 4), 16) / 255,\n\t\tparseInt(h.substring(4, 6), 16) / 255\n\t];\n}\nconst ColorKeyWebGPURenderer = 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 !== \"ColorKey\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"colorkey_node\";\n\tconst similarityInput = op.similarityHandleId ? op.inputs?.[op.similarityHandleId] : null;\n\tconst hasSimilaritySig = !!(similarityInput?.connectionValid && (similarityInput.outputItem?.type === \"Signal\" || similarityInput.outputItem?.type === \"Numeric\"));\n\tconst similaritySd = hasSimilaritySig && similarityInput?.outputItem?.data ? similarityInput.outputItem.data : null;\n\tlet similarity = .4;\n\tlet hasStaticSimilaritySig = false;\n\tif (!hasSimilaritySig) if (similarityInput?.connectionValid && similarityInput.outputItem?.type === \"Number\") similarity = Math.max(0, Math.min(1, Number(similarityInput.outputItem.data ?? .4)));\n\telse similarity = Math.max(0, Math.min(1, Number(op.similarity ?? .4)));\n\telse if (similaritySd) {\n\t\tsimilarity = Math.max(0, Math.min(1, Number(similaritySd.offset ?? 0)));\n\t\thasStaticSimilaritySig = true;\n\t}\n\tconst smoothnessInput = op.smoothnessHandleId ? op.inputs?.[op.smoothnessHandleId] : null;\n\tconst hasSmoothnessSig = !!(smoothnessInput?.connectionValid && (smoothnessInput.outputItem?.type === \"Signal\" || smoothnessInput.outputItem?.type === \"Numeric\"));\n\tconst smoothnessSd = hasSmoothnessSig && smoothnessInput?.outputItem?.data ? smoothnessInput.outputItem.data : null;\n\tlet smoothness = .1;\n\tlet hasStaticSmoothnessSig = false;\n\tif (!hasSmoothnessSig) if (smoothnessInput?.connectionValid && smoothnessInput.outputItem?.type === \"Number\") smoothness = Math.max(0, Math.min(1, Number(smoothnessInput.outputItem.data ?? .1)));\n\telse smoothness = Math.max(0, Math.min(1, Number(op.smoothness ?? .1)));\n\telse if (smoothnessSd) {\n\t\tsmoothness = Math.max(0, Math.min(1, Number(smoothnessSd.offset ?? 0)));\n\t\thasStaticSmoothnessSig = true;\n\t}\n\tconst spillInput = op.spillSuppressionHandleId ? op.inputs?.[op.spillSuppressionHandleId] : null;\n\tconst hasSpillSig = !!(spillInput?.connectionValid && (spillInput.outputItem?.type === \"Signal\" || spillInput.outputItem?.type === \"Numeric\"));\n\tconst spillSd = hasSpillSig && spillInput?.outputItem?.data ? spillInput.outputItem.data : null;\n\tlet spillSuppression = .2;\n\tlet hasStaticSpillSig = false;\n\tif (!hasSpillSig) if (spillInput?.connectionValid && spillInput.outputItem?.type === \"Number\") spillSuppression = Math.max(0, Math.min(1, Number(spillInput.outputItem.data ?? .2)));\n\telse spillSuppression = Math.max(0, Math.min(1, Number(op.spillSuppression ?? .2)));\n\telse if (spillSd) {\n\t\tspillSuppression = Math.max(0, Math.min(1, Number(spillSd.offset ?? 0)));\n\t\thasStaticSpillSig = true;\n\t}\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { colorKeyPipeline: pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getColorKeyResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tlet similarityView;\n\tif (hasStaticSimilaritySig && similaritySd) similarityView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, similaritySd.nodeId ?? `${nodeId}_similarity_sig`, elapsedSeconds, durationSeconds, similaritySd, width, height, props.renderId, frame, fps);\n\telse similarityView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tlet smoothnessView;\n\tif (hasStaticSmoothnessSig && smoothnessSd) smoothnessView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, smoothnessSd.nodeId ?? `${nodeId}_smoothness_sig`, elapsedSeconds, durationSeconds, smoothnessSd, width, height, props.renderId, frame, fps);\n\telse smoothnessView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tlet spillView;\n\tif (hasStaticSpillSig && spillSd) spillView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, spillSd.nodeId ?? `${nodeId}_spill_sig`, elapsedSeconds, durationSeconds, spillSd, width, height, props.renderId, frame, fps);\n\telse spillView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tconst [keyR, keyG, keyB] = hexToRgb(op.keyColor ?? \"#00ff00\");\n\tcolorKeyData[0] = similarity;\n\tcolorKeyData[1] = smoothness;\n\tcolorKeyData[2] = spillSuppression;\n\tcolorKeyData[3] = op.colorSpace === \"RGB\" ? 1 : 0;\n\tcolorKeyData[4] = op.spillSuppressionType === \"None\" ? 2 : op.spillSuppressionType === \"Neutralize\" ? 1 : 0;\n\tcolorKeyData[5] = keyR;\n\tcolorKeyData[6] = keyG;\n\tcolorKeyData[7] = keyB;\n\tcolorKeyData[8] = hasStaticSimilaritySig ? 1 : 0;\n\tcolorKeyData[9] = hasStaticSmoothnessSig ? 1 : 0;\n\tcolorKeyData[10] = hasStaticSpillSig ? 1 : 0;\n\tcolorKeyData[11] = 0;\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst singleBuffer = ctx.renderer.getTemporaryBuffer(colorKeyData);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: singleBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: similarityView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: smoothnessView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: spillView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ColorKeyWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-eo_mW2uK.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-x1xlZaH_.mjs","names":[],"sources":["../../../nodes/node-colorkey/dist/renderers-eo_mW2uK.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst COLORKEY_SHADER = `\nstruct ColorKeyUniforms {\n\tsimilarity : f32,\n\tsmoothness : f32,\n\tspillSuppression : f32,\n\tcolorSpace : f32, // 0 for YUV, 1 for RGB\n\tspillSuppressionType : f32, // 0 for Desaturate, 1 for Neutralize, 2 for None\n\tkeyR : f32,\n\tkeyG : f32,\n\tkeyB : f32,\n\thasSimilaritySig : f32,\n\thasSmoothnessSig : f32,\n\thasSpillSig : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : ColorKeyUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\n@group(2) @binding(0) var similaritySigTex : texture_2d<f32>;\n@group(2) @binding(1) var smoothnessSigTex : texture_2d<f32>;\n@group(2) @binding(2) var spillSigTex : texture_2d<f32>;\n@group(2) @binding(3) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn rgb2yuv(rgb: vec3<f32>) -> vec3<f32> {\n\tlet y = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b;\n\tlet u = -0.169 * rgb.r - 0.331 * rgb.g + 0.500 * rgb.b;\n\tlet v = 0.500 * rgb.r - 0.419 * rgb.g - 0.081 * rgb.b;\n\treturn vec3<f32>(y, u, v);\n}\n\nfn yuv2rgb(yuv: vec3<f32>) -> vec3<f32> {\n\tlet r = yuv.x + 1.402 * yuv.z;\n\tlet g = yuv.x - 0.344 * yuv.y - 0.714 * yuv.z;\n\tlet b = yuv.x + 1.772 * yuv.y;\n\treturn vec3<f32>(r, g, b);\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet src_color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tif (src_color.a < 1e-5) {\n\t\treturn src_color;\n\t}\n\n\t// Unpremultiply alpha for keying and grading\n\tlet unpremult_rgb = src_color.rgb / src_color.a;\n\n\t// Resolve dynamic signals if connected, otherwise use static uniform values\n\tvar similarity = u.similarity;\n\tif (u.hasSimilaritySig > 0.5) {\n\t\tsimilarity = textureSampleLevel(similaritySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tvar smoothness = u.smoothness;\n\tif (u.hasSmoothnessSig > 0.5) {\n\t\tsmoothness = textureSampleLevel(smoothnessSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tvar spillSuppression = u.spillSuppression;\n\tif (u.hasSpillSig > 0.5) {\n\t\tspillSuppression = textureSampleLevel(spillSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet keyColor = vec3<f32>(u.keyR, u.keyG, u.keyB);\n\n\t// 1. Calculate similarity distance\n\tvar dist = 0.0;\n\tif (u.colorSpace < 0.5) {\n\t\t// YUV (Chroma Distance)\n\t\tlet C_yuv = rgb2yuv(unpremult_rgb);\n\t\tlet K_yuv = rgb2yuv(keyColor);\n\t\tdist = distance(C_yuv.yz, K_yuv.yz);\n\t} else {\n\t\t// RGB (Exact Distance)\n\t\tdist = distance(unpremult_rgb, keyColor);\n\t}\n\n\t// 2. Calculate transparency mask\n\tvar mask = 0.0;\n\tif (smoothness < 0.0001) {\n\t\tmask = select(0.0, 1.0, dist >= similarity);\n\t} else {\n\t\tmask = smoothstep(similarity, similarity + smoothness, dist);\n\t}\n\n\t// 3. Apply spill suppression\n\tvar final_rgb = unpremult_rgb;\n\tif (u.spillSuppressionType < 2.5) { // 0 for Desaturate, 1 for Neutralize, 2 for None\n\t\tlet C_yuv = rgb2yuv(unpremult_rgb);\n\t\tlet K_yuv = rgb2yuv(keyColor);\n\t\tlet K_chroma = K_yuv.yz;\n\t\tlet K_len_sq = dot(K_chroma, K_chroma);\n\n\t\tif (K_len_sq > 1e-6) {\n\t\t\tlet C_chroma = C_yuv.yz;\n\t\t\tlet proj = dot(C_chroma, K_chroma) / K_len_sq;\n\t\t\tif (proj > 0.0) {\n\t\t\t\tlet C_para = proj * K_chroma;\n\t\t\t\tvar C_chroma_suppressed = C_chroma;\n\n\t\t\t\tif (u.spillSuppressionType < 0.5) {\n\t\t\t\t\t// Desaturate\n\t\t\t\t\tC_chroma_suppressed = C_chroma - spillSuppression * C_para;\n\t\t\t\t} else {\n\t\t\t\t\t// Neutralize (completely shift to neutral gray chroma)\n\t\t\t\t\tC_chroma_suppressed = C_chroma - C_para;\n\t\t\t\t}\n\n\t\t\t\tfinal_rgb = yuv2rgb(vec3<f32>(C_yuv.x, C_chroma_suppressed.x, C_chroma_suppressed.y));\n\t\t\t}\n\t\t}\n\t}\n\n\tlet final_alpha = src_color.a * mask;\n\treturn vec4<f32>(clamp(final_rgb, vec3<f32>(0.0), vec3<f32>(1.0)) * final_alpha, final_alpha);\n}\n`;\nconst colorKeyData = new Float32Array(12);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 3),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getColorKeyResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `colorkey_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst colorKeyModule = device.createShaderModule({\n\t\t\tlabel: `colorkey_${format}.wgsl`,\n\t\t\tcode: COLORKEY_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `ColorKeyPipeline_${format}`,\n\t\t\tmodule: colorKeyModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tcolorKeyPipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nfunction hexToRgb(hex) {\n\tlet h = hex.replace(\"#\", \"\");\n\tif (h.length === 3) h = h.split(\"\").map((c) => c + c).join(\"\");\n\treturn [\n\t\tparseInt(h.substring(0, 2), 16) / 255,\n\t\tparseInt(h.substring(2, 4), 16) / 255,\n\t\tparseInt(h.substring(4, 6), 16) / 255\n\t];\n}\nconst ColorKeyWebGPURenderer = 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 !== \"ColorKey\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"colorkey_node\";\n\tconst similarityInput = op.similarityHandleId ? op.inputs?.[op.similarityHandleId] : null;\n\tconst hasSimilaritySig = !!(similarityInput?.connectionValid && (similarityInput.outputItem?.type === \"Signal\" || similarityInput.outputItem?.type === \"Numeric\"));\n\tconst similaritySd = hasSimilaritySig && similarityInput?.outputItem?.data ? similarityInput.outputItem.data : null;\n\tlet similarity = .4;\n\tlet hasStaticSimilaritySig = false;\n\tif (!hasSimilaritySig) if (similarityInput?.connectionValid && similarityInput.outputItem?.type === \"Number\") similarity = Math.max(0, Math.min(1, Number(similarityInput.outputItem.data ?? .4)));\n\telse similarity = Math.max(0, Math.min(1, Number(op.similarity ?? .4)));\n\telse if (similaritySd) {\n\t\tsimilarity = Math.max(0, Math.min(1, Number(similaritySd.offset ?? 0)));\n\t\thasStaticSimilaritySig = true;\n\t}\n\tconst smoothnessInput = op.smoothnessHandleId ? op.inputs?.[op.smoothnessHandleId] : null;\n\tconst hasSmoothnessSig = !!(smoothnessInput?.connectionValid && (smoothnessInput.outputItem?.type === \"Signal\" || smoothnessInput.outputItem?.type === \"Numeric\"));\n\tconst smoothnessSd = hasSmoothnessSig && smoothnessInput?.outputItem?.data ? smoothnessInput.outputItem.data : null;\n\tlet smoothness = .1;\n\tlet hasStaticSmoothnessSig = false;\n\tif (!hasSmoothnessSig) if (smoothnessInput?.connectionValid && smoothnessInput.outputItem?.type === \"Number\") smoothness = Math.max(0, Math.min(1, Number(smoothnessInput.outputItem.data ?? .1)));\n\telse smoothness = Math.max(0, Math.min(1, Number(op.smoothness ?? .1)));\n\telse if (smoothnessSd) {\n\t\tsmoothness = Math.max(0, Math.min(1, Number(smoothnessSd.offset ?? 0)));\n\t\thasStaticSmoothnessSig = true;\n\t}\n\tconst spillInput = op.spillSuppressionHandleId ? op.inputs?.[op.spillSuppressionHandleId] : null;\n\tconst hasSpillSig = !!(spillInput?.connectionValid && (spillInput.outputItem?.type === \"Signal\" || spillInput.outputItem?.type === \"Numeric\"));\n\tconst spillSd = hasSpillSig && spillInput?.outputItem?.data ? spillInput.outputItem.data : null;\n\tlet spillSuppression = .2;\n\tlet hasStaticSpillSig = false;\n\tif (!hasSpillSig) if (spillInput?.connectionValid && spillInput.outputItem?.type === \"Number\") spillSuppression = Math.max(0, Math.min(1, Number(spillInput.outputItem.data ?? .2)));\n\telse spillSuppression = Math.max(0, Math.min(1, Number(op.spillSuppression ?? .2)));\n\telse if (spillSd) {\n\t\tspillSuppression = Math.max(0, Math.min(1, Number(spillSd.offset ?? 0)));\n\t\thasStaticSpillSig = true;\n\t}\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { colorKeyPipeline: pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getColorKeyResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tlet similarityView;\n\tif (hasStaticSimilaritySig && similaritySd) similarityView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, similaritySd.nodeId ?? `${nodeId}_similarity_sig`, elapsedSeconds, durationSeconds, similaritySd, width, height, props.renderId, frame, fps);\n\telse similarityView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tlet smoothnessView;\n\tif (hasStaticSmoothnessSig && smoothnessSd) smoothnessView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, smoothnessSd.nodeId ?? `${nodeId}_smoothness_sig`, elapsedSeconds, durationSeconds, smoothnessSd, width, height, props.renderId, frame, fps);\n\telse smoothnessView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tlet spillView;\n\tif (hasStaticSpillSig && spillSd) spillView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, spillSd.nodeId ?? `${nodeId}_spill_sig`, elapsedSeconds, durationSeconds, spillSd, width, height, props.renderId, frame, fps);\n\telse spillView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tconst [keyR, keyG, keyB] = hexToRgb(op.keyColor ?? \"#00ff00\");\n\tcolorKeyData[0] = similarity;\n\tcolorKeyData[1] = smoothness;\n\tcolorKeyData[2] = spillSuppression;\n\tcolorKeyData[3] = op.colorSpace === \"RGB\" ? 1 : 0;\n\tcolorKeyData[4] = op.spillSuppressionType === \"None\" ? 2 : op.spillSuppressionType === \"Neutralize\" ? 1 : 0;\n\tcolorKeyData[5] = keyR;\n\tcolorKeyData[6] = keyG;\n\tcolorKeyData[7] = keyB;\n\tcolorKeyData[8] = hasStaticSimilaritySig ? 1 : 0;\n\tcolorKeyData[9] = hasStaticSmoothnessSig ? 1 : 0;\n\tcolorKeyData[10] = hasStaticSpillSig ? 1 : 0;\n\tcolorKeyData[11] = 0;\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst singleBuffer = ctx.renderer.getTemporaryBuffer(colorKeyData);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: singleBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: similarityView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: smoothnessView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: spillView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ColorKeyWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-eo_mW2uK.mjs.map"],"mappings":"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"}