framefields 2.9.0 → 2.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/NOTICE.md +14 -0
  2. package/README.md +1 -5
  3. package/dist/audio/index.d.mts +5 -4
  4. package/dist/audio/index.mjs +13 -13
  5. package/dist/{audio-BfQg37MW.mjs → audio-B6RmYOPe.mjs} +4 -4
  6. package/dist/{audio-BfQg37MW.mjs.map → audio-B6RmYOPe.mjs.map} +1 -1
  7. package/dist/{audio-a0MFkK6J.mjs → audio-BlDbnteH.mjs} +1 -1
  8. package/dist/{audio-a0MFkK6J.mjs.map → audio-BlDbnteH.mjs.map} +1 -1
  9. package/dist/{audio-Ccpl9mjV.d.mts → audio-D6tBMbHh.d.mts} +4 -3
  10. package/dist/audio-D6tBMbHh.d.mts.map +1 -0
  11. package/dist/{check-result-C3jlgV2i.mjs → check-result-Bj7g62ka.mjs} +1 -1
  12. package/dist/{check-result-C3jlgV2i.mjs.map → check-result-Bj7g62ka.mjs.map} +1 -1
  13. package/dist/cli/check-worker.mjs +50 -50
  14. package/dist/cli.mjs +1 -1
  15. package/dist/components/index.d.mts +14 -11
  16. package/dist/components/index.mjs +47 -47
  17. package/dist/dist-BlulwErl.mjs +3 -0
  18. package/dist/{dist-BlIrsfcn.mjs → dist-ByxHoMQI.mjs} +1 -1
  19. package/dist/{dist-BlIrsfcn.mjs.map → dist-ByxHoMQI.mjs.map} +1 -1
  20. package/dist/{dist-Buaaj-Ul.mjs → dist-Cn8bDsQF.mjs} +1 -1
  21. package/dist/{dist-Buaaj-Ul.mjs.map → dist-Cn8bDsQF.mjs.map} +1 -1
  22. package/dist/{dist-C1cCW7Bt.mjs → dist-D12-a3-x.mjs} +3 -3
  23. package/dist/{dist-C1cCW7Bt.mjs.map → dist-D12-a3-x.mjs.map} +1 -1
  24. package/dist/{dist-C8Xq3zgx.mjs → dist-DEUU6sNe.mjs} +4 -4
  25. package/dist/{dist-C8Xq3zgx.mjs.map → dist-DEUU6sNe.mjs.map} +1 -1
  26. package/dist/{dist-DVMepKaO.mjs → dist-DL1GwJvs.mjs} +2 -2
  27. package/dist/{dist-DVMepKaO.mjs.map → dist-DL1GwJvs.mjs.map} +1 -1
  28. package/dist/dist-Dq5TkNDI.mjs +1434 -0
  29. package/dist/dist-Dq5TkNDI.mjs.map +1 -0
  30. package/dist/effects/index.d.mts +6 -4
  31. package/dist/effects/index.mjs +36 -36
  32. package/dist/{effects-CemgqEPv.mjs → effects-CViUoQSV.mjs} +3 -3
  33. package/dist/{effects-CemgqEPv.mjs.map → effects-CViUoQSV.mjs.map} +1 -1
  34. package/dist/fonts/index.d.mts +1 -1
  35. package/dist/fonts/index.mjs +3 -3
  36. package/dist/{fonts-BW0pPcvJ.mjs → fonts-B0U2KO5I.mjs} +2 -2
  37. package/dist/{fonts-BW0pPcvJ.mjs.map → fonts-B0U2KO5I.mjs.map} +1 -1
  38. package/dist/{gpu-CMaa63nz.mjs → gpu-zFNrvhV9.mjs} +2 -2
  39. package/dist/{gpu-CMaa63nz.mjs.map → gpu-zFNrvhV9.mjs.map} +1 -1
  40. package/dist/index-9_4X2ro1.d.mts +2402 -0
  41. package/dist/index-9_4X2ro1.d.mts.map +1 -0
  42. package/dist/{index-CZjrnylh.d.mts → index-B9Lm1x8i.d.mts} +662 -640
  43. package/dist/index-B9Lm1x8i.d.mts.map +1 -0
  44. package/dist/{index-BfDFmIBE.d.mts → index-BuYtrhzL.d.mts} +1 -1
  45. package/dist/{index-BfDFmIBE.d.mts.map → index-BuYtrhzL.d.mts.map} +1 -1
  46. package/dist/{index-D5UDyVMb.d.mts → index-Bzo1uj8h.d.mts} +4 -2401
  47. package/dist/index-Bzo1uj8h.d.mts.map +1 -0
  48. package/dist/{index-Du5YgdzM.d.mts → index-C6GcuYVA.d.mts} +6 -1151
  49. package/dist/index-C6GcuYVA.d.mts.map +1 -0
  50. package/dist/{index-BIjMAW1h.d.mts → index-CgGM31I9.d.mts} +2 -2
  51. package/dist/{index-BIjMAW1h.d.mts.map → index-CgGM31I9.d.mts.map} +1 -1
  52. package/dist/index-DBhswLMO.d.mts +330 -0
  53. package/dist/index-DBhswLMO.d.mts.map +1 -0
  54. package/dist/{index-CJL0JAU8.d.mts → index-V0ZQ4JN6.d.mts} +2 -2
  55. package/dist/{index-CJL0JAU8.d.mts.map → index-V0ZQ4JN6.d.mts.map} +1 -1
  56. package/dist/{index-7Z9_a_iB.d.mts → index-f4IF1vRH.d.mts} +3 -3
  57. package/dist/{index-7Z9_a_iB.d.mts.map → index-f4IF1vRH.d.mts.map} +1 -1
  58. package/dist/index-svAgwTY_.d.mts +1163 -0
  59. package/dist/index-svAgwTY_.d.mts.map +1 -0
  60. package/dist/{index-CFoAmh7q.d.mts → index-w28KUM9A.d.mts} +3 -3
  61. package/dist/{index-CFoAmh7q.d.mts.map → index-w28KUM9A.d.mts.map} +1 -1
  62. package/dist/index.d.mts +15 -12
  63. package/dist/index.mjs +58 -57
  64. package/dist/preview/index.d.mts +4 -3
  65. package/dist/preview/index.mjs +12 -12
  66. package/dist/{preview-BQVgn6Ho.mjs → preview-ZKJ_zTmd.mjs} +3 -3
  67. package/dist/{preview-BQVgn6Ho.mjs.map → preview-ZKJ_zTmd.mjs.map} +1 -1
  68. package/dist/preview-engine/{chunk-GEUUXTDL.mjs → chunk-D73ZKPFN.mjs} +4 -4
  69. package/dist/preview-engine/{chunk-UQKPDGEH.mjs → chunk-EJJITH6U.mjs} +1 -1
  70. package/dist/preview-engine/{chunk-374QY63R.mjs → chunk-Q62GPWGD.mjs} +23 -23
  71. package/dist/preview-engine/chunk-XYGDTPO7.mjs +39 -0
  72. package/dist/preview-engine/components.mjs +1 -1
  73. package/dist/preview-engine/effects.mjs +1 -1
  74. package/dist/preview-engine/framefields.mjs +1 -1
  75. package/dist/preview-engine/player.mjs +1 -1
  76. package/dist/preview-engine/{renderers-O55BEDQZ.mjs → renderers-MDHPQY6D.mjs} +1 -1
  77. package/dist/preview-engine/src-4IUYUKIZ.mjs +8 -0
  78. package/dist/{program-CKpKkllV.mjs → program-xjIwjKb6.mjs} +4 -4
  79. package/dist/{program-CKpKkllV.mjs.map → program-xjIwjKb6.mjs.map} +1 -1
  80. package/dist/renderer/index.d.mts +3 -2
  81. package/dist/renderer/index.mjs +3 -3
  82. package/dist/renderer-129U3pc9.mjs +5 -0
  83. package/dist/renderer-2phFTFxQ.mjs +5 -0
  84. package/dist/{renderer-Bfk6A7UO.mjs → renderer-5qJPGvVL.mjs} +5 -5
  85. package/dist/{renderer-Bfk6A7UO.mjs.map → renderer-5qJPGvVL.mjs.map} +1 -1
  86. package/dist/renderer-9muKpDeE.mjs +5 -0
  87. package/dist/{renderer-B522Dkdk.mjs → renderer-AUK_ZS3p.mjs} +4 -4
  88. package/dist/{renderer-B522Dkdk.mjs.map → renderer-AUK_ZS3p.mjs.map} +1 -1
  89. package/dist/{renderer-DKgPVOLL.d.mts → renderer-B-inTgyb.d.mts} +2 -2
  90. package/dist/{renderer-DKgPVOLL.d.mts.map → renderer-B-inTgyb.d.mts.map} +1 -1
  91. package/dist/{renderer-BF0hx_iJ.mjs → renderer-B3IRvukr.mjs} +5 -5
  92. package/dist/{renderer-BF0hx_iJ.mjs.map → renderer-B3IRvukr.mjs.map} +1 -1
  93. package/dist/renderer-B5Dhv6j9.mjs +5 -0
  94. package/dist/{renderer-DO-KbpYZ.mjs → renderer-B6TjJi1g.mjs} +5 -5
  95. package/dist/{renderer-DO-KbpYZ.mjs.map → renderer-B6TjJi1g.mjs.map} +1 -1
  96. package/dist/{renderer-D61B9bXF.mjs → renderer-B78W9uad.mjs} +4 -4
  97. package/dist/{renderer-D61B9bXF.mjs.map → renderer-B78W9uad.mjs.map} +1 -1
  98. package/dist/{renderer-BPWDsufX.mjs → renderer-B7kOF_Az.mjs} +3 -3
  99. package/dist/{renderer-BPWDsufX.mjs.map → renderer-B7kOF_Az.mjs.map} +1 -1
  100. package/dist/renderer-BBUgCS3C.mjs +5 -0
  101. package/dist/{renderer-C7eFJf0_.mjs → renderer-BG6bkKtY.mjs} +5 -5
  102. package/dist/{renderer-C7eFJf0_.mjs.map → renderer-BG6bkKtY.mjs.map} +1 -1
  103. package/dist/{renderer-B39I6CQw.mjs → renderer-BJKzZwyn.mjs} +4 -4
  104. package/dist/{renderer-B39I6CQw.mjs.map → renderer-BJKzZwyn.mjs.map} +1 -1
  105. package/dist/{renderer-DqvoMLca.mjs → renderer-BJQt0RiZ.mjs} +5 -5
  106. package/dist/{renderer-DqvoMLca.mjs.map → renderer-BJQt0RiZ.mjs.map} +1 -1
  107. package/dist/renderer-BKXM28Mx.mjs +5 -0
  108. package/dist/renderer-BKqm6xdf.mjs +5 -0
  109. package/dist/{renderer-DiY70S8S.mjs → renderer-BMP_lYMk.mjs} +4 -4
  110. package/dist/{renderer-DiY70S8S.mjs.map → renderer-BMP_lYMk.mjs.map} +1 -1
  111. package/dist/renderer-BMfMMf0R.mjs +5 -0
  112. package/dist/{renderer-DkRSZg5g.mjs → renderer-BNbMi9CI.mjs} +5 -5
  113. package/dist/{renderer-DkRSZg5g.mjs.map → renderer-BNbMi9CI.mjs.map} +1 -1
  114. package/dist/{renderer-D7Al3_-5.mjs → renderer-BPYIqtNg.mjs} +5 -5
  115. package/dist/{renderer-D7Al3_-5.mjs.map → renderer-BPYIqtNg.mjs.map} +1 -1
  116. package/dist/renderer-BPsjEnnl.mjs +5 -0
  117. package/dist/{renderer-DDEkFbVI.mjs → renderer-BQOeeXTr.mjs} +5 -5
  118. package/dist/{renderer-DDEkFbVI.mjs.map → renderer-BQOeeXTr.mjs.map} +1 -1
  119. package/dist/{renderer-GBmWjBvy.mjs → renderer-BRWjLiHX.mjs} +3 -3
  120. package/dist/{renderer-GBmWjBvy.mjs.map → renderer-BRWjLiHX.mjs.map} +1 -1
  121. package/dist/{renderer-_iMAO698.mjs → renderer-BVql26Ay.mjs} +2 -2
  122. package/dist/{renderer-_iMAO698.mjs.map → renderer-BVql26Ay.mjs.map} +1 -1
  123. package/dist/{renderer-CHr7MiYW.mjs → renderer-BWMzjSgf.mjs} +5 -5
  124. package/dist/{renderer-CHr7MiYW.mjs.map → renderer-BWMzjSgf.mjs.map} +1 -1
  125. package/dist/{renderer-pHWEHDnM.mjs → renderer-BYqrtBvd.mjs} +5 -5
  126. package/dist/{renderer-pHWEHDnM.mjs.map → renderer-BYqrtBvd.mjs.map} +1 -1
  127. package/dist/{renderer-CwFqqpWY.mjs → renderer-BZmmekE8.mjs} +4 -4
  128. package/dist/{renderer-CwFqqpWY.mjs.map → renderer-BZmmekE8.mjs.map} +1 -1
  129. package/dist/{renderer-D47AEJE_.mjs → renderer-BcO7LUla.mjs} +3 -3
  130. package/dist/{renderer-D47AEJE_.mjs.map → renderer-BcO7LUla.mjs.map} +1 -1
  131. package/dist/{renderer-BlvGcyAN.mjs → renderer-BdbI_u9w.mjs} +3 -3
  132. package/dist/{renderer-BlvGcyAN.mjs.map → renderer-BdbI_u9w.mjs.map} +1 -1
  133. package/dist/{renderer-DsEyjwfT.mjs → renderer-Be5hfwSd.mjs} +74 -74
  134. package/dist/{renderer-DsEyjwfT.mjs.map → renderer-Be5hfwSd.mjs.map} +1 -1
  135. package/dist/{renderer-BAYTI6jj.mjs → renderer-BfbSvElt.mjs} +4 -4
  136. package/dist/{renderer-BAYTI6jj.mjs.map → renderer-BfbSvElt.mjs.map} +1 -1
  137. package/dist/{renderer-BpIF1QIE.mjs → renderer-BgDLCCuq.mjs} +5 -5
  138. package/dist/{renderer-BpIF1QIE.mjs.map → renderer-BgDLCCuq.mjs.map} +1 -1
  139. package/dist/renderer-Bofr6f88.mjs +6 -0
  140. package/dist/renderer-BqoGcujR.mjs +5 -0
  141. package/dist/renderer-BvuBt2aH.mjs +5 -0
  142. package/dist/renderer-BxTgXHu1.mjs +5 -0
  143. package/dist/renderer-Bz2Rrz60.mjs +5 -0
  144. package/dist/{renderer-g_vrrAQU.mjs → renderer-C06U4c9k.mjs} +3 -3
  145. package/dist/{renderer-g_vrrAQU.mjs.map → renderer-C06U4c9k.mjs.map} +1 -1
  146. package/dist/{renderer-D7r6onRT.mjs → renderer-C3Iev6zu.mjs} +4 -4
  147. package/dist/{renderer-D7r6onRT.mjs.map → renderer-C3Iev6zu.mjs.map} +1 -1
  148. package/dist/{renderer-CpUJBOfb.mjs → renderer-C3tVrzyT.mjs} +3 -3
  149. package/dist/{renderer-SWr3vbrV.mjs → renderer-C4yKI8MT.mjs} +3 -3
  150. package/dist/{renderer-SWr3vbrV.mjs.map → renderer-C4yKI8MT.mjs.map} +1 -1
  151. package/dist/{renderer-Xv6GfNUI.mjs → renderer-C6st34I6.mjs} +3 -3
  152. package/dist/{renderer-Xv6GfNUI.mjs.map → renderer-C6st34I6.mjs.map} +1 -1
  153. package/dist/{renderer-sCovEubT.mjs → renderer-C7MAqpIS.mjs} +4 -4
  154. package/dist/{renderer-sCovEubT.mjs.map → renderer-C7MAqpIS.mjs.map} +1 -1
  155. package/dist/renderer-CBjG8rjE.mjs +5 -0
  156. package/dist/{renderer-BAusZ6Vu.mjs → renderer-CCFHnafT.mjs} +4 -4
  157. package/dist/{renderer-BAusZ6Vu.mjs.map → renderer-CCFHnafT.mjs.map} +1 -1
  158. package/dist/{renderer-DVCJjVn7.mjs → renderer-CDVb4OfJ.mjs} +5 -5
  159. package/dist/{renderer-DVCJjVn7.mjs.map → renderer-CDVb4OfJ.mjs.map} +1 -1
  160. package/dist/{renderer-DpruWmZU.mjs → renderer-CEfVvcw-.mjs} +4 -4
  161. package/dist/{renderer-DpruWmZU.mjs.map → renderer-CEfVvcw-.mjs.map} +1 -1
  162. package/dist/{renderer-DbRZe0Re.mjs → renderer-CIB5L_C4.mjs} +5 -5
  163. package/dist/{renderer-DbRZe0Re.mjs.map → renderer-CIB5L_C4.mjs.map} +1 -1
  164. package/dist/{renderer-ktWXVYka.mjs → renderer-CPTXJs0n.mjs} +6 -6
  165. package/dist/{renderer-ktWXVYka.mjs.map → renderer-CPTXJs0n.mjs.map} +1 -1
  166. package/dist/renderer-CS2zyPyZ.mjs +5 -0
  167. package/dist/{renderer-CcvvoKiZ.mjs → renderer-CUBDxuxh.mjs} +5 -5
  168. package/dist/{renderer-CcvvoKiZ.mjs.map → renderer-CUBDxuxh.mjs.map} +1 -1
  169. package/dist/renderer-CWLF6cAz.mjs +1008 -0
  170. package/dist/renderer-CWLF6cAz.mjs.map +1 -0
  171. package/dist/{renderer-EaLUCobW.mjs → renderer-CXLugAe8.mjs} +4 -4
  172. package/dist/{renderer-EaLUCobW.mjs.map → renderer-CXLugAe8.mjs.map} +1 -1
  173. package/dist/renderer-CXnbl_jR.mjs +5 -0
  174. package/dist/{renderer-C7L8Ceqr.mjs → renderer-CYX9vKZ-.mjs} +4 -4
  175. package/dist/{renderer-C7L8Ceqr.mjs.map → renderer-CYX9vKZ-.mjs.map} +1 -1
  176. package/dist/{renderer-8QIwXh7O.mjs → renderer-C_2UDMEG.mjs} +6 -6
  177. package/dist/{renderer-8QIwXh7O.mjs.map → renderer-C_2UDMEG.mjs.map} +1 -1
  178. package/dist/renderer-CaF9vod_.mjs +5 -0
  179. package/dist/renderer-CbSBH3lp.mjs +5 -0
  180. package/dist/{renderer-B2jjxsjO.mjs → renderer-CbhnJi_8.mjs} +4 -4
  181. package/dist/{renderer-B2jjxsjO.mjs.map → renderer-CbhnJi_8.mjs.map} +1 -1
  182. package/dist/{renderer-BdyopiLC.mjs → renderer-CcJyD9Q5.mjs} +4 -4
  183. package/dist/{renderer-BdyopiLC.mjs.map → renderer-CcJyD9Q5.mjs.map} +1 -1
  184. package/dist/renderer-CdjuGRbO.mjs +5 -0
  185. package/dist/{renderer-DF-yvIrV.mjs → renderer-Cl8r1LJe.mjs} +4 -4
  186. package/dist/{renderer-DF-yvIrV.mjs.map → renderer-Cl8r1LJe.mjs.map} +1 -1
  187. package/dist/renderer-CoLbxC13.mjs +5 -0
  188. package/dist/{renderer-BgO6BA_z.mjs → renderer-CpedZNEG.mjs} +3 -3
  189. package/dist/{renderer-BgO6BA_z.mjs.map → renderer-CpedZNEG.mjs.map} +1 -1
  190. package/dist/renderer-Cr9G0dXB.mjs +5 -0
  191. package/dist/{renderer-bAKUeHF3.mjs → renderer-CwVbHki6.mjs} +5 -5
  192. package/dist/{renderer-bAKUeHF3.mjs.map → renderer-CwVbHki6.mjs.map} +1 -1
  193. package/dist/{renderer-DTqDy2m9.mjs → renderer-CyCtm0UV.mjs} +3 -3
  194. package/dist/{renderer-DTqDy2m9.mjs.map → renderer-CyCtm0UV.mjs.map} +1 -1
  195. package/dist/{renderer-CYC32bDW.mjs → renderer-D1VsqFf4.mjs} +5 -5
  196. package/dist/{renderer-CYC32bDW.mjs.map → renderer-D1VsqFf4.mjs.map} +1 -1
  197. package/dist/{renderer-CCycwCEB.mjs → renderer-D2TTDcgh.mjs} +3 -3
  198. package/dist/{renderer-CCycwCEB.mjs.map → renderer-D2TTDcgh.mjs.map} +1 -1
  199. package/dist/renderer-D63l6_UC.mjs +5 -0
  200. package/dist/renderer-DCJqnzER.mjs +5 -0
  201. package/dist/{renderer-cod5Ona9.mjs → renderer-DEQeONTd.mjs} +3 -3
  202. package/dist/renderer-DFBOR5J3.mjs +5 -0
  203. package/dist/renderer-DGAZSzw6.mjs +5 -0
  204. package/dist/{renderer-oKRF4A0M.mjs → renderer-DH7l5WFr.mjs} +4 -4
  205. package/dist/{renderer-oKRF4A0M.mjs.map → renderer-DH7l5WFr.mjs.map} +1 -1
  206. package/dist/{renderer-DNQvOrkY.mjs → renderer-DIEmK57T.mjs} +5 -5
  207. package/dist/{renderer-DNQvOrkY.mjs.map → renderer-DIEmK57T.mjs.map} +1 -1
  208. package/dist/{renderer-DEmYyaqj.mjs → renderer-DIqkhsLI.mjs} +4 -4
  209. package/dist/{renderer-DEmYyaqj.mjs.map → renderer-DIqkhsLI.mjs.map} +1 -1
  210. package/dist/{renderer-DX41niRU.mjs → renderer-DOKHd37M.mjs} +4 -4
  211. package/dist/{renderer-DX41niRU.mjs.map → renderer-DOKHd37M.mjs.map} +1 -1
  212. package/dist/renderer-DPLGk1Qk.mjs +5 -0
  213. package/dist/renderer-DTCUzByS.mjs +5 -0
  214. package/dist/{renderer-BXJXziIt.mjs → renderer-DW7hbluw.mjs} +3 -3
  215. package/dist/{renderer-BXJXziIt.mjs.map → renderer-DW7hbluw.mjs.map} +1 -1
  216. package/dist/{renderer--fkmiVjl.mjs → renderer-Dat8opUZ.mjs} +4 -4
  217. package/dist/{renderer--fkmiVjl.mjs.map → renderer-Dat8opUZ.mjs.map} +1 -1
  218. package/dist/renderer-DdGahYi1.mjs +5 -0
  219. package/dist/{renderer-DmkWrWAk.mjs → renderer-Dee8ksIV.mjs} +3 -3
  220. package/dist/{renderer-DmkWrWAk.mjs.map → renderer-Dee8ksIV.mjs.map} +1 -1
  221. package/dist/renderer-DhL4nNPk.mjs +5 -0
  222. package/dist/renderer-DkyTbiVz.mjs +3 -0
  223. package/dist/renderer-DnAZweRX.mjs +5 -0
  224. package/dist/{renderer-BX7jS14r.d.mts → renderer-DoPEPlbG.d.mts} +3 -2
  225. package/dist/{renderer-BX7jS14r.d.mts.map → renderer-DoPEPlbG.d.mts.map} +1 -1
  226. package/dist/renderer-DpisVnT2.mjs +5 -0
  227. package/dist/{renderer-mNSyac1V.mjs → renderer-DrWeb39d.mjs} +1 -1
  228. package/dist/{renderer-mNSyac1V.mjs.map → renderer-DrWeb39d.mjs.map} +1 -1
  229. package/dist/renderer-Ds7pAKnE.mjs +3 -0
  230. package/dist/{renderer-CiQhD8Gg.mjs → renderer-Dss7T71q.mjs} +5 -5
  231. package/dist/{renderer-CiQhD8Gg.mjs.map → renderer-Dss7T71q.mjs.map} +1 -1
  232. package/dist/{renderer-C41U1tK6.mjs → renderer-Du-GnKLb.mjs} +9 -9
  233. package/dist/{renderer-C41U1tK6.mjs.map → renderer-Du-GnKLb.mjs.map} +1 -1
  234. package/dist/renderer-DxZD5B54.mjs +5 -0
  235. package/dist/{renderer-WCZu2Rf5.mjs → renderer-ESkPj6pk.mjs} +4 -4
  236. package/dist/{renderer-WCZu2Rf5.mjs.map → renderer-ESkPj6pk.mjs.map} +1 -1
  237. package/dist/{renderer-DMvmf3T2.mjs → renderer-F1D9ZJ8I.mjs} +3 -3
  238. package/dist/{renderer-BlPqTEii.mjs → renderer-HnSiwSW8.mjs} +4 -4
  239. package/dist/{renderer-BlPqTEii.mjs.map → renderer-HnSiwSW8.mjs.map} +1 -1
  240. package/dist/{renderer-1r-Uq-Ae.mjs → renderer-IQ97z2rw.mjs} +3 -3
  241. package/dist/{renderer-1r-Uq-Ae.mjs.map → renderer-IQ97z2rw.mjs.map} +1 -1
  242. package/dist/{renderer-DFzI3yI_.mjs → renderer-NTCk1Srf.mjs} +3 -3
  243. package/dist/{renderer-DFzI3yI_.mjs.map → renderer-NTCk1Srf.mjs.map} +1 -1
  244. package/dist/{renderer-D8bBHrWC.mjs → renderer-OsQRvOle.mjs} +5 -5
  245. package/dist/{renderer-D8bBHrWC.mjs.map → renderer-OsQRvOle.mjs.map} +1 -1
  246. package/dist/renderer-PMHOnbnA.mjs +5 -0
  247. package/dist/renderer-STufNpMx.mjs +5 -0
  248. package/dist/renderer-SdrgfCxH.mjs +5 -0
  249. package/dist/{renderer-Lth37j17.mjs → renderer-US4GsamT.mjs} +3 -3
  250. package/dist/{renderer-zXPVLRlD.mjs → renderer-VhkubIx_.mjs} +5 -5
  251. package/dist/{renderer-zXPVLRlD.mjs.map → renderer-VhkubIx_.mjs.map} +1 -1
  252. package/dist/{renderer-DIw3UtEU.mjs → renderer-bbaMOD4I.mjs} +5 -5
  253. package/dist/{renderer-DIw3UtEU.mjs.map → renderer-bbaMOD4I.mjs.map} +1 -1
  254. package/dist/{renderer-hSCfnvaK.mjs → renderer-eT7Gp7FS.mjs} +5 -5
  255. package/dist/{renderer-hSCfnvaK.mjs.map → renderer-eT7Gp7FS.mjs.map} +1 -1
  256. package/dist/{renderer-CQvmbRQ5.mjs → renderer-g7fF2AYk.mjs} +5 -5
  257. package/dist/{renderer-CQvmbRQ5.mjs.map → renderer-g7fF2AYk.mjs.map} +1 -1
  258. package/dist/{renderer-B-ur0Ej8.mjs → renderer-mLlgfM7X.mjs} +4 -4
  259. package/dist/{renderer-B-ur0Ej8.mjs.map → renderer-mLlgfM7X.mjs.map} +1 -1
  260. package/dist/{renderer-SSBL4M1o.mjs → renderer-mQt-y49D.mjs} +5 -5
  261. package/dist/{renderer-SSBL4M1o.mjs.map → renderer-mQt-y49D.mjs.map} +1 -1
  262. package/dist/{renderer-BIGFP1cF.mjs → renderer-q4zMFfnY.mjs} +2 -2
  263. package/dist/{renderer-BIGFP1cF.mjs.map → renderer-q4zMFfnY.mjs.map} +1 -1
  264. package/dist/{renderer-DXEWbnRF.mjs → renderer-sPI7aY6c.mjs} +4 -4
  265. package/dist/{renderer-DXEWbnRF.mjs.map → renderer-sPI7aY6c.mjs.map} +1 -1
  266. package/dist/{renderer-sYSkIUfo.mjs → renderer-xDV2cCkX.mjs} +5 -5
  267. package/dist/{renderer-sYSkIUfo.mjs.map → renderer-xDV2cCkX.mjs.map} +1 -1
  268. package/dist/{renderers-CP8CFWDs-DH2oktaC.mjs → renderers-CP8CFWDs-BH1gUTYa.mjs} +4 -4
  269. package/dist/{renderers-CP8CFWDs-DH2oktaC.mjs.map → renderers-CP8CFWDs-BH1gUTYa.mjs.map} +1 -1
  270. package/dist/sam/index.d.mts +4 -0
  271. package/dist/sam/index.mjs +3 -0
  272. package/dist/signals/index.d.mts +7 -6
  273. package/dist/signals/index.mjs +8 -8
  274. package/dist/{signals-CXwgAUp-.mjs → signals-gOd0Ui9B.mjs} +4 -4
  275. package/dist/{signals-CXwgAUp-.mjs.map → signals-gOd0Ui9B.mjs.map} +1 -1
  276. package/dist/{src-CK5rGVbh.mjs → src-BU1VOWSk.mjs} +81 -39
  277. package/dist/src-BU1VOWSk.mjs.map +1 -0
  278. package/dist/{renderer-B0piZg9r.mjs → src-Bnr8DUC--DzkRGA62.mjs} +12 -993
  279. package/dist/src-Bnr8DUC--DzkRGA62.mjs.map +1 -0
  280. package/package.json +69 -69
  281. package/dist/audio-Ccpl9mjV.d.mts.map +0 -1
  282. package/dist/index-CZjrnylh.d.mts.map +0 -1
  283. package/dist/index-D5UDyVMb.d.mts.map +0 -1
  284. package/dist/index-Du5YgdzM.d.mts.map +0 -1
  285. package/dist/preview-engine/chunk-CCB3VTY2.mjs +0 -39
  286. package/dist/preview-engine/src-NGVAJYHC.mjs +0 -8
  287. package/dist/renderer--Ac-dg4A.mjs +0 -5
  288. package/dist/renderer--N7TMqzU.mjs +0 -5
  289. package/dist/renderer-2ecmdOae.mjs +0 -5
  290. package/dist/renderer-B0piZg9r.mjs.map +0 -1
  291. package/dist/renderer-B5RJp5g-.mjs +0 -5
  292. package/dist/renderer-B7xyT1Vb.mjs +0 -5
  293. package/dist/renderer-BBeArN_x.mjs +0 -5
  294. package/dist/renderer-BCAZDu-r.mjs +0 -5
  295. package/dist/renderer-BJnhik7Y.mjs +0 -5
  296. package/dist/renderer-BxRW8MZO.mjs +0 -5
  297. package/dist/renderer-C-lfsEAN.mjs +0 -5
  298. package/dist/renderer-C6nOFN4-.mjs +0 -5
  299. package/dist/renderer-C84TSQmS.mjs +0 -5
  300. package/dist/renderer-C8_6YofT.mjs +0 -5
  301. package/dist/renderer-COR66Sby.mjs +0 -3
  302. package/dist/renderer-COb3tOPG.mjs +0 -5
  303. package/dist/renderer-CSCIzaLy.mjs +0 -5
  304. package/dist/renderer-CmI4c8MS.mjs +0 -5
  305. package/dist/renderer-CqVltdX9.mjs +0 -5
  306. package/dist/renderer-D-FpMzLY.mjs +0 -5
  307. package/dist/renderer-D-Oyn9mG.mjs +0 -5
  308. package/dist/renderer-D2QrkA8_.mjs +0 -5
  309. package/dist/renderer-D64r4iN-.mjs +0 -5
  310. package/dist/renderer-DCq6YkgP.mjs +0 -5
  311. package/dist/renderer-DDHG3GdR.mjs +0 -5
  312. package/dist/renderer-DMdNfcud.mjs +0 -6
  313. package/dist/renderer-DZQXZ4lK.mjs +0 -5
  314. package/dist/renderer-DczJJLA1.mjs +0 -5
  315. package/dist/renderer-DfqJj9oe.mjs +0 -5
  316. package/dist/renderer-DgO9ihVJ.mjs +0 -5
  317. package/dist/renderer-DhgnQZYb.mjs +0 -5
  318. package/dist/renderer-DjxKjHMf.mjs +0 -5
  319. package/dist/renderer-DnRDW2Oz.mjs +0 -3
  320. package/dist/renderer-DqLA5cdR.mjs +0 -5
  321. package/dist/renderer-Dudp6ZlH.mjs +0 -5
  322. package/dist/renderer-_jC5KIT1.mjs +0 -5
  323. package/dist/renderer-cTgAuVmJ.mjs +0 -5
  324. package/dist/renderer-nVKDvDLO.mjs +0 -5
  325. package/dist/renderer-pZ6_pUo1.mjs +0 -5
  326. package/dist/src-CK5rGVbh.mjs.map +0 -1
  327. /package/dist/{chunk-BcJoO4Nm.mjs → chunk-D8S17ehY.mjs} +0 -0
  328. /package/dist/{renderer-COqFNSfV.mjs → renderer-Cputd36d.mjs} +0 -0
@@ -1,7 +1,7 @@
1
- import "./chunk-BcJoO4Nm.mjs";
2
- import { n as defineRenderer } from "./renderer-mNSyac1V.mjs";
3
- import "./dist-C1cCW7Bt.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-CMaa63nz.mjs";
1
+ import "./chunk-D8S17ehY.mjs";
2
+ import { n as defineRenderer } from "./renderer-DrWeb39d.mjs";
3
+ import "./dist-D12-a3-x.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-zFNrvhV9.mjs";
5
5
 
6
6
  //#region ../../nodes/node-kaleidoscope/dist/renderers-D5lECrP_.mjs
7
7
  const OP = "Kaleidoscope";
@@ -200,4 +200,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: KaleidoscopeWebGPURende
200
200
 
201
201
  //#endregion
202
202
  export { KaleidoscopeWebGPURenderer, renderers_default as default };
203
- //# sourceMappingURL=renderer-DkRSZg5g.mjs.map
203
+ //# sourceMappingURL=renderer-BNbMi9CI.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-DkRSZg5g.mjs","names":[],"sources":["../../../nodes/node-kaleidoscope/dist/renderers-D5lECrP_.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst OP = \"Kaleidoscope\";\nconst UNIFORM_FLOATS = 12;\n/** One fragment shader per pass; pass 0 reads the layer, later passes read the previous pass. */\nconst PASSES = [`struct U { v : array<vec4<f32>, 3> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet segments = u.v[1].x;\n\tlet rotation = u.v[1].y;\n\tlet centerX = u.v[1].z;\n\tlet centerY = u.v[1].w;\n\tlet zoom = u.v[2].x;\n\n\tlet R = res();\n\tlet aspect = R.x / R.y;\n\tlet center = vec2<f32>(centerX, centerY);\n\tvar p = in.uv - center;\n\tp.x *= aspect;\n\tlet rad = length(p) / zoom;\n\tlet rot = radians(rotation);\n\tlet seg = 6.2831853 / segments;\n\tvar a = atan2(p.y, p.x) - rot;\n\ta = a - seg * floor(a / seg);\n\ta = min(a, seg - a);\n\tvar q = vec2<f32>(cos(a + rot), sin(a + rot)) * rad;\n\tq.x /= aspect;\n\tlet uv = q + center;\n\tlet m = vec2<f32>(1.0) - abs(fract(uv * 0.5) * 2.0 - vec2<f32>(1.0));\n\treturn sampleP(m);\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/** Packs the effect's resolved props into the uniform block the shaders read. */\nfunction pack(raw, data, time, frame) {\n\tdata.fill(0);\n\tdata[0] = time;\n\tdata[1] = frame;\n\tdata[4] = num(raw.segments, 6);\n\tdata[5] = num(raw.rotation, 0);\n\tdata[6] = num(raw.centerX, .5);\n\tdata[7] = num(raw.centerY, .5);\n\tdata[8] = num(raw.zoom, 1);\n}\nconst KaleidoscopeWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== OP) return;\n\tconst child = props.virtualMedia?.children?.[0];\n\tif (!child) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst frame = Math.round(props.compositionFrame ?? props.frame ?? 0);\n\tconst raw = op.effect?.resolveUniforms ? op.effect.resolveUniforms({\n\t\tframe,\n\t\tfps,\n\t\ttime: frame / fps\n\t}) : op;\n\tconst data = new Float32Array(UNIFORM_FLOATS);\n\tpack(raw, data, frame / fps, frame);\n\tconst { texture: childTex } = await drawChildToTexture(args, child);\n\tconst device = ctx.device;\n\tconst r = resources(device);\n\tconst pipelines = pipelinesFor(device, ctx.renderer.format);\n\tconst ubo = ctx.renderer.getTemporaryBuffer(data);\n\tlet prev = childTex;\n\tfor (const pipeline of pipelines) {\n\t\tconst out = ctx.renderer.getTemporaryTexture(targetWidth, targetHeight, [\n\t\t\tchildTex,\n\t\t\tprev,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tdrawFullscreenPass(encoder, out.createView(), pipeline, [device.createBindGroup({\n\t\t\tlayout: r.layout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: ubo }\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: childTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: prev.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: r.sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})]);\n\t\tprev = out;\n\t}\n\tdrawTextureToTarget(args, prev);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: KaleidoscopeWebGPURenderer });\n\n//#endregion\nexport { KaleidoscopeWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-D5lECrP_.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-BNbMi9CI.mjs","names":[],"sources":["../../../nodes/node-kaleidoscope/dist/renderers-D5lECrP_.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst OP = \"Kaleidoscope\";\nconst UNIFORM_FLOATS = 12;\n/** One fragment shader per pass; pass 0 reads the layer, later passes read the previous pass. */\nconst PASSES = [`struct U { v : array<vec4<f32>, 3> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet segments = u.v[1].x;\n\tlet rotation = u.v[1].y;\n\tlet centerX = u.v[1].z;\n\tlet centerY = u.v[1].w;\n\tlet zoom = u.v[2].x;\n\n\tlet R = res();\n\tlet aspect = R.x / R.y;\n\tlet center = vec2<f32>(centerX, centerY);\n\tvar p = in.uv - center;\n\tp.x *= aspect;\n\tlet rad = length(p) / zoom;\n\tlet rot = radians(rotation);\n\tlet seg = 6.2831853 / segments;\n\tvar a = atan2(p.y, p.x) - rot;\n\ta = a - seg * floor(a / seg);\n\ta = min(a, seg - a);\n\tvar q = vec2<f32>(cos(a + rot), sin(a + rot)) * rad;\n\tq.x /= aspect;\n\tlet uv = q + center;\n\tlet m = vec2<f32>(1.0) - abs(fract(uv * 0.5) * 2.0 - vec2<f32>(1.0));\n\treturn sampleP(m);\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/** Packs the effect's resolved props into the uniform block the shaders read. */\nfunction pack(raw, data, time, frame) {\n\tdata.fill(0);\n\tdata[0] = time;\n\tdata[1] = frame;\n\tdata[4] = num(raw.segments, 6);\n\tdata[5] = num(raw.rotation, 0);\n\tdata[6] = num(raw.centerX, .5);\n\tdata[7] = num(raw.centerY, .5);\n\tdata[8] = num(raw.zoom, 1);\n}\nconst KaleidoscopeWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== OP) return;\n\tconst child = props.virtualMedia?.children?.[0];\n\tif (!child) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst frame = Math.round(props.compositionFrame ?? props.frame ?? 0);\n\tconst raw = op.effect?.resolveUniforms ? op.effect.resolveUniforms({\n\t\tframe,\n\t\tfps,\n\t\ttime: frame / fps\n\t}) : op;\n\tconst data = new Float32Array(UNIFORM_FLOATS);\n\tpack(raw, data, frame / fps, frame);\n\tconst { texture: childTex } = await drawChildToTexture(args, child);\n\tconst device = ctx.device;\n\tconst r = resources(device);\n\tconst pipelines = pipelinesFor(device, ctx.renderer.format);\n\tconst ubo = ctx.renderer.getTemporaryBuffer(data);\n\tlet prev = childTex;\n\tfor (const pipeline of pipelines) {\n\t\tconst out = ctx.renderer.getTemporaryTexture(targetWidth, targetHeight, [\n\t\t\tchildTex,\n\t\t\tprev,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tdrawFullscreenPass(encoder, out.createView(), pipeline, [device.createBindGroup({\n\t\t\tlayout: r.layout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: ubo }\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: childTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: prev.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: r.sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})]);\n\t\tprev = out;\n\t}\n\tdrawTextureToTarget(args, prev);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: KaleidoscopeWebGPURenderer });\n\n//#endregion\nexport { KaleidoscopeWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-D5lECrP_.mjs.map"],"mappings":";;;;;;AAIA,MAAM,KAAK;AACX,MAAM,iBAAiB;;AAEvB,MAAM,SAAS,CAAC;;;;;EAKd,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuErB;AACF,MAAM,YAAY,WAAW,YAAY;CACxC,QAAQ,wBAAwB,QAAQ;EACvC;EACA;EACA;EACA;EACA,EAAE,GAAG,GAAG,SAAS;CAClB,2BAA2B,IAAI,KAAK;CACpC,SAAS,OAAO,cAAc;EAC7B,WAAW;EACX,WAAW;EACX,cAAc;EACd,cAAc;EACd,CAAC;CACF,EAAE;AACH,SAAS,aAAa,QAAQ,QAAQ;CACrC,MAAM,IAAI,UAAU,OAAO;CAC3B,IAAI,OAAO,EAAE,UAAU,IAAI,OAAO;AAClC,KAAI,CAAC,MAAM;AACV,SAAO,OAAO,KAAK,MAAM,MAAM;GAC9B,MAAM,SAAS,OAAO,mBAAmB;IACxC;IACA,OAAO,GAAG,GAAG,GAAG,EAAE;IAClB,CAAC;AACF,UAAO,OAAO,qBAAqB;IAClC,OAAO,GAAG,GAAG,GAAG;IAChB,QAAQ,OAAO,qBAAqB,EAAE,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC;IACrE,QAAQ;KACP;KACA,YAAY;KACZ;IACD,UAAU;KACT;KACA,YAAY;KACZ,SAAS,CAAC,EAAE,QAAQ,CAAC;KACrB;IACD,WAAW,EAAE,UAAU,kBAAkB;IACzC,CAAC;IACD;AACF,IAAE,UAAU,IAAI,QAAQ,KAAK;;AAE9B,QAAO;;AAER,SAAS,IAAI,GAAG,UAAU;CACzB,MAAM,IAAI,OAAO,MAAM,WAAW,IAAI,OAAO,EAAE;AAC/C,QAAO,OAAO,SAAS,EAAE,GAAG,IAAI;;;AAGjC,SAAS,KAAK,KAAK,MAAM,MAAM,OAAO;AACrC,MAAK,KAAK,EAAE;AACZ,MAAK,KAAK;AACV,MAAK,KAAK;AACV,MAAK,KAAK,IAAI,IAAI,UAAU,EAAE;AAC9B,MAAK,KAAK,IAAI,IAAI,UAAU,EAAE;AAC9B,MAAK,KAAK,IAAI,IAAI,SAAS,GAAG;AAC9B,MAAK,KAAK,IAAI,IAAI,SAAS,GAAG;AAC9B,MAAK,KAAK,IAAI,IAAI,MAAM,EAAE;;AAE3B,MAAM,6BAA6B,OAAO,SAAS;CAClD,MAAM,EAAE,KAAK,SAAS,MAAM,eAAe,aAAa,cAAc,UAAU;CAChF,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,GAAI;CACnB,MAAM,QAAQ,MAAM,cAAc,WAAW;AAC7C,KAAI,CAAC,MAAO;AACZ,MAAK,KAAK;CACV,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,QAAQ,KAAK,MAAM,MAAM,oBAAoB,MAAM,SAAS,EAAE;CACpE,MAAM,MAAM,GAAG,QAAQ,kBAAkB,GAAG,OAAO,gBAAgB;EAClE;EACA;EACA,MAAM,QAAQ;EACd,CAAC,GAAG;CACL,MAAM,OAAO,IAAI,aAAa,eAAe;AAC7C,MAAK,KAAK,MAAM,QAAQ,KAAK,MAAM;CACnC,MAAM,EAAE,SAAS,aAAa,MAAM,mBAAmB,MAAM,MAAM;CACnE,MAAM,SAAS,IAAI;CACnB,MAAM,IAAI,UAAU,OAAO;CAC3B,MAAM,YAAY,aAAa,QAAQ,IAAI,SAAS,OAAO;CAC3D,MAAM,MAAM,IAAI,SAAS,mBAAmB,KAAK;CACjD,IAAI,OAAO;AACX,MAAK,MAAM,YAAY,WAAW;EACjC,MAAM,MAAM,IAAI,SAAS,oBAAoB,aAAa,cAAc;GACvE;GACA;GACA;GACA,GAAG,MAAM,mBAAmB,EAAE;GAC9B,CAAC;AACF,qBAAmB,SAAS,IAAI,YAAY,EAAE,UAAU,CAAC,OAAO,gBAAgB;GAC/E,QAAQ,EAAE;GACV,SAAS;IACR;KACC,SAAS;KACT,UAAU,EAAE,QAAQ,KAAK;KACzB;IACD;KACC,SAAS;KACT,UAAU,SAAS,YAAY;KAC/B;IACD;KACC,SAAS;KACT,UAAU,KAAK,YAAY;KAC3B;IACD;KACC,SAAS;KACT,UAAU,EAAE;KACZ;IACD;GACD,CAAC,CAAC,CAAC;AACJ,SAAO;;AAER,qBAAoB,MAAM,KAAK;;AAKhC,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,4BAA4B,CAAC"}
@@ -1,7 +1,7 @@
1
- import "./chunk-BcJoO4Nm.mjs";
2
- import { n as defineRenderer } from "./renderer-mNSyac1V.mjs";
3
- import "./dist-C1cCW7Bt.mjs";
4
- import { i as beginTargetPass, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, t as FULLSCREEN_QUAD_WGSL } from "./gpu-CMaa63nz.mjs";
1
+ import "./chunk-D8S17ehY.mjs";
2
+ import { n as defineRenderer } from "./renderer-DrWeb39d.mjs";
3
+ import "./dist-D12-a3-x.mjs";
4
+ import { i as beginTargetPass, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, t as FULLSCREEN_QUAD_WGSL } from "./gpu-zFNrvhV9.mjs";
5
5
 
6
6
  //#region ../../nodes/node-channel-merger/dist/renderers-CFuJvvvy.mjs
7
7
  const COLOR_SPACE_MAP = {
@@ -290,4 +290,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: ChannelMergerWebGPURend
290
290
 
291
291
  //#endregion
292
292
  export { ChannelMergerWebGPURenderer, renderers_default as default };
293
- //# sourceMappingURL=renderer-D7Al3_-5.mjs.map
293
+ //# sourceMappingURL=renderer-BPYIqtNg.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-D7Al3_-5.mjs","names":[],"sources":["../../../nodes/node-channel-merger/dist/renderers-CFuJvvvy.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, beginTargetPass, drawChildToTexture, fragmentBindGroupLayout, texturesLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst COLOR_SPACE_MAP = {\n\tRGBA: 0,\n\tHSLA: 1,\n\tCMYK: 2,\n\tLAB: 3\n};\nconst WGSL_CHANNEL_MERGER = `\nstruct MergerUniforms {\n\tcolorSpace : f32, // 0=RGBA, 1=HSLA, 2=CMYK, 3=LAB\n\thasCh4 : f32, // 0 or 1\n\tdefaultCh4 : f32, // fallback value (1.0 for alpha, 0.0 for CMYK black)\n\t_pad0 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : MergerUniforms;\n@group(1) @binding(0) var tex1 : texture_2d<f32>;\n@group(1) @binding(1) var tex2 : texture_2d<f32>;\n@group(1) @binding(2) var tex3 : texture_2d<f32>;\n@group(1) @binding(3) var tex4 : texture_2d<f32>;\n@group(1) @binding(4) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn hue2rgb(p: f32, q: f32, t_in: f32) -> f32 {\n\tvar t = t_in;\n\tif (t < 0.0) { t = t + 1.0; }\n\tif (t > 1.0) { t = t - 1.0; }\n\tif (t < 1.0 / 6.0) { return p + (q - p) * 6.0 * t; }\n\tif (t < 1.0 / 2.0) { return q; }\n\tif (t < 2.0 / 3.0) { return p + (q - p) * (2.0 / 3.0 - t) * 6.0; }\n\treturn p;\n}\n\nfn hsl2rgb(h: f32, s: f32, l: f32) -> vec3<f32> {\n\tif (s <= 0.00001) {\n\t\treturn vec3<f32>(l, l, l);\n\t}\n\tlet q = select(l + s - l * s, l * (1.0 + s), l < 0.5);\n\tlet p = 2.0 * l - q;\n\tlet r = hue2rgb(p, q, h + 1.0 / 3.0);\n\tlet g = hue2rgb(p, q, h);\n\tlet b = hue2rgb(p, q, h - 1.0 / 3.0);\n\treturn vec3<f32>(clamp(r, 0.0, 1.0), clamp(g, 0.0, 1.0), clamp(b, 0.0, 1.0));\n}\n\nfn inv_lab_f(t: f32) -> f32 {\n\tlet t3 = t * t * t;\n\treturn select((t - 16.0 / 116.0) / 7.787, t3, t3 > 0.008856);\n}\n\nfn lin2srgb(v: f32) -> f32 {\n\tlet c = clamp(v, 0.0, 1.0);\n\treturn select(c * 12.92, 1.055 * pow(c, 1.0 / 2.4) - 0.055, c > 0.0031308);\n}\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n\tlet c1 = textureSample(tex1, samp, in.uv);\n\tlet c2 = textureSample(tex2, samp, in.uv);\n\tlet c3 = textureSample(tex3, samp, in.uv);\n\tlet c4 = textureSample(tex4, samp, in.uv);\n\n\tlet v1 = c1.r;\n\tlet v2 = c2.r;\n\tlet v3 = c3.r;\n\tlet v4 = select(u.defaultCh4, c4.r, u.hasCh4 > 0.5);\n\n\tlet cs = u32(u.colorSpace + 0.5);\n\n\tif (cs == 0u) { // RGBA\n\t\treturn vec4<f32>(clamp(v1, 0.0, 1.0), clamp(v2, 0.0, 1.0), clamp(v3, 0.0, 1.0), clamp(v4, 0.0, 1.0));\n\t} else if (cs == 1u) { // HSLA\n\t\tlet rgb = hsl2rgb(fract(v1), clamp(v2, 0.0, 1.0), clamp(v3, 0.0, 1.0));\n\t\treturn vec4<f32>(rgb, clamp(v4, 0.0, 1.0));\n\t} else if (cs == 2u) { // CMYK\n\t\tlet C = clamp(v1, 0.0, 1.0);\n\t\tlet M = clamp(v2, 0.0, 1.0);\n\t\tlet Y = clamp(v3, 0.0, 1.0);\n\t\tlet K = clamp(v4, 0.0, 1.0);\n\t\tlet r = (1.0 - C) * (1.0 - K);\n\t\tlet g = (1.0 - M) * (1.0 - K);\n\t\tlet b = (1.0 - Y) * (1.0 - K);\n\t\treturn vec4<f32>(clamp(r, 0.0, 1.0), clamp(g, 0.0, 1.0), clamp(b, 0.0, 1.0), 1.0);\n\t} else { // LAB\n\t\tlet L_norm = clamp(v1, 0.0, 1.0);\n\t\tlet a_norm = clamp(v2, 0.0, 1.0);\n\t\tlet b_norm = clamp(v3, 0.0, 1.0);\n\n\t\tlet L_star = L_norm * 100.0;\n\t\tlet a_star = a_norm * 255.0 - 128.0;\n\t\tlet b_star = b_norm * 255.0 - 128.0;\n\n\t\tlet fy = (L_star + 16.0) / 116.0;\n\t\tlet fx = fy + a_star / 500.0;\n\t\tlet fz = fy - b_star / 200.0;\n\n\t\tlet x = inv_lab_f(fx);\n\t\tlet y = inv_lab_f(fy);\n\t\tlet z = inv_lab_f(fz);\n\n\t\tlet X = x * 0.95047;\n\t\tlet Y = y * 1.00000;\n\t\tlet Z = z * 1.08883;\n\n\t\tlet lr = 3.2404542 * X - 1.5371385 * Y - 0.4985314 * Z;\n\t\tlet lg = -0.9692660 * X + 1.8760108 * Y + 0.0415560 * Z;\n\t\tlet lb = 0.0556434 * X - 0.2040259 * Y + 1.0572252 * Z;\n\n\t\treturn vec4<f32>(lin2srgb(lr), lin2srgb(lg), lin2srgb(lb), clamp(v4, 0.0, 1.0));\n\t}\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst uniformData = new Float32Array(4);\nfunction getDeviceLayouts(device) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tres = {\n\t\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\t\ttextureLayout: texturesLayout(device, 4),\n\t\tpipelineCache: /* @__PURE__ */ new Map()\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction getPipeline(device, format) {\n\tconst resources = getDeviceLayouts(device);\n\tconst key = `merger_${format}`;\n\tlet pipeline = resources.pipelineCache.get(key);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: \"ChannelMergerShader\",\n\t\t\tcode: WGSL_CHANNEL_MERGER\n\t\t});\n\t\tconst layout = device.createPipelineLayout({ bindGroupLayouts: [resources.uniformLayout, resources.textureLayout] });\n\t\tpipeline = device.createRenderPipeline({\n\t\t\tlabel: \"ChannelMergerPipeline\",\n\t\t\tlayout,\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t});\n\t\tresources.pipelineCache.set(key, pipeline);\n\t}\n\treturn {\n\t\tpipeline,\n\t\tresources\n\t};\n}\nconst ChannelMergerWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ChannelMerger\" || !op) return;\n\tconst ch1Media = op.channel1Media ?? props.virtualMedia.children?.[0];\n\tconst ch2Media = op.channel2Media;\n\tconst ch3Media = op.channel3Media;\n\tconst ch4Media = op.channel4Media;\n\tif (!ch1Media || !ch2Media || !ch3Media) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst { texture: tex1, view: view1 } = await drawChildToTexture(args, ch1Media, { props: {\n\t\t...props,\n\t\tvirtualMedia: ch1Media,\n\t\trenderId: `${props.renderId}-ch1`\n\t} });\n\targs.pass.end();\n\tconst { texture: tex2, view: view2 } = await drawChildToTexture(args, ch2Media, {\n\t\tprops: {\n\t\t\t...props,\n\t\t\tvirtualMedia: ch2Media,\n\t\t\trenderId: `${props.renderId}-ch2`,\n\t\t\texcludeTextures: [...props.excludeTextures || [], tex1]\n\t\t},\n\t\texclude: [tex1]\n\t});\n\targs.pass.end();\n\tconst { texture: tex3, view: view3 } = await drawChildToTexture(args, ch3Media, {\n\t\tprops: {\n\t\t\t...props,\n\t\t\tvirtualMedia: ch3Media,\n\t\t\trenderId: `${props.renderId}-ch3`,\n\t\t\texcludeTextures: [\n\t\t\t\t...props.excludeTextures || [],\n\t\t\t\ttex1,\n\t\t\t\ttex2\n\t\t\t]\n\t\t},\n\t\texclude: [tex1, tex2]\n\t});\n\targs.pass.end();\n\tconst tex4 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t...props.excludeTextures || [],\n\t\ttargetTexture,\n\t\ttex1,\n\t\ttex2,\n\t\ttex3\n\t]);\n\tconst view4 = tex4.createView();\n\tctx.renderer.beginFrame(encoder, view4, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\").end();\n\tconst hasCh4 = ch4Media ? 1 : 0;\n\tif (ch4Media) {\n\t\tctx.renderer.pushScissor({\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth,\n\t\t\theight\n\t\t});\n\t\tctx.renderer.pushIdentity();\n\t\tawait drawChild(ch4Media, {\n\t\t\t...props,\n\t\t\tvirtualMedia: ch4Media,\n\t\t\trenderId: `${props.renderId}-ch4`,\n\t\t\texcludeTextures: [\n\t\t\t\t...props.excludeTextures || [],\n\t\t\t\ttex1,\n\t\t\t\ttex2,\n\t\t\t\ttex3,\n\t\t\t\ttex4\n\t\t\t]\n\t\t}, view4, tex4, width, height);\n\t\tctx.renderer.popTransform();\n\t\tctx.renderer.popScissor();\n\t\targs.pass.end();\n\t}\n\tconst colorSpace = op.colorSpace ?? \"RGBA\";\n\tconst defaultCh4 = op.defaultChannel4 ?? (colorSpace === \"CMYK\" ? 0 : 1);\n\tuniformData[0] = COLOR_SPACE_MAP[colorSpace] ?? 0;\n\tuniformData[1] = hasCh4;\n\tuniformData[2] = defaultCh4;\n\tuniformData[3] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst { pipeline, resources } = getPipeline(ctx.device, targetTexture.format);\n\tconst uniformBindGroup = ctx.device.createBindGroup({\n\t\tlayout: resources.uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t});\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst textureBindGroup = ctx.device.createBindGroup({\n\t\tlayout: resources.textureLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: view1\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: view2\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: view3\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: view4\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t});\n\tconst finalPass = beginTargetPass(args);\n\tfinalPass.setPipeline(pipeline);\n\tfinalPass.setBindGroup(0, uniformBindGroup);\n\tfinalPass.setBindGroup(1, textureBindGroup);\n\tfinalPass.draw(4, 1, 0, 0);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ChannelMergerWebGPURenderer });\n\n//#endregion\nexport { ChannelMergerWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-CFuJvvvy.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-BPYIqtNg.mjs","names":[],"sources":["../../../nodes/node-channel-merger/dist/renderers-CFuJvvvy.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, beginTargetPass, drawChildToTexture, fragmentBindGroupLayout, texturesLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst COLOR_SPACE_MAP = {\n\tRGBA: 0,\n\tHSLA: 1,\n\tCMYK: 2,\n\tLAB: 3\n};\nconst WGSL_CHANNEL_MERGER = `\nstruct MergerUniforms {\n\tcolorSpace : f32, // 0=RGBA, 1=HSLA, 2=CMYK, 3=LAB\n\thasCh4 : f32, // 0 or 1\n\tdefaultCh4 : f32, // fallback value (1.0 for alpha, 0.0 for CMYK black)\n\t_pad0 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : MergerUniforms;\n@group(1) @binding(0) var tex1 : texture_2d<f32>;\n@group(1) @binding(1) var tex2 : texture_2d<f32>;\n@group(1) @binding(2) var tex3 : texture_2d<f32>;\n@group(1) @binding(3) var tex4 : texture_2d<f32>;\n@group(1) @binding(4) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn hue2rgb(p: f32, q: f32, t_in: f32) -> f32 {\n\tvar t = t_in;\n\tif (t < 0.0) { t = t + 1.0; }\n\tif (t > 1.0) { t = t - 1.0; }\n\tif (t < 1.0 / 6.0) { return p + (q - p) * 6.0 * t; }\n\tif (t < 1.0 / 2.0) { return q; }\n\tif (t < 2.0 / 3.0) { return p + (q - p) * (2.0 / 3.0 - t) * 6.0; }\n\treturn p;\n}\n\nfn hsl2rgb(h: f32, s: f32, l: f32) -> vec3<f32> {\n\tif (s <= 0.00001) {\n\t\treturn vec3<f32>(l, l, l);\n\t}\n\tlet q = select(l + s - l * s, l * (1.0 + s), l < 0.5);\n\tlet p = 2.0 * l - q;\n\tlet r = hue2rgb(p, q, h + 1.0 / 3.0);\n\tlet g = hue2rgb(p, q, h);\n\tlet b = hue2rgb(p, q, h - 1.0 / 3.0);\n\treturn vec3<f32>(clamp(r, 0.0, 1.0), clamp(g, 0.0, 1.0), clamp(b, 0.0, 1.0));\n}\n\nfn inv_lab_f(t: f32) -> f32 {\n\tlet t3 = t * t * t;\n\treturn select((t - 16.0 / 116.0) / 7.787, t3, t3 > 0.008856);\n}\n\nfn lin2srgb(v: f32) -> f32 {\n\tlet c = clamp(v, 0.0, 1.0);\n\treturn select(c * 12.92, 1.055 * pow(c, 1.0 / 2.4) - 0.055, c > 0.0031308);\n}\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n\tlet c1 = textureSample(tex1, samp, in.uv);\n\tlet c2 = textureSample(tex2, samp, in.uv);\n\tlet c3 = textureSample(tex3, samp, in.uv);\n\tlet c4 = textureSample(tex4, samp, in.uv);\n\n\tlet v1 = c1.r;\n\tlet v2 = c2.r;\n\tlet v3 = c3.r;\n\tlet v4 = select(u.defaultCh4, c4.r, u.hasCh4 > 0.5);\n\n\tlet cs = u32(u.colorSpace + 0.5);\n\n\tif (cs == 0u) { // RGBA\n\t\treturn vec4<f32>(clamp(v1, 0.0, 1.0), clamp(v2, 0.0, 1.0), clamp(v3, 0.0, 1.0), clamp(v4, 0.0, 1.0));\n\t} else if (cs == 1u) { // HSLA\n\t\tlet rgb = hsl2rgb(fract(v1), clamp(v2, 0.0, 1.0), clamp(v3, 0.0, 1.0));\n\t\treturn vec4<f32>(rgb, clamp(v4, 0.0, 1.0));\n\t} else if (cs == 2u) { // CMYK\n\t\tlet C = clamp(v1, 0.0, 1.0);\n\t\tlet M = clamp(v2, 0.0, 1.0);\n\t\tlet Y = clamp(v3, 0.0, 1.0);\n\t\tlet K = clamp(v4, 0.0, 1.0);\n\t\tlet r = (1.0 - C) * (1.0 - K);\n\t\tlet g = (1.0 - M) * (1.0 - K);\n\t\tlet b = (1.0 - Y) * (1.0 - K);\n\t\treturn vec4<f32>(clamp(r, 0.0, 1.0), clamp(g, 0.0, 1.0), clamp(b, 0.0, 1.0), 1.0);\n\t} else { // LAB\n\t\tlet L_norm = clamp(v1, 0.0, 1.0);\n\t\tlet a_norm = clamp(v2, 0.0, 1.0);\n\t\tlet b_norm = clamp(v3, 0.0, 1.0);\n\n\t\tlet L_star = L_norm * 100.0;\n\t\tlet a_star = a_norm * 255.0 - 128.0;\n\t\tlet b_star = b_norm * 255.0 - 128.0;\n\n\t\tlet fy = (L_star + 16.0) / 116.0;\n\t\tlet fx = fy + a_star / 500.0;\n\t\tlet fz = fy - b_star / 200.0;\n\n\t\tlet x = inv_lab_f(fx);\n\t\tlet y = inv_lab_f(fy);\n\t\tlet z = inv_lab_f(fz);\n\n\t\tlet X = x * 0.95047;\n\t\tlet Y = y * 1.00000;\n\t\tlet Z = z * 1.08883;\n\n\t\tlet lr = 3.2404542 * X - 1.5371385 * Y - 0.4985314 * Z;\n\t\tlet lg = -0.9692660 * X + 1.8760108 * Y + 0.0415560 * Z;\n\t\tlet lb = 0.0556434 * X - 0.2040259 * Y + 1.0572252 * Z;\n\n\t\treturn vec4<f32>(lin2srgb(lr), lin2srgb(lg), lin2srgb(lb), clamp(v4, 0.0, 1.0));\n\t}\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst uniformData = new Float32Array(4);\nfunction getDeviceLayouts(device) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tres = {\n\t\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\t\ttextureLayout: texturesLayout(device, 4),\n\t\tpipelineCache: /* @__PURE__ */ new Map()\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction getPipeline(device, format) {\n\tconst resources = getDeviceLayouts(device);\n\tconst key = `merger_${format}`;\n\tlet pipeline = resources.pipelineCache.get(key);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: \"ChannelMergerShader\",\n\t\t\tcode: WGSL_CHANNEL_MERGER\n\t\t});\n\t\tconst layout = device.createPipelineLayout({ bindGroupLayouts: [resources.uniformLayout, resources.textureLayout] });\n\t\tpipeline = device.createRenderPipeline({\n\t\t\tlabel: \"ChannelMergerPipeline\",\n\t\t\tlayout,\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t});\n\t\tresources.pipelineCache.set(key, pipeline);\n\t}\n\treturn {\n\t\tpipeline,\n\t\tresources\n\t};\n}\nconst ChannelMergerWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ChannelMerger\" || !op) return;\n\tconst ch1Media = op.channel1Media ?? props.virtualMedia.children?.[0];\n\tconst ch2Media = op.channel2Media;\n\tconst ch3Media = op.channel3Media;\n\tconst ch4Media = op.channel4Media;\n\tif (!ch1Media || !ch2Media || !ch3Media) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst { texture: tex1, view: view1 } = await drawChildToTexture(args, ch1Media, { props: {\n\t\t...props,\n\t\tvirtualMedia: ch1Media,\n\t\trenderId: `${props.renderId}-ch1`\n\t} });\n\targs.pass.end();\n\tconst { texture: tex2, view: view2 } = await drawChildToTexture(args, ch2Media, {\n\t\tprops: {\n\t\t\t...props,\n\t\t\tvirtualMedia: ch2Media,\n\t\t\trenderId: `${props.renderId}-ch2`,\n\t\t\texcludeTextures: [...props.excludeTextures || [], tex1]\n\t\t},\n\t\texclude: [tex1]\n\t});\n\targs.pass.end();\n\tconst { texture: tex3, view: view3 } = await drawChildToTexture(args, ch3Media, {\n\t\tprops: {\n\t\t\t...props,\n\t\t\tvirtualMedia: ch3Media,\n\t\t\trenderId: `${props.renderId}-ch3`,\n\t\t\texcludeTextures: [\n\t\t\t\t...props.excludeTextures || [],\n\t\t\t\ttex1,\n\t\t\t\ttex2\n\t\t\t]\n\t\t},\n\t\texclude: [tex1, tex2]\n\t});\n\targs.pass.end();\n\tconst tex4 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t...props.excludeTextures || [],\n\t\ttargetTexture,\n\t\ttex1,\n\t\ttex2,\n\t\ttex3\n\t]);\n\tconst view4 = tex4.createView();\n\tctx.renderer.beginFrame(encoder, view4, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\").end();\n\tconst hasCh4 = ch4Media ? 1 : 0;\n\tif (ch4Media) {\n\t\tctx.renderer.pushScissor({\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth,\n\t\t\theight\n\t\t});\n\t\tctx.renderer.pushIdentity();\n\t\tawait drawChild(ch4Media, {\n\t\t\t...props,\n\t\t\tvirtualMedia: ch4Media,\n\t\t\trenderId: `${props.renderId}-ch4`,\n\t\t\texcludeTextures: [\n\t\t\t\t...props.excludeTextures || [],\n\t\t\t\ttex1,\n\t\t\t\ttex2,\n\t\t\t\ttex3,\n\t\t\t\ttex4\n\t\t\t]\n\t\t}, view4, tex4, width, height);\n\t\tctx.renderer.popTransform();\n\t\tctx.renderer.popScissor();\n\t\targs.pass.end();\n\t}\n\tconst colorSpace = op.colorSpace ?? \"RGBA\";\n\tconst defaultCh4 = op.defaultChannel4 ?? (colorSpace === \"CMYK\" ? 0 : 1);\n\tuniformData[0] = COLOR_SPACE_MAP[colorSpace] ?? 0;\n\tuniformData[1] = hasCh4;\n\tuniformData[2] = defaultCh4;\n\tuniformData[3] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst { pipeline, resources } = getPipeline(ctx.device, targetTexture.format);\n\tconst uniformBindGroup = ctx.device.createBindGroup({\n\t\tlayout: resources.uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t});\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst textureBindGroup = ctx.device.createBindGroup({\n\t\tlayout: resources.textureLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: view1\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: view2\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: view3\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: view4\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t});\n\tconst finalPass = beginTargetPass(args);\n\tfinalPass.setPipeline(pipeline);\n\tfinalPass.setBindGroup(0, uniformBindGroup);\n\tfinalPass.setBindGroup(1, textureBindGroup);\n\tfinalPass.draw(4, 1, 0, 0);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ChannelMergerWebGPURenderer });\n\n//#endregion\nexport { ChannelMergerWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-CFuJvvvy.mjs.map"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-D8S17ehY.mjs";
2
+ import "./dist-D12-a3-x.mjs";
3
+ import { t as renderers_default } from "./renderer-sPI7aY6c.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,7 +1,7 @@
1
- import "./chunk-BcJoO4Nm.mjs";
2
- import { n as defineRenderer } from "./renderer-mNSyac1V.mjs";
3
- import "./dist-C1cCW7Bt.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-CMaa63nz.mjs";
1
+ import "./chunk-D8S17ehY.mjs";
2
+ import { n as defineRenderer } from "./renderer-DrWeb39d.mjs";
3
+ import "./dist-D12-a3-x.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-zFNrvhV9.mjs";
5
5
 
6
6
  //#region ../../nodes/node-trails/dist/renderers-C37o-6Mg.mjs
7
7
  const HISTORY_FORMAT = "rgba16float";
@@ -212,4 +212,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: TrailsWebGPURenderer })
212
212
 
213
213
  //#endregion
214
214
  export { TrailsWebGPURenderer, renderers_default as default };
215
- //# sourceMappingURL=renderer-DDEkFbVI.mjs.map
215
+ //# sourceMappingURL=renderer-BQOeeXTr.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-DDEkFbVI.mjs","names":[],"sources":["../../../nodes/node-trails/dist/renderers-C37o-6Mg.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 HISTORY_FORMAT = \"rgba16float\";\nconst TRAILS_WGSL = `\nstruct U { a : vec4<f32>, b : vec4<f32> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var historyTex : texture_2d<f32>;\n@group(0) @binding(2) var currentTex : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n// Hue rotation in YIQ: linear, so it works on premultiplied color.\nfn hueRotate(c : vec3<f32>, angle : f32) -> vec3<f32> {\n\tlet yiq = mat3x3<f32>(0.299, 0.596, 0.211, 0.587, -0.274, -0.523, 0.114, -0.322, 0.312) * c;\n\tlet cs = cos(angle);\n\tlet sn = sin(angle);\n\tlet rot = vec3<f32>(yiq.x, yiq.y * cs - yiq.z * sn, yiq.y * sn + yiq.z * cs);\n\treturn mat3x3<f32>(1.0, 1.0, 1.0, 0.956, -0.272, -1.106, 0.621, -0.647, 1.703) * rot;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet decay = u.a.x;\n\tlet mode = u.a.y;\n\tlet zoom = max(u.a.z, 1e-3);\n\tlet angle = u.a.w;\n\tlet offset = u.b.xy;\n\tlet hue = u.b.z;\n\tlet fresh = u.b.w;\n\tlet cur = textureSampleLevel(currentTex, samp, in.uv, 0.0);\n\tif (fresh > 0.5) { return cur; }\n\tlet c = in.uv - 0.5;\n\tlet cs = cos(-angle);\n\tlet sn = sin(-angle);\n\tlet src = vec2<f32>(c.x * cs - c.y * sn, c.x * sn + c.y * cs) / zoom + 0.5 - offset;\n\tvar hist = vec4<f32>(0.0);\n\tif (all(src >= vec2<f32>(0.0)) && all(src <= vec2<f32>(1.0))) {\n\t\thist = textureSampleLevel(historyTex, samp, src, 0.0);\n\t}\n\tif (hue != 0.0) { hist = vec4<f32>(max(hueRotate(hist.rgb, hue), vec3<f32>(0.0)), hist.a); }\n\thist *= decay;\n\tif (mode < 0.5) { return cur + hist * (1.0 - cur.a); }\n\tif (mode < 1.5) { return vec4<f32>(cur.rgb + hist.rgb, min(cur.a + hist.a, 1.0)); }\n\tif (mode < 2.5) { return max(cur, hist); }\n\t// blend: a running average, so opaque footage shows its own echoes.\n\treturn mix(cur, hist / max(decay, 1e-4), decay);\n}\n`;\nconst resources = perDevice((device) => {\n\tconst layout = fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], \"trails_layout\");\n\tconst module = device.createShaderModule({\n\t\tcode: TRAILS_WGSL,\n\t\tlabel: \"trails.wgsl\"\n\t});\n\treturn {\n\t\tlayout,\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlabel: \"trails\",\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format: HISTORY_FORMAT }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t}),\n\t\tsampler: device.createSampler({\n\t\t\tmagFilter: \"linear\",\n\t\t\tminFilter: \"linear\"\n\t\t})\n\t};\n});\nfunction historyFor(effect, device, width, height) {\n\tconst h = effect.feedbackHistory;\n\tif (h && h.device === device && h.width === width && h.height === height) return h;\n\th?.front.destroy();\n\th?.back.destroy();\n\tconst make = (label) => device.createTexture({\n\t\tlabel,\n\t\tsize: [width, height],\n\t\tformat: HISTORY_FORMAT,\n\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST\n\t});\n\tconst next = {\n\t\tdevice,\n\t\twidth,\n\t\theight,\n\t\tfront: make(\"trails_front\"),\n\t\tback: make(\"trails_back\"),\n\t\tframe: -1\n\t};\n\teffect.feedbackHistory = next;\n\treturn next;\n}\nasync function childAt(args, frame, compositionStart, h) {\n\tconst child = args.props.virtualMedia?.children?.[0];\n\tif (!child) return null;\n\treturn drawChildToTexture(args, child, {\n\t\texclude: [h.front, h.back],\n\t\tprops: {\n\t\t\t...args.props,\n\t\t\tvirtualMedia: child,\n\t\t\tframe,\n\t\t\tcompositionFrame: compositionStart + frame\n\t\t}\n\t});\n}\nfunction swap(h) {\n\tconst t = h.front;\n\th.front = h.back;\n\th.back = t;\n}\nasync function stepTrails(args, h, v, frame, compositionStart, fresh) {\n\tconst cur = await childAt(args, frame, compositionStart, h);\n\tif (!cur) return;\n\tconst r = resources(args.ctx.device);\n\tconst uniforms = new Float32Array([\n\t\tv.decay,\n\t\t{\n\t\t\tover: 0,\n\t\t\tadd: 1,\n\t\t\tmax: 2,\n\t\t\tblend: 3\n\t\t}[v.mode] ?? 0,\n\t\tv.zoom,\n\t\tv.rotation * Math.PI / 180,\n\t\tv.offsetX / h.width,\n\t\tv.offsetY / h.height,\n\t\tv.hueShift * Math.PI / 180,\n\t\tfresh ? 1 : 0\n\t]);\n\tdrawFullscreenPass(args.encoder, h.back.createView(), r.pipeline, [args.ctx.device.createBindGroup({\n\t\tlayout: r.layout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: args.ctx.renderer.getTemporaryBuffer(uniforms) }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: h.front.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: cur.view\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: r.sampler\n\t\t\t}\n\t\t]\n\t})]);\n\tswap(h);\n\th.frame = frame;\n}\nfunction num(v, fallback) {\n\treturn typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\nconst TrailsWebGPURenderer = async (args) => {\n\tconst { ctx, pass, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Trails\" || !op.effect?.resolveUniforms) return;\n\tif (!props.virtualMedia?.children?.[0]) return;\n\tpass.end();\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 raw = op.effect.resolveUniforms({\n\t\tframe: compositionFrame,\n\t\tfps,\n\t\ttime: compositionFrame / fps\n\t});\n\tconst h = historyFor(op.effect, ctx.device, targetWidth, targetHeight);\n\t{\n\t\tconst v = {\n\t\t\tdecay: Math.min(1, Math.max(0, num(raw.decay, .9))),\n\t\t\tmode: raw.mode ?? \"blend\",\n\t\t\tzoom: num(raw.zoom, 1),\n\t\t\trotation: num(raw.rotation, 0),\n\t\t\toffsetX: num(raw.offsetX, 0),\n\t\t\toffsetY: num(raw.offsetY, 0),\n\t\t\thueShift: num(raw.hueShift, 0),\n\t\t\twarmup: Math.max(0, Math.round(num(raw.warmup, 60)))\n\t\t};\n\t\tif (h.frame !== local) {\n\t\t\tlet start = local;\n\t\t\tif (h.frame === local - 1) start = local;\n\t\t\telse {\n\t\t\t\tconst needed = v.decay > 0 && v.decay < 1 ? Math.ceil(Math.log(.005) / Math.log(v.decay)) : v.warmup;\n\t\t\t\tstart = Math.max(0, local - Math.min(v.warmup, needed));\n\t\t\t\th.frame = -1;\n\t\t\t}\n\t\t\tfor (let f = start; f <= local; f++) await stepTrails(args, h, v, f, compositionStart, h.frame < 0);\n\t\t}\n\t}\n\tdrawTextureToTarget(args, h.front);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: TrailsWebGPURenderer });\n\n//#endregion\nexport { TrailsWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-C37o-6Mg.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-BQOeeXTr.mjs","names":[],"sources":["../../../nodes/node-trails/dist/renderers-C37o-6Mg.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 HISTORY_FORMAT = \"rgba16float\";\nconst TRAILS_WGSL = `\nstruct U { a : vec4<f32>, b : vec4<f32> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var historyTex : texture_2d<f32>;\n@group(0) @binding(2) var currentTex : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n// Hue rotation in YIQ: linear, so it works on premultiplied color.\nfn hueRotate(c : vec3<f32>, angle : f32) -> vec3<f32> {\n\tlet yiq = mat3x3<f32>(0.299, 0.596, 0.211, 0.587, -0.274, -0.523, 0.114, -0.322, 0.312) * c;\n\tlet cs = cos(angle);\n\tlet sn = sin(angle);\n\tlet rot = vec3<f32>(yiq.x, yiq.y * cs - yiq.z * sn, yiq.y * sn + yiq.z * cs);\n\treturn mat3x3<f32>(1.0, 1.0, 1.0, 0.956, -0.272, -1.106, 0.621, -0.647, 1.703) * rot;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet decay = u.a.x;\n\tlet mode = u.a.y;\n\tlet zoom = max(u.a.z, 1e-3);\n\tlet angle = u.a.w;\n\tlet offset = u.b.xy;\n\tlet hue = u.b.z;\n\tlet fresh = u.b.w;\n\tlet cur = textureSampleLevel(currentTex, samp, in.uv, 0.0);\n\tif (fresh > 0.5) { return cur; }\n\tlet c = in.uv - 0.5;\n\tlet cs = cos(-angle);\n\tlet sn = sin(-angle);\n\tlet src = vec2<f32>(c.x * cs - c.y * sn, c.x * sn + c.y * cs) / zoom + 0.5 - offset;\n\tvar hist = vec4<f32>(0.0);\n\tif (all(src >= vec2<f32>(0.0)) && all(src <= vec2<f32>(1.0))) {\n\t\thist = textureSampleLevel(historyTex, samp, src, 0.0);\n\t}\n\tif (hue != 0.0) { hist = vec4<f32>(max(hueRotate(hist.rgb, hue), vec3<f32>(0.0)), hist.a); }\n\thist *= decay;\n\tif (mode < 0.5) { return cur + hist * (1.0 - cur.a); }\n\tif (mode < 1.5) { return vec4<f32>(cur.rgb + hist.rgb, min(cur.a + hist.a, 1.0)); }\n\tif (mode < 2.5) { return max(cur, hist); }\n\t// blend: a running average, so opaque footage shows its own echoes.\n\treturn mix(cur, hist / max(decay, 1e-4), decay);\n}\n`;\nconst resources = perDevice((device) => {\n\tconst layout = fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], \"trails_layout\");\n\tconst module = device.createShaderModule({\n\t\tcode: TRAILS_WGSL,\n\t\tlabel: \"trails.wgsl\"\n\t});\n\treturn {\n\t\tlayout,\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlabel: \"trails\",\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format: HISTORY_FORMAT }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t}),\n\t\tsampler: device.createSampler({\n\t\t\tmagFilter: \"linear\",\n\t\t\tminFilter: \"linear\"\n\t\t})\n\t};\n});\nfunction historyFor(effect, device, width, height) {\n\tconst h = effect.feedbackHistory;\n\tif (h && h.device === device && h.width === width && h.height === height) return h;\n\th?.front.destroy();\n\th?.back.destroy();\n\tconst make = (label) => device.createTexture({\n\t\tlabel,\n\t\tsize: [width, height],\n\t\tformat: HISTORY_FORMAT,\n\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST\n\t});\n\tconst next = {\n\t\tdevice,\n\t\twidth,\n\t\theight,\n\t\tfront: make(\"trails_front\"),\n\t\tback: make(\"trails_back\"),\n\t\tframe: -1\n\t};\n\teffect.feedbackHistory = next;\n\treturn next;\n}\nasync function childAt(args, frame, compositionStart, h) {\n\tconst child = args.props.virtualMedia?.children?.[0];\n\tif (!child) return null;\n\treturn drawChildToTexture(args, child, {\n\t\texclude: [h.front, h.back],\n\t\tprops: {\n\t\t\t...args.props,\n\t\t\tvirtualMedia: child,\n\t\t\tframe,\n\t\t\tcompositionFrame: compositionStart + frame\n\t\t}\n\t});\n}\nfunction swap(h) {\n\tconst t = h.front;\n\th.front = h.back;\n\th.back = t;\n}\nasync function stepTrails(args, h, v, frame, compositionStart, fresh) {\n\tconst cur = await childAt(args, frame, compositionStart, h);\n\tif (!cur) return;\n\tconst r = resources(args.ctx.device);\n\tconst uniforms = new Float32Array([\n\t\tv.decay,\n\t\t{\n\t\t\tover: 0,\n\t\t\tadd: 1,\n\t\t\tmax: 2,\n\t\t\tblend: 3\n\t\t}[v.mode] ?? 0,\n\t\tv.zoom,\n\t\tv.rotation * Math.PI / 180,\n\t\tv.offsetX / h.width,\n\t\tv.offsetY / h.height,\n\t\tv.hueShift * Math.PI / 180,\n\t\tfresh ? 1 : 0\n\t]);\n\tdrawFullscreenPass(args.encoder, h.back.createView(), r.pipeline, [args.ctx.device.createBindGroup({\n\t\tlayout: r.layout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: args.ctx.renderer.getTemporaryBuffer(uniforms) }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: h.front.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: cur.view\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: r.sampler\n\t\t\t}\n\t\t]\n\t})]);\n\tswap(h);\n\th.frame = frame;\n}\nfunction num(v, fallback) {\n\treturn typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\nconst TrailsWebGPURenderer = async (args) => {\n\tconst { ctx, pass, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Trails\" || !op.effect?.resolveUniforms) return;\n\tif (!props.virtualMedia?.children?.[0]) return;\n\tpass.end();\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 raw = op.effect.resolveUniforms({\n\t\tframe: compositionFrame,\n\t\tfps,\n\t\ttime: compositionFrame / fps\n\t});\n\tconst h = historyFor(op.effect, ctx.device, targetWidth, targetHeight);\n\t{\n\t\tconst v = {\n\t\t\tdecay: Math.min(1, Math.max(0, num(raw.decay, .9))),\n\t\t\tmode: raw.mode ?? \"blend\",\n\t\t\tzoom: num(raw.zoom, 1),\n\t\t\trotation: num(raw.rotation, 0),\n\t\t\toffsetX: num(raw.offsetX, 0),\n\t\t\toffsetY: num(raw.offsetY, 0),\n\t\t\thueShift: num(raw.hueShift, 0),\n\t\t\twarmup: Math.max(0, Math.round(num(raw.warmup, 60)))\n\t\t};\n\t\tif (h.frame !== local) {\n\t\t\tlet start = local;\n\t\t\tif (h.frame === local - 1) start = local;\n\t\t\telse {\n\t\t\t\tconst needed = v.decay > 0 && v.decay < 1 ? Math.ceil(Math.log(.005) / Math.log(v.decay)) : v.warmup;\n\t\t\t\tstart = Math.max(0, local - Math.min(v.warmup, needed));\n\t\t\t\th.frame = -1;\n\t\t\t}\n\t\t\tfor (let f = start; f <= local; f++) await stepTrails(args, h, v, f, compositionStart, h.frame < 0);\n\t\t}\n\t}\n\tdrawTextureToTarget(args, h.front);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: TrailsWebGPURenderer });\n\n//#endregion\nexport { TrailsWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-C37o-6Mg.mjs.map"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { n as defineRenderer } from "./renderer-mNSyac1V.mjs";
2
- import { a as createFullscreenPipeline, c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-CMaa63nz.mjs";
1
+ import { n as defineRenderer } from "./renderer-DrWeb39d.mjs";
2
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-zFNrvhV9.mjs";
3
3
 
4
4
  //#region ../../nodes/node-curves/dist/renderers-DzdBU1io.mjs
5
5
  /**
@@ -639,4 +639,4 @@ var renderers_default = rendererNode;
639
639
 
640
640
  //#endregion
641
641
  export { renderers_default as n, rendererNode as t };
642
- //# sourceMappingURL=renderer-GBmWjBvy.mjs.map
642
+ //# sourceMappingURL=renderer-BRWjLiHX.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-GBmWjBvy.mjs","names":[],"sources":["../../../nodes/node-curves/dist/renderers-DzdBU1io.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/shared/spline.ts\n/**\n* Solves the Fritsch-Carlson Monotonic Cubic Hermite Spline interpolation\n* for a set of control points. Returns an interpolation function.\n*/\nfunction solveMonotonicSpline(points) {\n\tconst pts = [...points].sort((a, b) => a.x - b.x);\n\tconst uniquePts = [];\n\tfor (const p of pts) if (uniquePts.length === 0 || Math.abs(p.x - uniquePts[uniquePts.length - 1].x) > 1e-6) uniquePts.push(p);\n\tconst n = uniquePts.length;\n\tif (n === 0) return (x) => x;\n\tif (n === 1) return () => uniquePts[0].y;\n\tconst dx = new Float32Array(n - 1);\n\tconst dy = new Float32Array(n - 1);\n\tconst ms = new Float32Array(n - 1);\n\tfor (let i = 0; i < n - 1; i++) {\n\t\tdx[i] = uniquePts[i + 1].x - uniquePts[i].x;\n\t\tdy[i] = uniquePts[i + 1].y - uniquePts[i].y;\n\t\tms[i] = dy[i] / dx[i];\n\t}\n\tconst tangents = new Float32Array(n);\n\ttangents[0] = ms[0];\n\tfor (let i = 1; i < n - 1; i++) tangents[i] = (ms[i - 1] + ms[i]) / 2;\n\ttangents[n - 1] = ms[n - 2];\n\tfor (let i = 0; i < n - 1; i++) {\n\t\tconst m = ms[i];\n\t\tif (Math.abs(m) < 1e-9) {\n\t\t\ttangents[i] = 0;\n\t\t\ttangents[i + 1] = 0;\n\t\t} else {\n\t\t\tconst alpha = tangents[i] / m;\n\t\t\tconst beta = tangents[i + 1] / m;\n\t\t\tconst alphaSq = alpha * alpha;\n\t\t\tconst betaSq = beta * beta;\n\t\t\tif (alphaSq + betaSq > 9) {\n\t\t\t\tconst tau = 3 / Math.sqrt(alphaSq + betaSq);\n\t\t\t\ttangents[i] = tau * alpha * m;\n\t\t\t\ttangents[i + 1] = tau * beta * m;\n\t\t\t}\n\t\t}\n\t}\n\treturn (x) => {\n\t\tif (x <= uniquePts[0].x) return uniquePts[0].y;\n\t\tif (x >= uniquePts[n - 1].x) return uniquePts[n - 1].y;\n\t\tlet low = 0;\n\t\tlet high = n - 2;\n\t\tlet idx = 0;\n\t\twhile (low <= high) {\n\t\t\tconst mid = low + high >> 1;\n\t\t\tif (x >= uniquePts[mid].x && x <= uniquePts[mid + 1].x) {\n\t\t\t\tidx = mid;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (x < uniquePts[mid].x) high = mid - 1;\n\t\t\telse low = mid + 1;\n\t\t}\n\t\tconst h = dx[idx];\n\t\tconst t = (x - uniquePts[idx].x) / h;\n\t\tconst t2 = t * t;\n\t\tconst t3 = t2 * t;\n\t\tconst h00 = 2 * t3 - 3 * t2 + 1;\n\t\tconst h10 = t3 - 2 * t2 + t;\n\t\tconst h01 = -2 * t3 + 3 * t2;\n\t\tconst h11 = t3 - t2;\n\t\tconst y = uniquePts[idx].y * h00 + h * tangents[idx] * h10 + uniquePts[idx + 1].y * h01 + h * tangents[idx + 1] * h11;\n\t\treturn Math.max(0, Math.min(1, y));\n\t};\n}\n\n//#endregion\n//#region src/renderers/histogram-computer.ts\nconst PER_CHAN_SIZE = 256 * 4;\nconst HISTOGRAM_COMPUTE_SHADER = `\n@group(0) @binding(0) var t_src: texture_2d<f32>;\n@group(0) @binding(1) var<storage, read_write> bins_r: array<atomic<u32>, 256>;\n@group(0) @binding(2) var<storage, read_write> bins_g: array<atomic<u32>, 256>;\n@group(0) @binding(3) var<storage, read_write> bins_b: array<atomic<u32>, 256>;\n@group(0) @binding(4) var<storage, read_write> bins_luma: array<atomic<u32>, 256>;\n\n@compute @workgroup_size(8, 8)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>) {\n\tlet dims = textureDimensions(t_src, 0);\n\tif (gid.x >= dims.x || gid.y >= dims.y) { return; }\n\n\tlet color = textureLoad(t_src, vec2<u32>(gid.x, gid.y), 0);\n\tlet a = color.a;\n\tif (a < 1e-5) { return; }\n\n\tlet rgb = color.rgb / a;\n\n\tlet ri = u32(clamp(rgb.r * 255.0, 0.0, 255.0));\n\tlet gi = u32(clamp(rgb.g * 255.0, 0.0, 255.0));\n\tlet bi = u32(clamp(rgb.b * 255.0, 0.0, 255.0));\n\tlet luma = 0.2126 * rgb.r + 0.7152 * rgb.g + 0.0722 * rgb.b;\n\tlet lumai = u32(clamp(luma * 255.0, 0.0, 255.0));\n\n\tatomicAdd(&bins_r[ri], 1u);\n\tatomicAdd(&bins_g[gi], 1u);\n\tatomicAdd(&bins_b[bi], 1u);\n\tatomicAdd(&bins_luma[lumai], 1u);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getHistogramResources(device) {\n\tlet res = deviceResourceCache.get(device);\n\tif (!res) {\n\t\tconst bindGroupLayout = device.createBindGroupLayout({ entries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tvisibility: GPUShaderStage.COMPUTE,\n\t\t\t\ttexture: {\n\t\t\t\t\tsampleType: \"float\",\n\t\t\t\t\tviewDimension: \"2d\"\n\t\t\t\t}\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: \"storage\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\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: 4,\n\t\t\t\tvisibility: GPUShaderStage.COMPUTE,\n\t\t\t\tbuffer: { type: \"storage\" }\n\t\t\t}\n\t\t] });\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: \"histogram.wgsl\",\n\t\t\tcode: HISTOGRAM_COMPUTE_SHADER\n\t\t});\n\t\tres = {\n\t\t\tpipeline: device.createComputePipeline({\n\t\t\t\tlabel: \"HistogramPipeline\",\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [bindGroupLayout] }),\n\t\t\t\tcompute: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"main\"\n\t\t\t\t}\n\t\t\t}),\n\t\t\tbindGroupLayout\n\t\t};\n\t\tdeviceResourceCache.set(device, res);\n\t}\n\treturn res;\n}\nconst histogramCallbacks = /* @__PURE__ */ new Map();\nconst inflight = /* @__PURE__ */ new Set();\n/**\n* Records histogram compute + buffer copy commands into the provided encoder.\n* The async readback fires after the queue processes the encoder's commands.\n* This ensures the source texture data is valid when the compute pass reads it.\n*/\nfunction computeHistogramFromEncoder(device, encoder, srcTexture, nodeId) {\n\tif (!histogramCallbacks.get(nodeId)) return;\n\tif (inflight.has(nodeId)) return;\n\tinflight.add(nodeId);\n\tconst { pipeline, bindGroupLayout } = getHistogramResources(device);\n\tconst makeStorage = () => device.createBuffer({\n\t\tsize: PER_CHAN_SIZE,\n\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST\n\t});\n\tconst bufR = makeStorage();\n\tconst bufG = makeStorage();\n\tconst bufB = makeStorage();\n\tconst bufLuma = makeStorage();\n\tencoder.clearBuffer(bufR);\n\tencoder.clearBuffer(bufG);\n\tencoder.clearBuffer(bufB);\n\tencoder.clearBuffer(bufLuma);\n\tconst bindGroup = device.createBindGroup({\n\t\tlayout: bindGroupLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: srcTexture.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: { buffer: bufR }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: { buffer: bufG }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: { buffer: bufB }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: { buffer: bufLuma }\n\t\t\t}\n\t\t]\n\t});\n\tconst pass = encoder.beginComputePass({ label: \"histogram-pass\" });\n\tpass.setPipeline(pipeline);\n\tpass.setBindGroup(0, bindGroup);\n\tpass.dispatchWorkgroups(Math.ceil(srcTexture.width / 8), Math.ceil(srcTexture.height / 8));\n\tpass.end();\n\tconst makeReadback = () => device.createBuffer({\n\t\tsize: PER_CHAN_SIZE,\n\t\tusage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST\n\t});\n\tconst rbR = makeReadback();\n\tconst rbG = makeReadback();\n\tconst rbB = makeReadback();\n\tconst rbLuma = makeReadback();\n\tencoder.copyBufferToBuffer(bufR, 0, rbR, 0, PER_CHAN_SIZE);\n\tencoder.copyBufferToBuffer(bufG, 0, rbG, 0, PER_CHAN_SIZE);\n\tencoder.copyBufferToBuffer(bufB, 0, rbB, 0, PER_CHAN_SIZE);\n\tencoder.copyBufferToBuffer(bufLuma, 0, rbLuma, 0, PER_CHAN_SIZE);\n\tdevice.queue.onSubmittedWorkDone().then(() => {\n\t\treturn Promise.all([\n\t\t\trbR.mapAsync(GPUMapMode.READ),\n\t\t\trbG.mapAsync(GPUMapMode.READ),\n\t\t\trbB.mapAsync(GPUMapMode.READ),\n\t\t\trbLuma.mapAsync(GPUMapMode.READ)\n\t\t]);\n\t}).then(() => {\n\t\tconst r = new Uint32Array(rbR.getMappedRange().slice(0));\n\t\tconst g = new Uint32Array(rbG.getMappedRange().slice(0));\n\t\tconst b = new Uint32Array(rbB.getMappedRange().slice(0));\n\t\tconst luma = new Uint32Array(rbLuma.getMappedRange().slice(0));\n\t\trbR.unmap();\n\t\trbG.unmap();\n\t\trbB.unmap();\n\t\trbLuma.unmap();\n\t\trbR.destroy();\n\t\trbG.destroy();\n\t\trbB.destroy();\n\t\trbLuma.destroy();\n\t\tbufR.destroy();\n\t\tbufG.destroy();\n\t\tbufB.destroy();\n\t\tbufLuma.destroy();\n\t\tinflight.delete(nodeId);\n\t\tconst currentCb = histogramCallbacks.get(nodeId);\n\t\tif (currentCb) currentCb({\n\t\t\tr,\n\t\t\tg,\n\t\t\tb,\n\t\t\tluma\n\t\t});\n\t}).catch(() => {\n\t\trbR.destroy();\n\t\trbG.destroy();\n\t\trbB.destroy();\n\t\trbLuma.destroy();\n\t\tbufR.destroy();\n\t\tbufG.destroy();\n\t\tbufB.destroy();\n\t\tbufLuma.destroy();\n\t\tinflight.delete(nodeId);\n\t});\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst LUT_SIZE = 1024;\nconst LUT_FORMAT = \"rgba8unorm\";\nconst LUT_BYTES_PER_ROW = LUT_SIZE * 4;\nconst CURVES_RGB_SHADER = `\n${FULLSCREEN_QUAD_WGSL}\n\n@group(0) @binding(0) var t_lut : texture_2d<f32>;\n@group(0) @binding(1) var s_lut : sampler;\n\n@group(1) @binding(0) var t_src : texture_2d<f32>;\n@group(1) @binding(1) var s_src : sampler;\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n\tlet src = textureSampleLevel(t_src, s_src, in.uv, 0.0);\n\tif (src.a < 1e-5) { return src; }\n\n\tlet rgb = src.rgb / src.a;\n\n\tlet N = f32(${LUT_SIZE});\n\tlet uv_r = (rgb.r * (N - 1.0) + 0.5) / N;\n\tlet uv_g = (rgb.g * (N - 1.0) + 0.5) / N;\n\tlet uv_b = (rgb.b * (N - 1.0) + 0.5) / N;\n\n\tlet r_graded = textureSampleLevel(t_lut, s_lut, vec2<f32>(uv_r, 0.5), 0.0).r;\n\tlet g_graded = textureSampleLevel(t_lut, s_lut, vec2<f32>(uv_g, 0.5), 0.0).g;\n\tlet b_graded = textureSampleLevel(t_lut, s_lut, vec2<f32>(uv_b, 0.5), 0.0).b;\n\n\tlet graded = vec3<f32>(r_graded, g_graded, b_graded);\n\treturn vec4<f32>(graded * src.a, src.a);\n}\n`;\nconst CURVES_HSL_SHADER = `\nstruct Uniforms {\n\tmode: u32,\n\tpad0: u32,\n\tpad1: u32,\n\tpad2: u32,\n};\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var t_lut : texture_2d<f32>;\n@group(0) @binding(2) var s_lut : sampler;\n\n@group(1) @binding(0) var t_src : texture_2d<f32>;\n@group(1) @binding(1) var s_src : sampler;\n\n${FULLSCREEN_QUAD_WGSL}\n\nfn rgb_to_hsl(rgb: vec3<f32>) -> vec3<f32> {\n\tlet r = rgb.r; let g = rgb.g; let b = rgb.b;\n\tlet cmax = max(r, max(g, b));\n\tlet cmin = min(r, min(g, b));\n\tlet delta = cmax - cmin;\n\n\tvar h = 0.0;\n\tvar s = 0.0;\n\tlet l = (cmax + cmin) * 0.5;\n\n\tif (delta > 1e-5) {\n\t\ts = delta / (1.0 - abs(2.0 * l - 1.0));\n\t\tif (cmax == r) {\n\t\t\th = ((g - b) / delta) % 6.0;\n\t\t} else if (cmax == g) {\n\t\t\th = (b - r) / delta + 2.0;\n\t\t} else {\n\t\t\th = (r - g) / delta + 4.0;\n\t\t}\n\t\th = h / 6.0;\n\t\tif (h < 0.0) { h = h + 1.0; }\n\t}\n\treturn vec3<f32>(h, s, l);\n}\n\nfn hsl_to_rgb(hsl: vec3<f32>) -> vec3<f32> {\n\tlet h = hsl.x; let s = hsl.y; let l = hsl.z;\n\tlet c = (1.0 - abs(2.0 * l - 1.0)) * s;\n\tlet x = c * (1.0 - abs((h * 6.0) % 2.0 - 1.0));\n\tlet m = l - c * 0.5;\n\n\tvar rgb = vec3<f32>(0.0);\n\tlet hi = u32(h * 6.0) % 6u;\n\tif (hi == 0u) { rgb = vec3<f32>(c, x, 0.0); }\n\telse if (hi == 1u) { rgb = vec3<f32>(x, c, 0.0); }\n\telse if (hi == 2u) { rgb = vec3<f32>(0.0, c, x); }\n\telse if (hi == 3u) { rgb = vec3<f32>(0.0, x, c); }\n\telse if (hi == 4u) { rgb = vec3<f32>(x, 0.0, c); }\n\telse { rgb = vec3<f32>(c, 0.0, x); }\n\treturn rgb + vec3<f32>(m);\n}\n\nfn lut_sample(x: f32) -> f32 {\n\tlet N = f32(${LUT_SIZE});\n\tlet uv_x = (x * (N - 1.0) + 0.5) / N;\n\treturn textureSampleLevel(t_lut, s_lut, vec2<f32>(uv_x, 0.5), 0.0).r;\n}\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n\tlet src = textureSampleLevel(t_src, s_src, in.uv, 0.0);\n\tif (src.a < 1e-5) { return src; }\n\n\tlet rgb = src.rgb / src.a;\n\tlet hsl = rgb_to_hsl(rgb);\n\n\tvar out_hsl = hsl;\n\n\tif (u.mode == 0u) {\n\t\tlet adj = lut_sample(hsl.x);\n\t\tout_hsl.x = fract(hsl.x + (adj - 0.5) * 2.0);\n\t} else if (u.mode == 1u) {\n\t\tlet adj = lut_sample(hsl.x);\n\t\tout_hsl.y = clamp(hsl.y * (adj * 2.0), 0.0, 1.0);\n\t} else if (u.mode == 2u) {\n\t\tlet adj = lut_sample(hsl.z);\n\t\tout_hsl.y = clamp(hsl.y * (adj * 2.0), 0.0, 1.0);\n\t} else {\n\t\tlet adj = lut_sample(hsl.y);\n\t\tout_hsl.y = clamp(adj, 0.0, 1.0);\n\t}\n\n\tlet out_rgb = clamp(hsl_to_rgb(out_hsl), vec3<f32>(0.0), vec3<f32>(1.0));\n\treturn vec4<f32>(out_rgb * src.a, src.a);\n}\n`;\nconst rgbResourceCache = /* @__PURE__ */ new WeakMap();\nconst hslResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getRgbResources(device, format) {\n\tlet res = rgbResourceCache.get(device);\n\tif (!res) {\n\t\tconst lutBGL = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\t\tconst srcBGL = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\t\tres = {\n\t\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\t\tlabel: \"CurvesRgbPipeline\",\n\t\t\t\tmodule: device.createShaderModule({\n\t\t\t\t\tlabel: \"curves-rgb.wgsl\",\n\t\t\t\t\tcode: CURVES_RGB_SHADER\n\t\t\t\t}),\n\t\t\t\tlayouts: [lutBGL, srcBGL],\n\t\t\t\tformat\n\t\t\t}),\n\t\t\tlutBindGroupLayout: lutBGL,\n\t\t\tsrcBindGroupLayout: srcBGL\n\t\t};\n\t\trgbResourceCache.set(device, res);\n\t}\n\treturn res;\n}\nfunction getHslResources(device, format) {\n\tlet res = hslResourceCache.get(device);\n\tif (!res) {\n\t\tconst uniformLayout = fragmentBindGroupLayout(device, [\n\t\t\t\"uniform\",\n\t\t\t\"texture\",\n\t\t\t\"sampler\"\n\t\t]);\n\t\tconst srcBGL = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\t\tres = {\n\t\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\t\tlabel: \"CurvesHslPipeline\",\n\t\t\t\tmodule: device.createShaderModule({\n\t\t\t\t\tlabel: \"curves-hsl.wgsl\",\n\t\t\t\t\tcode: CURVES_HSL_SHADER\n\t\t\t\t}),\n\t\t\t\tlayouts: [uniformLayout, srcBGL],\n\t\t\t\tformat\n\t\t\t}),\n\t\t\tuniformLayout,\n\t\t\tsrcBindGroupLayout: srcBGL\n\t\t};\n\t\thslResourceCache.set(device, res);\n\t}\n\treturn res;\n}\nconst LUT_CACHE_LIMIT = 32;\nconst deviceTextureCache = /* @__PURE__ */ new WeakMap();\nfunction getLut(device, configKey, build) {\n\tlet cache = deviceTextureCache.get(device);\n\tif (!cache) {\n\t\tcache = /* @__PURE__ */ new Map();\n\t\tdeviceTextureCache.set(device, cache);\n\t}\n\tconst hit = cache.get(configKey);\n\tif (hit) {\n\t\tcache.delete(configKey);\n\t\tcache.set(configKey, hit);\n\t\treturn hit;\n\t}\n\tconst texture = build();\n\tcache.set(configKey, texture);\n\tif (cache.size > LUT_CACHE_LIMIT) {\n\t\tconst [oldestKey, oldest] = cache.entries().next().value;\n\t\tcache.delete(oldestKey);\n\t\toldest.destroy();\n\t}\n\treturn texture;\n}\nfunction buildRgbLut(device, op) {\n\tconst masterSpline = solveMonotonicSpline(op.master || [{\n\t\tx: 0,\n\t\ty: 0\n\t}, {\n\t\tx: 1,\n\t\ty: 1\n\t}]);\n\tconst redSpline = solveMonotonicSpline(op.red || [{\n\t\tx: 0,\n\t\ty: 0\n\t}, {\n\t\tx: 1,\n\t\ty: 1\n\t}]);\n\tconst greenSpline = solveMonotonicSpline(op.green || [{\n\t\tx: 0,\n\t\ty: 0\n\t}, {\n\t\tx: 1,\n\t\ty: 1\n\t}]);\n\tconst blueSpline = solveMonotonicSpline(op.blue || [{\n\t\tx: 0,\n\t\ty: 0\n\t}, {\n\t\tx: 1,\n\t\ty: 1\n\t}]);\n\tconst lutData = new Uint8Array(LUT_SIZE * 4);\n\tfor (let i = 0; i < LUT_SIZE; i++) {\n\t\tconst masterVal = masterSpline(i / (LUT_SIZE - 1));\n\t\tconst r = Math.max(0, Math.min(1, redSpline(masterVal)));\n\t\tconst g = Math.max(0, Math.min(1, greenSpline(masterVal)));\n\t\tconst b = Math.max(0, Math.min(1, blueSpline(masterVal)));\n\t\tlutData[i * 4 + 0] = Math.round(r * 255);\n\t\tlutData[i * 4 + 1] = Math.round(g * 255);\n\t\tlutData[i * 4 + 2] = Math.round(b * 255);\n\t\tlutData[i * 4 + 3] = 255;\n\t}\n\tconst texture = device.createTexture({\n\t\tsize: [\n\t\t\tLUT_SIZE,\n\t\t\t1,\n\t\t\t1\n\t\t],\n\t\tdimension: \"2d\",\n\t\tformat: LUT_FORMAT,\n\t\tusage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST\n\t});\n\tdevice.queue.writeTexture({ texture }, lutData, { bytesPerRow: LUT_BYTES_PER_ROW }, [\n\t\tLUT_SIZE,\n\t\t1,\n\t\t1\n\t]);\n\treturn texture;\n}\nfunction buildHslLut(device, points) {\n\tconst spline = solveMonotonicSpline(points);\n\tconst lutData = new Uint8Array(LUT_SIZE * 4);\n\tfor (let i = 0; i < LUT_SIZE; i++) {\n\t\tconst u = i / (LUT_SIZE - 1);\n\t\tconst val = Math.round(Math.max(0, Math.min(1, spline(u))) * 255);\n\t\tlutData[i * 4 + 0] = val;\n\t\tlutData[i * 4 + 1] = val;\n\t\tlutData[i * 4 + 2] = val;\n\t\tlutData[i * 4 + 3] = 255;\n\t}\n\tconst texture = device.createTexture({\n\t\tsize: [\n\t\t\tLUT_SIZE,\n\t\t\t1,\n\t\t\t1\n\t\t],\n\t\tdimension: \"2d\",\n\t\tformat: LUT_FORMAT,\n\t\tusage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST\n\t});\n\tdevice.queue.writeTexture({ texture }, lutData, { bytesPerRow: LUT_BYTES_PER_ROW }, [\n\t\tLUT_SIZE,\n\t\t1,\n\t\t1\n\t]);\n\treturn texture;\n}\nconst HSL_MODE_MAP = {\n\t\"hue-vs-hue\": 0,\n\t\"hue-vs-sat\": 1,\n\t\"lum-vs-sat\": 2,\n\t\"sat-vs-sat\": 3\n};\nconst HSL_CURVE_KEY_MAP = {\n\t\"hue-vs-hue\": \"hueVsHue\",\n\t\"hue-vs-sat\": \"hueVsSat\",\n\t\"lum-vs-sat\": \"lumVsSat\",\n\t\"sat-vs-sat\": \"satVsSat\"\n};\nconst CurvesWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Curves\" || !props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst childMedia = props.virtualMedia.children[0];\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.nodeId || \"curves_fallback\";\n\tconst curveType = op.curveType || \"rgb\";\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\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\tif (curveType === \"rgb\") {\n\t\tconst configKey = JSON.stringify({\n\t\t\tcurveType,\n\t\t\tmaster: op.master,\n\t\t\tred: op.red,\n\t\t\tgreen: op.green,\n\t\t\tblue: op.blue\n\t\t});\n\t\tconst lut = getLut(ctx.device, configKey, () => buildRgbLut(ctx.device, op));\n\t\tconst { pipeline, lutBindGroupLayout, srcBindGroupLayout } = getRgbResources(ctx.device, ctx.renderer.format);\n\t\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [ctx.device.createBindGroup({\n\t\t\tlayout: lutBindGroupLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: lut.createView()\n\t\t\t}, {\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t}]\n\t\t}), ctx.renderer.bindGroupCache.getBindGroup(ctx.device, srcBindGroupLayout, tmpTex, sampler)]);\n\t} else {\n\t\tconst hslPoints = op[HSL_CURVE_KEY_MAP[curveType]] || [{\n\t\t\tx: 0,\n\t\t\ty: .5\n\t\t}, {\n\t\t\tx: 1,\n\t\t\ty: .5\n\t\t}];\n\t\tconst configKey = JSON.stringify({\n\t\t\tcurveType,\n\t\t\tpoints: hslPoints\n\t\t});\n\t\tconst lut = getLut(ctx.device, configKey, () => buildHslLut(ctx.device, hslPoints));\n\t\tconst uniformData = new Uint32Array([\n\t\t\tHSL_MODE_MAP[curveType] ?? 0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0\n\t\t]);\n\t\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\t\tconst { pipeline, uniformLayout, srcBindGroupLayout } = getHslResources(ctx.device, ctx.renderer.format);\n\t\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [ctx.device.createBindGroup({\n\t\t\tlayout: uniformLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: uniformBuffer }\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: lut.createView()\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}), ctx.renderer.bindGroupCache.getBindGroup(ctx.device, srcBindGroupLayout, tmpTex, sampler)]);\n\t}\n\tcomputeHistogramFromEncoder(ctx.device, encoder, outTex, nodeId);\n\tdrawTextureToTarget(args, outTex, props.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nconst rendererNode = defineRenderer({ WebGPURenderer: CurvesWebGPURenderer });\nvar renderers_default = rendererNode;\n\n//#endregion\nexport { renderers_default as n, solveMonotonicSpline as r, rendererNode as t };\n//# sourceMappingURL=renderers-DzdBU1io.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-BRWjLiHX.mjs","names":[],"sources":["../../../nodes/node-curves/dist/renderers-DzdBU1io.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/shared/spline.ts\n/**\n* Solves the Fritsch-Carlson Monotonic Cubic Hermite Spline interpolation\n* for a set of control points. Returns an interpolation function.\n*/\nfunction solveMonotonicSpline(points) {\n\tconst pts = [...points].sort((a, b) => a.x - b.x);\n\tconst uniquePts = [];\n\tfor (const p of pts) if (uniquePts.length === 0 || Math.abs(p.x - uniquePts[uniquePts.length - 1].x) > 1e-6) uniquePts.push(p);\n\tconst n = uniquePts.length;\n\tif (n === 0) return (x) => x;\n\tif (n === 1) return () => uniquePts[0].y;\n\tconst dx = new Float32Array(n - 1);\n\tconst dy = new Float32Array(n - 1);\n\tconst ms = new Float32Array(n - 1);\n\tfor (let i = 0; i < n - 1; i++) {\n\t\tdx[i] = uniquePts[i + 1].x - uniquePts[i].x;\n\t\tdy[i] = uniquePts[i + 1].y - uniquePts[i].y;\n\t\tms[i] = dy[i] / dx[i];\n\t}\n\tconst tangents = new Float32Array(n);\n\ttangents[0] = ms[0];\n\tfor (let i = 1; i < n - 1; i++) tangents[i] = (ms[i - 1] + ms[i]) / 2;\n\ttangents[n - 1] = ms[n - 2];\n\tfor (let i = 0; i < n - 1; i++) {\n\t\tconst m = ms[i];\n\t\tif (Math.abs(m) < 1e-9) {\n\t\t\ttangents[i] = 0;\n\t\t\ttangents[i + 1] = 0;\n\t\t} else {\n\t\t\tconst alpha = tangents[i] / m;\n\t\t\tconst beta = tangents[i + 1] / m;\n\t\t\tconst alphaSq = alpha * alpha;\n\t\t\tconst betaSq = beta * beta;\n\t\t\tif (alphaSq + betaSq > 9) {\n\t\t\t\tconst tau = 3 / Math.sqrt(alphaSq + betaSq);\n\t\t\t\ttangents[i] = tau * alpha * m;\n\t\t\t\ttangents[i + 1] = tau * beta * m;\n\t\t\t}\n\t\t}\n\t}\n\treturn (x) => {\n\t\tif (x <= uniquePts[0].x) return uniquePts[0].y;\n\t\tif (x >= uniquePts[n - 1].x) return uniquePts[n - 1].y;\n\t\tlet low = 0;\n\t\tlet high = n - 2;\n\t\tlet idx = 0;\n\t\twhile (low <= high) {\n\t\t\tconst mid = low + high >> 1;\n\t\t\tif (x >= uniquePts[mid].x && x <= uniquePts[mid + 1].x) {\n\t\t\t\tidx = mid;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (x < uniquePts[mid].x) high = mid - 1;\n\t\t\telse low = mid + 1;\n\t\t}\n\t\tconst h = dx[idx];\n\t\tconst t = (x - uniquePts[idx].x) / h;\n\t\tconst t2 = t * t;\n\t\tconst t3 = t2 * t;\n\t\tconst h00 = 2 * t3 - 3 * t2 + 1;\n\t\tconst h10 = t3 - 2 * t2 + t;\n\t\tconst h01 = -2 * t3 + 3 * t2;\n\t\tconst h11 = t3 - t2;\n\t\tconst y = uniquePts[idx].y * h00 + h * tangents[idx] * h10 + uniquePts[idx + 1].y * h01 + h * tangents[idx + 1] * h11;\n\t\treturn Math.max(0, Math.min(1, y));\n\t};\n}\n\n//#endregion\n//#region src/renderers/histogram-computer.ts\nconst PER_CHAN_SIZE = 256 * 4;\nconst HISTOGRAM_COMPUTE_SHADER = `\n@group(0) @binding(0) var t_src: texture_2d<f32>;\n@group(0) @binding(1) var<storage, read_write> bins_r: array<atomic<u32>, 256>;\n@group(0) @binding(2) var<storage, read_write> bins_g: array<atomic<u32>, 256>;\n@group(0) @binding(3) var<storage, read_write> bins_b: array<atomic<u32>, 256>;\n@group(0) @binding(4) var<storage, read_write> bins_luma: array<atomic<u32>, 256>;\n\n@compute @workgroup_size(8, 8)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>) {\n\tlet dims = textureDimensions(t_src, 0);\n\tif (gid.x >= dims.x || gid.y >= dims.y) { return; }\n\n\tlet color = textureLoad(t_src, vec2<u32>(gid.x, gid.y), 0);\n\tlet a = color.a;\n\tif (a < 1e-5) { return; }\n\n\tlet rgb = color.rgb / a;\n\n\tlet ri = u32(clamp(rgb.r * 255.0, 0.0, 255.0));\n\tlet gi = u32(clamp(rgb.g * 255.0, 0.0, 255.0));\n\tlet bi = u32(clamp(rgb.b * 255.0, 0.0, 255.0));\n\tlet luma = 0.2126 * rgb.r + 0.7152 * rgb.g + 0.0722 * rgb.b;\n\tlet lumai = u32(clamp(luma * 255.0, 0.0, 255.0));\n\n\tatomicAdd(&bins_r[ri], 1u);\n\tatomicAdd(&bins_g[gi], 1u);\n\tatomicAdd(&bins_b[bi], 1u);\n\tatomicAdd(&bins_luma[lumai], 1u);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getHistogramResources(device) {\n\tlet res = deviceResourceCache.get(device);\n\tif (!res) {\n\t\tconst bindGroupLayout = device.createBindGroupLayout({ entries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tvisibility: GPUShaderStage.COMPUTE,\n\t\t\t\ttexture: {\n\t\t\t\t\tsampleType: \"float\",\n\t\t\t\t\tviewDimension: \"2d\"\n\t\t\t\t}\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: \"storage\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\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: 4,\n\t\t\t\tvisibility: GPUShaderStage.COMPUTE,\n\t\t\t\tbuffer: { type: \"storage\" }\n\t\t\t}\n\t\t] });\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: \"histogram.wgsl\",\n\t\t\tcode: HISTOGRAM_COMPUTE_SHADER\n\t\t});\n\t\tres = {\n\t\t\tpipeline: device.createComputePipeline({\n\t\t\t\tlabel: \"HistogramPipeline\",\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [bindGroupLayout] }),\n\t\t\t\tcompute: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"main\"\n\t\t\t\t}\n\t\t\t}),\n\t\t\tbindGroupLayout\n\t\t};\n\t\tdeviceResourceCache.set(device, res);\n\t}\n\treturn res;\n}\nconst histogramCallbacks = /* @__PURE__ */ new Map();\nconst inflight = /* @__PURE__ */ new Set();\n/**\n* Records histogram compute + buffer copy commands into the provided encoder.\n* The async readback fires after the queue processes the encoder's commands.\n* This ensures the source texture data is valid when the compute pass reads it.\n*/\nfunction computeHistogramFromEncoder(device, encoder, srcTexture, nodeId) {\n\tif (!histogramCallbacks.get(nodeId)) return;\n\tif (inflight.has(nodeId)) return;\n\tinflight.add(nodeId);\n\tconst { pipeline, bindGroupLayout } = getHistogramResources(device);\n\tconst makeStorage = () => device.createBuffer({\n\t\tsize: PER_CHAN_SIZE,\n\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST\n\t});\n\tconst bufR = makeStorage();\n\tconst bufG = makeStorage();\n\tconst bufB = makeStorage();\n\tconst bufLuma = makeStorage();\n\tencoder.clearBuffer(bufR);\n\tencoder.clearBuffer(bufG);\n\tencoder.clearBuffer(bufB);\n\tencoder.clearBuffer(bufLuma);\n\tconst bindGroup = device.createBindGroup({\n\t\tlayout: bindGroupLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: srcTexture.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: { buffer: bufR }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: { buffer: bufG }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: { buffer: bufB }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: { buffer: bufLuma }\n\t\t\t}\n\t\t]\n\t});\n\tconst pass = encoder.beginComputePass({ label: \"histogram-pass\" });\n\tpass.setPipeline(pipeline);\n\tpass.setBindGroup(0, bindGroup);\n\tpass.dispatchWorkgroups(Math.ceil(srcTexture.width / 8), Math.ceil(srcTexture.height / 8));\n\tpass.end();\n\tconst makeReadback = () => device.createBuffer({\n\t\tsize: PER_CHAN_SIZE,\n\t\tusage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST\n\t});\n\tconst rbR = makeReadback();\n\tconst rbG = makeReadback();\n\tconst rbB = makeReadback();\n\tconst rbLuma = makeReadback();\n\tencoder.copyBufferToBuffer(bufR, 0, rbR, 0, PER_CHAN_SIZE);\n\tencoder.copyBufferToBuffer(bufG, 0, rbG, 0, PER_CHAN_SIZE);\n\tencoder.copyBufferToBuffer(bufB, 0, rbB, 0, PER_CHAN_SIZE);\n\tencoder.copyBufferToBuffer(bufLuma, 0, rbLuma, 0, PER_CHAN_SIZE);\n\tdevice.queue.onSubmittedWorkDone().then(() => {\n\t\treturn Promise.all([\n\t\t\trbR.mapAsync(GPUMapMode.READ),\n\t\t\trbG.mapAsync(GPUMapMode.READ),\n\t\t\trbB.mapAsync(GPUMapMode.READ),\n\t\t\trbLuma.mapAsync(GPUMapMode.READ)\n\t\t]);\n\t}).then(() => {\n\t\tconst r = new Uint32Array(rbR.getMappedRange().slice(0));\n\t\tconst g = new Uint32Array(rbG.getMappedRange().slice(0));\n\t\tconst b = new Uint32Array(rbB.getMappedRange().slice(0));\n\t\tconst luma = new Uint32Array(rbLuma.getMappedRange().slice(0));\n\t\trbR.unmap();\n\t\trbG.unmap();\n\t\trbB.unmap();\n\t\trbLuma.unmap();\n\t\trbR.destroy();\n\t\trbG.destroy();\n\t\trbB.destroy();\n\t\trbLuma.destroy();\n\t\tbufR.destroy();\n\t\tbufG.destroy();\n\t\tbufB.destroy();\n\t\tbufLuma.destroy();\n\t\tinflight.delete(nodeId);\n\t\tconst currentCb = histogramCallbacks.get(nodeId);\n\t\tif (currentCb) currentCb({\n\t\t\tr,\n\t\t\tg,\n\t\t\tb,\n\t\t\tluma\n\t\t});\n\t}).catch(() => {\n\t\trbR.destroy();\n\t\trbG.destroy();\n\t\trbB.destroy();\n\t\trbLuma.destroy();\n\t\tbufR.destroy();\n\t\tbufG.destroy();\n\t\tbufB.destroy();\n\t\tbufLuma.destroy();\n\t\tinflight.delete(nodeId);\n\t});\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst LUT_SIZE = 1024;\nconst LUT_FORMAT = \"rgba8unorm\";\nconst LUT_BYTES_PER_ROW = LUT_SIZE * 4;\nconst CURVES_RGB_SHADER = `\n${FULLSCREEN_QUAD_WGSL}\n\n@group(0) @binding(0) var t_lut : texture_2d<f32>;\n@group(0) @binding(1) var s_lut : sampler;\n\n@group(1) @binding(0) var t_src : texture_2d<f32>;\n@group(1) @binding(1) var s_src : sampler;\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n\tlet src = textureSampleLevel(t_src, s_src, in.uv, 0.0);\n\tif (src.a < 1e-5) { return src; }\n\n\tlet rgb = src.rgb / src.a;\n\n\tlet N = f32(${LUT_SIZE});\n\tlet uv_r = (rgb.r * (N - 1.0) + 0.5) / N;\n\tlet uv_g = (rgb.g * (N - 1.0) + 0.5) / N;\n\tlet uv_b = (rgb.b * (N - 1.0) + 0.5) / N;\n\n\tlet r_graded = textureSampleLevel(t_lut, s_lut, vec2<f32>(uv_r, 0.5), 0.0).r;\n\tlet g_graded = textureSampleLevel(t_lut, s_lut, vec2<f32>(uv_g, 0.5), 0.0).g;\n\tlet b_graded = textureSampleLevel(t_lut, s_lut, vec2<f32>(uv_b, 0.5), 0.0).b;\n\n\tlet graded = vec3<f32>(r_graded, g_graded, b_graded);\n\treturn vec4<f32>(graded * src.a, src.a);\n}\n`;\nconst CURVES_HSL_SHADER = `\nstruct Uniforms {\n\tmode: u32,\n\tpad0: u32,\n\tpad1: u32,\n\tpad2: u32,\n};\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var t_lut : texture_2d<f32>;\n@group(0) @binding(2) var s_lut : sampler;\n\n@group(1) @binding(0) var t_src : texture_2d<f32>;\n@group(1) @binding(1) var s_src : sampler;\n\n${FULLSCREEN_QUAD_WGSL}\n\nfn rgb_to_hsl(rgb: vec3<f32>) -> vec3<f32> {\n\tlet r = rgb.r; let g = rgb.g; let b = rgb.b;\n\tlet cmax = max(r, max(g, b));\n\tlet cmin = min(r, min(g, b));\n\tlet delta = cmax - cmin;\n\n\tvar h = 0.0;\n\tvar s = 0.0;\n\tlet l = (cmax + cmin) * 0.5;\n\n\tif (delta > 1e-5) {\n\t\ts = delta / (1.0 - abs(2.0 * l - 1.0));\n\t\tif (cmax == r) {\n\t\t\th = ((g - b) / delta) % 6.0;\n\t\t} else if (cmax == g) {\n\t\t\th = (b - r) / delta + 2.0;\n\t\t} else {\n\t\t\th = (r - g) / delta + 4.0;\n\t\t}\n\t\th = h / 6.0;\n\t\tif (h < 0.0) { h = h + 1.0; }\n\t}\n\treturn vec3<f32>(h, s, l);\n}\n\nfn hsl_to_rgb(hsl: vec3<f32>) -> vec3<f32> {\n\tlet h = hsl.x; let s = hsl.y; let l = hsl.z;\n\tlet c = (1.0 - abs(2.0 * l - 1.0)) * s;\n\tlet x = c * (1.0 - abs((h * 6.0) % 2.0 - 1.0));\n\tlet m = l - c * 0.5;\n\n\tvar rgb = vec3<f32>(0.0);\n\tlet hi = u32(h * 6.0) % 6u;\n\tif (hi == 0u) { rgb = vec3<f32>(c, x, 0.0); }\n\telse if (hi == 1u) { rgb = vec3<f32>(x, c, 0.0); }\n\telse if (hi == 2u) { rgb = vec3<f32>(0.0, c, x); }\n\telse if (hi == 3u) { rgb = vec3<f32>(0.0, x, c); }\n\telse if (hi == 4u) { rgb = vec3<f32>(x, 0.0, c); }\n\telse { rgb = vec3<f32>(c, 0.0, x); }\n\treturn rgb + vec3<f32>(m);\n}\n\nfn lut_sample(x: f32) -> f32 {\n\tlet N = f32(${LUT_SIZE});\n\tlet uv_x = (x * (N - 1.0) + 0.5) / N;\n\treturn textureSampleLevel(t_lut, s_lut, vec2<f32>(uv_x, 0.5), 0.0).r;\n}\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n\tlet src = textureSampleLevel(t_src, s_src, in.uv, 0.0);\n\tif (src.a < 1e-5) { return src; }\n\n\tlet rgb = src.rgb / src.a;\n\tlet hsl = rgb_to_hsl(rgb);\n\n\tvar out_hsl = hsl;\n\n\tif (u.mode == 0u) {\n\t\tlet adj = lut_sample(hsl.x);\n\t\tout_hsl.x = fract(hsl.x + (adj - 0.5) * 2.0);\n\t} else if (u.mode == 1u) {\n\t\tlet adj = lut_sample(hsl.x);\n\t\tout_hsl.y = clamp(hsl.y * (adj * 2.0), 0.0, 1.0);\n\t} else if (u.mode == 2u) {\n\t\tlet adj = lut_sample(hsl.z);\n\t\tout_hsl.y = clamp(hsl.y * (adj * 2.0), 0.0, 1.0);\n\t} else {\n\t\tlet adj = lut_sample(hsl.y);\n\t\tout_hsl.y = clamp(adj, 0.0, 1.0);\n\t}\n\n\tlet out_rgb = clamp(hsl_to_rgb(out_hsl), vec3<f32>(0.0), vec3<f32>(1.0));\n\treturn vec4<f32>(out_rgb * src.a, src.a);\n}\n`;\nconst rgbResourceCache = /* @__PURE__ */ new WeakMap();\nconst hslResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getRgbResources(device, format) {\n\tlet res = rgbResourceCache.get(device);\n\tif (!res) {\n\t\tconst lutBGL = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\t\tconst srcBGL = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\t\tres = {\n\t\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\t\tlabel: \"CurvesRgbPipeline\",\n\t\t\t\tmodule: device.createShaderModule({\n\t\t\t\t\tlabel: \"curves-rgb.wgsl\",\n\t\t\t\t\tcode: CURVES_RGB_SHADER\n\t\t\t\t}),\n\t\t\t\tlayouts: [lutBGL, srcBGL],\n\t\t\t\tformat\n\t\t\t}),\n\t\t\tlutBindGroupLayout: lutBGL,\n\t\t\tsrcBindGroupLayout: srcBGL\n\t\t};\n\t\trgbResourceCache.set(device, res);\n\t}\n\treturn res;\n}\nfunction getHslResources(device, format) {\n\tlet res = hslResourceCache.get(device);\n\tif (!res) {\n\t\tconst uniformLayout = fragmentBindGroupLayout(device, [\n\t\t\t\"uniform\",\n\t\t\t\"texture\",\n\t\t\t\"sampler\"\n\t\t]);\n\t\tconst srcBGL = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\t\tres = {\n\t\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\t\tlabel: \"CurvesHslPipeline\",\n\t\t\t\tmodule: device.createShaderModule({\n\t\t\t\t\tlabel: \"curves-hsl.wgsl\",\n\t\t\t\t\tcode: CURVES_HSL_SHADER\n\t\t\t\t}),\n\t\t\t\tlayouts: [uniformLayout, srcBGL],\n\t\t\t\tformat\n\t\t\t}),\n\t\t\tuniformLayout,\n\t\t\tsrcBindGroupLayout: srcBGL\n\t\t};\n\t\thslResourceCache.set(device, res);\n\t}\n\treturn res;\n}\nconst LUT_CACHE_LIMIT = 32;\nconst deviceTextureCache = /* @__PURE__ */ new WeakMap();\nfunction getLut(device, configKey, build) {\n\tlet cache = deviceTextureCache.get(device);\n\tif (!cache) {\n\t\tcache = /* @__PURE__ */ new Map();\n\t\tdeviceTextureCache.set(device, cache);\n\t}\n\tconst hit = cache.get(configKey);\n\tif (hit) {\n\t\tcache.delete(configKey);\n\t\tcache.set(configKey, hit);\n\t\treturn hit;\n\t}\n\tconst texture = build();\n\tcache.set(configKey, texture);\n\tif (cache.size > LUT_CACHE_LIMIT) {\n\t\tconst [oldestKey, oldest] = cache.entries().next().value;\n\t\tcache.delete(oldestKey);\n\t\toldest.destroy();\n\t}\n\treturn texture;\n}\nfunction buildRgbLut(device, op) {\n\tconst masterSpline = solveMonotonicSpline(op.master || [{\n\t\tx: 0,\n\t\ty: 0\n\t}, {\n\t\tx: 1,\n\t\ty: 1\n\t}]);\n\tconst redSpline = solveMonotonicSpline(op.red || [{\n\t\tx: 0,\n\t\ty: 0\n\t}, {\n\t\tx: 1,\n\t\ty: 1\n\t}]);\n\tconst greenSpline = solveMonotonicSpline(op.green || [{\n\t\tx: 0,\n\t\ty: 0\n\t}, {\n\t\tx: 1,\n\t\ty: 1\n\t}]);\n\tconst blueSpline = solveMonotonicSpline(op.blue || [{\n\t\tx: 0,\n\t\ty: 0\n\t}, {\n\t\tx: 1,\n\t\ty: 1\n\t}]);\n\tconst lutData = new Uint8Array(LUT_SIZE * 4);\n\tfor (let i = 0; i < LUT_SIZE; i++) {\n\t\tconst masterVal = masterSpline(i / (LUT_SIZE - 1));\n\t\tconst r = Math.max(0, Math.min(1, redSpline(masterVal)));\n\t\tconst g = Math.max(0, Math.min(1, greenSpline(masterVal)));\n\t\tconst b = Math.max(0, Math.min(1, blueSpline(masterVal)));\n\t\tlutData[i * 4 + 0] = Math.round(r * 255);\n\t\tlutData[i * 4 + 1] = Math.round(g * 255);\n\t\tlutData[i * 4 + 2] = Math.round(b * 255);\n\t\tlutData[i * 4 + 3] = 255;\n\t}\n\tconst texture = device.createTexture({\n\t\tsize: [\n\t\t\tLUT_SIZE,\n\t\t\t1,\n\t\t\t1\n\t\t],\n\t\tdimension: \"2d\",\n\t\tformat: LUT_FORMAT,\n\t\tusage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST\n\t});\n\tdevice.queue.writeTexture({ texture }, lutData, { bytesPerRow: LUT_BYTES_PER_ROW }, [\n\t\tLUT_SIZE,\n\t\t1,\n\t\t1\n\t]);\n\treturn texture;\n}\nfunction buildHslLut(device, points) {\n\tconst spline = solveMonotonicSpline(points);\n\tconst lutData = new Uint8Array(LUT_SIZE * 4);\n\tfor (let i = 0; i < LUT_SIZE; i++) {\n\t\tconst u = i / (LUT_SIZE - 1);\n\t\tconst val = Math.round(Math.max(0, Math.min(1, spline(u))) * 255);\n\t\tlutData[i * 4 + 0] = val;\n\t\tlutData[i * 4 + 1] = val;\n\t\tlutData[i * 4 + 2] = val;\n\t\tlutData[i * 4 + 3] = 255;\n\t}\n\tconst texture = device.createTexture({\n\t\tsize: [\n\t\t\tLUT_SIZE,\n\t\t\t1,\n\t\t\t1\n\t\t],\n\t\tdimension: \"2d\",\n\t\tformat: LUT_FORMAT,\n\t\tusage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST\n\t});\n\tdevice.queue.writeTexture({ texture }, lutData, { bytesPerRow: LUT_BYTES_PER_ROW }, [\n\t\tLUT_SIZE,\n\t\t1,\n\t\t1\n\t]);\n\treturn texture;\n}\nconst HSL_MODE_MAP = {\n\t\"hue-vs-hue\": 0,\n\t\"hue-vs-sat\": 1,\n\t\"lum-vs-sat\": 2,\n\t\"sat-vs-sat\": 3\n};\nconst HSL_CURVE_KEY_MAP = {\n\t\"hue-vs-hue\": \"hueVsHue\",\n\t\"hue-vs-sat\": \"hueVsSat\",\n\t\"lum-vs-sat\": \"lumVsSat\",\n\t\"sat-vs-sat\": \"satVsSat\"\n};\nconst CurvesWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Curves\" || !props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst childMedia = props.virtualMedia.children[0];\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.nodeId || \"curves_fallback\";\n\tconst curveType = op.curveType || \"rgb\";\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\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\tif (curveType === \"rgb\") {\n\t\tconst configKey = JSON.stringify({\n\t\t\tcurveType,\n\t\t\tmaster: op.master,\n\t\t\tred: op.red,\n\t\t\tgreen: op.green,\n\t\t\tblue: op.blue\n\t\t});\n\t\tconst lut = getLut(ctx.device, configKey, () => buildRgbLut(ctx.device, op));\n\t\tconst { pipeline, lutBindGroupLayout, srcBindGroupLayout } = getRgbResources(ctx.device, ctx.renderer.format);\n\t\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [ctx.device.createBindGroup({\n\t\t\tlayout: lutBindGroupLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: lut.createView()\n\t\t\t}, {\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t}]\n\t\t}), ctx.renderer.bindGroupCache.getBindGroup(ctx.device, srcBindGroupLayout, tmpTex, sampler)]);\n\t} else {\n\t\tconst hslPoints = op[HSL_CURVE_KEY_MAP[curveType]] || [{\n\t\t\tx: 0,\n\t\t\ty: .5\n\t\t}, {\n\t\t\tx: 1,\n\t\t\ty: .5\n\t\t}];\n\t\tconst configKey = JSON.stringify({\n\t\t\tcurveType,\n\t\t\tpoints: hslPoints\n\t\t});\n\t\tconst lut = getLut(ctx.device, configKey, () => buildHslLut(ctx.device, hslPoints));\n\t\tconst uniformData = new Uint32Array([\n\t\t\tHSL_MODE_MAP[curveType] ?? 0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0\n\t\t]);\n\t\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\t\tconst { pipeline, uniformLayout, srcBindGroupLayout } = getHslResources(ctx.device, ctx.renderer.format);\n\t\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [ctx.device.createBindGroup({\n\t\t\tlayout: uniformLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: uniformBuffer }\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: lut.createView()\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}), ctx.renderer.bindGroupCache.getBindGroup(ctx.device, srcBindGroupLayout, tmpTex, sampler)]);\n\t}\n\tcomputeHistogramFromEncoder(ctx.device, encoder, outTex, nodeId);\n\tdrawTextureToTarget(args, outTex, props.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nconst rendererNode = defineRenderer({ WebGPURenderer: CurvesWebGPURenderer });\nvar renderers_default = rendererNode;\n\n//#endregion\nexport { renderers_default as n, solveMonotonicSpline as r, rendererNode as t };\n//# sourceMappingURL=renderers-DzdBU1io.mjs.map"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { n as defineRenderer } from "./renderer-mNSyac1V.mjs";
1
+ import { n as defineRenderer } from "./renderer-DrWeb39d.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-_iMAO698.mjs.map
658
+ //# sourceMappingURL=renderer-BVql26Ay.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-_iMAO698.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":";;;AAGA,SAAS,kBAAkB,OAAO;AACjC,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,oBAAoB,SAAS,OAAO,MAAM,kBAAkB;;AAKnH,MAAM,iBAAiB;AACvB,MAAM,cAAc;AACpB,MAAM,iBAAiB;AACvB,MAAM,aAAa;AACnB,MAAM,iBAAiB;AACvB,MAAM,gBAAgB;AACtB,MAAM,YAAY;AAClB,MAAM,cAAc;;;;;;;;;;uCAUmB,YAAY;;AAEnD,MAAM,WAAW;EACf,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAkGa,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgFrC,MAAM,YAAY;EAChB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqFd,MAAM,4BAA4B,IAAI,SAAS;AAC/C,SAAS,aAAa,QAAQ;CAC7B,IAAI,IAAI,UAAU,IAAI,OAAO;AAC7B,KAAI,EAAG,QAAO;CACd,MAAM,YAAY,OAAO,sBAAsB;EAC9C,OAAO;EACP,SAAS;GACR;IACC,SAAS;IACT,YAAY,eAAe;IAC3B,QAAQ,EAAE,MAAM,WAAW;IAC3B;GACD;IACC,SAAS;IACT,YAAY,eAAe;IAC3B,QAAQ,EAAE,MAAM,WAAW;IAC3B;GACD;IACC,SAAS;IACT,YAAY,eAAe;IAC3B,QAAQ,EAAE,MAAM,qBAAqB;IACrC;GACD;EACD,CAAC;AACF,KAAI;EACH;EACA,KAAK,OAAO,sBAAsB;GACjC,OAAO;GACP,QAAQ,OAAO,qBAAqB,EAAE,kBAAkB,CAAC,UAAU,EAAE,CAAC;GACtE,SAAS;IACR,QAAQ,OAAO,mBAAmB;KACjC,OAAO;KACP,MAAM;KACN,CAAC;IACF,YAAY;IACZ;GACD,CAAC;EACF,YAAY,OAAO,sBAAsB;GACxC,OAAO;GACP,SAAS,CAAC;IACT,SAAS;IACT,YAAY,eAAe,SAAS,eAAe;IACnD,QAAQ,EAAE,MAAM,WAAW;IAC3B,EAAE;IACF,SAAS;IACT,YAAY,eAAe;IAC3B,QAAQ,EAAE,MAAM,qBAAqB;IACrC,CAAC;GACF,CAAC;EACF,sBAAsB,IAAI,KAAK;EAC/B,YAAY,OAAO,mBAAmB;GACrC,OAAO;GACP,MAAM;GACN,CAAC;EACF;AACD,WAAU,IAAI,QAAQ,EAAE;AACxB,QAAO;;AAER,MAAM,SAAS;CACd,QAAQ;EACP,OAAO;GACN,WAAW;GACX,WAAW;GACX,WAAW;GACX;EACD,OAAO;GACN,WAAW;GACX,WAAW;GACX,WAAW;GACX;EACD;CACD,KAAK;EACJ,OAAO;GACN,WAAW;GACX,WAAW;GACX,WAAW;GACX;EACD,OAAO;GACN,WAAW;GACX,WAAW;GACX,WAAW;GACX;EACD;CACD,QAAQ;EACP,OAAO;GACN,WAAW;GACX,WAAW;GACX,WAAW;GACX;EACD,OAAO;GACN,WAAW;GACX,WAAW;GACX,WAAW;GACX;EACD;CACD;AACD,SAAS,aAAa,QAAQ,QAAQ,OAAO;CAC5C,MAAM,IAAI,aAAa,OAAO;CAC9B,MAAM,MAAM,GAAG,OAAO,GAAG;CACzB,IAAI,OAAO,EAAE,KAAK,IAAI,IAAI;AAC1B,KAAI,CAAC,MAAM;AACV,SAAO,OAAO,qBAAqB;GAClC,OAAO,kBAAkB;GACzB,QAAQ,OAAO,qBAAqB,EAAE,kBAAkB,CAAC,EAAE,WAAW,EAAE,CAAC;GACzE,QAAQ;IACP,QAAQ,EAAE;IACV,YAAY;IACZ;GACD,UAAU;IACT,QAAQ,EAAE;IACV,YAAY;IACZ,SAAS,CAAC;KACT;KACA,OAAO,OAAO;KACd,CAAC;IACF;GACD,WAAW,EAAE,UAAU,iBAAiB;GACxC,CAAC;AACF,IAAE,KAAK,IAAI,KAAK,KAAK;;AAEtB,QAAO;;AAER,MAAM,SAAS;CACd,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,OAAO;CACP;AACD,MAAM,WAAW;CAChB,OAAO;CACP,MAAM;CACN,MAAM;CACN,QAAQ;CACR,MAAM;CACN;AACD,MAAM,SAAS;CACd,MAAM;CACN,MAAM;CACN,QAAQ;CACR,MAAM;CACN;;AAED,SAAS,WAAW,GAAG,GAAG,KAAK,KAAK,MAAM;AACzC,KAAI,KAAK,EAAE;CACX,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,MAAM,IAAI,IAAI;EACpC;EACA;EACA;EACA;EACA,EAAE,IAAI,EAAE;CACT,MAAM,MAAM,KAAK,KAAK;AACtB,GAAE,GAAG,IAAI,IAAI,IAAI,MAAM,IAAI,WAAW,IAAI,UAAU;AACpD,GAAE,GAAG,EAAE,KAAK,EAAE,MAAM,IAAI,SAAS,EAAE,QAAQ,SAAS,IAAI,EAAE;AAC1D,GAAE,GAAG,EAAE,MAAM,OAAO,EAAE,MAAM,QAAQ,EAAE,QAAQ,IAAI,EAAE,QAAQ,GAAG;AAC/D,GAAE,GAAG,EAAE,MAAM,EAAE,MAAM,UAAU,EAAE,MAAM,OAAO,EAAE,MAAM,MAAM;CAC5D,MAAM,IAAI,EAAE;CACZ,MAAM,KAAK,EAAE,SAAS,KAAK,EAAE;CAC7B,MAAM,KAAK,EAAE,SAAS,KAAK,EAAE;AAC7B,GAAE,GAAG,SAAS,EAAE,QAAQ,IAAI,IAAI,EAAE,MAAM;AACxC,KAAI,EAAE,QAAS,GAAE,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,WAAW,GAAG,EAAE;AACpE,GAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,IAAI,EAAE,MAAM,GAAG;AAChD,GAAE,GAAG,EAAE,YAAY,KAAK,EAAE,SAAS,KAAK,EAAE,SAAS,IAAI,EAAE,SAAS,GAAG;CACrE,MAAM,aAAa,EAAE,WAAW,MAAM,GAAG,eAAe;AACxD,GAAE,GAAG,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,EAAE,QAAQ,WAAW,OAAO;AAClE,MAAK,MAAM,CAAC,GAAG,MAAM,WAAW,SAAS,CAAE,GAAE,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO;CACnF,MAAM,IAAI,EAAE,MAAM;AAClB,GAAE,IAAI,IAAI,IAAI,GAAG,EAAE,MAAM,YAAY,GAAG,EAAE,MAAM,SAAS,GAAG,EAAE,WAAW;AACzE,GAAE,IAAI,GAAG,WAAW,GAAG,GAAG,WAAW,GAAG,GAAG,UAAU,GAAG,GAAG,UAAU,EAAE;AACvE,GAAE,IAAI,GAAG,SAAS,GAAG,GAAG,UAAU,GAAG,EAAE,MAAM,GAAG,EAAE,MAAM,EAAE;AAC1D,GAAE,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK,GAAG;AACjD,GAAE,IAAI,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,OAAO,IAAI,GAAG,EAAE,gBAAgB,EAAE;CACvF,MAAM,SAAS,EAAE,OAAO,MAAM,GAAG,WAAW;AAC5C,GAAE,IAAI,OAAO,QAAQ,KAAK,QAAQ,KAAK,QAAQ,EAAE,QAAQ;AACzD,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,SAAS,CAAE,GAAE,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG;;AAEzE,SAAS,SAAS,SAAS,QAAQ;CAClC,MAAM,WAAW,QAAQ;AACzB,KAAI,YAAY,SAAS,WAAW,OAAQ,QAAO;CACnD,MAAM,IAAI,QAAQ;CAClB,MAAM,QAAQ;EACb;EACA,WAAW,OAAO,aAAa;GAC9B,OAAO;GACP,MAAM,EAAE,MAAM;GACd,OAAO,eAAe,UAAU,eAAe,WAAW,eAAe;GACzE,CAAC;EACF,OAAO;EACP,SAAS;EACT,OAAO;EACP,2BAA2B,IAAI,KAAK;EACpC,YAAY;EACZ,UAAU;EACV,KAAK,OAAO,aAAa;GACxB,OAAO;GACP,MAAM,cAAc;GACpB,OAAO,eAAe,UAAU,eAAe;GAC/C,CAAC;EACF;AACD,SAAQ,gBAAgB;AACxB,QAAO;;;AAGR,SAAS,WAAW,OAAO,GAAG;CAC7B,MAAM,IAAI,EAAE,MAAM;CAClB,MAAM,QAAQ,IAAI,EAAE,QAAQ,EAAE,SAAS;CACvC,MAAM,OAAO,KAAK,IAAI,IAAI,QAAQ,IAAI,EAAE;AACxC,KAAI,CAAC,MAAM,cAAc,MAAM,WAAW,MAAM;AAC/C,QAAM,YAAY,SAAS;AAC3B,QAAM,aAAa,MAAM,OAAO,aAAa;GAC5C,OAAO;GACP;GACA,OAAO,eAAe,UAAU,eAAe;GAC/C,CAAC;AACF,QAAM,WAAW;;AAElB,KAAI,GAAG;EACN,MAAM,OAAO,IAAI,aAAa,QAAQ,EAAE;AACxC,OAAK,IAAI,EAAE,KAAK,SAAS,GAAG,MAAM,CAAC;AACnC,OAAK,KAAK,EAAE,MAAM,YAAY,GAAG,KAAK,SAAS,GAAG,MAAM,EAAE,MAAM;AAChE,QAAM,OAAO,MAAM,YAAY,MAAM,YAAY,GAAG,KAAK;;AAE1D,QAAO,MAAM;;;AAGd,SAAS,QAAQ,SAAS,OAAO,OAAO,kBAAkB,KAAK;CAC9D,MAAM,EAAE,WAAW;CACnB,MAAM,IAAI,QAAQ;AAClB,KAAI,QAAQ,MAAM,SAAS,MAAM,QAAQ,GAAG;EAC3C,IAAI,OAAO;AACX,OAAK,MAAM,KAAK,MAAM,UAAU,MAAM,CAAE,KAAI,KAAK,SAAS,IAAI,KAAM,QAAO;EAC3E,MAAM,UAAU,OAAO,qBAAqB,EAAE,OAAO,qBAAqB,CAAC;AAC3E,MAAI,QAAQ,GAAG;GACd,MAAM,OAAO,MAAM,UAAU,IAAI,KAAK;AACtC,WAAQ,mBAAmB,KAAK,QAAQ,GAAG,MAAM,WAAW,GAAG,EAAE,MAAM,eAAe;AACtF,SAAM,UAAU,KAAK;AACrB,SAAM,QAAQ,KAAK;AACnB,SAAM,QAAQ;SACR;AACN,WAAQ,YAAY,MAAM,UAAU;AACpC,SAAM,UAAU;AAChB,SAAM,QAAQ;AACd,SAAM,QAAQ;;AAEf,SAAO,MAAM,OAAO,CAAC,QAAQ,QAAQ,CAAC,CAAC;;CAExC,MAAM,IAAI,aAAa,OAAO;CAC9B,MAAM,SAAS,IAAI,aAAa,cAAc,EAAE;CAChD,MAAM,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,SAAS,CAAC;CACpD,MAAM,UAAU,IAAI;CACpB,MAAM,gBAAgB,KAAK,MAAM,EAAE,UAAU,IAAI;AACjD,MAAK,IAAI,IAAI,MAAM,QAAQ,GAAG,KAAK,OAAO,KAAK;EAC9C,MAAM,QAAQ,MAAM,IAAI,gBAAgB,IAAI;AAC5C,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;GAC/B,MAAM,WAAW,MAAM,IAAI,IAAI,gBAAgB;GAC/C,MAAM,SAAS,QAAQ,cAAc,mBAAmB,KAAK,IAAI,GAAG,SAAS,EAAE,IAAI;AACnF,SAAM,SAAS,KAAK,IAAI,GAAG,OAAO,KAAK,GAAG;GAC1C,IAAI,OAAO,KAAK,MAAM,MAAM,MAAM;AAClC,SAAM,SAAS;AACf,WAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,MAAM,CAAC;AAC7C,UAAO,KAAK,IAAI,MAAM,EAAE,IAAI;GAC5B,MAAM,OAAO,WAAW,OAAO,OAAO;GACtC,MAAM,YAAY,OAAO,gBAAgB;IACxC,QAAQ,EAAE;IACV,SAAS;KACR;MACC,SAAS;MACT,UAAU,EAAE,QAAQ,MAAM,KAAK;MAC/B;KACD;MACC,SAAS;MACT,UAAU,EAAE,QAAQ,MAAM,WAAW;MACrC;KACD;MACC,SAAS;MACT,UAAU,EAAE,QAAQ,MAAM;MAC1B;KACD;IACD,CAAC;AACF,QAAK,IAAI,IAAI,GAAG,IAAI,UAAU,KAAK;AAClC,eAAW,GAAG,QAAQ,QAAQ;KAC7B,IAAI,UAAU;KACd,OAAO,WAAW,IAAI,YAAY;KAClC,WAAW,MAAM;KACjB,WAAW,MAAM,IAAI,OAAO;KAC5B;KACA,EAAE;KACF,QAAQ;KACR,QAAQ;KACR,CAAC;AACF,WAAO,MAAM,YAAY,MAAM,KAAK,GAAG,OAAO;IAC9C,MAAM,UAAU,OAAO,qBAAqB,EAAE,OAAO,kBAAkB,CAAC;IACxE,MAAM,OAAO,QAAQ,iBAAiB,EAAE,OAAO,iBAAiB,CAAC;AACjE,SAAK,YAAY,EAAE,IAAI;AACvB,SAAK,aAAa,GAAG,UAAU;AAC/B,SAAK,mBAAmB,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;AACrD,SAAK,KAAK;AACV,WAAO,MAAM,OAAO,CAAC,QAAQ,QAAQ,CAAC,CAAC;;AAExC,SAAM,WAAW;;AAElB,QAAM,QAAQ;AACd,MAAI,IAAI,mBAAmB,KAAK,CAAC,MAAM,UAAU,IAAI,EAAE,IAAI,MAAM,UAAU,OAAO,eAAe;GAChG,MAAM,SAAS,OAAO,aAAa;IAClC,OAAO,sBAAsB;IAC7B,MAAM,EAAE,MAAM;IACd,OAAO,eAAe,WAAW,eAAe;IAChD,CAAC;GACF,MAAM,UAAU,OAAO,qBAAqB,EAAE,OAAO,sBAAsB,CAAC;AAC5E,WAAQ,mBAAmB,MAAM,WAAW,GAAG,QAAQ,GAAG,EAAE,MAAM,eAAe;AACjF,UAAO,MAAM,OAAO,CAAC,QAAQ,QAAQ,CAAC,CAAC;AACvC,SAAM,UAAU,IAAI,GAAG;IACtB;IACA,SAAS,MAAM;IACf,OAAO,MAAM;IACb,CAAC;;;;AAIL,MAAM,0BAA0B,OAAO,SAAS;CAC/C,MAAM,EAAE,KAAK,SAAS,MAAM,YAAY,aAAa,cAAc,UAAU;CAC7E,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,eAAe,CAAC,kBAAkB,GAAG,OAAO,CAAE;CAC7D,MAAM,UAAU,GAAG;CACnB,MAAM,IAAI,QAAQ;CAClB,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,SAAS,EAAE,CAAC;CACvD,MAAM,mBAAmB,KAAK,MAAM,MAAM,oBAAoB,MAAM;CACpE,MAAM,mBAAmB,mBAAmB;CAC5C,MAAM,QAAQ,SAAS,SAAS,IAAI,OAAO;AAC3C,SAAQ,SAAS,OAAO,OAAO,kBAAkB,IAAI;AACrD,MAAK,KAAK;CACV,MAAM,SAAS,IAAI,aAAa,cAAc,EAAE;AAChD,YAAW,GAAG,QAAQ,cAAc,kBAAkB,IAAI,EAAE,QAAQ;EACnE,IAAI;EACJ,MAAM;EACN,WAAW;EACX,WAAW;EACX,SAAS,IAAI;EACb,EAAE;EACF,QAAQ,cAAc,EAAE,MAAM;EAC9B,QAAQ,eAAe,EAAE,MAAM;EAC/B,CAAC;CACF,MAAM,MAAM,IAAI,SAAS,mBAAmB,OAAO;CACnD,MAAM,OAAO,IAAI,SAAS,WAAW,SAAS,YAAY;EACzD,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,EAAE,aAAa,cAAc,OAAO;AACrC,MAAK,YAAY,aAAa,IAAI,QAAQ,IAAI,SAAS,QAAQ,EAAE,MAAM,CAAC;AACxE,MAAK,aAAa,GAAG,IAAI,OAAO,gBAAgB;EAC/C,QAAQ,aAAa,IAAI,OAAO,CAAC;EACjC,SAAS,CAAC;GACT,SAAS;GACT,UAAU,EAAE,QAAQ,KAAK;GACzB,EAAE;GACF,SAAS;GACT,UAAU,EAAE,QAAQ,MAAM,WAAW;GACrC,CAAC;EACF,CAAC,CAAC;AACH,MAAK,KAAK,GAAG,EAAE,IAAI;AACnB,MAAK,KAAK;;AAKX,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,yBAAyB,CAAC"}
1
+ {"version":3,"file":"renderer-BVql26Ay.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,7 +1,7 @@
1
- import "./chunk-BcJoO4Nm.mjs";
2
- import { n as defineRenderer } from "./renderer-mNSyac1V.mjs";
3
- import "./dist-C1cCW7Bt.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-CMaa63nz.mjs";
1
+ import "./chunk-D8S17ehY.mjs";
2
+ import { n as defineRenderer } from "./renderer-DrWeb39d.mjs";
3
+ import "./dist-D12-a3-x.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-zFNrvhV9.mjs";
5
5
 
6
6
  //#region ../../nodes/node-toon/dist/renderers-BsjrUZoi.mjs
7
7
  const OP = "Toon";
@@ -216,4 +216,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: ToonWebGPURenderer });
216
216
 
217
217
  //#endregion
218
218
  export { ToonWebGPURenderer, renderers_default as default };
219
- //# sourceMappingURL=renderer-CHr7MiYW.mjs.map
219
+ //# sourceMappingURL=renderer-BWMzjSgf.mjs.map