framefields 2.4.3 → 2.5.1

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 (514) hide show
  1. package/README.md +26 -1
  2. package/dist/audio/index.d.mts +4 -4
  3. package/dist/audio/index.mjs +13 -13
  4. package/dist/{audio-DJeVoE8b.mjs → audio-BluXgSeG.mjs} +1 -1
  5. package/dist/{audio-DJeVoE8b.mjs.map → audio-BluXgSeG.mjs.map} +1 -1
  6. package/dist/{audio-BymXfAvH.d.mts → audio-C1A4N3Wh.d.mts} +3 -3
  7. package/dist/{audio-BymXfAvH.d.mts.map → audio-C1A4N3Wh.d.mts.map} +1 -1
  8. package/dist/{audio-BzHHpImj.mjs → audio-CZwVENqB.mjs} +4 -4
  9. package/dist/{audio-BzHHpImj.mjs.map → audio-CZwVENqB.mjs.map} +1 -1
  10. package/dist/cli.d.mts +1 -0
  11. package/dist/cli.mjs +221 -0
  12. package/dist/cli.mjs.map +1 -0
  13. package/dist/components/index.d.mts +12 -0
  14. package/dist/components/index.mjs +49 -0
  15. package/dist/{dist-Bo2_zeCn.mjs → dist-CQZ5_60A.mjs} +2 -2
  16. package/dist/{dist-Bo2_zeCn.mjs.map → dist-CQZ5_60A.mjs.map} +1 -1
  17. package/dist/{dist-0QGroRYZ.mjs → dist-C_SMBmHr.mjs} +1 -1
  18. package/dist/{dist-0QGroRYZ.mjs.map → dist-C_SMBmHr.mjs.map} +1 -1
  19. package/dist/{dist-hmWTJPik.mjs → dist-DBWkkSvJ.mjs} +113 -68
  20. package/dist/dist-DBWkkSvJ.mjs.map +1 -0
  21. package/dist/{dist-TrtLGPvc.mjs → dist-DFeF-ygz.mjs} +1 -1
  22. package/dist/{dist-TrtLGPvc.mjs.map → dist-DFeF-ygz.mjs.map} +1 -1
  23. package/dist/{dist-DMa2BbYs.mjs → dist-DHQVWaV2.mjs} +53 -21
  24. package/dist/dist-DHQVWaV2.mjs.map +1 -0
  25. package/dist/effects/index.d.mts +4 -4
  26. package/dist/effects/index.mjs +36 -36
  27. package/dist/{effects-CiZjSwIh.mjs → effects-DZvq-nWT.mjs} +3 -3
  28. package/dist/{effects-CiZjSwIh.mjs.map → effects-DZvq-nWT.mjs.map} +1 -1
  29. package/dist/fonts/index.d.mts +1 -1
  30. package/dist/fonts/index.mjs +3 -3
  31. package/dist/{fonts-Da1JDKpc.mjs → fonts-DcsxFpyU.mjs} +3 -2
  32. package/dist/fonts-DcsxFpyU.mjs.map +1 -0
  33. package/dist/{gpu-CHIgM_YH.mjs → gpu-Dq_uI_00.mjs} +2 -2
  34. package/dist/{gpu-CHIgM_YH.mjs.map → gpu-Dq_uI_00.mjs.map} +1 -1
  35. package/dist/{index-DIvWBm-q.d.mts → index-B-KVpJMb.d.mts} +2 -2
  36. package/dist/{index-DIvWBm-q.d.mts.map → index-B-KVpJMb.d.mts.map} +1 -1
  37. package/dist/{index-WMofVN02.d.mts → index-BpdVOlsV.d.mts} +3 -3
  38. package/dist/{index-WMofVN02.d.mts.map → index-BpdVOlsV.d.mts.map} +1 -1
  39. package/dist/index-C2f4Hm-p.d.mts +89 -0
  40. package/dist/index-C2f4Hm-p.d.mts.map +1 -0
  41. package/dist/{index-B-55dXDu.d.mts → index-CalU-mpZ.d.mts} +1 -1
  42. package/dist/{index-B-55dXDu.d.mts.map → index-CalU-mpZ.d.mts.map} +1 -1
  43. package/dist/{index-CJkihekp.d.mts → index-D6-lH1Mx.d.mts} +189 -189
  44. package/dist/index-D6-lH1Mx.d.mts.map +1 -0
  45. package/dist/index-DKssQ_wn.d.mts +5968 -0
  46. package/dist/index-DKssQ_wn.d.mts.map +1 -0
  47. package/dist/{index-Dwf76Qep.d.mts → index-DNKM3to5.d.mts} +3 -3
  48. package/dist/{index-Dwf76Qep.d.mts.map → index-DNKM3to5.d.mts.map} +1 -1
  49. package/dist/{index-DGe83M-p.d.mts → index-fymoeGNW.d.mts} +6 -1
  50. package/dist/index-fymoeGNW.d.mts.map +1 -0
  51. package/dist/index.d.mts +13 -4659
  52. package/dist/index.mjs +59 -6654
  53. package/dist/preview/index.d.mts +4 -90
  54. package/dist/preview/index.mjs +12 -12
  55. package/dist/{preview-5E4B96RD.mjs → preview-CYI4i4m3.mjs} +5 -4
  56. package/dist/preview-CYI4i4m3.mjs.map +1 -0
  57. package/dist/preview-engine/audio.mjs +1 -1
  58. package/dist/preview-engine/{chunk-TFFG5YFI.mjs → chunk-24H3QVYB.mjs} +1 -1
  59. package/dist/preview-engine/{chunk-7J4OK4VE.mjs → chunk-25T3M6MI.mjs} +1 -1
  60. package/dist/preview-engine/{chunk-O3NOB5IB.mjs → chunk-2QQQTZHS.mjs} +1 -1
  61. package/dist/preview-engine/{chunk-XTPEGKOZ.mjs → chunk-2RZ6S4SW.mjs} +1 -1
  62. package/dist/preview-engine/{chunk-37P2KIFE.mjs → chunk-3AYICEZ5.mjs} +1 -1
  63. package/dist/preview-engine/{chunk-JTUK7ZXK.mjs → chunk-3I6B3YPF.mjs} +1 -1
  64. package/dist/preview-engine/{chunk-LQBDZSQD.mjs → chunk-6GMEF2QB.mjs} +1 -1
  65. package/dist/preview-engine/{chunk-5CWQHYQP.mjs → chunk-7BUKVFWB.mjs} +1 -1
  66. package/dist/preview-engine/{chunk-AWX4YGC5.mjs → chunk-7JYMNGNK.mjs} +1 -1
  67. package/dist/preview-engine/chunk-AB5VITYM.mjs +1974 -0
  68. package/dist/preview-engine/{chunk-LSBCFJZM.mjs → chunk-BNO5JAEZ.mjs} +1 -1
  69. package/dist/preview-engine/{chunk-6WKWYUOM.mjs → chunk-CE6CG5BH.mjs} +1 -1
  70. package/dist/preview-engine/{chunk-LQENNFBA.mjs → chunk-CT2WFPYG.mjs} +11 -11
  71. package/dist/preview-engine/{chunk-5JSSXOBB.mjs → chunk-DUEY7AXY.mjs} +1 -1
  72. package/dist/preview-engine/{chunk-UDDK5QZF.mjs → chunk-DWHQSNSJ.mjs} +1 -1
  73. package/dist/preview-engine/{chunk-AY2ZIXST.mjs → chunk-ENS4KUJV.mjs} +1 -1
  74. package/dist/preview-engine/chunk-EU7CFSB5.mjs +1 -0
  75. package/dist/preview-engine/chunk-I6E3AKLS.mjs +1 -0
  76. package/dist/preview-engine/{chunk-7QE6II7R.mjs → chunk-JMOJKT5W.mjs} +1 -1
  77. package/dist/preview-engine/{chunk-NIRW77QA.mjs → chunk-KJGNTREI.mjs} +1 -1
  78. package/dist/preview-engine/{chunk-ILBZQLUF.mjs → chunk-KKBJ7X3T.mjs} +1 -1
  79. package/dist/preview-engine/{chunk-GQN35VLT.mjs → chunk-LNJYHSYX.mjs} +1 -1
  80. package/dist/preview-engine/{chunk-6TGNQ5FD.mjs → chunk-LQVACZDE.mjs} +1 -1
  81. package/dist/preview-engine/{chunk-YQYLBXOX.mjs → chunk-M6ZKK6ZU.mjs} +1 -1
  82. package/dist/preview-engine/{chunk-EEOUHDUD.mjs → chunk-MA4YVA2E.mjs} +1 -1
  83. package/dist/preview-engine/{chunk-JAJOZG5P.mjs → chunk-MBJXS3D7.mjs} +1 -1
  84. package/dist/preview-engine/{chunk-BIS3W4Z5.mjs → chunk-MCR7XMNQ.mjs} +1 -1
  85. package/dist/preview-engine/{chunk-C45ROXI6.mjs → chunk-NAISBHLR.mjs} +11 -11
  86. package/dist/preview-engine/{chunk-AKYUVDKM.mjs → chunk-NB55FW7D.mjs} +1 -1
  87. package/dist/preview-engine/{chunk-3SOD7OTO.mjs → chunk-NHQR76WL.mjs} +1 -1
  88. package/dist/preview-engine/{chunk-MJN3LOZ7.mjs → chunk-NKGXINCU.mjs} +1 -1
  89. package/dist/preview-engine/{chunk-FDNR4PRC.mjs → chunk-NXKXOSE6.mjs} +1 -1
  90. package/dist/preview-engine/{chunk-N3PRZLZJ.mjs → chunk-NYEDWUFS.mjs} +1 -1
  91. package/dist/preview-engine/{chunk-W3QGP5XF.mjs → chunk-P734GD7D.mjs} +1 -1
  92. package/dist/preview-engine/{chunk-YJ6GWVL4.mjs → chunk-PDM3TJ45.mjs} +1 -1
  93. package/dist/preview-engine/{chunk-KJ2DTA77.mjs → chunk-PXWCGXTF.mjs} +1 -1
  94. package/dist/preview-engine/{chunk-V6LCSK6Q.mjs → chunk-QCUGWPYP.mjs} +1 -1
  95. package/dist/preview-engine/{chunk-JJYNYYPA.mjs → chunk-QJYAIQYU.mjs} +1 -1
  96. package/dist/preview-engine/{chunk-VUFDQJ2B.mjs → chunk-QKQYHPBK.mjs} +1 -1
  97. package/dist/preview-engine/{chunk-NVTPJUNG.mjs → chunk-QVW5METG.mjs} +1 -1
  98. package/dist/preview-engine/{chunk-UMF7NNUA.mjs → chunk-QYIKOOFI.mjs} +1 -1
  99. package/dist/preview-engine/{chunk-FSAELHVT.mjs → chunk-RNFYEZLL.mjs} +1 -1
  100. package/dist/preview-engine/{chunk-CEIOI4HO.mjs → chunk-SIXIF5QZ.mjs} +1 -1
  101. package/dist/preview-engine/chunk-SNASF7OM.mjs +3 -0
  102. package/dist/preview-engine/{chunk-A2775RSO.mjs → chunk-T4VP45AP.mjs} +1 -1
  103. package/dist/preview-engine/{chunk-5EVEGKWT.mjs → chunk-TE2QAKKF.mjs} +1 -1
  104. package/dist/preview-engine/{chunk-6MBYREBG.mjs → chunk-UXCTWFKK.mjs} +1 -1
  105. package/dist/preview-engine/{chunk-V6DAD4S4.mjs → chunk-V3FODTPI.mjs} +2 -2
  106. package/dist/preview-engine/{chunk-JJA4G3OU.mjs → chunk-VH5V54RA.mjs} +1 -1
  107. package/dist/preview-engine/{chunk-GIH5QURF.mjs → chunk-VTE3IISK.mjs} +1 -1
  108. package/dist/preview-engine/chunk-W4HIVUUA.mjs +4 -0
  109. package/dist/preview-engine/{chunk-O5LA63CK.mjs → chunk-WUMVCQYI.mjs} +1 -1
  110. package/dist/preview-engine/{chunk-U4SQUTDV.mjs → chunk-X6BJLPW6.mjs} +1 -1
  111. package/dist/preview-engine/{chunk-54HE34HO.mjs → chunk-XJ4CQIZZ.mjs} +1 -1
  112. package/dist/preview-engine/{chunk-6AEU4DC7.mjs → chunk-XUPZBI3Y.mjs} +6 -6
  113. package/dist/preview-engine/{chunk-LMZHCWXP.mjs → chunk-XYRBFLFF.mjs} +1 -1
  114. package/dist/preview-engine/{chunk-S7NG26UG.mjs → chunk-YJ24W73B.mjs} +1 -1
  115. package/dist/preview-engine/{chunk-5SVJIGPK.mjs → chunk-Z4TKEI3I.mjs} +1 -1
  116. package/dist/preview-engine/{chunk-UVWGZUKZ.mjs → chunk-ZAIVXGSS.mjs} +1 -1
  117. package/dist/preview-engine/{chunk-OZDZQMTB.mjs → chunk-ZVUTFXDR.mjs} +1 -1
  118. package/dist/preview-engine/components.mjs +1 -0
  119. package/dist/preview-engine/effects.mjs +1 -1
  120. package/dist/preview-engine/fonts.mjs +1 -1
  121. package/dist/preview-engine/framefields.mjs +1 -1971
  122. package/dist/preview-engine/player.mjs +5 -5
  123. package/dist/preview-engine/renderers-2S5ZWL2J.mjs +1 -0
  124. package/dist/preview-engine/renderers-37CN7O4S.mjs +1 -0
  125. package/dist/preview-engine/renderers-3UGG2IMP.mjs +1 -0
  126. package/dist/preview-engine/{renderers-2A7YDJMJ.mjs → renderers-4RFB2LG2.mjs} +1 -1
  127. package/dist/preview-engine/renderers-6NFRKHNO.mjs +1 -0
  128. package/dist/preview-engine/{renderers-QJNGN722.mjs → renderers-6PVGRTXV.mjs} +1 -1
  129. package/dist/preview-engine/renderers-7MPBAHYA.mjs +1 -0
  130. package/dist/preview-engine/renderers-AFTYMS3H.mjs +1 -0
  131. package/dist/preview-engine/renderers-AKZAAGR7.mjs +1 -0
  132. package/dist/preview-engine/renderers-AYEWAW7F.mjs +1 -0
  133. package/dist/preview-engine/{renderers-5OGAF66H.mjs → renderers-BNXTSIXJ.mjs} +1 -1
  134. package/dist/preview-engine/{renderers-XPO2WQNF.mjs → renderers-BQLYS4TM.mjs} +1 -1
  135. package/dist/preview-engine/renderers-C7SJ3M6S.mjs +1 -0
  136. package/dist/preview-engine/{renderers-VD5GHHK6.mjs → renderers-CEJP6Q7F.mjs} +1 -1
  137. package/dist/preview-engine/{renderers-KW75FYFG.mjs → renderers-CLLR5MOQ.mjs} +1 -1
  138. package/dist/preview-engine/{renderers-PM4Q5QOW.mjs → renderers-DHKB5LI6.mjs} +1 -1
  139. package/dist/preview-engine/renderers-DUF2CTX6.mjs +1 -0
  140. package/dist/preview-engine/{renderers-XTRFEQO4.mjs → renderers-DZZFIYYA.mjs} +1 -1
  141. package/dist/preview-engine/renderers-EIJFIY6L.mjs +1 -0
  142. package/dist/preview-engine/renderers-EOMMSENQ.mjs +1 -0
  143. package/dist/preview-engine/{renderers-NJAKGI25.mjs → renderers-FOHW7RWH.mjs} +1 -1
  144. package/dist/preview-engine/{renderers-K23EAM2J.mjs → renderers-GF77N2KM.mjs} +1 -1
  145. package/dist/preview-engine/renderers-H3ZM2TOA.mjs +1 -0
  146. package/dist/preview-engine/{renderers-NPKRNXAT.mjs → renderers-HJ6NO5ZD.mjs} +1 -1
  147. package/dist/preview-engine/renderers-JXBZPQKP.mjs +1 -0
  148. package/dist/preview-engine/renderers-KSQM7EM5.mjs +1 -0
  149. package/dist/preview-engine/{renderers-WNMRLGZS.mjs → renderers-KV3TTCO6.mjs} +1 -1
  150. package/dist/preview-engine/{renderers-U2ZWRL25.mjs → renderers-L7EITUCD.mjs} +1 -1
  151. package/dist/preview-engine/renderers-LD3COS4X.mjs +1 -0
  152. package/dist/preview-engine/renderers-MCTBJEL7.mjs +1 -0
  153. package/dist/preview-engine/renderers-MKEXNBCW.mjs +1 -0
  154. package/dist/preview-engine/{renderers-ZRR7BLB7.mjs → renderers-MPCYLXXU.mjs} +1 -1
  155. package/dist/preview-engine/{renderers-DKOWLKDE.mjs → renderers-MS4HG3M4.mjs} +1 -1
  156. package/dist/preview-engine/{renderers-MHDLRY3S.mjs → renderers-N7T34SCI.mjs} +1 -1
  157. package/dist/preview-engine/{renderers-2GE5HE56.mjs → renderers-O56IOD7J.mjs} +1 -1
  158. package/dist/preview-engine/renderers-OZGEXW2X.mjs +1 -0
  159. package/dist/preview-engine/renderers-PSEDMUBV.mjs +1 -0
  160. package/dist/preview-engine/renderers-PVUROEGR.mjs +1 -0
  161. package/dist/preview-engine/renderers-QBVVTQV6.mjs +1 -0
  162. package/dist/preview-engine/{renderers-7M3YOI7E.mjs → renderers-QO2RHF7F.mjs} +1 -1
  163. package/dist/preview-engine/renderers-QPFZBLDI.mjs +1 -0
  164. package/dist/preview-engine/renderers-R4U2TK6P.mjs +1 -0
  165. package/dist/preview-engine/renderers-RBLNDAO4.mjs +1 -0
  166. package/dist/preview-engine/renderers-RM25AXWZ.mjs +1 -0
  167. package/dist/preview-engine/{renderers-DFJDEPCU.mjs → renderers-ROSSJ7Y2.mjs} +1 -1
  168. package/dist/preview-engine/{renderers-4H34AFW2.mjs → renderers-RRJ2DX2W.mjs} +1 -1
  169. package/dist/preview-engine/renderers-RYRFCEYT.mjs +1 -0
  170. package/dist/preview-engine/renderers-SIBP54WK.mjs +1 -0
  171. package/dist/preview-engine/renderers-SRU6QXLN.mjs +1 -0
  172. package/dist/preview-engine/{renderers-TFEDHXPY.mjs → renderers-T62TXGVO.mjs} +1 -1
  173. package/dist/preview-engine/{renderers-6GYRMHGQ.mjs → renderers-TAMDNTEQ.mjs} +1 -1
  174. package/dist/preview-engine/{renderers-LF6W5P2I.mjs → renderers-TASYN62K.mjs} +1 -1
  175. package/dist/preview-engine/renderers-TBP2EKJ4.mjs +1 -0
  176. package/dist/preview-engine/{renderers-FNPXT2EH.mjs → renderers-TWZHTKW7.mjs} +1 -1
  177. package/dist/preview-engine/renderers-UQHKFGDX.mjs +1 -0
  178. package/dist/preview-engine/{renderers-35G4KCQ2.mjs → renderers-UVABXXQF.mjs} +1 -1
  179. package/dist/preview-engine/{renderers-XTCBHTHC.mjs → renderers-VYK2BJID.mjs} +1 -1
  180. package/dist/preview-engine/{renderers-Q6AO5M54.mjs → renderers-W5CTR4B5.mjs} +1 -1
  181. package/dist/preview-engine/renderers-WDV7ENJA.mjs +1 -0
  182. package/dist/preview-engine/renderers-WNBDSSJ3.mjs +1 -0
  183. package/dist/preview-engine/{renderers-ATL5ARUV.mjs → renderers-WPBTAU2E.mjs} +1 -1
  184. package/dist/preview-engine/renderers-WTC2RNGU.mjs +1 -0
  185. package/dist/preview-engine/renderers-XLBHSQZJ.mjs +228 -0
  186. package/dist/preview-engine/{renderers-WOLTH5VI.mjs → renderers-XSPU2BIQ.mjs} +1 -1
  187. package/dist/preview-engine/renderers-XVUOO7B6.mjs +1 -0
  188. package/dist/preview-engine/renderers-YHOQUEHD.mjs +1 -0
  189. package/dist/preview-engine/renderers-YPFM5UJO.mjs +1 -0
  190. package/dist/preview-engine/renderers-YW3LBALW.mjs +1 -0
  191. package/dist/preview-engine/signals.mjs +1 -1
  192. package/dist/{program-KwDdbC0-.mjs → program-BdPDtfVv.mjs} +133 -30
  193. package/dist/program-BdPDtfVv.mjs.map +1 -0
  194. package/dist/registry/annotate.json +30 -0
  195. package/dist/registry/app-frame.json +38 -0
  196. package/dist/registry/backdrop.json +37 -0
  197. package/dist/registry/before-after.json +33 -0
  198. package/dist/registry/callout.json +30 -0
  199. package/dist/registry/captions.json +37 -0
  200. package/dist/registry/card-stack.json +30 -0
  201. package/dist/registry/chat-thread.json +32 -0
  202. package/dist/registry/code-block.json +45 -0
  203. package/dist/registry/confetti.json +29 -0
  204. package/dist/registry/counter.json +36 -0
  205. package/dist/registry/device-frame.json +36 -0
  206. package/dist/registry/focus-zoom.json +32 -0
  207. package/dist/registry/index.json +408 -0
  208. package/dist/registry/logo-reveal.json +37 -0
  209. package/dist/registry/lower-third.json +34 -0
  210. package/dist/registry/meter.json +35 -0
  211. package/dist/registry/mouse-pointer.json +44 -0
  212. package/dist/registry/selection.json +31 -0
  213. package/dist/registry/spotlight.json +28 -0
  214. package/dist/registry/terminal.json +40 -0
  215. package/dist/registry/text-reveal.json +39 -0
  216. package/dist/registry/title-card.json +34 -0
  217. package/dist/registry/toasts.json +28 -0
  218. package/dist/registry/touch-point.json +33 -0
  219. package/dist/registry/waveform.json +29 -0
  220. package/dist/registry/word-cycle.json +32 -0
  221. package/dist/renderer/index.d.mts +2 -2
  222. package/dist/renderer/index.mjs +3 -3
  223. package/dist/{renderer-Bhfl-WFX.mjs → renderer-0cHsK6xR.mjs} +5 -5
  224. package/dist/{renderer-Bhfl-WFX.mjs.map → renderer-0cHsK6xR.mjs.map} +1 -1
  225. package/dist/{renderer-D4No_jA4.mjs → renderer-1VKN5j2C.mjs} +4 -4
  226. package/dist/{renderer-D4No_jA4.mjs.map → renderer-1VKN5j2C.mjs.map} +1 -1
  227. package/dist/{renderer-qYhNf6iB.mjs → renderer-2bipMLqz.mjs} +3 -3
  228. package/dist/{renderer-qYhNf6iB.mjs.map → renderer-2bipMLqz.mjs.map} +1 -1
  229. package/dist/{renderer-DK9etIAz.mjs → renderer-7DyjqxEj.mjs} +5 -5
  230. package/dist/{renderer-DK9etIAz.mjs.map → renderer-7DyjqxEj.mjs.map} +1 -1
  231. package/dist/renderer-B-D_VZg3.mjs +5 -0
  232. package/dist/{renderer-Ci6YMa4u.mjs → renderer-B31zMDE8.mjs} +5 -5
  233. package/dist/{renderer-Ci6YMa4u.mjs.map → renderer-B31zMDE8.mjs.map} +1 -1
  234. package/dist/{renderer-DP_In2uT.mjs → renderer-B4blg067.mjs} +4 -4
  235. package/dist/{renderer-DP_In2uT.mjs.map → renderer-B4blg067.mjs.map} +1 -1
  236. package/dist/{renderer-kNjMhwiZ.mjs → renderer-B5YYBBDq.mjs} +3 -3
  237. package/dist/{renderer-kNjMhwiZ.mjs.map → renderer-B5YYBBDq.mjs.map} +1 -1
  238. package/dist/renderer-B64dhpDX.mjs +5 -0
  239. package/dist/{renderer-mqUBkx-a.mjs → renderer-B8LXXvHi.mjs} +4 -4
  240. package/dist/{renderer-mqUBkx-a.mjs.map → renderer-B8LXXvHi.mjs.map} +1 -1
  241. package/dist/renderer-BA2Ko4H1.mjs +3 -0
  242. package/dist/{renderer-B4ydDdo6.mjs → renderer-BAkPq8qo.mjs} +3 -3
  243. package/dist/{renderer-B4ydDdo6.mjs.map → renderer-BAkPq8qo.mjs.map} +1 -1
  244. package/dist/{renderer-OEpwc9Zk.mjs → renderer-BBTdHKH7.mjs} +5 -5
  245. package/dist/{renderer-OEpwc9Zk.mjs.map → renderer-BBTdHKH7.mjs.map} +1 -1
  246. package/dist/{renderer-DGT141pN.mjs → renderer-BBTkfhL8.mjs} +5 -5
  247. package/dist/{renderer-DGT141pN.mjs.map → renderer-BBTkfhL8.mjs.map} +1 -1
  248. package/dist/renderer-BDL4jyrb.mjs +5 -0
  249. package/dist/{renderer-BtWWpFvl.mjs → renderer-BGNdwdCR.mjs} +4 -4
  250. package/dist/{renderer-BtWWpFvl.mjs.map → renderer-BGNdwdCR.mjs.map} +1 -1
  251. package/dist/{renderer-DXSIstnn.mjs → renderer-BJwOM1Dq.mjs} +4 -4
  252. package/dist/{renderer-DXSIstnn.mjs.map → renderer-BJwOM1Dq.mjs.map} +1 -1
  253. package/dist/renderer-BKCZGKkl.mjs +5 -0
  254. package/dist/renderer-BKs3jI7-.mjs +5 -0
  255. package/dist/{renderer-C5WkQZGR.mjs → renderer-BN_n6O6P.mjs} +5 -5
  256. package/dist/{renderer-C5WkQZGR.mjs.map → renderer-BN_n6O6P.mjs.map} +1 -1
  257. package/dist/renderer-BW74Zf-u.mjs +5 -0
  258. package/dist/{renderer-C1U85w9f.mjs → renderer-BWa3CLK7.mjs} +3 -3
  259. package/dist/{renderer-C1U85w9f.mjs.map → renderer-BWa3CLK7.mjs.map} +1 -1
  260. package/dist/{renderer-plx7_lUQ.mjs → renderer-BWnFh7NO.mjs} +5 -5
  261. package/dist/{renderer-plx7_lUQ.mjs.map → renderer-BWnFh7NO.mjs.map} +1 -1
  262. package/dist/renderer-BXuQN61O.mjs +5 -0
  263. package/dist/renderer-BY1pPvzx.mjs +6 -0
  264. package/dist/{renderer-CwO8T8l8.mjs → renderer-BYJS2lhn.mjs} +4 -4
  265. package/dist/{renderer-CwO8T8l8.mjs.map → renderer-BYJS2lhn.mjs.map} +1 -1
  266. package/dist/renderer-Bahthqvq.mjs +5 -0
  267. package/dist/renderer-BbaiQG8h.mjs +5 -0
  268. package/dist/{renderer-gm0zoV4t.mjs → renderer-BfrzKmRh.mjs} +3 -3
  269. package/dist/{renderer-gm0zoV4t.mjs.map → renderer-BfrzKmRh.mjs.map} +1 -1
  270. package/dist/renderer-BhHF-08y.mjs +5 -0
  271. package/dist/{renderer-DQeUc1yY.mjs → renderer-BhhweLr_.mjs} +4 -4
  272. package/dist/{renderer-DQeUc1yY.mjs.map → renderer-BhhweLr_.mjs.map} +1 -1
  273. package/dist/{renderer-OsA-Lg4d.mjs → renderer-Bmj7AyJP.mjs} +3 -3
  274. package/dist/{renderer-OsA-Lg4d.mjs.map → renderer-Bmj7AyJP.mjs.map} +1 -1
  275. package/dist/{renderer-DZhIe8Gj.mjs → renderer-BmoQJUJO.mjs} +4 -4
  276. package/dist/{renderer-DZhIe8Gj.mjs.map → renderer-BmoQJUJO.mjs.map} +1 -1
  277. package/dist/renderer-BnrMcw6C.mjs +5 -0
  278. package/dist/{renderer-Blm4Dv_h.mjs → renderer-Bo1PY0zW.mjs} +3 -3
  279. package/dist/{renderer-DcOT5c0t.mjs → renderer-Bo_d7h86.mjs} +4 -4
  280. package/dist/{renderer-DcOT5c0t.mjs.map → renderer-Bo_d7h86.mjs.map} +1 -1
  281. package/dist/renderer-BsS61z5l.mjs +5 -0
  282. package/dist/renderer-Btuq2Eq8.mjs +5 -0
  283. package/dist/renderer-BvcqncI2.mjs +3 -0
  284. package/dist/{renderer-C4xvz_Ft.mjs → renderer-Bw5YP2Db.mjs} +4 -4
  285. package/dist/{renderer-C4xvz_Ft.mjs.map → renderer-Bw5YP2Db.mjs.map} +1 -1
  286. package/dist/renderer-BxmsEl2x.mjs +5 -0
  287. package/dist/{renderer-BSitV56h.mjs → renderer-C9r0-KY4.mjs} +10 -1
  288. package/dist/{renderer-BSitV56h.mjs.map → renderer-C9r0-KY4.mjs.map} +1 -1
  289. package/dist/{renderer-B4jxP8vF.mjs → renderer-CDX2f82b.mjs} +5 -5
  290. package/dist/{renderer-B4jxP8vF.mjs.map → renderer-CDX2f82b.mjs.map} +1 -1
  291. package/dist/renderer-CGOyHdKs.mjs +5 -0
  292. package/dist/renderer-CJjmpmpu.mjs +5 -0
  293. package/dist/{renderer-P4OPsD82.mjs → renderer-CJoa4H2G.mjs} +3 -3
  294. package/dist/{renderer-P4OPsD82.mjs.map → renderer-CJoa4H2G.mjs.map} +1 -1
  295. package/dist/{renderer-1P3yS8YM.mjs → renderer-CLO8QHWE.mjs} +4 -4
  296. package/dist/{renderer-1P3yS8YM.mjs.map → renderer-CLO8QHWE.mjs.map} +1 -1
  297. package/dist/{renderer-CjQAYeYz.mjs → renderer-CMEqUhrW.mjs} +5 -5
  298. package/dist/{renderer-CjQAYeYz.mjs.map → renderer-CMEqUhrW.mjs.map} +1 -1
  299. package/dist/{renderer-CzgDJcot.mjs → renderer-CNs1vBUy.mjs} +4 -4
  300. package/dist/{renderer-CzgDJcot.mjs.map → renderer-CNs1vBUy.mjs.map} +1 -1
  301. package/dist/{index-B0BZMhtw.d.mts → renderer-COXKPofU.d.mts} +13 -13
  302. package/dist/renderer-COXKPofU.d.mts.map +1 -0
  303. package/dist/{renderer-CrwYWVsV.mjs → renderer-COtZ315B.mjs} +3 -3
  304. package/dist/renderer-CQvDDAIu.mjs +5 -0
  305. package/dist/{renderer-DOvzHN60.mjs → renderer-CWSM0IGG.mjs} +4 -4
  306. package/dist/{renderer-DOvzHN60.mjs.map → renderer-CWSM0IGG.mjs.map} +1 -1
  307. package/dist/{renderer-DVFFVy9v.mjs → renderer-CXbXF7Dh.mjs} +5 -5
  308. package/dist/{renderer-DVFFVy9v.mjs.map → renderer-CXbXF7Dh.mjs.map} +1 -1
  309. package/dist/renderer-CYxigw7S.mjs +5 -0
  310. package/dist/{renderer-DOxmmN6Q.mjs → renderer-CdUf7ZDJ.mjs} +5 -5
  311. package/dist/{renderer-DOxmmN6Q.mjs.map → renderer-CdUf7ZDJ.mjs.map} +1 -1
  312. package/dist/renderer-CgDofO5z.mjs +5 -0
  313. package/dist/renderer-CgmQchab.mjs +5 -0
  314. package/dist/{renderer-CS8VMTp1.mjs → renderer-Ch7qwjH9.mjs} +5 -5
  315. package/dist/{renderer-CS8VMTp1.mjs.map → renderer-Ch7qwjH9.mjs.map} +1 -1
  316. package/dist/{renderer-PuN2_AL_.mjs → renderer-ChCUad83.mjs} +5 -5
  317. package/dist/{renderer-PuN2_AL_.mjs.map → renderer-ChCUad83.mjs.map} +1 -1
  318. package/dist/{renderer-BaJQx0Bp.mjs → renderer-ChjkppUz.mjs} +5 -5
  319. package/dist/{renderer-BaJQx0Bp.mjs.map → renderer-ChjkppUz.mjs.map} +1 -1
  320. package/dist/{renderer-CTYKUnDq.mjs → renderer-Cj1giMd0.mjs} +3 -3
  321. package/dist/{renderer-CTYKUnDq.mjs.map → renderer-Cj1giMd0.mjs.map} +1 -1
  322. package/dist/{renderer-DWG4Podv.mjs → renderer-Cjs1OeBu.mjs} +6 -6
  323. package/dist/{renderer-DWG4Podv.mjs.map → renderer-Cjs1OeBu.mjs.map} +1 -1
  324. package/dist/renderer-CjzrLwW_.mjs +5 -0
  325. package/dist/renderer-ClnYWADT.mjs +5 -0
  326. package/dist/{renderer-B9ssmkbx.mjs → renderer-CmKdr2nA.mjs} +5 -5
  327. package/dist/{renderer-B9ssmkbx.mjs.map → renderer-CmKdr2nA.mjs.map} +1 -1
  328. package/dist/renderer-CwAd71C6.mjs +5 -0
  329. package/dist/{renderer-BT0x6KPK.mjs → renderer-D0X7Eh-T.mjs} +4 -4
  330. package/dist/{renderer-BT0x6KPK.mjs.map → renderer-D0X7Eh-T.mjs.map} +1 -1
  331. package/dist/{renderer-DYbgd6Ye.mjs → renderer-D2ru2Afi.mjs} +4 -4
  332. package/dist/{renderer-DYbgd6Ye.mjs.map → renderer-D2ru2Afi.mjs.map} +1 -1
  333. package/dist/renderer-D3Z9t-xT.mjs +5 -0
  334. package/dist/{renderer-CLxQ4rU6.mjs → renderer-D5u3GVtD.mjs} +74 -74
  335. package/dist/{renderer-CLxQ4rU6.mjs.map → renderer-D5u3GVtD.mjs.map} +1 -1
  336. package/dist/{renderer-DCsTCvdo.mjs → renderer-D6p8b6ql.mjs} +4 -4
  337. package/dist/{renderer-DCsTCvdo.mjs.map → renderer-D6p8b6ql.mjs.map} +1 -1
  338. package/dist/{renderer-Bkq1PT0g.mjs → renderer-DBjV6C2u.mjs} +3 -3
  339. package/dist/{renderer-BAoKytKL.mjs → renderer-DHqicGgT.mjs} +4 -4
  340. package/dist/{renderer-BAoKytKL.mjs.map → renderer-DHqicGgT.mjs.map} +1 -1
  341. package/dist/{renderer-B_b8-ztW.mjs → renderer-DK34NH92.mjs} +5 -5
  342. package/dist/{renderer-B_b8-ztW.mjs.map → renderer-DK34NH92.mjs.map} +1 -1
  343. package/dist/renderer-DKH1oSlW.mjs +5 -0
  344. package/dist/{renderer-I3Wxk1tL.mjs → renderer-DP41Fokp.mjs} +4 -4
  345. package/dist/{renderer-I3Wxk1tL.mjs.map → renderer-DP41Fokp.mjs.map} +1 -1
  346. package/dist/{renderer-CPLfsRe1.mjs → renderer-DQuKNgIx.mjs} +6 -6
  347. package/dist/{renderer-CPLfsRe1.mjs.map → renderer-DQuKNgIx.mjs.map} +1 -1
  348. package/dist/renderer-DTkf_hwG.mjs +5 -0
  349. package/dist/renderer-DU0bmOS7.mjs +5 -0
  350. package/dist/{renderer-GapR_An3.mjs → renderer-DWaqF7-6.mjs} +4 -4
  351. package/dist/{renderer-GapR_An3.mjs.map → renderer-DWaqF7-6.mjs.map} +1 -1
  352. package/dist/renderer-D_vJHQt5.mjs +5 -0
  353. package/dist/{renderer-GbVNyv-E.mjs → renderer-Db_wphHH.mjs} +192 -27
  354. package/dist/renderer-Db_wphHH.mjs.map +1 -0
  355. package/dist/renderer-Dc5n0M6P.mjs +5 -0
  356. package/dist/renderer-Ddfn0Dha.mjs +5 -0
  357. package/dist/renderer-DeSoNQeG.mjs +5 -0
  358. package/dist/{renderer-C0ds-UfM.mjs → renderer-DkPDYtD3.mjs} +5 -5
  359. package/dist/{renderer-C0ds-UfM.mjs.map → renderer-DkPDYtD3.mjs.map} +1 -1
  360. package/dist/{renderer-BCLmYH4S.mjs → renderer-DqO9gBAi.mjs} +4 -4
  361. package/dist/{renderer-BCLmYH4S.mjs.map → renderer-DqO9gBAi.mjs.map} +1 -1
  362. package/dist/{renderer-BUwHWIf7.mjs → renderer-DuQMzR3v.mjs} +4 -4
  363. package/dist/{renderer-BUwHWIf7.mjs.map → renderer-DuQMzR3v.mjs.map} +1 -1
  364. package/dist/{renderer-DBtt-7wt.d.mts → renderer-Dx28wTi1.d.mts} +2 -2
  365. package/dist/{renderer-DBtt-7wt.d.mts.map → renderer-Dx28wTi1.d.mts.map} +1 -1
  366. package/dist/{renderer-f7A01ArI.mjs → renderer-DyMEAZIm.mjs} +5 -5
  367. package/dist/{renderer-f7A01ArI.mjs.map → renderer-DyMEAZIm.mjs.map} +1 -1
  368. package/dist/renderer-Dzca9Qba.mjs +5 -0
  369. package/dist/{renderer-DBKyuPl1.mjs → renderer-FCqOfN6n.mjs} +5 -5
  370. package/dist/{renderer-DBKyuPl1.mjs.map → renderer-FCqOfN6n.mjs.map} +1 -1
  371. package/dist/{renderer-D96Pu8yX.mjs → renderer-Fsdod0yZ.mjs} +5 -5
  372. package/dist/{renderer-D96Pu8yX.mjs.map → renderer-Fsdod0yZ.mjs.map} +1 -1
  373. package/dist/{renderer-Du8eOWWU.mjs → renderer-G3px5ODP.mjs} +4 -4
  374. package/dist/{renderer-Du8eOWWU.mjs.map → renderer-G3px5ODP.mjs.map} +1 -1
  375. package/dist/renderer-HRVvtc9c.mjs +5 -0
  376. package/dist/{renderer-CUPWHfEY.mjs → renderer-IMg0dK6K.mjs} +5 -5
  377. package/dist/{renderer-CUPWHfEY.mjs.map → renderer-IMg0dK6K.mjs.map} +1 -1
  378. package/dist/renderer-M3Qs4f1K.mjs +5 -0
  379. package/dist/renderer-NDHJt_Ae.mjs +5 -0
  380. package/dist/{renderer-y6k54AM6.mjs → renderer-PLoGrFGz.mjs} +4 -4
  381. package/dist/{renderer-y6k54AM6.mjs.map → renderer-PLoGrFGz.mjs.map} +1 -1
  382. package/dist/{renderer-DO5r7ZV-.mjs → renderer-PNIgmWft.mjs} +2 -2
  383. package/dist/{renderer-DO5r7ZV-.mjs.map → renderer-PNIgmWft.mjs.map} +1 -1
  384. package/dist/{renderer-CDky5Gva.mjs → renderer-VdTs-dqH.mjs} +4 -4
  385. package/dist/{renderer-CDky5Gva.mjs.map → renderer-VdTs-dqH.mjs.map} +1 -1
  386. package/dist/{renderer-QaN-aejD.mjs → renderer-VxVi_0c7.mjs} +3 -3
  387. package/dist/{renderer-QaN-aejD.mjs.map → renderer-VxVi_0c7.mjs.map} +1 -1
  388. package/dist/{renderer-BMLJgnbU.mjs → renderer-WVrUeiLZ.mjs} +3 -3
  389. package/dist/{renderer-BHLYKy8b.mjs → renderer-Z39F9QK5.mjs} +5 -5
  390. package/dist/{renderer-BHLYKy8b.mjs.map → renderer-Z39F9QK5.mjs.map} +1 -1
  391. package/dist/{renderer-DSbRWfgl.mjs → renderer-ZjSP5jw6.mjs} +3 -3
  392. package/dist/{renderer-DSbRWfgl.mjs.map → renderer-ZjSP5jw6.mjs.map} +1 -1
  393. package/dist/{renderer-CE83KHgr.mjs → renderer-fH9SCJC2.mjs} +3 -3
  394. package/dist/{renderer-CE83KHgr.mjs.map → renderer-fH9SCJC2.mjs.map} +1 -1
  395. package/dist/{renderer-Cy4a31rZ.mjs → renderer-gjT5v76-.mjs} +3 -3
  396. package/dist/{renderer-Cy4a31rZ.mjs.map → renderer-gjT5v76-.mjs.map} +1 -1
  397. package/dist/{renderer-C-z6bxj9.mjs → renderer-kP5Y282J.mjs} +5 -5
  398. package/dist/{renderer-C-z6bxj9.mjs.map → renderer-kP5Y282J.mjs.map} +1 -1
  399. package/dist/{renderer-BI8QhEj9.mjs → renderer-kkDfQ56G.mjs} +5 -5
  400. package/dist/{renderer-BI8QhEj9.mjs.map → renderer-kkDfQ56G.mjs.map} +1 -1
  401. package/dist/{renderer-DHUlVqST.mjs → renderer-l_U6kA8K.mjs} +3 -3
  402. package/dist/{renderer-DHUlVqST.mjs.map → renderer-l_U6kA8K.mjs.map} +1 -1
  403. package/dist/{renderer-BajIOuZH.mjs → renderer-nLPfvY3-.mjs} +2 -2
  404. package/dist/{renderer-BajIOuZH.mjs.map → renderer-nLPfvY3-.mjs.map} +1 -1
  405. package/dist/{renderer-C4vHq0X8.mjs → renderer-o_JK4YfO.mjs} +5 -5
  406. package/dist/{renderer-C4vHq0X8.mjs.map → renderer-o_JK4YfO.mjs.map} +1 -1
  407. package/dist/{renderer-CAi-lhR2.mjs → renderer-vwoyR8pW.mjs} +4 -4
  408. package/dist/{renderer-CAi-lhR2.mjs.map → renderer-vwoyR8pW.mjs.map} +1 -1
  409. package/dist/{renderers-CP8CFWDs-D1FHpA7I.mjs → renderers-CP8CFWDs-DiX2Y4Qp.mjs} +4 -4
  410. package/dist/{renderers-CP8CFWDs-D1FHpA7I.mjs.map → renderers-CP8CFWDs-DiX2Y4Qp.mjs.map} +1 -1
  411. package/dist/signals/index.d.mts +6 -6
  412. package/dist/signals/index.mjs +8 -8
  413. package/dist/{signals-BwdVfK3p.mjs → signals-Cf9mfNGE.mjs} +4 -4
  414. package/dist/{signals-BwdVfK3p.mjs.map → signals-Cf9mfNGE.mjs.map} +1 -1
  415. package/dist/src-Ds9IAk5S.mjs +8373 -0
  416. package/dist/src-Ds9IAk5S.mjs.map +1 -0
  417. package/package.json +68 -58
  418. package/dist/dist-DMa2BbYs.mjs.map +0 -1
  419. package/dist/dist-hmWTJPik.mjs.map +0 -1
  420. package/dist/fonts-Da1JDKpc.mjs.map +0 -1
  421. package/dist/index-B0BZMhtw.d.mts.map +0 -1
  422. package/dist/index-CJkihekp.d.mts.map +0 -1
  423. package/dist/index-DGe83M-p.d.mts.map +0 -1
  424. package/dist/index.d.mts.map +0 -1
  425. package/dist/index.mjs.map +0 -1
  426. package/dist/preview/index.d.mts.map +0 -1
  427. package/dist/preview-5E4B96RD.mjs.map +0 -1
  428. package/dist/preview-engine/chunk-3T4LB4ZH.mjs +0 -3
  429. package/dist/preview-engine/chunk-E7DH7EPX.mjs +0 -1
  430. package/dist/preview-engine/chunk-PCWWKYFO.mjs +0 -1
  431. package/dist/preview-engine/chunk-RQLMW6MA.mjs +0 -4
  432. package/dist/preview-engine/chunk-XN56POGE.mjs +0 -1
  433. package/dist/preview-engine/renderers-2AD6AHAO.mjs +0 -1
  434. package/dist/preview-engine/renderers-37UYW266.mjs +0 -1
  435. package/dist/preview-engine/renderers-3YHETAPE.mjs +0 -1
  436. package/dist/preview-engine/renderers-43LBWRY2.mjs +0 -1
  437. package/dist/preview-engine/renderers-4I4UDLDR.mjs +0 -1
  438. package/dist/preview-engine/renderers-5EITT2FW.mjs +0 -1
  439. package/dist/preview-engine/renderers-7UKFQ75V.mjs +0 -1
  440. package/dist/preview-engine/renderers-AIRDDXRB.mjs +0 -1
  441. package/dist/preview-engine/renderers-BUOGMWAA.mjs +0 -1
  442. package/dist/preview-engine/renderers-C4XIAG3F.mjs +0 -1
  443. package/dist/preview-engine/renderers-ELARGDRC.mjs +0 -1
  444. package/dist/preview-engine/renderers-EU5VM2S2.mjs +0 -1
  445. package/dist/preview-engine/renderers-GEPP3YKK.mjs +0 -1
  446. package/dist/preview-engine/renderers-IQNZQWYU.mjs +0 -1
  447. package/dist/preview-engine/renderers-J6DEIWTU.mjs +0 -1
  448. package/dist/preview-engine/renderers-JQ7AI473.mjs +0 -228
  449. package/dist/preview-engine/renderers-JTVCE5PV.mjs +0 -1
  450. package/dist/preview-engine/renderers-KCNUETAD.mjs +0 -1
  451. package/dist/preview-engine/renderers-KKBHXAWS.mjs +0 -1
  452. package/dist/preview-engine/renderers-LER7SUT2.mjs +0 -1
  453. package/dist/preview-engine/renderers-MOERLDWF.mjs +0 -1
  454. package/dist/preview-engine/renderers-O57YIIAO.mjs +0 -1
  455. package/dist/preview-engine/renderers-OPUIAD7I.mjs +0 -1
  456. package/dist/preview-engine/renderers-PENUAXDD.mjs +0 -1
  457. package/dist/preview-engine/renderers-PFCI7ZFW.mjs +0 -1
  458. package/dist/preview-engine/renderers-Q4HDP2IE.mjs +0 -1
  459. package/dist/preview-engine/renderers-QMHUOKMM.mjs +0 -1
  460. package/dist/preview-engine/renderers-R26YPECG.mjs +0 -1
  461. package/dist/preview-engine/renderers-TAFDMFEA.mjs +0 -1
  462. package/dist/preview-engine/renderers-TMZLWQP2.mjs +0 -1
  463. package/dist/preview-engine/renderers-TP6ZMGU4.mjs +0 -1
  464. package/dist/preview-engine/renderers-TY63VTZB.mjs +0 -1
  465. package/dist/preview-engine/renderers-UBO4ZNE6.mjs +0 -1
  466. package/dist/preview-engine/renderers-UCNQ536S.mjs +0 -1
  467. package/dist/preview-engine/renderers-WOZQDE4A.mjs +0 -1
  468. package/dist/preview-engine/renderers-X2XGDF3R.mjs +0 -1
  469. package/dist/preview-engine/renderers-XG3BDROH.mjs +0 -1
  470. package/dist/preview-engine/renderers-XS4CFZWR.mjs +0 -1
  471. package/dist/preview-engine/renderers-ZQDMRWN7.mjs +0 -1
  472. package/dist/program-KwDdbC0-.mjs.map +0 -1
  473. package/dist/renderer-5C41E6gT.mjs +0 -5
  474. package/dist/renderer-6SXF9Ykm.mjs +0 -5
  475. package/dist/renderer-B2C2w3Wr.mjs +0 -5
  476. package/dist/renderer-B2QSfPYZ.mjs +0 -5
  477. package/dist/renderer-B5cQcMl1.mjs +0 -5
  478. package/dist/renderer-BDhD8Yab.mjs +0 -3
  479. package/dist/renderer-BSDdTHDh.mjs +0 -5
  480. package/dist/renderer-BTUjk8uY.mjs +0 -5
  481. package/dist/renderer-Bcey5Gvk.mjs +0 -5
  482. package/dist/renderer-Bd2MuOeJ.mjs +0 -5
  483. package/dist/renderer-Bd5A0zer.mjs +0 -5
  484. package/dist/renderer-CC-WlYa2.mjs +0 -5
  485. package/dist/renderer-Cb0qf1UG.mjs +0 -5
  486. package/dist/renderer-CfX13dgQ.mjs +0 -5
  487. package/dist/renderer-ChFkRLrv.mjs +0 -5
  488. package/dist/renderer-CjkfJj5R.mjs +0 -5
  489. package/dist/renderer-Ck7Lu6c9.mjs +0 -5
  490. package/dist/renderer-CuquqG_c.mjs +0 -5
  491. package/dist/renderer-Cwz2E4QD.mjs +0 -5
  492. package/dist/renderer-Czkt9YYp.mjs +0 -5
  493. package/dist/renderer-DFTIhSdJ.mjs +0 -5
  494. package/dist/renderer-DFaa-Ats.mjs +0 -5
  495. package/dist/renderer-DIHXKvPl.mjs +0 -5
  496. package/dist/renderer-DMzOqVM3.mjs +0 -5
  497. package/dist/renderer-DOId5U8x.mjs +0 -5
  498. package/dist/renderer-DQXFOup8.mjs +0 -5
  499. package/dist/renderer-DRt3BSTj.mjs +0 -5
  500. package/dist/renderer-Di_5vQ81.mjs +0 -6
  501. package/dist/renderer-DkmpsPIa.mjs +0 -5
  502. package/dist/renderer-Ds6wd9Gk.mjs +0 -5
  503. package/dist/renderer-DuuOlYIG.mjs +0 -3
  504. package/dist/renderer-Dv4p0lp9.mjs +0 -5
  505. package/dist/renderer-DzWoOlVc.mjs +0 -5
  506. package/dist/renderer-GbVNyv-E.mjs.map +0 -1
  507. package/dist/renderer-IOz63OWg.mjs +0 -5
  508. package/dist/renderer-JkSrsUa5.mjs +0 -5
  509. package/dist/renderer-Ocs1Djwu.mjs +0 -5
  510. package/dist/renderer-Wdn7m_uN.mjs +0 -5
  511. package/dist/renderer-mKpjaoE3.mjs +0 -5
  512. /package/dist/{chunk-GBe2k3y8.mjs → chunk-D7gtBK74.mjs} +0 -0
  513. /package/dist/preview-engine/{chunk-Q4Z54DQ7.mjs → chunk-LXHECDOB.mjs} +0 -0
  514. /package/dist/{renderer-B-BcgA6d.mjs → renderer-B7fX0C62.mjs} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-y6k54AM6.mjs","names":[],"sources":["../../../nodes/node-modulate/dist/renderers-B9q42xr2.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\nfunction resolveVal(val, fallback, frame, fps) {\n\tif (val === void 0 || val === null) return fallback;\n\tif (typeof val === \"object\" && val !== null) {\n\t\tif (\"get\" in val && typeof val.get === \"function\") try {\n\t\t\tconst res = val.get({\n\t\t\t\tframe,\n\t\t\t\tfps,\n\t\t\t\ttime: fps > 0 ? frame / fps : 0,\n\t\t\t\tduration: 0,\n\t\t\t\tdurationMs: 0,\n\t\t\t\tprogress: 0,\n\t\t\t\tdeltaTime: fps > 0 ? 1 / fps : 0\n\t\t\t});\n\t\t\tconst n$1 = Number(res);\n\t\t\tif (Number.isFinite(n$1)) return n$1;\n\t\t} catch {}\n\t\tif (\"value\" in val) {\n\t\t\tconst n$1 = Number(val.value);\n\t\t\tif (Number.isFinite(n$1)) return n$1;\n\t\t}\n\t} else if (typeof val === \"function\") try {\n\t\tconst res = val(frame, fps);\n\t\tconst n$1 = Number(res);\n\t\tif (Number.isFinite(n$1)) return n$1;\n\t} catch {}\n\tconst n = Number(val);\n\treturn Number.isFinite(n) ? n : fallback;\n}\nfunction resolveModulateField(op, fieldName, defaultValue, minVal, maxVal, frame = 0, fps = 30) {\n\tconst handleId = op[`${fieldName}HandleId`];\n\tconst signalInput = handleId ? op.inputs?.[handleId] : null;\n\tconst hasSignal = !!(signalInput?.connectionValid && signalInput.outputItem?.type === \"Signal\");\n\tconst sd = hasSignal ? signalInput?.outputItem?.data : null;\n\tlet value = defaultValue;\n\tif (!hasSignal) if (signalInput?.connectionValid && signalInput.outputItem?.type === \"Number\") value = Number(signalInput.outputItem.data ?? defaultValue);\n\telse value = resolveVal(op[fieldName] ?? op.signals?.[fieldName], defaultValue, frame, fps);\n\telse if (sd && typeof sd === \"object\" && \"offset\" in sd) value = Number(sd.offset ?? defaultValue);\n\tvalue = Math.max(minVal, Math.min(maxVal, value));\n\treturn {\n\t\thasSignal,\n\t\tsd,\n\t\tvalue\n\t};\n}\nconst STATIC_MODULATE_SHADER = `\nstruct ModulateUniforms {\n\thue : f32,\n\tbrightness : f32,\n\tcontrast : f32,\n\texposure : f32,\n\tsaturation : f32,\n\tsepia : f32,\n\n\thasSignal_hue : f32,\n\thasSignal_brightness : f32,\n\thasSignal_contrast : f32,\n\thasSignal_exposure : f32,\n\thasSignal_saturation : f32,\n\thasSignal_sepia : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : ModulateUniforms;\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 hueTex : texture_2d<f32>;\n@group(2) @binding(1) var brightnessTex : texture_2d<f32>;\n@group(2) @binding(2) var contrastTex : texture_2d<f32>;\n@group(2) @binding(3) var exposureTex : texture_2d<f32>;\n@group(2) @binding(4) var saturationTex : texture_2d<f32>;\n@group(2) @binding(5) var sepiaTex : texture_2d<f32>;\n@group(2) @binding(6) var sigSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn apply_exposure(c: vec4<f32>, exposure: f32) -> vec4<f32> {\n\tlet scale = pow(2.0, exposure);\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = scale * unpremult.r;\n\tlet g = scale * unpremult.g;\n\tlet b = scale * unpremult.b;\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_hue(c: vec4<f32>, degrees: f32) -> vec4<f32> {\n\tlet rad = (degrees * 3.1415926535) / 180.0;\n\tlet cosVal = cos(rad);\n\tlet sinVal = sin(rad);\n\n\tlet row0 = vec4<f32>(0.213 + cosVal * 0.787 - sinVal * 0.213, 0.715 - cosVal * 0.715 - sinVal * 0.715, 0.072 - cosVal * 0.072 + sinVal * 0.928, 0.0);\n\tlet row1 = vec4<f32>(0.213 - cosVal * 0.213 + sinVal * 0.143, 0.715 + cosVal * 0.285 + sinVal * 0.14, 0.072 - cosVal * 0.072 - sinVal * 0.283, 0.0);\n\tlet row2 = vec4<f32>(0.213 - cosVal * 0.213 - sinVal * 0.787, 0.715 - cosVal * 0.715 + sinVal * 0.715, 0.072 + cosVal * 0.928 + sinVal * 0.072, 0.0);\n\t\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = dot(row0, unpremult);\n\tlet g = dot(row1, unpremult);\n\tlet b = dot(row2, unpremult);\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_saturation(c: vec4<f32>, sat: f32) -> vec4<f32> {\n\tlet row0 = vec4<f32>(0.213 + sat * 0.787, 0.715 * (1.0 - sat), 0.072 * (1.0 - sat), 0.0);\n\tlet row1 = vec4<f32>(0.213 * (1.0 - sat), 0.715 + sat * 0.285, 0.072 * (1.0 - sat), 0.0);\n\tlet row2 = vec4<f32>(0.213 * (1.0 - sat), 0.715 * (1.0 - sat), 0.072 + sat * 0.928, 0.0);\n\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = dot(row0, unpremult);\n\tlet g = dot(row1, unpremult);\n\tlet b = dot(row2, unpremult);\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_contrast(c: vec4<f32>, contrast: f32) -> vec4<f32> {\n\tlet offset = 0.5 * (1.0 - contrast);\n\t\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = contrast * unpremult.r + offset;\n\tlet g = contrast * unpremult.g + offset;\n\tlet b = contrast * unpremult.b + offset;\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_brightness(c: vec4<f32>, bright: f32) -> vec4<f32> {\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = bright * unpremult.r;\n\tlet g = bright * unpremult.g;\n\tlet b = bright * unpremult.b;\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_sepia(c: vec4<f32>, s: f32) -> vec4<f32> {\n\tlet row0 = vec4<f32>(1.0 - 0.607 * s, 0.769 * s, 0.189 * s, 0.0);\n\tlet row1 = vec4<f32>(0.349 * s, 1.0 - 0.314 * s, 0.168 * s, 0.0);\n\tlet row2 = vec4<f32>(0.272 * s, 0.534 * s, 1.0 - 0.869 * s, 0.0);\n\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = dot(row0, unpremult);\n\tlet g = dot(row1, unpremult);\n\tlet b = dot(row2, unpremult);\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet original = textureSample(tex, samp, in.uv);\n\tvar color = original;\n\n\t// 1. Exposure\n\tvar exposure = u.exposure;\n\tif (u.hasSignal_exposure > 0.5) {\n\t\texposure = textureSampleLevel(exposureTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_exposure(color, exposure);\n\n\t// 2. Hue\n\tvar hue = u.hue;\n\tif (u.hasSignal_hue > 0.5) {\n\t\thue = textureSampleLevel(hueTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_hue(color, hue);\n\n\t// 3. Saturation\n\tvar saturation = u.saturation;\n\tif (u.hasSignal_saturation > 0.5) {\n\t\tsaturation = textureSampleLevel(saturationTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_saturation(color, saturation);\n\n\t// 4. Contrast\n\tvar contrast = u.contrast;\n\tif (u.hasSignal_contrast > 0.5) {\n\t\tcontrast = textureSampleLevel(contrastTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_contrast(color, contrast);\n\n\t// 5. Brightness\n\tvar brightness = u.brightness;\n\tif (u.hasSignal_brightness > 0.5) {\n\t\tbrightness = textureSampleLevel(brightnessTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_brightness(color, brightness);\n\n\t// 6. Sepia\n\tvar sepia = u.sepia;\n\tif (u.hasSignal_sepia > 0.5) {\n\t\tsepia = textureSampleLevel(sepiaTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_sepia(color, sepia);\n\n\treturn color;\n}\n`;\nconst modulateData = new Float32Array(12);\nconst getDeviceLayouts = perDevice((device) => ({\n\tmodulateUniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tmodulateSignalsLayout: texturesLayout(device, 6),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getModulateResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `modulate_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst modulateModule = device.createShaderModule({\n\t\t\tlabel: `modulate_static_${format}.wgsl`,\n\t\t\tcode: STATIC_MODULATE_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `ModulatePipeline_static_${format}`,\n\t\t\tmodule: modulateModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.modulateUniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.modulateSignalsLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tmodulatePipeline: pipeline,\n\t\tmodulateUniformLayout: layouts.modulateUniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tmodulateSignalsLayout: layouts.modulateSignalsLayout\n\t};\n}\nconst ModulateWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Modulate\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst hueInfo = resolveModulateField(op, \"hue\", 0, 0, 360, compositionFrame, fps);\n\tconst brightnessInfo = resolveModulateField(op, \"brightness\", 1, 0, 2, compositionFrame, fps);\n\tconst contrastInfo = resolveModulateField(op, \"contrast\", 1, 0, 2, compositionFrame, fps);\n\tconst exposureInfo = resolveModulateField(op, \"exposure\", 0, -2, 2, compositionFrame, fps);\n\tconst saturationInfo = resolveModulateField(op, \"saturation\", 1, 0, 2, compositionFrame, fps);\n\tconst sepiaInfo = resolveModulateField(op, \"sepia\", 0, 0, 1, compositionFrame, fps);\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { modulatePipeline: pipeline, modulateUniformLayout: uLayout, singleTextureLayout: tLayout, modulateSignalsLayout: sigLayout } = getModulateResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tmodulateData[0] = hueInfo.value;\n\tmodulateData[1] = brightnessInfo.value;\n\tmodulateData[2] = contrastInfo.value;\n\tmodulateData[3] = exposureInfo.value;\n\tmodulateData[4] = saturationInfo.value;\n\tmodulateData[5] = sepiaInfo.value;\n\tconst fields = [\n\t\t{\n\t\t\tname: \"hue\",\n\t\t\tinfo: hueInfo,\n\t\t\tidx: 6\n\t\t},\n\t\t{\n\t\t\tname: \"brightness\",\n\t\t\tinfo: brightnessInfo,\n\t\t\tidx: 7\n\t\t},\n\t\t{\n\t\t\tname: \"contrast\",\n\t\t\tinfo: contrastInfo,\n\t\t\tidx: 8\n\t\t},\n\t\t{\n\t\t\tname: \"exposure\",\n\t\t\tinfo: exposureInfo,\n\t\t\tidx: 9\n\t\t},\n\t\t{\n\t\t\tname: \"saturation\",\n\t\t\tinfo: saturationInfo,\n\t\t\tidx: 10\n\t\t},\n\t\t{\n\t\t\tname: \"sepia\",\n\t\t\tinfo: sepiaInfo,\n\t\t\tidx: 11\n\t\t}\n\t];\n\tconst signalViews = [];\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tfor (const f of fields) {\n\t\tconst isGenerator = !!(f.info.hasSignal && f.info.sd);\n\t\tmodulateData[f.idx] = isGenerator ? 1 : 0;\n\t\tif (isGenerator) {\n\t\t\tconst view = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, f.info.sd.nodeId ?? `modulate_${f.name}_sig`, elapsedSeconds, durationSeconds, f.info.sd, width, height, props.renderId, frame, fps);\n\t\t\tsignalViews.push(view);\n\t\t} else signalViews.push(signalRegistry.getDummy1x1TextureView(ctx.device));\n\t}\n\tconst buffer = ctx.renderer.getTemporaryBuffer(modulateData);\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 }\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: signalViews[0]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: signalViews[1]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: signalViews[2]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: signalViews[3]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: signalViews[4]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: signalViews[5]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\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: ModulateWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-B9q42xr2.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-PLoGrFGz.mjs","names":[],"sources":["../../../nodes/node-modulate/dist/renderers-B9q42xr2.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\nfunction resolveVal(val, fallback, frame, fps) {\n\tif (val === void 0 || val === null) return fallback;\n\tif (typeof val === \"object\" && val !== null) {\n\t\tif (\"get\" in val && typeof val.get === \"function\") try {\n\t\t\tconst res = val.get({\n\t\t\t\tframe,\n\t\t\t\tfps,\n\t\t\t\ttime: fps > 0 ? frame / fps : 0,\n\t\t\t\tduration: 0,\n\t\t\t\tdurationMs: 0,\n\t\t\t\tprogress: 0,\n\t\t\t\tdeltaTime: fps > 0 ? 1 / fps : 0\n\t\t\t});\n\t\t\tconst n$1 = Number(res);\n\t\t\tif (Number.isFinite(n$1)) return n$1;\n\t\t} catch {}\n\t\tif (\"value\" in val) {\n\t\t\tconst n$1 = Number(val.value);\n\t\t\tif (Number.isFinite(n$1)) return n$1;\n\t\t}\n\t} else if (typeof val === \"function\") try {\n\t\tconst res = val(frame, fps);\n\t\tconst n$1 = Number(res);\n\t\tif (Number.isFinite(n$1)) return n$1;\n\t} catch {}\n\tconst n = Number(val);\n\treturn Number.isFinite(n) ? n : fallback;\n}\nfunction resolveModulateField(op, fieldName, defaultValue, minVal, maxVal, frame = 0, fps = 30) {\n\tconst handleId = op[`${fieldName}HandleId`];\n\tconst signalInput = handleId ? op.inputs?.[handleId] : null;\n\tconst hasSignal = !!(signalInput?.connectionValid && signalInput.outputItem?.type === \"Signal\");\n\tconst sd = hasSignal ? signalInput?.outputItem?.data : null;\n\tlet value = defaultValue;\n\tif (!hasSignal) if (signalInput?.connectionValid && signalInput.outputItem?.type === \"Number\") value = Number(signalInput.outputItem.data ?? defaultValue);\n\telse value = resolveVal(op[fieldName] ?? op.signals?.[fieldName], defaultValue, frame, fps);\n\telse if (sd && typeof sd === \"object\" && \"offset\" in sd) value = Number(sd.offset ?? defaultValue);\n\tvalue = Math.max(minVal, Math.min(maxVal, value));\n\treturn {\n\t\thasSignal,\n\t\tsd,\n\t\tvalue\n\t};\n}\nconst STATIC_MODULATE_SHADER = `\nstruct ModulateUniforms {\n\thue : f32,\n\tbrightness : f32,\n\tcontrast : f32,\n\texposure : f32,\n\tsaturation : f32,\n\tsepia : f32,\n\n\thasSignal_hue : f32,\n\thasSignal_brightness : f32,\n\thasSignal_contrast : f32,\n\thasSignal_exposure : f32,\n\thasSignal_saturation : f32,\n\thasSignal_sepia : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : ModulateUniforms;\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 hueTex : texture_2d<f32>;\n@group(2) @binding(1) var brightnessTex : texture_2d<f32>;\n@group(2) @binding(2) var contrastTex : texture_2d<f32>;\n@group(2) @binding(3) var exposureTex : texture_2d<f32>;\n@group(2) @binding(4) var saturationTex : texture_2d<f32>;\n@group(2) @binding(5) var sepiaTex : texture_2d<f32>;\n@group(2) @binding(6) var sigSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn apply_exposure(c: vec4<f32>, exposure: f32) -> vec4<f32> {\n\tlet scale = pow(2.0, exposure);\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = scale * unpremult.r;\n\tlet g = scale * unpremult.g;\n\tlet b = scale * unpremult.b;\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_hue(c: vec4<f32>, degrees: f32) -> vec4<f32> {\n\tlet rad = (degrees * 3.1415926535) / 180.0;\n\tlet cosVal = cos(rad);\n\tlet sinVal = sin(rad);\n\n\tlet row0 = vec4<f32>(0.213 + cosVal * 0.787 - sinVal * 0.213, 0.715 - cosVal * 0.715 - sinVal * 0.715, 0.072 - cosVal * 0.072 + sinVal * 0.928, 0.0);\n\tlet row1 = vec4<f32>(0.213 - cosVal * 0.213 + sinVal * 0.143, 0.715 + cosVal * 0.285 + sinVal * 0.14, 0.072 - cosVal * 0.072 - sinVal * 0.283, 0.0);\n\tlet row2 = vec4<f32>(0.213 - cosVal * 0.213 - sinVal * 0.787, 0.715 - cosVal * 0.715 + sinVal * 0.715, 0.072 + cosVal * 0.928 + sinVal * 0.072, 0.0);\n\t\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = dot(row0, unpremult);\n\tlet g = dot(row1, unpremult);\n\tlet b = dot(row2, unpremult);\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_saturation(c: vec4<f32>, sat: f32) -> vec4<f32> {\n\tlet row0 = vec4<f32>(0.213 + sat * 0.787, 0.715 * (1.0 - sat), 0.072 * (1.0 - sat), 0.0);\n\tlet row1 = vec4<f32>(0.213 * (1.0 - sat), 0.715 + sat * 0.285, 0.072 * (1.0 - sat), 0.0);\n\tlet row2 = vec4<f32>(0.213 * (1.0 - sat), 0.715 * (1.0 - sat), 0.072 + sat * 0.928, 0.0);\n\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = dot(row0, unpremult);\n\tlet g = dot(row1, unpremult);\n\tlet b = dot(row2, unpremult);\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_contrast(c: vec4<f32>, contrast: f32) -> vec4<f32> {\n\tlet offset = 0.5 * (1.0 - contrast);\n\t\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = contrast * unpremult.r + offset;\n\tlet g = contrast * unpremult.g + offset;\n\tlet b = contrast * unpremult.b + offset;\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_brightness(c: vec4<f32>, bright: f32) -> vec4<f32> {\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = bright * unpremult.r;\n\tlet g = bright * unpremult.g;\n\tlet b = bright * unpremult.b;\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_sepia(c: vec4<f32>, s: f32) -> vec4<f32> {\n\tlet row0 = vec4<f32>(1.0 - 0.607 * s, 0.769 * s, 0.189 * s, 0.0);\n\tlet row1 = vec4<f32>(0.349 * s, 1.0 - 0.314 * s, 0.168 * s, 0.0);\n\tlet row2 = vec4<f32>(0.272 * s, 0.534 * s, 1.0 - 0.869 * s, 0.0);\n\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = dot(row0, unpremult);\n\tlet g = dot(row1, unpremult);\n\tlet b = dot(row2, unpremult);\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet original = textureSample(tex, samp, in.uv);\n\tvar color = original;\n\n\t// 1. Exposure\n\tvar exposure = u.exposure;\n\tif (u.hasSignal_exposure > 0.5) {\n\t\texposure = textureSampleLevel(exposureTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_exposure(color, exposure);\n\n\t// 2. Hue\n\tvar hue = u.hue;\n\tif (u.hasSignal_hue > 0.5) {\n\t\thue = textureSampleLevel(hueTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_hue(color, hue);\n\n\t// 3. Saturation\n\tvar saturation = u.saturation;\n\tif (u.hasSignal_saturation > 0.5) {\n\t\tsaturation = textureSampleLevel(saturationTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_saturation(color, saturation);\n\n\t// 4. Contrast\n\tvar contrast = u.contrast;\n\tif (u.hasSignal_contrast > 0.5) {\n\t\tcontrast = textureSampleLevel(contrastTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_contrast(color, contrast);\n\n\t// 5. Brightness\n\tvar brightness = u.brightness;\n\tif (u.hasSignal_brightness > 0.5) {\n\t\tbrightness = textureSampleLevel(brightnessTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_brightness(color, brightness);\n\n\t// 6. Sepia\n\tvar sepia = u.sepia;\n\tif (u.hasSignal_sepia > 0.5) {\n\t\tsepia = textureSampleLevel(sepiaTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_sepia(color, sepia);\n\n\treturn color;\n}\n`;\nconst modulateData = new Float32Array(12);\nconst getDeviceLayouts = perDevice((device) => ({\n\tmodulateUniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tmodulateSignalsLayout: texturesLayout(device, 6),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getModulateResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `modulate_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst modulateModule = device.createShaderModule({\n\t\t\tlabel: `modulate_static_${format}.wgsl`,\n\t\t\tcode: STATIC_MODULATE_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `ModulatePipeline_static_${format}`,\n\t\t\tmodule: modulateModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.modulateUniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.modulateSignalsLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tmodulatePipeline: pipeline,\n\t\tmodulateUniformLayout: layouts.modulateUniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tmodulateSignalsLayout: layouts.modulateSignalsLayout\n\t};\n}\nconst ModulateWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Modulate\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst hueInfo = resolveModulateField(op, \"hue\", 0, 0, 360, compositionFrame, fps);\n\tconst brightnessInfo = resolveModulateField(op, \"brightness\", 1, 0, 2, compositionFrame, fps);\n\tconst contrastInfo = resolveModulateField(op, \"contrast\", 1, 0, 2, compositionFrame, fps);\n\tconst exposureInfo = resolveModulateField(op, \"exposure\", 0, -2, 2, compositionFrame, fps);\n\tconst saturationInfo = resolveModulateField(op, \"saturation\", 1, 0, 2, compositionFrame, fps);\n\tconst sepiaInfo = resolveModulateField(op, \"sepia\", 0, 0, 1, compositionFrame, fps);\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { modulatePipeline: pipeline, modulateUniformLayout: uLayout, singleTextureLayout: tLayout, modulateSignalsLayout: sigLayout } = getModulateResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tmodulateData[0] = hueInfo.value;\n\tmodulateData[1] = brightnessInfo.value;\n\tmodulateData[2] = contrastInfo.value;\n\tmodulateData[3] = exposureInfo.value;\n\tmodulateData[4] = saturationInfo.value;\n\tmodulateData[5] = sepiaInfo.value;\n\tconst fields = [\n\t\t{\n\t\t\tname: \"hue\",\n\t\t\tinfo: hueInfo,\n\t\t\tidx: 6\n\t\t},\n\t\t{\n\t\t\tname: \"brightness\",\n\t\t\tinfo: brightnessInfo,\n\t\t\tidx: 7\n\t\t},\n\t\t{\n\t\t\tname: \"contrast\",\n\t\t\tinfo: contrastInfo,\n\t\t\tidx: 8\n\t\t},\n\t\t{\n\t\t\tname: \"exposure\",\n\t\t\tinfo: exposureInfo,\n\t\t\tidx: 9\n\t\t},\n\t\t{\n\t\t\tname: \"saturation\",\n\t\t\tinfo: saturationInfo,\n\t\t\tidx: 10\n\t\t},\n\t\t{\n\t\t\tname: \"sepia\",\n\t\t\tinfo: sepiaInfo,\n\t\t\tidx: 11\n\t\t}\n\t];\n\tconst signalViews = [];\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tfor (const f of fields) {\n\t\tconst isGenerator = !!(f.info.hasSignal && f.info.sd);\n\t\tmodulateData[f.idx] = isGenerator ? 1 : 0;\n\t\tif (isGenerator) {\n\t\t\tconst view = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, f.info.sd.nodeId ?? `modulate_${f.name}_sig`, elapsedSeconds, durationSeconds, f.info.sd, width, height, props.renderId, frame, fps);\n\t\t\tsignalViews.push(view);\n\t\t} else signalViews.push(signalRegistry.getDummy1x1TextureView(ctx.device));\n\t}\n\tconst buffer = ctx.renderer.getTemporaryBuffer(modulateData);\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 }\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: signalViews[0]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: signalViews[1]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: signalViews[2]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: signalViews[3]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: signalViews[4]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: signalViews[5]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\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: ModulateWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-B9q42xr2.mjs.map"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { n as defineRenderer } from "./renderer-BSitV56h.mjs";
1
+ import { n as defineRenderer } from "./renderer-C9r0-KY4.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-DO5r7ZV-.mjs.map
658
+ //# sourceMappingURL=renderer-PNIgmWft.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-DO5r7ZV-.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-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,6 +1,6 @@
1
- import { n as defineRenderer } from "./renderer-BSitV56h.mjs";
2
- import { Nn as signalRegistry } from "./dist-hmWTJPik.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-CHIgM_YH.mjs";
1
+ import { n as defineRenderer } from "./renderer-C9r0-KY4.mjs";
2
+ import { Fn as signalRegistry } from "./dist-DBWkkSvJ.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-Dq_uI_00.mjs";
4
4
 
5
5
  //#region ../../nodes/node-displacement-map/dist/renderers-DzMCAYTg.mjs
6
6
  const STRENGTH_MIN = 0;
@@ -249,4 +249,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: DisplacementMapWebGPURe
249
249
 
250
250
  //#endregion
251
251
  export { renderers_default as t };
252
- //# sourceMappingURL=renderer-CDky5Gva.mjs.map
252
+ //# sourceMappingURL=renderer-VdTs-dqH.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CDky5Gva.mjs","names":[],"sources":["../../../nodes/node-displacement-map/dist/renderers-DzMCAYTg.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 STRENGTH_MIN = 0;\nconst STRENGTH_MAX = 500;\nfunction clamp(value, min, max) {\n\treturn Math.min(max, Math.max(min, value));\n}\nconst DISPLACEMENT_MAP_SHADER = `\nstruct DisplacementUniforms {\n strengthX : f32,\n strengthY : f32,\n xChannel : f32, // 0=R, 1=G, 2=B, 3=A, 4=Luma\n yChannel : f32, // 0=R, 1=G, 2=B, 3=A, 4=Luma\n\n wrapMode : f32, // 0=Clamp, 1=Repeat, 2=Mirror\n hasSignalX : f32,\n hasSignalY : f32,\n _pad : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : DisplacementUniforms;\n@group(1) @binding(0) var srcTex : texture_2d<f32>;\n@group(1) @binding(1) var srcSamp : sampler;\n@group(2) @binding(0) var mapTex : texture_2d<f32>;\n@group(2) @binding(1) var mapSamp : sampler;\n@group(3) @binding(0) var sigXTex : texture_2d<f32>;\n@group(3) @binding(1) var sigYTex : texture_2d<f32>;\n@group(3) @binding(2) var sigSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn extractChannel(color: vec4<f32>, channel: f32) -> f32 {\n if (channel < 0.5) { return color.r; }\n if (channel < 1.5) { return color.g; }\n if (channel < 2.5) { return color.b; }\n if (channel < 3.5) { return color.a; }\n // Luminance\n return dot(color.rgb, vec3<f32>(0.299, 0.587, 0.114));\n}\n\nfn applyWrap(coord: f32, mode: f32) -> f32 {\n if (mode < 0.5) {\n // Clamp\n return clamp(coord, 0.0, 1.0);\n }\n if (mode < 1.5) {\n // Repeat\n return fract(coord);\n }\n // Mirror\n let t = fract(coord * 0.5) * 2.0;\n if (t > 1.0) {\n return 2.0 - t;\n }\n return t;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n let mapColor = textureSampleLevel(mapTex, mapSamp, in.uv, 0.0);\n\n // Extract displacement values from chosen channels, centered around 0.5 and gated by alpha\n // NOTE (P3, not changed here): this yields a max offset of strength/2 px at\n // either extreme (peak-to-peak swing == strength). Confirm with design whether\n // \"strength in pixels\" should mean peak amplitude instead — see review doc.\n let dispX = (extractChannel(mapColor, u.xChannel) - 0.5) * mapColor.a;\n let dispY = (extractChannel(mapColor, u.yChannel) - 0.5) * mapColor.a;\n\n // Get strength, potentially from signal textures\n var sX = u.strengthX;\n var sY = u.strengthY;\n if (u.hasSignalX > 0.5) {\n sX = textureSampleLevel(sigXTex, sigSamp, in.uv, 0.0).r;\n }\n if (u.hasSignalY > 0.5) {\n sY = textureSampleLevel(sigYTex, sigSamp, in.uv, 0.0).r;\n }\n\n // Compute displacement in UV space (strength is in pixels, convert to UV)\n let srcDims = vec2<f32>(textureDimensions(srcTex));\n let offset = vec2<f32>(\n dispX * sX / srcDims.x,\n dispY * sY / srcDims.y,\n );\n\n let displaced = vec2<f32>(\n applyWrap(in.uv.x + offset.x, u.wrapMode),\n applyWrap(in.uv.y + offset.y, u.wrapMode),\n );\n\n return textureSampleLevel(srcTex, srcSamp, displaced, 0.0);\n}\n`;\nconst uniformData = new Float32Array(8);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsrcTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tmapTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 2),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getDisplacementResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `displacement_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: `displacement_${format}.wgsl`,\n\t\t\tcode: DISPLACEMENT_MAP_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `DisplacementMapPipeline_${format}`,\n\t\t\tmodule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.srcTextureLayout,\n\t\t\t\tlayouts.mapTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tpipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsrcTextureLayout: layouts.srcTextureLayout,\n\t\tmapTextureLayout: layouts.mapTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nfunction channelToFloat(ch) {\n\tswitch (ch) {\n\t\tcase \"Green\": return 1;\n\t\tcase \"Blue\": return 2;\n\t\tcase \"Alpha\": return 3;\n\t\tcase \"Luminance\": return 4;\n\t\tdefault: return 0;\n\t}\n}\nfunction wrapModeToFloat(mode) {\n\tswitch (mode) {\n\t\tcase \"Repeat\": return 1;\n\t\tcase \"Mirror\": return 2;\n\t\tdefault: return 0;\n\t}\n}\nfunction resolveSignalField(op, fieldName, defaultValue) {\n\tconst handleId = op[`${fieldName}HandleId`];\n\tconst signalInput = handleId ? op.inputs?.[handleId] : null;\n\tconst hasSignal = !!(signalInput?.connectionValid && signalInput.outputItem?.type === \"Signal\");\n\tconst sd = hasSignal ? signalInput?.outputItem?.data : null;\n\tlet value = defaultValue;\n\tif (!hasSignal) if (signalInput?.connectionValid && signalInput.outputItem?.type === \"Number\") value = clamp(Number(signalInput.outputItem.data ?? defaultValue), STRENGTH_MIN, STRENGTH_MAX);\n\telse value = Number(op[fieldName] ?? defaultValue);\n\telse if (sd && typeof sd === \"object\" && \"offset\" in sd) value = Number(sd.offset ?? defaultValue);\n\treturn {\n\t\thasSignal,\n\t\tsd,\n\t\tvalue\n\t};\n}\nconst DisplacementMapWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"DisplacementMap\" || !op) return;\n\tconst sourceMedia = props.virtualMedia.children?.[0];\n\tconst mapMedia = op.mapMedia;\n\tif (!sourceMedia || !mapMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst strengthXInfo = resolveSignalField(op, \"strengthX\", 50);\n\tconst strengthYInfo = resolveSignalField(op, \"strengthY\", 50);\n\tconst { texture: srcTex } = await drawChildToTexture(args, sourceMedia, { props: {\n\t\t...props,\n\t\tvirtualMedia: sourceMedia,\n\t\trenderId: `${props.renderId}-c0`\n\t} });\n\targs.pass.end();\n\tconst { texture: mapTex } = await drawChildToTexture(args, mapMedia, {\n\t\tprops: {\n\t\t\t...props,\n\t\t\tvirtualMedia: mapMedia,\n\t\t\trenderId: `${props.renderId}-c1`,\n\t\t\texcludeTextures: [...props.excludeTextures || [], srcTex]\n\t\t},\n\t\texclude: [srcTex]\n\t});\n\targs.pass.end();\n\tconst { pipeline, uniformLayout: uLayout, srcTextureLayout: srcLayout, mapTextureLayout: mapLayout, signalTextureLayout: sigLayout } = getDisplacementResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tlet sigXView;\n\tlet sigYView;\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tif (strengthXInfo.hasSignal && strengthXInfo.sd) sigXView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, strengthXInfo.sd.nodeId ?? \"displace_sx_sig\", elapsedSeconds, durationSeconds, strengthXInfo.sd, width, height, props.renderId, frame, fps);\n\telse sigXView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tif (strengthYInfo.hasSignal && strengthYInfo.sd) sigYView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, strengthYInfo.sd.nodeId ?? \"displace_sy_sig\", elapsedSeconds, durationSeconds, strengthYInfo.sd, width, height, props.renderId, frame, fps);\n\telse sigYView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tuniformData[0] = strengthXInfo.value;\n\tuniformData[1] = strengthYInfo.value;\n\tuniformData[2] = channelToFloat(op.xChannel);\n\tuniformData[3] = channelToFloat(op.yChannel);\n\tuniformData[4] = wrapModeToFloat(op.wrapMode);\n\tuniformData[5] = strengthXInfo.hasSignal ? 1 : 0;\n\tuniformData[6] = strengthYInfo.hasSignal ? 1 : 0;\n\tuniformData[7] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tsrcTex,\n\t\tmapTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uniformBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, srcLayout, srcTex, sampler),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, mapLayout, mapTex, 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: sigXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: sigYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: DisplacementMapWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-DzMCAYTg.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-VdTs-dqH.mjs","names":[],"sources":["../../../nodes/node-displacement-map/dist/renderers-DzMCAYTg.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 STRENGTH_MIN = 0;\nconst STRENGTH_MAX = 500;\nfunction clamp(value, min, max) {\n\treturn Math.min(max, Math.max(min, value));\n}\nconst DISPLACEMENT_MAP_SHADER = `\nstruct DisplacementUniforms {\n strengthX : f32,\n strengthY : f32,\n xChannel : f32, // 0=R, 1=G, 2=B, 3=A, 4=Luma\n yChannel : f32, // 0=R, 1=G, 2=B, 3=A, 4=Luma\n\n wrapMode : f32, // 0=Clamp, 1=Repeat, 2=Mirror\n hasSignalX : f32,\n hasSignalY : f32,\n _pad : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : DisplacementUniforms;\n@group(1) @binding(0) var srcTex : texture_2d<f32>;\n@group(1) @binding(1) var srcSamp : sampler;\n@group(2) @binding(0) var mapTex : texture_2d<f32>;\n@group(2) @binding(1) var mapSamp : sampler;\n@group(3) @binding(0) var sigXTex : texture_2d<f32>;\n@group(3) @binding(1) var sigYTex : texture_2d<f32>;\n@group(3) @binding(2) var sigSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn extractChannel(color: vec4<f32>, channel: f32) -> f32 {\n if (channel < 0.5) { return color.r; }\n if (channel < 1.5) { return color.g; }\n if (channel < 2.5) { return color.b; }\n if (channel < 3.5) { return color.a; }\n // Luminance\n return dot(color.rgb, vec3<f32>(0.299, 0.587, 0.114));\n}\n\nfn applyWrap(coord: f32, mode: f32) -> f32 {\n if (mode < 0.5) {\n // Clamp\n return clamp(coord, 0.0, 1.0);\n }\n if (mode < 1.5) {\n // Repeat\n return fract(coord);\n }\n // Mirror\n let t = fract(coord * 0.5) * 2.0;\n if (t > 1.0) {\n return 2.0 - t;\n }\n return t;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n let mapColor = textureSampleLevel(mapTex, mapSamp, in.uv, 0.0);\n\n // Extract displacement values from chosen channels, centered around 0.5 and gated by alpha\n // NOTE (P3, not changed here): this yields a max offset of strength/2 px at\n // either extreme (peak-to-peak swing == strength). Confirm with design whether\n // \"strength in pixels\" should mean peak amplitude instead — see review doc.\n let dispX = (extractChannel(mapColor, u.xChannel) - 0.5) * mapColor.a;\n let dispY = (extractChannel(mapColor, u.yChannel) - 0.5) * mapColor.a;\n\n // Get strength, potentially from signal textures\n var sX = u.strengthX;\n var sY = u.strengthY;\n if (u.hasSignalX > 0.5) {\n sX = textureSampleLevel(sigXTex, sigSamp, in.uv, 0.0).r;\n }\n if (u.hasSignalY > 0.5) {\n sY = textureSampleLevel(sigYTex, sigSamp, in.uv, 0.0).r;\n }\n\n // Compute displacement in UV space (strength is in pixels, convert to UV)\n let srcDims = vec2<f32>(textureDimensions(srcTex));\n let offset = vec2<f32>(\n dispX * sX / srcDims.x,\n dispY * sY / srcDims.y,\n );\n\n let displaced = vec2<f32>(\n applyWrap(in.uv.x + offset.x, u.wrapMode),\n applyWrap(in.uv.y + offset.y, u.wrapMode),\n );\n\n return textureSampleLevel(srcTex, srcSamp, displaced, 0.0);\n}\n`;\nconst uniformData = new Float32Array(8);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsrcTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tmapTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 2),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getDisplacementResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `displacement_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: `displacement_${format}.wgsl`,\n\t\t\tcode: DISPLACEMENT_MAP_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `DisplacementMapPipeline_${format}`,\n\t\t\tmodule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.srcTextureLayout,\n\t\t\t\tlayouts.mapTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tpipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsrcTextureLayout: layouts.srcTextureLayout,\n\t\tmapTextureLayout: layouts.mapTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nfunction channelToFloat(ch) {\n\tswitch (ch) {\n\t\tcase \"Green\": return 1;\n\t\tcase \"Blue\": return 2;\n\t\tcase \"Alpha\": return 3;\n\t\tcase \"Luminance\": return 4;\n\t\tdefault: return 0;\n\t}\n}\nfunction wrapModeToFloat(mode) {\n\tswitch (mode) {\n\t\tcase \"Repeat\": return 1;\n\t\tcase \"Mirror\": return 2;\n\t\tdefault: return 0;\n\t}\n}\nfunction resolveSignalField(op, fieldName, defaultValue) {\n\tconst handleId = op[`${fieldName}HandleId`];\n\tconst signalInput = handleId ? op.inputs?.[handleId] : null;\n\tconst hasSignal = !!(signalInput?.connectionValid && signalInput.outputItem?.type === \"Signal\");\n\tconst sd = hasSignal ? signalInput?.outputItem?.data : null;\n\tlet value = defaultValue;\n\tif (!hasSignal) if (signalInput?.connectionValid && signalInput.outputItem?.type === \"Number\") value = clamp(Number(signalInput.outputItem.data ?? defaultValue), STRENGTH_MIN, STRENGTH_MAX);\n\telse value = Number(op[fieldName] ?? defaultValue);\n\telse if (sd && typeof sd === \"object\" && \"offset\" in sd) value = Number(sd.offset ?? defaultValue);\n\treturn {\n\t\thasSignal,\n\t\tsd,\n\t\tvalue\n\t};\n}\nconst DisplacementMapWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"DisplacementMap\" || !op) return;\n\tconst sourceMedia = props.virtualMedia.children?.[0];\n\tconst mapMedia = op.mapMedia;\n\tif (!sourceMedia || !mapMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst strengthXInfo = resolveSignalField(op, \"strengthX\", 50);\n\tconst strengthYInfo = resolveSignalField(op, \"strengthY\", 50);\n\tconst { texture: srcTex } = await drawChildToTexture(args, sourceMedia, { props: {\n\t\t...props,\n\t\tvirtualMedia: sourceMedia,\n\t\trenderId: `${props.renderId}-c0`\n\t} });\n\targs.pass.end();\n\tconst { texture: mapTex } = await drawChildToTexture(args, mapMedia, {\n\t\tprops: {\n\t\t\t...props,\n\t\t\tvirtualMedia: mapMedia,\n\t\t\trenderId: `${props.renderId}-c1`,\n\t\t\texcludeTextures: [...props.excludeTextures || [], srcTex]\n\t\t},\n\t\texclude: [srcTex]\n\t});\n\targs.pass.end();\n\tconst { pipeline, uniformLayout: uLayout, srcTextureLayout: srcLayout, mapTextureLayout: mapLayout, signalTextureLayout: sigLayout } = getDisplacementResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tlet sigXView;\n\tlet sigYView;\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tif (strengthXInfo.hasSignal && strengthXInfo.sd) sigXView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, strengthXInfo.sd.nodeId ?? \"displace_sx_sig\", elapsedSeconds, durationSeconds, strengthXInfo.sd, width, height, props.renderId, frame, fps);\n\telse sigXView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tif (strengthYInfo.hasSignal && strengthYInfo.sd) sigYView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, strengthYInfo.sd.nodeId ?? \"displace_sy_sig\", elapsedSeconds, durationSeconds, strengthYInfo.sd, width, height, props.renderId, frame, fps);\n\telse sigYView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tuniformData[0] = strengthXInfo.value;\n\tuniformData[1] = strengthYInfo.value;\n\tuniformData[2] = channelToFloat(op.xChannel);\n\tuniformData[3] = channelToFloat(op.yChannel);\n\tuniformData[4] = wrapModeToFloat(op.wrapMode);\n\tuniformData[5] = strengthXInfo.hasSignal ? 1 : 0;\n\tuniformData[6] = strengthYInfo.hasSignal ? 1 : 0;\n\tuniformData[7] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tsrcTex,\n\t\tmapTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uniformBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, srcLayout, srcTex, sampler),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, mapLayout, mapTex, 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: sigXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: sigYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: DisplacementMapWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-DzMCAYTg.mjs.map"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { c as solveHomography, n as defineRenderer } from "./renderer-BSitV56h.mjs";
2
- import { a as createFullscreenPipeline, c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, r as STRAIGHT_ALPHA_BLEND, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-CHIgM_YH.mjs";
1
+ import { c as solveHomography, n as defineRenderer } from "./renderer-C9r0-KY4.mjs";
2
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, r as STRAIGHT_ALPHA_BLEND, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-Dq_uI_00.mjs";
3
3
 
4
4
  //#region ../../nodes/node-corner-pin/dist/renderers-pM5Tx32P.mjs
5
5
  function getDefaultPoints() {
@@ -145,4 +145,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: CornerPinWebGPURenderer
145
145
 
146
146
  //#endregion
147
147
  export { renderers_default as t };
148
- //# sourceMappingURL=renderer-QaN-aejD.mjs.map
148
+ //# sourceMappingURL=renderer-VxVi_0c7.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-QaN-aejD.mjs","names":[],"sources":["../../../nodes/node-corner-pin/dist/renderers-pM5Tx32P.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, STRAIGHT_ALPHA_BLEND, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\nimport { solveHomography } from \"@framefields/node-sdk\";\n\n//#region src/shared/utils.ts\nfunction getDefaultPoints() {\n\treturn [\n\t\t{\n\t\t\tx: 0,\n\t\t\ty: 0\n\t\t},\n\t\t{\n\t\t\tx: 100,\n\t\t\ty: 0\n\t\t},\n\t\t{\n\t\t\tx: 0,\n\t\t\ty: 100\n\t\t},\n\t\t{\n\t\t\tx: 100,\n\t\t\ty: 100\n\t\t}\n\t];\n}\n/**\n* Homography mapping the corner-pin quad (percent coordinates, TL, TR, BL, BR)\n* to the unit square it samples from. Falls back to the identity quad.\n*/\nfunction solveCornerPinHomography(targetPoints) {\n\treturn solveHomography((targetPoints && targetPoints.length === 4 ? targetPoints : getDefaultPoints()).map((p) => ({\n\t\tx: p.x / 100,\n\t\ty: p.y / 100\n\t})));\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst cornerPinWgsl = `\nstruct CornerPinUniforms {\n\tmatrix_row0 : vec4<f32>,\n\tmatrix_row1 : vec4<f32>,\n\tmatrix_row2 : vec4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : CornerPinUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet x = in.uv.x;\n\tlet y = in.uv.y;\n\n\tlet d = u.matrix_row2.x * x + u.matrix_row2.y * y + u.matrix_row2.z;\n\tif (abs(d) < 1e-6) {\n\t\treturn vec4<f32>(0.0);\n\t}\n\n\tlet src_u = (u.matrix_row0.x * x + u.matrix_row0.y * y + u.matrix_row0.z) / d;\n\tlet src_v = (u.matrix_row1.x * x + u.matrix_row1.y * y + u.matrix_row1.z) / d;\n\n\tif (src_u < 0.0 || src_u > 1.0 || src_v < 0.0 || src_v > 1.0) {\n\t\treturn vec4<f32>(0.0);\n\t}\n\n\tlet color = textureSampleLevel(tex, samp, vec2<f32>(src_u, src_v), 0.0);\n\treturn color;\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getCornerPinResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (!res) {\n\t\tconst pinUniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\t\tconst pinTextureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\t\tres = {\n\t\t\tpinPipeline: createFullscreenPipeline(device, {\n\t\t\t\tlabel: \"CornerPinPipeline\",\n\t\t\t\tmodule: device.createShaderModule({\n\t\t\t\t\tlabel: \"corner_pin.wgsl\",\n\t\t\t\t\tcode: cornerPinWgsl\n\t\t\t\t}),\n\t\t\t\tlayouts: [pinUniformLayout, pinTextureLayout],\n\t\t\t\tformat,\n\t\t\t\tblend: STRAIGHT_ALPHA_BLEND\n\t\t\t}),\n\t\t\tpinUniformLayout,\n\t\t\tpinTextureLayout\n\t\t};\n\t\tdeviceResourceCache.set(device, res);\n\t}\n\treturn res;\n}\nconst CornerPinWebGPURenderer = async (args) => {\n\tconst { ctx, props, targetTexture, targetWidth, targetHeight, encoder } = args;\n\tconst { virtualMedia } = props;\n\tconst op = virtualMedia?.operation;\n\tif (!op || op.op !== \"CornerPin\") return;\n\tconst childMedia = virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tconst sourceWidth = op.originalWidth ?? childMedia.metadata?.width ?? props.containerWidth ?? targetWidth;\n\tconst sourceHeight = op.originalHeight ?? childMedia.metadata?.height ?? props.containerHeight ?? targetHeight;\n\targs.pass.end();\n\tconst { texture: childTex } = await drawChildToTexture(args, childMedia, {\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tcontainerWidth: sourceWidth,\n\t\t\tcontainerHeight: sourceHeight,\n\t\t\tvirtualMedia: childMedia\n\t\t}\n\t});\n\tconst h = solveCornerPinHomography(op.points || []);\n\tconst uniformData = new Float32Array(12);\n\tuniformData[0] = h[0];\n\tuniformData[1] = h[1];\n\tuniformData[2] = h[2];\n\tuniformData[3] = 0;\n\tuniformData[4] = h[3];\n\tuniformData[5] = h[4];\n\tuniformData[6] = h[5];\n\tuniformData[7] = 0;\n\tuniformData[8] = h[6];\n\tuniformData[9] = h[7];\n\tuniformData[10] = h[8];\n\tuniformData[11] = 0;\n\tconst { pinPipeline: pipeline, pinUniformLayout: uLayout, pinTextureLayout: tLayout } = getCornerPinResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst uniformBindGroup = ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t});\n\tconst textureBindGroup = ctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, childTex, sampler);\n\tconst outTex = ctx.renderer.getTemporaryTexture(targetWidth, targetHeight, [\n\t\tchildTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [uniformBindGroup, textureBindGroup]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: CornerPinWebGPURenderer });\n\n//#endregion\nexport { getDefaultPoints as n, solveCornerPinHomography as r, renderers_default as t };\n//# sourceMappingURL=renderers-pM5Tx32P.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-VxVi_0c7.mjs","names":[],"sources":["../../../nodes/node-corner-pin/dist/renderers-pM5Tx32P.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, STRAIGHT_ALPHA_BLEND, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\nimport { solveHomography } from \"@framefields/node-sdk\";\n\n//#region src/shared/utils.ts\nfunction getDefaultPoints() {\n\treturn [\n\t\t{\n\t\t\tx: 0,\n\t\t\ty: 0\n\t\t},\n\t\t{\n\t\t\tx: 100,\n\t\t\ty: 0\n\t\t},\n\t\t{\n\t\t\tx: 0,\n\t\t\ty: 100\n\t\t},\n\t\t{\n\t\t\tx: 100,\n\t\t\ty: 100\n\t\t}\n\t];\n}\n/**\n* Homography mapping the corner-pin quad (percent coordinates, TL, TR, BL, BR)\n* to the unit square it samples from. Falls back to the identity quad.\n*/\nfunction solveCornerPinHomography(targetPoints) {\n\treturn solveHomography((targetPoints && targetPoints.length === 4 ? targetPoints : getDefaultPoints()).map((p) => ({\n\t\tx: p.x / 100,\n\t\ty: p.y / 100\n\t})));\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst cornerPinWgsl = `\nstruct CornerPinUniforms {\n\tmatrix_row0 : vec4<f32>,\n\tmatrix_row1 : vec4<f32>,\n\tmatrix_row2 : vec4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : CornerPinUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet x = in.uv.x;\n\tlet y = in.uv.y;\n\n\tlet d = u.matrix_row2.x * x + u.matrix_row2.y * y + u.matrix_row2.z;\n\tif (abs(d) < 1e-6) {\n\t\treturn vec4<f32>(0.0);\n\t}\n\n\tlet src_u = (u.matrix_row0.x * x + u.matrix_row0.y * y + u.matrix_row0.z) / d;\n\tlet src_v = (u.matrix_row1.x * x + u.matrix_row1.y * y + u.matrix_row1.z) / d;\n\n\tif (src_u < 0.0 || src_u > 1.0 || src_v < 0.0 || src_v > 1.0) {\n\t\treturn vec4<f32>(0.0);\n\t}\n\n\tlet color = textureSampleLevel(tex, samp, vec2<f32>(src_u, src_v), 0.0);\n\treturn color;\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getCornerPinResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (!res) {\n\t\tconst pinUniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\t\tconst pinTextureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\t\tres = {\n\t\t\tpinPipeline: createFullscreenPipeline(device, {\n\t\t\t\tlabel: \"CornerPinPipeline\",\n\t\t\t\tmodule: device.createShaderModule({\n\t\t\t\t\tlabel: \"corner_pin.wgsl\",\n\t\t\t\t\tcode: cornerPinWgsl\n\t\t\t\t}),\n\t\t\t\tlayouts: [pinUniformLayout, pinTextureLayout],\n\t\t\t\tformat,\n\t\t\t\tblend: STRAIGHT_ALPHA_BLEND\n\t\t\t}),\n\t\t\tpinUniformLayout,\n\t\t\tpinTextureLayout\n\t\t};\n\t\tdeviceResourceCache.set(device, res);\n\t}\n\treturn res;\n}\nconst CornerPinWebGPURenderer = async (args) => {\n\tconst { ctx, props, targetTexture, targetWidth, targetHeight, encoder } = args;\n\tconst { virtualMedia } = props;\n\tconst op = virtualMedia?.operation;\n\tif (!op || op.op !== \"CornerPin\") return;\n\tconst childMedia = virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tconst sourceWidth = op.originalWidth ?? childMedia.metadata?.width ?? props.containerWidth ?? targetWidth;\n\tconst sourceHeight = op.originalHeight ?? childMedia.metadata?.height ?? props.containerHeight ?? targetHeight;\n\targs.pass.end();\n\tconst { texture: childTex } = await drawChildToTexture(args, childMedia, {\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tcontainerWidth: sourceWidth,\n\t\t\tcontainerHeight: sourceHeight,\n\t\t\tvirtualMedia: childMedia\n\t\t}\n\t});\n\tconst h = solveCornerPinHomography(op.points || []);\n\tconst uniformData = new Float32Array(12);\n\tuniformData[0] = h[0];\n\tuniformData[1] = h[1];\n\tuniformData[2] = h[2];\n\tuniformData[3] = 0;\n\tuniformData[4] = h[3];\n\tuniformData[5] = h[4];\n\tuniformData[6] = h[5];\n\tuniformData[7] = 0;\n\tuniformData[8] = h[6];\n\tuniformData[9] = h[7];\n\tuniformData[10] = h[8];\n\tuniformData[11] = 0;\n\tconst { pinPipeline: pipeline, pinUniformLayout: uLayout, pinTextureLayout: tLayout } = getCornerPinResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst uniformBindGroup = ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t});\n\tconst textureBindGroup = ctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, childTex, sampler);\n\tconst outTex = ctx.renderer.getTemporaryTexture(targetWidth, targetHeight, [\n\t\tchildTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [uniformBindGroup, textureBindGroup]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: CornerPinWebGPURenderer });\n\n//#endregion\nexport { getDefaultPoints as n, solveCornerPinHomography as r, renderers_default as t };\n//# sourceMappingURL=renderers-pM5Tx32P.mjs.map"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import "./chunk-GBe2k3y8.mjs";
2
- import "./dist-hmWTJPik.mjs";
3
- import { n as renderers_default, t as GradientMapWebGPURenderer } from "./renderer-OsA-Lg4d.mjs";
1
+ import "./chunk-D7gtBK74.mjs";
2
+ import "./dist-DBWkkSvJ.mjs";
3
+ import { n as renderers_default, t as GradientMapWebGPURenderer } from "./renderer-Bmj7AyJP.mjs";
4
4
 
5
5
  export { GradientMapWebGPURenderer, renderers_default as default };
@@ -1,7 +1,7 @@
1
- import "./chunk-GBe2k3y8.mjs";
2
- import { n as defineRenderer } from "./renderer-BSitV56h.mjs";
3
- import "./dist-hmWTJPik.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-CHIgM_YH.mjs";
1
+ import "./chunk-D7gtBK74.mjs";
2
+ import { n as defineRenderer } from "./renderer-C9r0-KY4.mjs";
3
+ import "./dist-DBWkkSvJ.mjs";
4
+ import { c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-Dq_uI_00.mjs";
5
5
 
6
6
  //#region ../../nodes/node-pixelate/dist/renderers-lrLhGRcA.mjs
7
7
  const OP = "Pixelate";
@@ -201,4 +201,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: PixelateWebGPURenderer
201
201
 
202
202
  //#endregion
203
203
  export { PixelateWebGPURenderer, renderers_default as default };
204
- //# sourceMappingURL=renderer-BHLYKy8b.mjs.map
204
+ //# sourceMappingURL=renderer-Z39F9QK5.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-BHLYKy8b.mjs","names":[],"sources":["../../../nodes/node-pixelate/dist/renderers-lrLhGRcA.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 = \"Pixelate\";\nconst UNIFORM_FLOATS = 8;\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>, 2> };\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 size = u.v[1].x;\n\tlet shape = u32(u.v[1].y + 0.5);\n\tlet gap = u.v[1].z;\n\n\tlet R = res();\n\tlet cell = max(size, 1.0);\n\tlet p = in.uv * R;\n\tlet c0 = floor(p / cell) * cell + cell * 0.5;\n\tlet col = texelS(c0);\n\tlet f = (p - c0) / cell;\n\tlet g = 1.0 - gap;\n\tlet e = 1.0 / cell;\n\tvar m = 1.0;\n\tif (shape == 1u) {\n\t\tm = 1.0 - smoothstep(0.5 * g - e, 0.5 * g, length(f));\n\t} else if (shape == 2u) {\n\t\tm = 1.0 - smoothstep(0.5 * g - e, 0.5 * g, abs(f.x) + abs(f.y));\n\t} else if (gap > 0.0) {\n\t\tm = 1.0 - smoothstep(0.5 * g - e, 0.5 * g, max(abs(f.x), abs(f.y)));\n\t}\n\treturn premul(vec4<f32>(col.rgb, col.a * m));\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/** Packs the effect's resolved props into the uniform block the shaders read. */\nfunction pack(raw, data, time, frame) {\n\tdata.fill(0);\n\tdata[0] = time;\n\tdata[1] = frame;\n\tdata[4] = num(raw.size, 12);\n\tdata[5] = Math.max(0, [\n\t\t\"square\",\n\t\t\"circle\",\n\t\t\"diamond\"\n\t].indexOf(String(raw.shape ?? \"square\")));\n\tdata[6] = num(raw.gap, 0);\n}\nconst PixelateWebGPURenderer = 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: PixelateWebGPURenderer });\n\n//#endregion\nexport { PixelateWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-lrLhGRcA.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-Z39F9QK5.mjs","names":[],"sources":["../../../nodes/node-pixelate/dist/renderers-lrLhGRcA.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 = \"Pixelate\";\nconst UNIFORM_FLOATS = 8;\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>, 2> };\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 size = u.v[1].x;\n\tlet shape = u32(u.v[1].y + 0.5);\n\tlet gap = u.v[1].z;\n\n\tlet R = res();\n\tlet cell = max(size, 1.0);\n\tlet p = in.uv * R;\n\tlet c0 = floor(p / cell) * cell + cell * 0.5;\n\tlet col = texelS(c0);\n\tlet f = (p - c0) / cell;\n\tlet g = 1.0 - gap;\n\tlet e = 1.0 / cell;\n\tvar m = 1.0;\n\tif (shape == 1u) {\n\t\tm = 1.0 - smoothstep(0.5 * g - e, 0.5 * g, length(f));\n\t} else if (shape == 2u) {\n\t\tm = 1.0 - smoothstep(0.5 * g - e, 0.5 * g, abs(f.x) + abs(f.y));\n\t} else if (gap > 0.0) {\n\t\tm = 1.0 - smoothstep(0.5 * g - e, 0.5 * g, max(abs(f.x), abs(f.y)));\n\t}\n\treturn premul(vec4<f32>(col.rgb, col.a * m));\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/** Packs the effect's resolved props into the uniform block the shaders read. */\nfunction pack(raw, data, time, frame) {\n\tdata.fill(0);\n\tdata[0] = time;\n\tdata[1] = frame;\n\tdata[4] = num(raw.size, 12);\n\tdata[5] = Math.max(0, [\n\t\t\"square\",\n\t\t\"circle\",\n\t\t\"diamond\"\n\t].indexOf(String(raw.shape ?? \"square\")));\n\tdata[6] = num(raw.gap, 0);\n}\nconst PixelateWebGPURenderer = 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: PixelateWebGPURenderer });\n\n//#endregion\nexport { PixelateWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-lrLhGRcA.mjs.map"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { l as unwrapFrameParam, n as defineRenderer } from "./renderer-BSitV56h.mjs";
2
- import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CHIgM_YH.mjs";
1
+ import { l as unwrapFrameParam, n as defineRenderer } from "./renderer-C9r0-KY4.mjs";
2
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-Dq_uI_00.mjs";
3
3
 
4
4
  //#region ../../nodes/node-vignette/dist/renderers-B_pue82_.mjs
5
5
  const VIGNETTE_SHADER = `
@@ -271,4 +271,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: VignetteWebGPURenderer
271
271
 
272
272
  //#endregion
273
273
  export { renderers_default as t };
274
- //# sourceMappingURL=renderer-DSbRWfgl.mjs.map
274
+ //# sourceMappingURL=renderer-ZjSP5jw6.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-DSbRWfgl.mjs","names":[],"sources":["../../../nodes/node-vignette/dist/renderers-B_pue82_.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst VIGNETTE_SHADER = `\nstruct VignetteUniforms {\n strength : f32,\n radius : f32,\n softness : f32,\n roundness : f32,\n\n centerX : f32,\n centerY : f32,\n hasStrengthSig : f32,\n hasRadiusSig : f32,\n\n hasSoftnessSig : f32,\n hasRoundnessSig: f32,\n hasCenterXSig : f32,\n hasCenterYSig : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : VignetteUniforms;\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 strengthSigTex : texture_2d<f32>;\n@group(2) @binding(1) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(2) var softnessSigTex : texture_2d<f32>;\n@group(2) @binding(3) var roundnessSigTex : texture_2d<f32>;\n@group(2) @binding(4) var centerXSigTex : texture_2d<f32>;\n@group(2) @binding(5) var centerYSigTex : texture_2d<f32>;\n@group(2) @binding(6) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n let color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\n if (color.a < 1e-5) {\n return color;\n }\n\n // Resolve parameter overrides or dynamic signals\n var strength = u.strength;\n if (u.hasStrengthSig > 0.5) {\n strength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\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\n var softness = u.softness;\n if (u.hasSoftnessSig > 0.5) {\n softness = textureSampleLevel(softnessSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var roundness = u.roundness;\n if (u.hasRoundnessSig > 0.5) {\n roundness = textureSampleLevel(roundnessSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\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\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\n let center = vec2<f32>(centerX, centerY);\n let dimensions = vec2<f32>(textureDimensions(tex));\n let aspect = dimensions.x / dimensions.y;\n let uvOffset = in.uv - center;\n\n // Calculate aspect ratio corrected coordinate for circle\n let correctedOffset = vec2<f32>(\n uvOffset.x * mix(1.0, aspect, roundness),\n uvOffset.y\n );\n let dist = length(correctedOffset);\n\n // Calculate vignette edge falloff\n let edge0 = radius;\n let edge1 = max(0.0, radius - softness);\n let vignetteFactor = smoothstep(edge0, edge1, dist);\n\n // Blend based on strength\n let intensity = strength / 100.0;\n let finalVignette = mix(1.0, vignetteFactor, intensity);\n\n // Unpremultiply, apply vignette, and repremultiply\n let unpremult_rgb = color.rgb / color.a;\n let final_rgb = unpremult_rgb * finalVignette;\n\n return vec4<f32>(clamp(final_rgb, vec3<f32>(0.0), vec3<f32>(1.0)) * color.a, color.a);\n}\n`;\nconst vignetteUniformData = new Float32Array(12);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 6),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getVignetteResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `vignette_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst vignetteModule = device.createShaderModule({\n\t\t\tlabel: `vignette_${format}.wgsl`,\n\t\t\tcode: VIGNETTE_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `VignettePipeline_${format}`,\n\t\t\tmodule: vignetteModule,\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\tvignettePipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst VignetteWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Vignette\" || !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] : \"vignette_node\";\n\tconst resolveBindable = (configKey, defaultValue, 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 = defaultValue;\n\t\tlet hasStaticSig = false;\n\t\tlet gpuTextureView;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") val = Math.max(minVal, Math.min(maxVal, Number(input.outputItem.data ?? defaultValue)));\n\t\telse {\n\t\t\tconst unwrapped = unwrapFrameParam(op[configKey], compositionFrame, fps);\n\t\t\tif (unwrapped.gpuTextureView) {\n\t\t\t\tgpuTextureView = unwrapped.gpuTextureView;\n\t\t\t\thasStaticSig = true;\n\t\t\t}\n\t\t\tconst rawVal = unwrapped.value;\n\t\t\tconst numVal = Number(rawVal ?? defaultValue);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, isNaN(numVal) ? defaultValue : numVal));\n\t\t}\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\tgpuTextureView\n\t\t};\n\t};\n\tconst strengthRes = resolveBindable(\"strength\", 50, 0, 100);\n\tconst radiusRes = resolveBindable(\"radius\", 1, .1, 2);\n\tconst softnessRes = resolveBindable(\"softness\", .5, 0, 1);\n\tconst roundnessRes = resolveBindable(\"roundness\", .5, 0, 1);\n\tconst centerXRes = resolveBindable(\"centerX\", .5, 0, 1);\n\tconst centerYRes = resolveBindable(\"centerY\", .5, 0, 1);\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\targs.pass.end();\n\tconst { vignettePipeline: pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getVignetteResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst signalContext = {\n\t\targs,\n\t\twidth,\n\t\theight,\n\t\tframe,\n\t\tfps,\n\t\telapsedSeconds,\n\t\tdurationSeconds\n\t};\n\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\tconst strengthView = getSignalView(strengthRes, \"strength_sig\");\n\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\tconst softnessView = getSignalView(softnessRes, \"softness_sig\");\n\tconst roundnessView = getSignalView(roundnessRes, \"roundness_sig\");\n\tconst centerXView = getSignalView(centerXRes, \"centerX_sig\");\n\tconst centerYView = getSignalView(centerYRes, \"centerY_sig\");\n\tvignetteUniformData[0] = strengthRes.val;\n\tvignetteUniformData[1] = radiusRes.val;\n\tvignetteUniformData[2] = softnessRes.val;\n\tvignetteUniformData[3] = roundnessRes.val;\n\tvignetteUniformData[4] = centerXRes.val;\n\tvignetteUniformData[5] = centerYRes.val;\n\tvignetteUniformData[6] = strengthRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[7] = radiusRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[8] = softnessRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[9] = roundnessRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[10] = centerXRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[11] = centerYRes.hasStaticSig ? 1 : 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(vignetteUniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uniformBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: strengthView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: radiusView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: softnessView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: roundnessView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: centerXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: centerYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\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: VignetteWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-B_pue82_.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-ZjSP5jw6.mjs","names":[],"sources":["../../../nodes/node-vignette/dist/renderers-B_pue82_.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst VIGNETTE_SHADER = `\nstruct VignetteUniforms {\n strength : f32,\n radius : f32,\n softness : f32,\n roundness : f32,\n\n centerX : f32,\n centerY : f32,\n hasStrengthSig : f32,\n hasRadiusSig : f32,\n\n hasSoftnessSig : f32,\n hasRoundnessSig: f32,\n hasCenterXSig : f32,\n hasCenterYSig : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : VignetteUniforms;\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 strengthSigTex : texture_2d<f32>;\n@group(2) @binding(1) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(2) var softnessSigTex : texture_2d<f32>;\n@group(2) @binding(3) var roundnessSigTex : texture_2d<f32>;\n@group(2) @binding(4) var centerXSigTex : texture_2d<f32>;\n@group(2) @binding(5) var centerYSigTex : texture_2d<f32>;\n@group(2) @binding(6) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n let color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\n if (color.a < 1e-5) {\n return color;\n }\n\n // Resolve parameter overrides or dynamic signals\n var strength = u.strength;\n if (u.hasStrengthSig > 0.5) {\n strength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\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\n var softness = u.softness;\n if (u.hasSoftnessSig > 0.5) {\n softness = textureSampleLevel(softnessSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var roundness = u.roundness;\n if (u.hasRoundnessSig > 0.5) {\n roundness = textureSampleLevel(roundnessSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\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\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\n let center = vec2<f32>(centerX, centerY);\n let dimensions = vec2<f32>(textureDimensions(tex));\n let aspect = dimensions.x / dimensions.y;\n let uvOffset = in.uv - center;\n\n // Calculate aspect ratio corrected coordinate for circle\n let correctedOffset = vec2<f32>(\n uvOffset.x * mix(1.0, aspect, roundness),\n uvOffset.y\n );\n let dist = length(correctedOffset);\n\n // Calculate vignette edge falloff\n let edge0 = radius;\n let edge1 = max(0.0, radius - softness);\n let vignetteFactor = smoothstep(edge0, edge1, dist);\n\n // Blend based on strength\n let intensity = strength / 100.0;\n let finalVignette = mix(1.0, vignetteFactor, intensity);\n\n // Unpremultiply, apply vignette, and repremultiply\n let unpremult_rgb = color.rgb / color.a;\n let final_rgb = unpremult_rgb * finalVignette;\n\n return vec4<f32>(clamp(final_rgb, vec3<f32>(0.0), vec3<f32>(1.0)) * color.a, color.a);\n}\n`;\nconst vignetteUniformData = new Float32Array(12);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 6),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getVignetteResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `vignette_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst vignetteModule = device.createShaderModule({\n\t\t\tlabel: `vignette_${format}.wgsl`,\n\t\t\tcode: VIGNETTE_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `VignettePipeline_${format}`,\n\t\t\tmodule: vignetteModule,\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\tvignettePipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst VignetteWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Vignette\" || !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] : \"vignette_node\";\n\tconst resolveBindable = (configKey, defaultValue, 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 = defaultValue;\n\t\tlet hasStaticSig = false;\n\t\tlet gpuTextureView;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") val = Math.max(minVal, Math.min(maxVal, Number(input.outputItem.data ?? defaultValue)));\n\t\telse {\n\t\t\tconst unwrapped = unwrapFrameParam(op[configKey], compositionFrame, fps);\n\t\t\tif (unwrapped.gpuTextureView) {\n\t\t\t\tgpuTextureView = unwrapped.gpuTextureView;\n\t\t\t\thasStaticSig = true;\n\t\t\t}\n\t\t\tconst rawVal = unwrapped.value;\n\t\t\tconst numVal = Number(rawVal ?? defaultValue);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, isNaN(numVal) ? defaultValue : numVal));\n\t\t}\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\tgpuTextureView\n\t\t};\n\t};\n\tconst strengthRes = resolveBindable(\"strength\", 50, 0, 100);\n\tconst radiusRes = resolveBindable(\"radius\", 1, .1, 2);\n\tconst softnessRes = resolveBindable(\"softness\", .5, 0, 1);\n\tconst roundnessRes = resolveBindable(\"roundness\", .5, 0, 1);\n\tconst centerXRes = resolveBindable(\"centerX\", .5, 0, 1);\n\tconst centerYRes = resolveBindable(\"centerY\", .5, 0, 1);\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\targs.pass.end();\n\tconst { vignettePipeline: pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getVignetteResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst signalContext = {\n\t\targs,\n\t\twidth,\n\t\theight,\n\t\tframe,\n\t\tfps,\n\t\telapsedSeconds,\n\t\tdurationSeconds\n\t};\n\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\tconst strengthView = getSignalView(strengthRes, \"strength_sig\");\n\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\tconst softnessView = getSignalView(softnessRes, \"softness_sig\");\n\tconst roundnessView = getSignalView(roundnessRes, \"roundness_sig\");\n\tconst centerXView = getSignalView(centerXRes, \"centerX_sig\");\n\tconst centerYView = getSignalView(centerYRes, \"centerY_sig\");\n\tvignetteUniformData[0] = strengthRes.val;\n\tvignetteUniformData[1] = radiusRes.val;\n\tvignetteUniformData[2] = softnessRes.val;\n\tvignetteUniformData[3] = roundnessRes.val;\n\tvignetteUniformData[4] = centerXRes.val;\n\tvignetteUniformData[5] = centerYRes.val;\n\tvignetteUniformData[6] = strengthRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[7] = radiusRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[8] = softnessRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[9] = roundnessRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[10] = centerXRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[11] = centerYRes.hasStaticSig ? 1 : 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(vignetteUniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uniformBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: strengthView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: radiusView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: softnessView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: roundnessView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: centerXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: centerYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\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: VignetteWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-B_pue82_.mjs.map"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { l as unwrapFrameParam, n as defineRenderer } from "./renderer-BSitV56h.mjs";
2
- import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CHIgM_YH.mjs";
1
+ import { l as unwrapFrameParam, n as defineRenderer } from "./renderer-C9r0-KY4.mjs";
2
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-Dq_uI_00.mjs";
3
3
 
4
4
  //#region ../../nodes/node-tile-offset/dist/renderers-DQJJPfSd.mjs
5
5
  const TILE_OFFSET_SHADER = `
@@ -206,4 +206,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: TileOffsetWebGPURendere
206
206
 
207
207
  //#endregion
208
208
  export { renderers_default as t };
209
- //# sourceMappingURL=renderer-CE83KHgr.mjs.map
209
+ //# sourceMappingURL=renderer-fH9SCJC2.mjs.map