framefields 2.11.0 → 2.13.0

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 (540) hide show
  1. package/NOTICE.md +4 -0
  2. package/dist/audio/index.d.mts +6 -5
  3. package/dist/audio/index.mjs +13 -13
  4. package/dist/{audio-CYZkDwae.d.mts → audio-CHV33Od9.d.mts} +3 -4
  5. package/dist/audio-CHV33Od9.d.mts.map +1 -0
  6. package/dist/{audio-BuCVk1IQ.mjs → audio-DHzLQ_RG.mjs} +4 -4
  7. package/dist/{audio-BuCVk1IQ.mjs.map → audio-DHzLQ_RG.mjs.map} +1 -1
  8. package/dist/{audio-KHBadECb.mjs → audio-DS9Jg2ls.mjs} +1 -1
  9. package/dist/{audio-KHBadECb.mjs.map → audio-DS9Jg2ls.mjs.map} +1 -1
  10. package/dist/{check-result-Culfu7Nx.mjs → check-result-DZWx73V8.mjs} +1 -1
  11. package/dist/{check-result-Culfu7Nx.mjs.map → check-result-DZWx73V8.mjs.map} +1 -1
  12. package/dist/cli/check-worker.mjs +51 -51
  13. package/dist/cli/check-worker.mjs.map +1 -1
  14. package/dist/cli/local-worker.d.mts +28 -0
  15. package/dist/cli/local-worker.d.mts.map +1 -0
  16. package/dist/cli/local-worker.mjs +83 -0
  17. package/dist/cli/local-worker.mjs.map +1 -0
  18. package/dist/cli.mjs +390 -124
  19. package/dist/cli.mjs.map +1 -1
  20. package/dist/cloud/index.d.mts +16 -3
  21. package/dist/cloud/index.d.mts.map +1 -1
  22. package/dist/cloud/index.mjs +2 -2
  23. package/dist/cloud-Cj1TIme8.mjs +685 -0
  24. package/dist/cloud-Cj1TIme8.mjs.map +1 -0
  25. package/dist/components/index.d.mts +15 -14
  26. package/dist/components/index.mjs +47 -47
  27. package/dist/{dist-CySGkG54.mjs → dist-BSKAbyea.mjs} +2 -2
  28. package/dist/dist-BSKAbyea.mjs.map +1 -0
  29. package/dist/{dist-CNGv-JTX.mjs → dist-B_rSWeOz.mjs} +1 -1
  30. package/dist/{dist-Bf2_efYP.mjs → dist-C8XSqfTx.mjs} +1 -1
  31. package/dist/{dist-Bf2_efYP.mjs.map → dist-C8XSqfTx.mjs.map} +1 -1
  32. package/dist/{dist-EQX3TUUl.mjs → dist-CUNvNDS3.mjs} +129 -82
  33. package/dist/dist-CUNvNDS3.mjs.map +1 -0
  34. package/dist/dist-CiTgmfUw.mjs +502 -0
  35. package/dist/dist-CiTgmfUw.mjs.map +1 -0
  36. package/dist/{dist-CWLLnigL.mjs → dist-D3BeAZ7X.mjs} +315 -84
  37. package/dist/dist-D3BeAZ7X.mjs.map +1 -0
  38. package/dist/{dist-BIE8fvlv.mjs → dist-DgZpN6IK.mjs} +1 -1
  39. package/dist/{dist-BIE8fvlv.mjs.map → dist-DgZpN6IK.mjs.map} +1 -1
  40. package/dist/{dist-Dg9LMWoX.mjs → dist-Kbf-JTry.mjs} +2 -2
  41. package/dist/{dist-Dg9LMWoX.mjs.map → dist-Kbf-JTry.mjs.map} +1 -1
  42. package/dist/effects/index.d.mts +6 -6
  43. package/dist/effects/index.mjs +36 -36
  44. package/dist/{effects-DKLbLXF7.mjs → effects-BiDgCK1L.mjs} +3 -3
  45. package/dist/{effects-DKLbLXF7.mjs.map → effects-BiDgCK1L.mjs.map} +1 -1
  46. package/dist/fonts/index.d.mts +1 -1
  47. package/dist/fonts/index.mjs +3 -3
  48. package/dist/{fonts-gPbGbShD.mjs → fonts-DeDPWdvJ.mjs} +2 -2
  49. package/dist/{fonts-gPbGbShD.mjs.map → fonts-DeDPWdvJ.mjs.map} +1 -1
  50. package/dist/{gpu-CpkJJLQP.mjs → gpu-CWjgql4C.mjs} +11 -3
  51. package/dist/gpu-CWjgql4C.mjs.map +1 -0
  52. package/dist/index-BFTtXosj.d.mts +63 -0
  53. package/dist/index-BFTtXosj.d.mts.map +1 -0
  54. package/dist/{index-BW0Q1ygn.d.mts → index-C5sgRLlG.d.mts} +1 -1
  55. package/dist/{index-BW0Q1ygn.d.mts.map → index-C5sgRLlG.d.mts.map} +1 -1
  56. package/dist/{index-CdCrae-I.d.mts → index-CnZhBlob.d.mts} +2 -2
  57. package/dist/index-CnZhBlob.d.mts.map +1 -0
  58. package/dist/{index-D2i9J9Zq.d.mts → index-D68eGFNE.d.mts} +3 -30
  59. package/dist/index-D68eGFNE.d.mts.map +1 -0
  60. package/dist/{index-CEU_Zsb9.d.mts → index-DBh3WphX.d.mts} +25 -23
  61. package/dist/index-DBh3WphX.d.mts.map +1 -0
  62. package/dist/{index-gOVtTm-P.d.mts → index-DQ1U3HC3.d.mts} +14 -6
  63. package/dist/index-DQ1U3HC3.d.mts.map +1 -0
  64. package/dist/{index-jSDEM-uE.d.mts → index-Dibc_xpC.d.mts} +6 -6
  65. package/dist/{index-jSDEM-uE.d.mts.map → index-Dibc_xpC.d.mts.map} +1 -1
  66. package/dist/{index-Cro-818i.d.mts → index-E2IXX0Cz.d.mts} +88 -14
  67. package/dist/index-E2IXX0Cz.d.mts.map +1 -0
  68. package/dist/{index-BuiZzc6i.d.mts → index-X2u96TEo.d.mts} +162 -5
  69. package/dist/index-X2u96TEo.d.mts.map +1 -0
  70. package/dist/{index-Bly-7YM1.d.mts → index-YB9j9KUx.d.mts} +3 -3
  71. package/dist/{index-Bly-7YM1.d.mts.map → index-YB9j9KUx.d.mts.map} +1 -1
  72. package/dist/{index-COYNQ_mf.d.mts → index-a6JrbAK0.d.mts} +1 -1
  73. package/dist/{index-COYNQ_mf.d.mts.map → index-a6JrbAK0.d.mts.map} +1 -1
  74. package/dist/{index-C8YwZ6k1.d.mts → index-rtCXNxGO.d.mts} +2 -2
  75. package/dist/{index-C8YwZ6k1.d.mts.map → index-rtCXNxGO.d.mts.map} +1 -1
  76. package/dist/index.d.mts +16 -15
  77. package/dist/index.mjs +58 -58
  78. package/dist/preview/index.d.mts +5 -4
  79. package/dist/preview/index.mjs +12 -12
  80. package/dist/{preview-BToKUTtZ.mjs → preview-PDz7o2xg.mjs} +323 -35
  81. package/dist/preview-PDz7o2xg.mjs.map +1 -0
  82. package/dist/preview-engine/audio.mjs +1 -1
  83. package/dist/preview-engine/{chunk-QF4JWVO3.mjs → chunk-35XSD4QM.mjs} +15 -15
  84. package/dist/preview-engine/{chunk-ZF2MEFKO.mjs → chunk-3DOIE4DV.mjs} +1 -1
  85. package/dist/preview-engine/{chunk-JDB7PMRI.mjs → chunk-3IT7LHWR.mjs} +1 -1
  86. package/dist/preview-engine/{chunk-DNNGWS2C.mjs → chunk-3MLGWUSK.mjs} +1 -1
  87. package/dist/preview-engine/{chunk-KVOFO273.mjs → chunk-3QJ5GRBH.mjs} +1 -1
  88. package/dist/preview-engine/{chunk-54Q5CKSV.mjs → chunk-3QTHW2CD.mjs} +1 -1
  89. package/dist/preview-engine/chunk-44V4V5LD.mjs +1 -0
  90. package/dist/preview-engine/chunk-4P3MMJWD.mjs +1 -0
  91. package/dist/preview-engine/chunk-4YT5YJIF.mjs +1 -0
  92. package/dist/preview-engine/{chunk-BJXNKMSY.mjs → chunk-64L4GUOF.mjs} +20 -6
  93. package/dist/preview-engine/{chunk-UMJ3VGKN.mjs → chunk-6B3NOY5W.mjs} +1 -1
  94. package/dist/preview-engine/chunk-77MT33VR.mjs +1 -0
  95. package/dist/preview-engine/{chunk-BRV7TQDV.mjs → chunk-77WWW75O.mjs} +1 -1
  96. package/dist/preview-engine/chunk-7M5LE6EM.mjs +483 -0
  97. package/dist/preview-engine/chunk-A6OAPDIA.mjs +1 -0
  98. package/dist/preview-engine/chunk-ADLIF544.mjs +39 -0
  99. package/dist/preview-engine/{chunk-OLB4TQLQ.mjs → chunk-AKVRG7UU.mjs} +1 -1
  100. package/dist/preview-engine/{chunk-CIVEZJYF.mjs → chunk-CRBOK3JT.mjs} +1 -1
  101. package/dist/preview-engine/chunk-CSLSWUUT.mjs +1 -0
  102. package/dist/preview-engine/{chunk-ACBBBOUM.mjs → chunk-CYM75INB.mjs} +1 -1
  103. package/dist/preview-engine/{chunk-JSYG6OWZ.mjs → chunk-D7OMXGIZ.mjs} +1 -1
  104. package/dist/preview-engine/{chunk-EPRINA4V.mjs → chunk-E7BKWHOT.mjs} +10 -10
  105. package/dist/preview-engine/{chunk-NOKPBMIP.mjs → chunk-EWDJMJO5.mjs} +1 -1
  106. package/dist/preview-engine/{chunk-5KSBS3AL.mjs → chunk-EYE3GNL5.mjs} +1 -1
  107. package/dist/preview-engine/chunk-FRJPXWAG.mjs +1 -0
  108. package/dist/preview-engine/{chunk-IKVJ4MW5.mjs → chunk-G4ZTSLZU.mjs} +1 -1
  109. package/dist/preview-engine/{chunk-VZLIRYAL.mjs → chunk-GAMAKN5L.mjs} +1 -1
  110. package/dist/preview-engine/{chunk-ZIXPWP2B.mjs → chunk-ICWD36H6.mjs} +1 -1
  111. package/dist/preview-engine/{chunk-OELPPLML.mjs → chunk-IEEV5RB3.mjs} +1 -1
  112. package/dist/preview-engine/chunk-JAAFSVAG.mjs +1 -0
  113. package/dist/preview-engine/{chunk-YVZTRH4Y.mjs → chunk-KDCM7S3S.mjs} +1 -1
  114. package/dist/preview-engine/chunk-LZNHGH56.mjs +5 -0
  115. package/dist/preview-engine/{chunk-O63FLYWC.mjs → chunk-N2VISDTG.mjs} +1 -1
  116. package/dist/preview-engine/{chunk-GN3NDRLI.mjs → chunk-NCQHOGZK.mjs} +1 -1
  117. package/dist/preview-engine/{chunk-YKM7JDQY.mjs → chunk-NJO2BIJX.mjs} +1 -1
  118. package/dist/preview-engine/{chunk-7GMHSTRP.mjs → chunk-NTSALWFF.mjs} +1 -1
  119. package/dist/preview-engine/{chunk-PKNUTHPI.mjs → chunk-NVXFEDJS.mjs} +1 -1
  120. package/dist/preview-engine/{chunk-VFQH5KVS.mjs → chunk-ONHY4KNY.mjs} +1 -1
  121. package/dist/preview-engine/{chunk-Z24UEN4P.mjs → chunk-PD2HKW2S.mjs} +1 -1
  122. package/dist/preview-engine/chunk-PH3UUX6A.mjs +138 -0
  123. package/dist/preview-engine/chunk-PIHG6HJO.mjs +1 -0
  124. package/dist/preview-engine/{chunk-YHMBGJP6.mjs → chunk-QPT2Y2GZ.mjs} +1 -1
  125. package/dist/preview-engine/{chunk-4AGQN53P.mjs → chunk-QXLFTCLC.mjs} +1 -1
  126. package/dist/preview-engine/{chunk-65NANVQL.mjs → chunk-R4H52Q7S.mjs} +1 -1
  127. package/dist/preview-engine/{chunk-FQL4IJZN.mjs → chunk-RN7J5TRU.mjs} +1 -1
  128. package/dist/preview-engine/{chunk-26XWIHW3.mjs → chunk-RVCLMO5Q.mjs} +1 -1
  129. package/dist/preview-engine/{chunk-VQA4DYZU.mjs → chunk-RYSV44B4.mjs} +1 -1
  130. package/dist/preview-engine/{chunk-TEWRQKX3.mjs → chunk-SFHWP65D.mjs} +1 -1
  131. package/dist/preview-engine/{chunk-RDWLLITE.mjs → chunk-SMHEMYCV.mjs} +1 -1
  132. package/dist/preview-engine/{chunk-EXEO245X.mjs → chunk-SV3ZNZQU.mjs} +1 -1
  133. package/dist/preview-engine/{chunk-32WC4FRR.mjs → chunk-UE7Y65C3.mjs} +3 -3
  134. package/dist/preview-engine/chunk-UFPA36D2.mjs +2227 -0
  135. package/dist/preview-engine/{chunk-EAWJXW4J.mjs → chunk-UVEDFIPN.mjs} +1 -1
  136. package/dist/preview-engine/{chunk-6LTINEA4.mjs → chunk-VMXJZ4KQ.mjs} +1 -1
  137. package/dist/preview-engine/{chunk-IBPYV6HF.mjs → chunk-W4XR6F5G.mjs} +1 -1
  138. package/dist/preview-engine/{chunk-UI3VH33L.mjs → chunk-WPYWCWWL.mjs} +1 -1
  139. package/dist/preview-engine/{chunk-GHTG5XV6.mjs → chunk-XYCR3STG.mjs} +84 -25
  140. package/dist/preview-engine/{chunk-WFMUDL55.mjs → chunk-YAPGJZPI.mjs} +1 -1
  141. package/dist/preview-engine/{chunk-LMXMBX4J.mjs → chunk-YJ4DSRDY.mjs} +1 -1
  142. package/dist/preview-engine/{chunk-CCORQLMR.mjs → chunk-YOJKIMU5.mjs} +1 -1
  143. package/dist/preview-engine/{chunk-UGB6JKVS.mjs → chunk-ZHNEZZ6A.mjs} +1 -1
  144. package/dist/preview-engine/{chunk-LFNCWMKS.mjs → chunk-ZZMI3WOT.mjs} +1 -1
  145. package/dist/preview-engine/components.mjs +1 -1
  146. package/dist/preview-engine/effects.mjs +1 -1
  147. package/dist/preview-engine/fonts.mjs +1 -1
  148. package/dist/preview-engine/framefields.mjs +1 -1
  149. package/dist/preview-engine/player.mjs +5 -5
  150. package/dist/preview-engine/{renderers-53EI26GL.mjs → renderers-3FZVDYRQ.mjs} +1 -1
  151. package/dist/preview-engine/renderers-3KEBYOOF.mjs +1 -0
  152. package/dist/preview-engine/{renderers-6YVZUQOH.mjs → renderers-4RPQSUUZ.mjs} +1 -1
  153. package/dist/preview-engine/renderers-5EGFXFPF.mjs +1 -0
  154. package/dist/preview-engine/renderers-5SJHYUTM.mjs +1 -0
  155. package/dist/preview-engine/renderers-66MWDUN6.mjs +1 -0
  156. package/dist/preview-engine/{renderers-CCRZNGVK.mjs → renderers-6FENMFSC.mjs} +1 -1
  157. package/dist/preview-engine/renderers-77OXJ2GY.mjs +1 -0
  158. package/dist/preview-engine/renderers-7LI4QKHO.mjs +1 -0
  159. package/dist/preview-engine/renderers-AFTUFMQQ.mjs +1 -0
  160. package/dist/preview-engine/{renderers-CYJAVWHT.mjs → renderers-AIZRIW2R.mjs} +1 -1
  161. package/dist/preview-engine/{renderers-OGOW3NA4.mjs → renderers-BDI2BDBA.mjs} +1 -1
  162. package/dist/preview-engine/renderers-BDXCO6NR.mjs +1 -0
  163. package/dist/preview-engine/{renderers-EN7LXJLG.mjs → renderers-BUZ67FNZ.mjs} +1 -1
  164. package/dist/preview-engine/renderers-DMTGKURQ.mjs +1 -0
  165. package/dist/preview-engine/renderers-DU7KPFVV.mjs +1 -0
  166. package/dist/preview-engine/{renderers-WSABL3QO.mjs → renderers-ECXMT5BD.mjs} +1 -1
  167. package/dist/preview-engine/{renderers-MOEC2XZZ.mjs → renderers-EILFSWSJ.mjs} +1 -1
  168. package/dist/preview-engine/renderers-EPSF5CSQ.mjs +1 -0
  169. package/dist/preview-engine/{renderers-X6CORAES.mjs → renderers-EVEWFJ7U.mjs} +1 -1
  170. package/dist/preview-engine/renderers-F6PT2LON.mjs +1 -0
  171. package/dist/preview-engine/renderers-F7WPJXKT.mjs +1 -0
  172. package/dist/preview-engine/renderers-FIFF267S.mjs +1 -0
  173. package/dist/preview-engine/{renderers-GQM3KMV3.mjs → renderers-FQISHQEN.mjs} +1 -1
  174. package/dist/preview-engine/{renderers-HKLCB4U6.mjs → renderers-FXAVFNUN.mjs} +1 -1
  175. package/dist/preview-engine/{renderers-P2HORBZ6.mjs → renderers-GITAVRYZ.mjs} +1 -1
  176. package/dist/preview-engine/renderers-GTKRV225.mjs +1 -0
  177. package/dist/preview-engine/{renderers-KCGK33Y2.mjs → renderers-HG6JZIZO.mjs} +1 -1
  178. package/dist/preview-engine/{renderers-I6QKZ7CH.mjs → renderers-HHWMIDN3.mjs} +1 -1
  179. package/dist/preview-engine/renderers-HI3SRJVD.mjs +1 -0
  180. package/dist/preview-engine/{renderers-7CAHX35U.mjs → renderers-HXEDI4BD.mjs} +1 -1
  181. package/dist/preview-engine/{renderers-77PDUMYI.mjs → renderers-HXNSDJBY.mjs} +1 -1
  182. package/dist/preview-engine/{renderers-ACUJMDEK.mjs → renderers-I2ZOUFRU.mjs} +1 -1
  183. package/dist/preview-engine/renderers-JHFD4LHZ.mjs +1 -0
  184. package/dist/preview-engine/{renderers-IHGAWLUF.mjs → renderers-JMSAW7VY.mjs} +1 -1
  185. package/dist/preview-engine/renderers-KGVZUFHD.mjs +1 -0
  186. package/dist/preview-engine/{renderers-RN2MHIFK.mjs → renderers-KICDB5Y6.mjs} +1 -1
  187. package/dist/preview-engine/{renderers-C7SI3NIE.mjs → renderers-KKULMOV4.mjs} +1 -1
  188. package/dist/preview-engine/{renderers-HSFQIILN.mjs → renderers-KMVMPYY7.mjs} +1 -1
  189. package/dist/preview-engine/renderers-LN7WPG6I.mjs +1 -0
  190. package/dist/preview-engine/{renderers-BOBVXYAA.mjs → renderers-LWW4RF6D.mjs} +1 -1
  191. package/dist/preview-engine/renderers-LY57CZZB.mjs +1 -0
  192. package/dist/preview-engine/renderers-MBMJWZEW.mjs +1 -0
  193. package/dist/preview-engine/{renderers-VVP5WQOY.mjs → renderers-MPFU74I3.mjs} +1 -1
  194. package/dist/preview-engine/{renderers-H6PBHEYU.mjs → renderers-MW53LTMB.mjs} +1 -1
  195. package/dist/preview-engine/{renderers-PPZK6VEW.mjs → renderers-NQC4DPX4.mjs} +1 -1
  196. package/dist/preview-engine/renderers-OJWWIVNW.mjs +1 -0
  197. package/dist/preview-engine/{renderers-4IBFDW2S.mjs → renderers-PC2GOZDT.mjs} +1 -1
  198. package/dist/preview-engine/{renderers-UG2C3C7T.mjs → renderers-Q77UPEYE.mjs} +1 -1
  199. package/dist/preview-engine/renderers-QHXCFDHI.mjs +1 -0
  200. package/dist/preview-engine/renderers-RDYJRNAR.mjs +1 -0
  201. package/dist/preview-engine/renderers-RENLKAA7.mjs +1 -0
  202. package/dist/preview-engine/renderers-RHMRWX46.mjs +1 -0
  203. package/dist/preview-engine/{renderers-5XLGCEOA.mjs → renderers-RIPXT4AL.mjs} +1 -1
  204. package/dist/preview-engine/{renderers-FY2HOQCS.mjs → renderers-SFVFAS3C.mjs} +1 -1
  205. package/dist/preview-engine/{renderers-VIGZYJYX.mjs → renderers-SWQVCJHB.mjs} +1 -1
  206. package/dist/preview-engine/renderers-SZVDZDY7.mjs +1 -0
  207. package/dist/preview-engine/renderers-TTXTV4PC.mjs +228 -0
  208. package/dist/preview-engine/renderers-TYSLUZ53.mjs +1 -0
  209. package/dist/preview-engine/{renderers-6LNDAO4B.mjs → renderers-U4IXWMD6.mjs} +1 -1
  210. package/dist/preview-engine/renderers-VEHYARKY.mjs +1 -0
  211. package/dist/preview-engine/renderers-VRXAG3FR.mjs +1 -0
  212. package/dist/preview-engine/{renderers-33FCFHDR.mjs → renderers-VUQAZ56P.mjs} +1 -1
  213. package/dist/preview-engine/renderers-W5YFMLSB.mjs +1 -0
  214. package/dist/preview-engine/renderers-XKDWUK56.mjs +1 -0
  215. package/dist/preview-engine/renderers-XKSBNCLZ.mjs +1 -0
  216. package/dist/preview-engine/renderers-XLQXVD37.mjs +1 -0
  217. package/dist/preview-engine/renderers-ZHSOWEMQ.mjs +1 -0
  218. package/dist/preview-engine/renderers-ZMDRNYSS.mjs +1 -0
  219. package/dist/preview-engine/signals.mjs +1 -1
  220. package/dist/preview-engine/{src-4IUYUKIZ.mjs → src-YXNX4MLK.mjs} +1 -1
  221. package/dist/{program-Bc860ko5.mjs → program-Bn6ko_I4.mjs} +44 -17
  222. package/dist/program-Bn6ko_I4.mjs.map +1 -0
  223. package/dist/renderer/index.d.mts +4 -3
  224. package/dist/renderer/index.mjs +3 -3
  225. package/dist/{renderer-B3Dme2es.mjs → renderer--Q0pM9Vh.mjs} +5 -5
  226. package/dist/{renderer-B3Dme2es.mjs.map → renderer--Q0pM9Vh.mjs.map} +1 -1
  227. package/dist/renderer-1aSF5BmY.mjs +5 -0
  228. package/dist/{renderer-CAWnCsQc.mjs → renderer-45ifiDkn.mjs} +5 -5
  229. package/dist/{renderer-CAWnCsQc.mjs.map → renderer-45ifiDkn.mjs.map} +1 -1
  230. package/dist/{renderer-Cz-n883J.mjs → renderer-549d94qG.mjs} +5 -5
  231. package/dist/{renderer-Cz-n883J.mjs.map → renderer-549d94qG.mjs.map} +1 -1
  232. package/dist/{renderer-BhsrlGKp.mjs → renderer-B-LUGB9h.mjs} +74 -21
  233. package/dist/renderer-B-LUGB9h.mjs.map +1 -0
  234. package/dist/renderer-B2e4Gr9u.mjs +5 -0
  235. package/dist/{renderer-B1LD29TV.mjs → renderer-B5b-ehRb.mjs} +3 -3
  236. package/dist/{renderer-B1LD29TV.mjs.map → renderer-B5b-ehRb.mjs.map} +1 -1
  237. package/dist/renderer-B6fz4j50.mjs +5 -0
  238. package/dist/{renderer-_9gbYS-3.mjs → renderer-BCTUqJG7.mjs} +5 -5
  239. package/dist/{renderer-_9gbYS-3.mjs.map → renderer-BCTUqJG7.mjs.map} +1 -1
  240. package/dist/renderer-BEftIYw-.mjs +5 -0
  241. package/dist/{renderer-C9BSXyrq.mjs → renderer-BHPgkoEL.mjs} +4 -4
  242. package/dist/{renderer-C9BSXyrq.mjs.map → renderer-BHPgkoEL.mjs.map} +1 -1
  243. package/dist/renderer-BHTnO-7e.mjs +5 -0
  244. package/dist/{renderer-fs8f1QeE.mjs → renderer-BIieU9pY.mjs} +5 -5
  245. package/dist/{renderer-fs8f1QeE.mjs.map → renderer-BIieU9pY.mjs.map} +1 -1
  246. package/dist/{renderer-DwK9jsER.mjs → renderer-BKi6jDi_.mjs} +4 -4
  247. package/dist/{renderer-DwK9jsER.mjs.map → renderer-BKi6jDi_.mjs.map} +1 -1
  248. package/dist/renderer-BMlnQqTO.mjs +5 -0
  249. package/dist/{renderer-BNJ6Jk7-.mjs → renderer-BMpmmYOq.mjs} +4 -4
  250. package/dist/{renderer-BNJ6Jk7-.mjs.map → renderer-BMpmmYOq.mjs.map} +1 -1
  251. package/dist/{renderer-DkqZmfm8.mjs → renderer-BO_wuUKA.mjs} +5 -5
  252. package/dist/{renderer-DkqZmfm8.mjs.map → renderer-BO_wuUKA.mjs.map} +1 -1
  253. package/dist/renderer-BOzcFezY.mjs +5 -0
  254. package/dist/{renderer-Bxjb0HYU.mjs → renderer-BPOh9x5X.mjs} +4 -4
  255. package/dist/{renderer-Bxjb0HYU.mjs.map → renderer-BPOh9x5X.mjs.map} +1 -1
  256. package/dist/{renderer-Ros7XQg2.mjs → renderer-BPiWsrC2.mjs} +3 -3
  257. package/dist/{renderer-Ros7XQg2.mjs.map → renderer-BPiWsrC2.mjs.map} +1 -1
  258. package/dist/{renderer-lHNTgiOM.mjs → renderer-BUj7jE6t.mjs} +3 -3
  259. package/dist/{renderer-lHNTgiOM.mjs.map → renderer-BUj7jE6t.mjs.map} +1 -1
  260. package/dist/renderer-BVbjJIKJ.mjs +5 -0
  261. package/dist/renderer-BXsHKf4k.mjs +5 -0
  262. package/dist/{renderer-D0aAZHC7.mjs → renderer-BZgJj8Cl.mjs} +4 -4
  263. package/dist/{renderer-D0aAZHC7.mjs.map → renderer-BZgJj8Cl.mjs.map} +1 -1
  264. package/dist/{renderer-V4dhrf_h.mjs → renderer-BgjPbgbn.mjs} +6 -6
  265. package/dist/{renderer-V4dhrf_h.mjs.map → renderer-BgjPbgbn.mjs.map} +1 -1
  266. package/dist/{renderer-BaIJIfJ6.mjs → renderer-BjgFpwVK.mjs} +5 -5
  267. package/dist/{renderer-BaIJIfJ6.mjs.map → renderer-BjgFpwVK.mjs.map} +1 -1
  268. package/dist/renderer-Bks49NVl.mjs +5 -0
  269. package/dist/{renderer-CU8v-LxD.mjs → renderer-BlZgyBSo.mjs} +5 -5
  270. package/dist/{renderer-CU8v-LxD.mjs.map → renderer-BlZgyBSo.mjs.map} +1 -1
  271. package/dist/{renderer-B6Oeahe_.mjs → renderer-BqUAyzCZ.mjs} +5 -5
  272. package/dist/{renderer-B6Oeahe_.mjs.map → renderer-BqUAyzCZ.mjs.map} +1 -1
  273. package/dist/{renderer-h62QaJYz.mjs → renderer-Br8km655.mjs} +4 -4
  274. package/dist/{renderer-h62QaJYz.mjs.map → renderer-Br8km655.mjs.map} +1 -1
  275. package/dist/{renderer-sfqZK6L5.mjs → renderer-BsMZ5Iaq.mjs} +4 -4
  276. package/dist/{renderer-sfqZK6L5.mjs.map → renderer-BsMZ5Iaq.mjs.map} +1 -1
  277. package/dist/{renderer-g_1t2je9.mjs → renderer-BtgqTg2K.mjs} +3 -3
  278. package/dist/{renderer-DcvjSolU.mjs → renderer-BuvKGwk3.mjs} +11 -2
  279. package/dist/{renderer-DcvjSolU.mjs.map → renderer-BuvKGwk3.mjs.map} +1 -1
  280. package/dist/{renderer-BOrMBwQS.mjs → renderer-C-3qhk5x.mjs} +2 -2
  281. package/dist/{renderer-BOrMBwQS.mjs.map → renderer-C-3qhk5x.mjs.map} +1 -1
  282. package/dist/{renderer-CLAvn9c6.mjs → renderer-C-GTxnfv.mjs} +4 -4
  283. package/dist/{renderer-CLAvn9c6.mjs.map → renderer-C-GTxnfv.mjs.map} +1 -1
  284. package/dist/renderer-C-t7qFKr.mjs +5 -0
  285. package/dist/{renderer-BDZC3o3N.mjs → renderer-C1ctHdXl.mjs} +4 -4
  286. package/dist/{renderer-BDZC3o3N.mjs.map → renderer-C1ctHdXl.mjs.map} +1 -1
  287. package/dist/renderer-C24n-6CX.mjs +6 -0
  288. package/dist/{renderer-pNmI-A9o.mjs → renderer-C7m7Yxgc.mjs} +5 -5
  289. package/dist/{renderer-pNmI-A9o.mjs.map → renderer-C7m7Yxgc.mjs.map} +1 -1
  290. package/dist/{renderer-Bf4-N7k7.mjs → renderer-C9dqx3U7.mjs} +5 -5
  291. package/dist/{renderer-Bf4-N7k7.mjs.map → renderer-C9dqx3U7.mjs.map} +1 -1
  292. package/dist/renderer-CCReX-7M.mjs +5 -0
  293. package/dist/{renderer-JHByuUNb.mjs → renderer-CE4535aW.mjs} +3 -3
  294. package/dist/{renderer-JHByuUNb.mjs.map → renderer-CE4535aW.mjs.map} +1 -1
  295. package/dist/renderer-CIxFQrAm.mjs +5 -0
  296. package/dist/{renderer-ByjaseAo.mjs → renderer-CL-vyXgX.mjs} +5 -5
  297. package/dist/{renderer-ByjaseAo.mjs.map → renderer-CL-vyXgX.mjs.map} +1 -1
  298. package/dist/renderer-CLHBMIqJ.mjs +5 -0
  299. package/dist/renderer-CMJKi-Ye.mjs +5 -0
  300. package/dist/{renderer-B-CMRUag.mjs → renderer-CMnlgAGs.mjs} +4 -4
  301. package/dist/{renderer-B-CMRUag.mjs.map → renderer-CMnlgAGs.mjs.map} +1 -1
  302. package/dist/{renderer-BNHcwxw9.mjs → renderer-CQFMyC_c.mjs} +4 -4
  303. package/dist/{renderer-BNHcwxw9.mjs.map → renderer-CQFMyC_c.mjs.map} +1 -1
  304. package/dist/{renderer-DgPn_SOC.mjs → renderer-CYwVNbUh.mjs} +4 -4
  305. package/dist/{renderer-DgPn_SOC.mjs.map → renderer-CYwVNbUh.mjs.map} +1 -1
  306. package/dist/{renderer-DLPhfwbR.mjs → renderer-CZ5mwBW1.mjs} +3 -3
  307. package/dist/{renderer-DLPhfwbR.mjs.map → renderer-CZ5mwBW1.mjs.map} +1 -1
  308. package/dist/{renderer-4ZUv3X1I.mjs → renderer-C_1eqfI0.mjs} +5 -5
  309. package/dist/{renderer-4ZUv3X1I.mjs.map → renderer-C_1eqfI0.mjs.map} +1 -1
  310. package/dist/renderer-C_H3mHZa.mjs +5 -0
  311. package/dist/{renderer-B1esRxGy.mjs → renderer-CciiDHuU.mjs} +4 -4
  312. package/dist/{renderer-B1esRxGy.mjs.map → renderer-CciiDHuU.mjs.map} +1 -1
  313. package/dist/renderer-CfkTdR5B.mjs +5 -0
  314. package/dist/{renderer-ynFRJh7G.mjs → renderer-CgK7Q1G8.mjs} +3 -3
  315. package/dist/{renderer-CR0mDPYY.mjs → renderer-CnL8Cmmr.mjs} +3 -3
  316. package/dist/renderer-CnhkXJ0R.mjs +5 -0
  317. package/dist/{renderer-fwKnV9zs.mjs → renderer-Cp_HOmp7.mjs} +5 -5
  318. package/dist/{renderer-fwKnV9zs.mjs.map → renderer-Cp_HOmp7.mjs.map} +1 -1
  319. package/dist/renderer-CqpyVsq_.mjs +5 -0
  320. package/dist/renderer-CtWgIpTE.mjs +5 -0
  321. package/dist/{renderer-riIFosX6.mjs → renderer-Cu3iKMSJ.mjs} +5 -5
  322. package/dist/{renderer-riIFosX6.mjs.map → renderer-Cu3iKMSJ.mjs.map} +1 -1
  323. package/dist/{renderer-D4f8f66C.mjs → renderer-CuPAQjDK.mjs} +4 -4
  324. package/dist/{renderer-D4f8f66C.mjs.map → renderer-CuPAQjDK.mjs.map} +1 -1
  325. package/dist/{renderer-CxGx1Lhi.mjs → renderer-CwlY8Tb-.mjs} +3 -3
  326. package/dist/{renderer-CxGx1Lhi.mjs.map → renderer-CwlY8Tb-.mjs.map} +1 -1
  327. package/dist/{renderer-o68mVeyk.mjs → renderer-CxSFvKd1.mjs} +4 -4
  328. package/dist/{renderer-o68mVeyk.mjs.map → renderer-CxSFvKd1.mjs.map} +1 -1
  329. package/dist/{renderer-CrR8Mpxq.mjs → renderer-CyUiXLRa.mjs} +5 -5
  330. package/dist/{renderer-CrR8Mpxq.mjs.map → renderer-CyUiXLRa.mjs.map} +1 -1
  331. package/dist/renderer-CyuKr5ca.mjs +5 -0
  332. package/dist/renderer-CzgcZXKH.mjs +3 -0
  333. package/dist/{renderer-Bx14Wnxl.mjs → renderer-D-GWBoVT.mjs} +58 -4
  334. package/dist/renderer-D-GWBoVT.mjs.map +1 -0
  335. package/dist/{renderer-BwrfKKqw.mjs → renderer-D-fzEZfX.mjs} +4 -4
  336. package/dist/{renderer-BwrfKKqw.mjs.map → renderer-D-fzEZfX.mjs.map} +1 -1
  337. package/dist/renderer-D5yp74NL.mjs +3 -0
  338. package/dist/{renderer-DAn9xiQT.mjs → renderer-D8gN7aqk.mjs} +4 -4
  339. package/dist/{renderer-DAn9xiQT.mjs.map → renderer-D8gN7aqk.mjs.map} +1 -1
  340. package/dist/renderer-D9ON_1Hf.mjs +5 -0
  341. package/dist/renderer-DAnTgh4o.mjs +5 -0
  342. package/dist/{renderer-Dpl6poqD.mjs → renderer-DGOMfyh8.mjs} +2 -2
  343. package/dist/{renderer-Dpl6poqD.mjs.map → renderer-DGOMfyh8.mjs.map} +1 -1
  344. package/dist/{renderer-Rw87u1Cr.mjs → renderer-DGb_wgTW.mjs} +6 -6
  345. package/dist/{renderer-Rw87u1Cr.mjs.map → renderer-DGb_wgTW.mjs.map} +1 -1
  346. package/dist/{renderer-Co6UFbZB.mjs → renderer-DJPZs_zV.mjs} +5 -5
  347. package/dist/{renderer-Co6UFbZB.mjs.map → renderer-DJPZs_zV.mjs.map} +1 -1
  348. package/dist/renderer-DKJOon6y.d.mts +1 -0
  349. package/dist/{renderer-DOkbn1ot.mjs → renderer-DOZPZTxe.mjs} +5 -5
  350. package/dist/{renderer-DOkbn1ot.mjs.map → renderer-DOZPZTxe.mjs.map} +1 -1
  351. package/dist/{renderer-DaXQgGg3.mjs → renderer-DRal7Goa.mjs} +5 -5
  352. package/dist/{renderer-DaXQgGg3.mjs.map → renderer-DRal7Goa.mjs.map} +1 -1
  353. package/dist/renderer-DWgpivA3.mjs +5 -0
  354. package/dist/{renderer-Bo7shNdU.mjs → renderer-DXFJv_e6.mjs} +4 -4
  355. package/dist/{renderer-Bo7shNdU.mjs.map → renderer-DXFJv_e6.mjs.map} +1 -1
  356. package/dist/renderer-Dh_qNNwR.mjs +5 -0
  357. package/dist/renderer-DkCpXPMP.mjs +5 -0
  358. package/dist/{renderer-eMCTAa9e.mjs → renderer-Dp5ChuOs.mjs} +4 -4
  359. package/dist/{renderer-eMCTAa9e.mjs.map → renderer-Dp5ChuOs.mjs.map} +1 -1
  360. package/dist/{renderer-1uoKiILq.mjs → renderer-DpZballM.mjs} +3 -3
  361. package/dist/{renderer-1uoKiILq.mjs.map → renderer-DpZballM.mjs.map} +1 -1
  362. package/dist/renderer-Dre-6cDR.mjs +5 -0
  363. package/dist/renderer-Ds5z4_HX.mjs +5 -0
  364. package/dist/{renderer-7ow5Acsg.mjs → renderer-DwGlDNOV.mjs} +3 -3
  365. package/dist/{renderer-7ow5Acsg.mjs.map → renderer-DwGlDNOV.mjs.map} +1 -1
  366. package/dist/{renderer-q7q6k_cD.mjs → renderer-DxB_OfLs.mjs} +4 -4
  367. package/dist/{renderer-q7q6k_cD.mjs.map → renderer-DxB_OfLs.mjs.map} +1 -1
  368. package/dist/{renderer-DFJWPqOJ.mjs → renderer-Dz6P-rPI.mjs} +3 -3
  369. package/dist/{renderer-DFJWPqOJ.mjs.map → renderer-Dz6P-rPI.mjs.map} +1 -1
  370. package/dist/{renderer-BURhYcpA.mjs → renderer-FPiLBwj5.mjs} +4 -4
  371. package/dist/{renderer-BURhYcpA.mjs.map → renderer-FPiLBwj5.mjs.map} +1 -1
  372. package/dist/renderer-HGSCOMyP.mjs +5 -0
  373. package/dist/renderer-KMY8W-cJ.mjs +5 -0
  374. package/dist/{renderer-D-QVGphn.mjs → renderer-KgsVk9c6.mjs} +4 -4
  375. package/dist/{renderer-D-QVGphn.mjs.map → renderer-KgsVk9c6.mjs.map} +1 -1
  376. package/dist/{renderer-COcKhouz.mjs → renderer-LXhEPCmy.mjs} +5 -5
  377. package/dist/{renderer-COcKhouz.mjs.map → renderer-LXhEPCmy.mjs.map} +1 -1
  378. package/dist/{renderer-HDj9Zb-O.mjs → renderer-NBMmvqWl.mjs} +20 -7
  379. package/dist/renderer-NBMmvqWl.mjs.map +1 -0
  380. package/dist/{renderer-DE9Jik9K.mjs → renderer-Nnu32rqg.mjs} +3 -3
  381. package/dist/{renderer-DE9Jik9K.mjs.map → renderer-Nnu32rqg.mjs.map} +1 -1
  382. package/dist/renderer-R21YvXz3.mjs +5 -0
  383. package/dist/{renderer-celhuAL7.mjs → renderer-RAq3LnNy.mjs} +3 -3
  384. package/dist/{renderer-celhuAL7.mjs.map → renderer-RAq3LnNy.mjs.map} +1 -1
  385. package/dist/renderer-RtzCz37W.mjs +5 -0
  386. package/dist/{renderer-50JEMaVo.mjs → renderer-RzkU_O1i.mjs} +5 -5
  387. package/dist/{renderer-50JEMaVo.mjs.map → renderer-RzkU_O1i.mjs.map} +1 -1
  388. package/dist/{renderer-Bbxh4N8Y.mjs → renderer-S9tVGneU.mjs} +95 -80
  389. package/dist/renderer-S9tVGneU.mjs.map +1 -0
  390. package/dist/{renderer-BSELd5vU.mjs → renderer-SJyp9-62.mjs} +3 -3
  391. package/dist/{renderer-BSELd5vU.mjs.map → renderer-SJyp9-62.mjs.map} +1 -1
  392. package/dist/{renderer-jnAIhWn_.mjs → renderer-_54hiCq0.mjs} +5 -5
  393. package/dist/{renderer-jnAIhWn_.mjs.map → renderer-_54hiCq0.mjs.map} +1 -1
  394. package/dist/{renderer-88C3QpKL.d.mts → renderer-aRk849b3.d.mts} +2 -2
  395. package/dist/{renderer-88C3QpKL.d.mts.map → renderer-aRk849b3.d.mts.map} +1 -1
  396. package/dist/{renderer-BQetXCcZ.mjs → renderer-dGEMVaZ3.mjs} +4 -4
  397. package/dist/{renderer-BQetXCcZ.mjs.map → renderer-dGEMVaZ3.mjs.map} +1 -1
  398. package/dist/{renderer-RvI3qRUI.mjs → renderer-dRXP2dJU.mjs} +5 -5
  399. package/dist/{renderer-RvI3qRUI.mjs.map → renderer-dRXP2dJU.mjs.map} +1 -1
  400. package/dist/{renderer-D06HxSXO.mjs → renderer-g9SstkTz.mjs} +3 -3
  401. package/dist/renderer-iMrqAjix.mjs +5 -0
  402. package/dist/{renderer-BJ-7WRgO.mjs → renderer-opVuiAQR.mjs} +3 -3
  403. package/dist/{renderer-BJ-7WRgO.mjs.map → renderer-opVuiAQR.mjs.map} +1 -1
  404. package/dist/{renderer-KKk7myX1.mjs → renderer-puQhVfDS.mjs} +5 -5
  405. package/dist/{renderer-KKk7myX1.mjs.map → renderer-puQhVfDS.mjs.map} +1 -1
  406. package/dist/renderer-sMed1u1O.mjs +5 -0
  407. package/dist/renderer-tsAuo46l.mjs +5 -0
  408. package/dist/{renderer-TKZCA0B9.mjs → renderer-vll8LX0I.mjs} +211 -72
  409. package/dist/renderer-vll8LX0I.mjs.map +1 -0
  410. package/dist/{renderers-CP8CFWDs-DRoslK4F.mjs → renderers-CP8CFWDs-BRQyvcut.mjs} +4 -4
  411. package/dist/{renderers-CP8CFWDs-DRoslK4F.mjs.map → renderers-CP8CFWDs-BRQyvcut.mjs.map} +1 -1
  412. package/dist/sam/index.d.mts +3 -3
  413. package/dist/sam/index.mjs +1 -1
  414. package/dist/signals/index.d.mts +7 -7
  415. package/dist/signals/index.mjs +8 -8
  416. package/dist/{signals-BfJ1aqpT.mjs → signals-tiho_9fp.mjs} +4 -4
  417. package/dist/{signals-BfJ1aqpT.mjs.map → signals-tiho_9fp.mjs.map} +1 -1
  418. package/dist/{src-Bnr8DUC--BRDqRF6I.mjs → src-BU6vm9sP-DdTHmCr4.mjs} +76 -11
  419. package/dist/src-BU6vm9sP-DdTHmCr4.mjs.map +1 -0
  420. package/dist/{src-BYp6r-cS.mjs → src-BzFGotRc.mjs} +250 -30
  421. package/dist/src-BzFGotRc.mjs.map +1 -0
  422. package/dist/storage/index.d.mts +206 -0
  423. package/dist/storage/index.d.mts.map +1 -0
  424. package/dist/storage/index.mjs +3 -0
  425. package/package.json +67 -59
  426. package/dist/audio-CYZkDwae.d.mts.map +0 -1
  427. package/dist/cloud-xcfV4J03.mjs +0 -233
  428. package/dist/cloud-xcfV4J03.mjs.map +0 -1
  429. package/dist/dist-CWLLnigL.mjs.map +0 -1
  430. package/dist/dist-CySGkG54.mjs.map +0 -1
  431. package/dist/dist-EQX3TUUl.mjs.map +0 -1
  432. package/dist/gpu-CpkJJLQP.mjs.map +0 -1
  433. package/dist/index-BuiZzc6i.d.mts.map +0 -1
  434. package/dist/index-CEU_Zsb9.d.mts.map +0 -1
  435. package/dist/index-CdCrae-I.d.mts.map +0 -1
  436. package/dist/index-Cro-818i.d.mts.map +0 -1
  437. package/dist/index-D2i9J9Zq.d.mts.map +0 -1
  438. package/dist/index-gOVtTm-P.d.mts.map +0 -1
  439. package/dist/preview-BToKUTtZ.mjs.map +0 -1
  440. package/dist/preview-engine/chunk-4FY4TNST.mjs +0 -1
  441. package/dist/preview-engine/chunk-7LDSMOO3.mjs +0 -1
  442. package/dist/preview-engine/chunk-AGAZJZWI.mjs +0 -1
  443. package/dist/preview-engine/chunk-BXPM5SJ3.mjs +0 -1
  444. package/dist/preview-engine/chunk-C4M3B2Q2.mjs +0 -1
  445. package/dist/preview-engine/chunk-CIVJXFWH.mjs +0 -4
  446. package/dist/preview-engine/chunk-D73ZKPFN.mjs +0 -138
  447. package/dist/preview-engine/chunk-KOVN277Z.mjs +0 -1
  448. package/dist/preview-engine/chunk-M4QANUJI.mjs +0 -480
  449. package/dist/preview-engine/chunk-P4Y3PMJF.mjs +0 -1
  450. package/dist/preview-engine/chunk-SE2C623Z.mjs +0 -5
  451. package/dist/preview-engine/chunk-XF6DYP6B.mjs +0 -1974
  452. package/dist/preview-engine/chunk-XYGDTPO7.mjs +0 -39
  453. package/dist/preview-engine/chunk-YGKO4NIU.mjs +0 -1
  454. package/dist/preview-engine/renderers-2NGIILMI.mjs +0 -1
  455. package/dist/preview-engine/renderers-466Z77BH.mjs +0 -1
  456. package/dist/preview-engine/renderers-4KRENGZA.mjs +0 -1
  457. package/dist/preview-engine/renderers-4W52BQEU.mjs +0 -1
  458. package/dist/preview-engine/renderers-55PRAS7G.mjs +0 -1
  459. package/dist/preview-engine/renderers-5LLYINHW.mjs +0 -1
  460. package/dist/preview-engine/renderers-63N3Y2XO.mjs +0 -1
  461. package/dist/preview-engine/renderers-6ROVFDIN.mjs +0 -1
  462. package/dist/preview-engine/renderers-A4RVLPMG.mjs +0 -1
  463. package/dist/preview-engine/renderers-A53P4J6O.mjs +0 -1
  464. package/dist/preview-engine/renderers-AFJ3373L.mjs +0 -1
  465. package/dist/preview-engine/renderers-ATFWTA3U.mjs +0 -1
  466. package/dist/preview-engine/renderers-BPYJXHBU.mjs +0 -1
  467. package/dist/preview-engine/renderers-D3ZF7FXT.mjs +0 -1
  468. package/dist/preview-engine/renderers-D7YN6B4B.mjs +0 -1
  469. package/dist/preview-engine/renderers-DBLASKF5.mjs +0 -1
  470. package/dist/preview-engine/renderers-DC5ZYYHM.mjs +0 -1
  471. package/dist/preview-engine/renderers-J6ZEXW5L.mjs +0 -1
  472. package/dist/preview-engine/renderers-JV4MF46Q.mjs +0 -1
  473. package/dist/preview-engine/renderers-KQKH4ZIX.mjs +0 -1
  474. package/dist/preview-engine/renderers-MDHPQY6D.mjs +0 -1
  475. package/dist/preview-engine/renderers-MEITHN4N.mjs +0 -1
  476. package/dist/preview-engine/renderers-MN3HSBTJ.mjs +0 -1
  477. package/dist/preview-engine/renderers-NTG3QGNH.mjs +0 -1
  478. package/dist/preview-engine/renderers-OU4SFMB2.mjs +0 -1
  479. package/dist/preview-engine/renderers-P6TIBJIG.mjs +0 -1
  480. package/dist/preview-engine/renderers-POJWQ7L3.mjs +0 -1
  481. package/dist/preview-engine/renderers-RJ7S6VHD.mjs +0 -1
  482. package/dist/preview-engine/renderers-RJJAJZYN.mjs +0 -1
  483. package/dist/preview-engine/renderers-UEQ733VK.mjs +0 -1
  484. package/dist/preview-engine/renderers-ULO2AW2U.mjs +0 -1
  485. package/dist/preview-engine/renderers-UPVHGHCK.mjs +0 -1
  486. package/dist/preview-engine/renderers-UZHSNNIM.mjs +0 -1
  487. package/dist/preview-engine/renderers-V5KWZL2C.mjs +0 -1
  488. package/dist/preview-engine/renderers-WL372W36.mjs +0 -228
  489. package/dist/preview-engine/renderers-YMXKYOHQ.mjs +0 -1
  490. package/dist/preview-engine/renderers-YWDAZ2NZ.mjs +0 -1
  491. package/dist/program-Bc860ko5.mjs.map +0 -1
  492. package/dist/renderer--Ymc_4XJ.mjs +0 -5
  493. package/dist/renderer-B-OdV-eq.mjs +0 -5
  494. package/dist/renderer-B65fwoA2.mjs +0 -5
  495. package/dist/renderer-B92Ahkcv.mjs +0 -5
  496. package/dist/renderer-B9z2AK31.mjs +0 -5
  497. package/dist/renderer-BIF3Dg3Z.mjs +0 -5
  498. package/dist/renderer-BJUVaIAT.mjs +0 -5
  499. package/dist/renderer-BKRDMbI-.mjs +0 -5
  500. package/dist/renderer-BSwhyVWa.mjs +0 -5
  501. package/dist/renderer-BUqSZn2X.mjs +0 -5
  502. package/dist/renderer-BVKOQarx.d.mts +0 -99
  503. package/dist/renderer-BVKOQarx.d.mts.map +0 -1
  504. package/dist/renderer-BbmvjqK9.mjs +0 -3
  505. package/dist/renderer-Bbxh4N8Y.mjs.map +0 -1
  506. package/dist/renderer-BhsrlGKp.mjs.map +0 -1
  507. package/dist/renderer-Bpe4k_x6.mjs +0 -5
  508. package/dist/renderer-Bx14Wnxl.mjs.map +0 -1
  509. package/dist/renderer-C1NjG0CJ.mjs +0 -5
  510. package/dist/renderer-C7Puyst9.mjs +0 -5
  511. package/dist/renderer-CGA_7320.mjs +0 -5
  512. package/dist/renderer-CLnFkXO7.mjs +0 -5
  513. package/dist/renderer-CMQIT1Kh.mjs +0 -5
  514. package/dist/renderer-CQ1rwjIh.mjs +0 -5
  515. package/dist/renderer-CT8h0boY.mjs +0 -5
  516. package/dist/renderer-Cb0lszt3.mjs +0 -5
  517. package/dist/renderer-Ci7oLye9.mjs +0 -5
  518. package/dist/renderer-CjqXB3CZ.mjs +0 -5
  519. package/dist/renderer-CqTV04zQ.mjs +0 -5
  520. package/dist/renderer-CtWeRtHK.mjs +0 -5
  521. package/dist/renderer-CzolnwCo.mjs +0 -5
  522. package/dist/renderer-D6qhcx_C.mjs +0 -5
  523. package/dist/renderer-DDfEf0jt.mjs +0 -5
  524. package/dist/renderer-DDpa8ztp.mjs +0 -5
  525. package/dist/renderer-DbQBqzmx.mjs +0 -5
  526. package/dist/renderer-DfUcwMKa.mjs +0 -5
  527. package/dist/renderer-DgIjNANM.mjs +0 -6
  528. package/dist/renderer-Dsh6Tgu0.mjs +0 -3
  529. package/dist/renderer-DuIwR9GT.mjs +0 -5
  530. package/dist/renderer-Dv4u2c14.mjs +0 -5
  531. package/dist/renderer-HDj9Zb-O.mjs.map +0 -1
  532. package/dist/renderer-IE1yu3lZ.mjs +0 -5
  533. package/dist/renderer-PY_wnEN0.mjs +0 -5
  534. package/dist/renderer-TKZCA0B9.mjs.map +0 -1
  535. package/dist/renderer-gv24VyzO.mjs +0 -5
  536. package/dist/renderer-nN6lPZf9.mjs +0 -5
  537. package/dist/src-BYp6r-cS.mjs.map +0 -1
  538. package/dist/src-Bnr8DUC--BRDqRF6I.mjs.map +0 -1
  539. /package/dist/{chunk-W71TSjRM.mjs → chunk-DOL2i2sR.mjs} +0 -0
  540. /package/dist/{renderer-B6rZUBwE.mjs → renderer-Co2YqWX0.mjs} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-BOrMBwQS.mjs","names":[],"sources":["../../../nodes/node-particles/dist/renderers-C4F7TVQQ.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\n\n//#region src/shared/program.ts\nfunction isParticleProgram(value) {\n\treturn typeof value === \"object\" && value !== null && \"particleStatic\" in value && typeof value.particleFrame === \"function\";\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst PARTICLE_BYTES = 32;\nconst PARAM_VEC4S = 32;\nconst MAX_ATTRACTORS = 8;\nconst MAX_COLORS = 8;\nconst SNAPSHOT_EVERY = 24;\nconst MAX_SNAPSHOTS = 64;\nconst WORKGROUP = 64;\nconst COMMON_WGSL = `\nstruct Particle {\n\tpos : vec2<f32>,\n\tvel : vec2<f32>,\n\tage : f32,\n\tlife : f32,\n\tjitter : f32,\n\t_pad : f32,\n};\n\nstruct Params { v : array<vec4<f32>, ${PARAM_VEC4S}> };\n`;\nconst SIM_WGSL = `\n${COMMON_WGSL}\n@group(0) @binding(0) var<uniform> P : Params;\n@group(0) @binding(1) var<storage, read_write> particles : array<Particle>;\n@group(0) @binding(2) var<storage, read> mask : array<f32>;\n\nfn pcg(v : u32) -> u32 {\n\tlet state = v * 747796405u + 2891336453u;\n\tlet word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\n\treturn (word >> 22u) ^ word;\n}\nfn rnd(idx : u32, channel : u32, seed : u32) -> f32 {\n\treturn f32(pcg(idx * 16u + channel + pcg(seed))) / 4294967295.0;\n}\n\nfn hash2(p : vec2<f32>) -> f32 {\n\tlet q = fract(p * vec2<f32>(0.1031, 0.1030));\n\tlet r = q + dot(q, q.yx + 33.33);\n\treturn fract((r.x + r.y) * r.x);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\tlet a = hash2(i);\n\tlet b = hash2(i + vec2<f32>(1.0, 0.0));\n\tlet c = hash2(i + vec2<f32>(0.0, 1.0));\n\tlet d = hash2(i + vec2<f32>(1.0, 1.0));\n\treturn mix(mix(a, b, u.x), mix(c, d, u.x), u.y);\n}\nfn fbm(p : vec2<f32>) -> f32 {\n\treturn vnoise(p) * 0.6 + vnoise(p * 2.03 + 17.0) * 0.3 + vnoise(p * 4.01 + 41.0) * 0.1;\n}\n// Divergence-free flow: the curl of a scalar noise field.\nfn curl(p : vec2<f32>) -> vec2<f32> {\n\tlet e = 0.02;\n\tlet dx = fbm(p + vec2<f32>(e, 0.0)) - fbm(p - vec2<f32>(e, 0.0));\n\tlet dy = fbm(p + vec2<f32>(0.0, e)) - fbm(p - vec2<f32>(0.0, e));\n\treturn vec2<f32>(dy, -dx) / (2.0 * e);\n}\n\nfn maskAt(cell : vec2<f32>, offset : u32) -> f32 {\n\tlet w = i32(P.v[18].x);\n\tlet h = i32(P.v[18].y);\n\tlet c0 = vec2<i32>(floor(cell));\n\tlet t = cell - floor(cell);\n\tvar s = 0.0;\n\tfor (var k = 0; k < 4; k++) {\n\t\tlet o = vec2<i32>(k & 1, k >> 1);\n\t\tlet c = c0 + o;\n\t\tvar v = 0.0;\n\t\tif (c.x >= 0 && c.y >= 0 && c.x < w && c.y < h) {\n\t\t\tv = mask[offset + u32(c.y * w + c.x)];\n\t\t}\n\t\tlet wx = select(1.0 - t.x, t.x, o.x == 1);\n\t\tlet wy = select(1.0 - t.y, t.y, o.y == 1);\n\t\ts += v * wx * wy;\n\t}\n\treturn s;\n}\n\nfn spawn(i : u32, idx : u32, birthFrac : f32) {\n\tlet birthAge = birthFrac * P.v[1].z;\n\tlet seed = u32(P.v[1].y);\n\tlet shape = u32(P.v[4].x);\n\tlet ex = P.v[4].y; let ey = P.v[4].z; let ew = P.v[4].w;\n\tlet eh = P.v[5].x; let er = P.v[5].y;\n\tlet r0 = rnd(idx, 0u, seed); let r1 = rnd(idx, 1u, seed);\n\tvar pos = vec2<f32>(ex, ey);\n\tvar center = vec2<f32>(ex, ey);\n\tif (shape == 1u) { pos = vec2<f32>(ex + ew * r0, ey + eh * r0); center = vec2<f32>(ex + ew * 0.5, ey + eh * 0.5); }\n\telse if (shape == 2u) { pos = vec2<f32>(ex + ew * r0, ey + eh * r1); center = vec2<f32>(ex + ew * 0.5, ey + eh * 0.5); }\n\telse if (shape == 3u) {\n\t\tlet a = r0 * 6.2831853; let rr = er * sqrt(r1);\n\t\tpos = vec2<f32>(ex + cos(a) * rr, ey + sin(a) * rr);\n\t} else if (shape == 4u) {\n\t\tlet a = r0 * 6.2831853;\n\t\tpos = vec2<f32>(ex + cos(a) * er, ey + sin(a) * er);\n\t}\n\tlet radial = P.v[1].w > 0.5;\n\tvar dir = P.v[6].x + (rnd(idx, 2u, seed) - 0.5) * P.v[6].y;\n\tif (radial) {\n\t\tlet d = pos - center;\n\t\tif (dot(d, d) > 1e-6) { dir = atan2(d.y, d.x) + (rnd(idx, 2u, seed) - 0.5) * P.v[6].y; }\n\t}\n\t// A moving emitter: older births of the frame start nearer last frame's spot.\n\tif (P.v[30].z > 0.5) { pos += (P.v[30].xy - vec2<f32>(ex, ey)) * birthFrac; }\n\tlet speed = mix(P.v[5].z, P.v[5].w, rnd(idx, 3u, seed));\n\tlet vel = vec2<f32>(cos(dir), sin(dir)) * speed;\n\tvar p : Particle;\n\tp.vel = vel;\n\tp.pos = pos + vel * birthAge;\n\tp.age = birthAge;\n\tp.life = mix(P.v[6].z, P.v[6].w, rnd(idx, 4u, seed));\n\tp.jitter = 1.0 - P.v[16].w * rnd(idx, 5u, seed);\n\tp._pad = 0.0;\n\tparticles[i] = p;\n}\n\n@compute @workgroup_size(${WORKGROUP})\nfn simulate(@builtin(global_invocation_id) gid : vec3<u32>) {\n\tlet i = gid.x;\n\tlet maxN = u32(P.v[1].x);\n\tif (i >= maxN) { return; }\n\tlet dt = P.v[0].x;\n\tlet time = P.v[0].y;\n\tlet emitStart = u32(P.v[0].z);\n\tlet emitCount = u32(P.v[0].w);\n\tlet frameDt = P.v[1].z;\n\n\tif (emitCount > 0u) {\n\t\tlet k = (i + maxN - (emitStart % maxN)) % maxN;\n\t\tif (k < emitCount) {\n\t\t\t// Births spread over the frame, oldest first.\n\t\t\tspawn(i, emitStart + k, 1.0 - (f32(k) + 0.5) / f32(emitCount));\n\t\t\treturn;\n\t\t}\n\t}\n\n\tvar p = particles[i];\n\tif (p.life <= 0.0) { return; }\n\tp.age += dt;\n\tif (p.age >= p.life) { p.life = 0.0; particles[i] = p; return; }\n\n\tvar acc = vec2<f32>(P.v[2].z, P.v[2].w);\n\tlet ns = P.v[3].y;\n\tif (ns != 0.0) {\n\t\tlet sc = max(P.v[3].z, 1.0);\n\t\tacc += curl(p.pos / sc + vec2<f32>(time * P.v[3].w, time * P.v[3].w * 0.7)) * ns;\n\t}\n\tlet nAttr = u32(P.v[7].w);\n\tfor (var a = 0u; a < nAttr; a++) {\n\t\tlet at = P.v[8u + a];\n\t\tlet d = at.xy - p.pos;\n\t\tlet dist = length(d) + 1e-3;\n\t\tlet fall = exp(-(dist * dist) / max(at.w * at.w, 1.0));\n\t\tacc += d / dist * at.z * fall;\n\t}\n\tif (P.v[16].x > 0.5) {\n\t\t// Silhouette push: out along the gradient, harder where it just arrived.\n\t\tlet comp = p.pos + P.v[18].zw;\n\t\tlet cell = (comp - P.v[17].xy) / P.v[17].zw - 0.5;\n\t\tlet cellCount = u32(P.v[18].x * P.v[18].y);\n\t\tlet a0 = maskAt(cell, 0u);\n\t\tif (a0 > 0.02) {\n\t\t\tlet gx = maskAt(cell + vec2<f32>(1.0, 0.0), 0u) - maskAt(cell - vec2<f32>(1.0, 0.0), 0u);\n\t\t\tlet gy = maskAt(cell + vec2<f32>(0.0, 1.0), 0u) - maskAt(cell - vec2<f32>(0.0, 1.0), 0u);\n\t\t\tlet g = vec2<f32>(gx, gy);\n\t\t\tlet gl = length(g);\n\t\t\tif (gl > 1e-5) {\n\t\t\t\tlet before = maskAt(cell, cellCount);\n\t\t\t\tlet k = a0 * P.v[16].y + max(0.0, a0 - before) * P.v[16].z;\n\t\t\t\tacc -= g / gl * k;\n\t\t\t}\n\t\t}\n\t}\n\n\tp.vel += acc * dt;\n\tp.vel *= exp(-P.v[3].x * dt);\n\tp.pos += p.vel * dt;\n\n\tlet w = P.v[2].x; let h = P.v[2].y;\n\tlet floorY = P.v[7].y;\n\tlet bounce = P.v[7].z;\n\tif (floorY >= 0.0 && p.pos.y > floorY) { p.pos.y = floorY; p.vel.y = -abs(p.vel.y) * bounce; p.vel.x *= 0.9; }\n\tlet mode = u32(P.v[7].x);\n\tif (mode == 1u) {\n\t\tif (p.pos.x < 0.0 || p.pos.y < 0.0 || p.pos.x > w || p.pos.y > h) { p.life = 0.0; }\n\t} else if (mode == 2u) {\n\t\tif (p.pos.x < 0.0) { p.pos.x = 0.0; p.vel.x = abs(p.vel.x) * bounce; }\n\t\tif (p.pos.x > w) { p.pos.x = w; p.vel.x = -abs(p.vel.x) * bounce; }\n\t\tif (p.pos.y < 0.0) { p.pos.y = 0.0; p.vel.y = abs(p.vel.y) * bounce; }\n\t\tif (p.pos.y > h) { p.pos.y = h; p.vel.y = -abs(p.vel.y) * bounce; }\n\t} else if (mode == 3u) {\n\t\tp.pos = vec2<f32>(p.pos.x - floor(p.pos.x / w) * w, p.pos.y - floor(p.pos.y / h) * h);\n\t}\n\tparticles[i] = p;\n}\n`;\nconst DRAW_WGSL = `\n${COMMON_WGSL}\n@group(0) @binding(0) var<uniform> P : Params;\n@group(0) @binding(1) var<storage, read> particles : array<Particle>;\n\nstruct VOut {\n\t@builtin(position) pos : vec4<f32>,\n\t@location(0) uv : vec2<f32>,\n\t@location(1) color : vec4<f32>,\n\t@location(2) aspect : f32,\n};\n\nfn gradient(t : f32) -> vec4<f32> {\n\tlet n = i32(P.v[21].x);\n\tif (n <= 1) { return P.v[22]; }\n\tlet x = clamp(t, 0.0, 1.0) * f32(n - 1);\n\tlet i = min(i32(floor(x)), n - 2);\n\treturn mix(P.v[22 + i], P.v[23 + i], x - f32(i));\n}\n\n@vertex\nfn vs(@builtin(vertex_index) vi : u32, @builtin(instance_index) ii : u32) -> VOut {\n\tvar out : VOut;\n\tlet p = particles[ii];\n\tif (p.life <= 0.0) {\n\t\tout.pos = vec4<f32>(2.0, 2.0, 0.0, 1.0);\n\t\tout.color = vec4<f32>(0.0);\n\t\treturn out;\n\t}\n\tlet t = p.age / p.life;\n\tlet size = mix(P.v[19].x, P.v[19].y, t) * p.jitter;\n\tvar corner = vec2<f32>(0.0);\n\tswitch (vi) {\n\t\tcase 0u: { corner = vec2<f32>(-1.0, -1.0); }\n\t\tcase 1u: { corner = vec2<f32>(1.0, -1.0); }\n\t\tcase 2u: { corner = vec2<f32>(-1.0, 1.0); }\n\t\tcase 3u: { corner = vec2<f32>(-1.0, 1.0); }\n\t\tcase 4u: { corner = vec2<f32>(1.0, -1.0); }\n\t\tdefault: { corner = vec2<f32>(1.0, 1.0); }\n\t}\n\tlet speed = length(p.vel);\n\tvar axisX = vec2<f32>(1.0, 0.0);\n\tvar halfLen = size * 0.5;\n\tlet shape = u32(P.v[20].x);\n\tif (shape == 3u && speed > 1e-3) {\n\t\taxisX = p.vel / speed;\n\t\thalfLen = size * 0.5 + speed * P.v[20].y * 0.5;\n\t}\n\tlet axisY = vec2<f32>(-axisX.y, axisX.x);\n\tlet local = axisX * corner.x * halfLen + axisY * corner.y * size * 0.5;\n\tlet px = (p.pos + local) * P.v[21].yz;\n\tlet tsize = P.v[2].xy * P.v[21].yz;\n\tout.pos = vec4<f32>(px.x / tsize.x * 2.0 - 1.0, 1.0 - px.y / tsize.y * 2.0, 0.0, 1.0);\n\tout.uv = corner;\n\tout.aspect = halfLen / max(size * 0.5, 1e-3);\n\n\tvar c = gradient(t);\n\tif (P.v[20].z > 0.5) { c = gradient(speed / max(P.v[20].w, 1e-3)); }\n\tlet fadeIn = max(P.v[19].z, 1e-4);\n\tlet fadeOut = max(P.v[19].w, 1e-4);\n\tlet a = c.a * smoothstep(0.0, fadeIn, t) * (1.0 - smoothstep(1.0 - fadeOut, 1.0, t)) * P.v[21].w;\n\tout.color = vec4<f32>(c.rgb * a, a);\n\treturn out;\n}\n\n@fragment\nfn fs(in : VOut) -> @location(0) vec4<f32> {\n\tlet shape = u32(P.v[20].x);\n\tvar m = 1.0;\n\tif (shape == 0u) {\n\t\tlet d = length(in.uv);\n\t\tlet e = max(fwidth(d), 1e-3);\n\t\tm = 1.0 - smoothstep(1.0 - e, 1.0, d);\n\t} else if (shape == 1u) {\n\t\tlet d = length(in.uv);\n\t\tm = exp(-3.5 * d * d) * (1.0 - smoothstep(0.9, 1.0, d));\n\t} else if (shape == 3u) {\n\t\t// A capsule along the motion, soft at the sides.\n\t\tlet ax = abs(in.uv.x) * in.aspect;\n\t\tlet ex = max(ax - (in.aspect - 1.0), 0.0);\n\t\tlet d = length(vec2<f32>(ex, in.uv.y));\n\t\tm = 1.0 - smoothstep(0.5, 1.0, d);\n\t}\n\treturn in.color * m;\n}\n`;\nconst pipelines = /* @__PURE__ */ new WeakMap();\nfunction getPipelines(device) {\n\tlet p = pipelines.get(device);\n\tif (p) return p;\n\tconst simLayout = device.createBindGroupLayout({\n\t\tlabel: \"particles_sim_layout\",\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tvisibility: GPUShaderStage.COMPUTE,\n\t\t\t\tbuffer: { type: \"uniform\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tvisibility: GPUShaderStage.COMPUTE,\n\t\t\t\tbuffer: { type: \"storage\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tvisibility: GPUShaderStage.COMPUTE,\n\t\t\t\tbuffer: { type: \"read-only-storage\" }\n\t\t\t}\n\t\t]\n\t});\n\tp = {\n\t\tsimLayout,\n\t\tsim: device.createComputePipeline({\n\t\t\tlabel: \"particles_sim\",\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [simLayout] }),\n\t\t\tcompute: {\n\t\t\t\tmodule: device.createShaderModule({\n\t\t\t\t\tlabel: \"particles_sim.wgsl\",\n\t\t\t\t\tcode: SIM_WGSL\n\t\t\t\t}),\n\t\t\t\tentryPoint: \"simulate\"\n\t\t\t}\n\t\t}),\n\t\tdrawLayout: device.createBindGroupLayout({\n\t\t\tlabel: \"particles_draw_layout\",\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tvisibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n\t\t\t\tbuffer: { type: \"uniform\" }\n\t\t\t}, {\n\t\t\t\tbinding: 1,\n\t\t\t\tvisibility: GPUShaderStage.VERTEX,\n\t\t\t\tbuffer: { type: \"read-only-storage\" }\n\t\t\t}]\n\t\t}),\n\t\tdraw: /* @__PURE__ */ new Map(),\n\t\tdrawModule: device.createShaderModule({\n\t\t\tlabel: \"particles_draw.wgsl\",\n\t\t\tcode: DRAW_WGSL\n\t\t})\n\t};\n\tpipelines.set(device, p);\n\treturn p;\n}\nconst BLENDS = {\n\tnormal: {\n\t\tcolor: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\toperation: \"add\"\n\t\t},\n\t\talpha: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\toperation: \"add\"\n\t\t}\n\t},\n\tadd: {\n\t\tcolor: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one\",\n\t\t\toperation: \"add\"\n\t\t},\n\t\talpha: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one\",\n\t\t\toperation: \"add\"\n\t\t}\n\t},\n\tscreen: {\n\t\tcolor: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one-minus-src\",\n\t\t\toperation: \"add\"\n\t\t},\n\t\talpha: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\toperation: \"add\"\n\t\t}\n\t}\n};\nfunction drawPipeline(device, format, blend) {\n\tconst p = getPipelines(device);\n\tconst key = `${format}|${blend}`;\n\tlet pipe = p.draw.get(key);\n\tif (!pipe) {\n\t\tpipe = device.createRenderPipeline({\n\t\t\tlabel: `particles_draw_${blend}`,\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [p.drawLayout] }),\n\t\t\tvertex: {\n\t\t\t\tmodule: p.drawModule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule: p.drawModule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{\n\t\t\t\t\tformat,\n\t\t\t\t\tblend: BLENDS[blend]\n\t\t\t\t}]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-list\" }\n\t\t});\n\t\tp.draw.set(key, pipe);\n\t}\n\treturn pipe;\n}\nconst SHAPES = {\n\tcircle: 0,\n\tsoft: 1,\n\tsquare: 2,\n\tspark: 3\n};\nconst EMITTERS = {\n\tpoint: 0,\n\tline: 1,\n\trect: 2,\n\tcircle: 3,\n\tring: 4\n};\nconst BOUNDS = {\n\tnone: 0,\n\tkill: 1,\n\tbounce: 2,\n\twrap: 3\n};\n/** Packs static settings and one frame's inputs into the shared parameter block. */\nfunction packParams(s, f, out, sim, view) {\n\tout.fill(0);\n\tconst v = (i, a, b, c, d) => out.set([\n\t\ta,\n\t\tb,\n\t\tc,\n\t\td\n\t], i * 4);\n\tconst deg = Math.PI / 180;\n\tv(0, sim.dt, sim.time, sim.emitStart, sim.emitCount);\n\tv(1, s.max, s.seed, sim.frameDt, s.emitter.radial ? 1 : 0);\n\tv(2, s.layer.width, s.layer.height, f.gravity[0], f.gravity[1]);\n\tv(3, f.drag, f.noise.strength, f.noise.scale, f.noise.speed);\n\tconst e = s.emitter;\n\tconst ex = f.emitter?.x ?? e.x;\n\tconst ey = f.emitter?.y ?? e.y;\n\tv(4, EMITTERS[e.shape], ex, ey, e.width);\n\tif (f.emitter) v(30, f.emitter.previousX, f.emitter.previousY, 1, 0);\n\tv(5, e.height, e.radius, s.speed[0], s.speed[1]);\n\tv(6, s.direction * deg, s.spread * deg, s.lifetime[0], s.lifetime[1]);\n\tconst attractors = f.attractors.slice(0, MAX_ATTRACTORS);\n\tv(7, BOUNDS[s.bounds], s.floor ?? -1, s.bounce, attractors.length);\n\tfor (const [i, a] of attractors.entries()) v(8 + i, a.x, a.y, a.strength, a.radius);\n\tconst m = f.push?.mask;\n\tv(16, m ? 1 : 0, f.push?.strength ?? 0, f.push?.sweep ?? 0, s.sizeJitter);\n\tv(17, m?.originX ?? 0, m?.originY ?? 0, m?.scaleX ?? 1, m?.scaleY ?? 1);\n\tv(18, m?.width ?? 0, m?.height ?? 0, s.layer.x, s.layer.y);\n\tv(19, s.size[0], s.size[1], s.fade[0], s.fade[1]);\n\tv(20, SHAPES[s.shape], s.stretch, s.colorBySpeed !== null ? 1 : 0, s.colorBySpeed ?? 1);\n\tconst colors = s.colors.slice(0, MAX_COLORS);\n\tv(21, colors.length, view.scaleX, view.scaleY, s.opacity);\n\tfor (const [i, c] of colors.entries()) v(22 + i, c[0], c[1], c[2], c[3]);\n}\nfunction stateFor(program, device) {\n\tconst existing = program.particleState;\n\tif (existing && existing.device === device) return existing;\n\tconst s = program.particleStatic;\n\tconst state = {\n\t\tdevice,\n\t\tparticles: device.createBuffer({\n\t\t\tlabel: \"particles\",\n\t\t\tsize: s.max * PARTICLE_BYTES,\n\t\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST\n\t\t}),\n\t\tframe: -1,\n\t\temitted: 0,\n\t\tcarry: 0,\n\t\tsnapshots: /* @__PURE__ */ new Map(),\n\t\tmaskBuffer: null,\n\t\tmaskSize: 0,\n\t\tubo: device.createBuffer({\n\t\t\tlabel: \"particles_params\",\n\t\t\tsize: PARAM_VEC4S * 16,\n\t\t\tusage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n\t\t})\n\t};\n\tprogram.particleState = state;\n\treturn state;\n}\n/** Uploads this frame's (and the previous frame's) silhouette; a 1-float buffer when there is none. */\nfunction uploadMask(state, f) {\n\tconst m = f.push?.mask;\n\tconst cells = m ? m.width * m.height : 0;\n\tconst size = Math.max(16, cells * 2 * 4);\n\tif (!state.maskBuffer || state.maskSize < size) {\n\t\tstate.maskBuffer?.destroy();\n\t\tstate.maskBuffer = state.device.createBuffer({\n\t\t\tlabel: \"particles_mask\",\n\t\t\tsize,\n\t\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST\n\t\t});\n\t\tstate.maskSize = size;\n\t}\n\tif (m) {\n\t\tconst both = new Float32Array(cells * 2);\n\t\tboth.set(m.data.subarray(0, cells));\n\t\tboth.set((f.push?.previous ?? m).data.subarray(0, cells), cells);\n\t\tstate.device.queue.writeBuffer(state.maskBuffer, 0, both);\n\t}\n\treturn state.maskBuffer;\n}\n/** Steps the system from the frame it holds to `frame` (layer-local), restoring a snapshot to go back. */\nfunction advance(program, state, frame, compositionStart, fps) {\n\tconst { device } = state;\n\tconst s = program.particleStatic;\n\tif (frame < state.frame || state.frame < 0) {\n\t\tlet best = -1;\n\t\tfor (const k of state.snapshots.keys()) if (k <= frame && k > best) best = k;\n\t\tconst encoder = device.createCommandEncoder({ label: \"particles_restore\" });\n\t\tif (best >= 0) {\n\t\t\tconst snap = state.snapshots.get(best);\n\t\t\tencoder.copyBufferToBuffer(snap.buffer, 0, state.particles, 0, s.max * PARTICLE_BYTES);\n\t\t\tstate.emitted = snap.emitted;\n\t\t\tstate.carry = snap.carry;\n\t\t\tstate.frame = best;\n\t\t} else {\n\t\t\tencoder.clearBuffer(state.particles);\n\t\t\tstate.emitted = 0;\n\t\t\tstate.carry = 0;\n\t\t\tstate.frame = -1;\n\t\t}\n\t\tdevice.queue.submit([encoder.finish()]);\n\t}\n\tconst p = getPipelines(device);\n\tconst params = new Float32Array(PARAM_VEC4S * 4);\n\tconst substeps = Math.max(1, Math.round(s.substeps));\n\tconst frameDt = 1 / fps;\n\tconst prewarmFrames = Math.round(s.prewarm * fps);\n\tfor (let f = state.frame + 1; f <= frame; f++) {\n\t\tconst steps = f === 0 ? prewarmFrames + 1 : 1;\n\t\tfor (let w = 0; w < steps; w++) {\n\t\t\tconst simFrame = f === 0 ? w - prewarmFrames : f;\n\t\t\tconst inputs = program.particleFrame(compositionStart + Math.max(0, simFrame), fps);\n\t\t\tstate.carry += Math.max(0, inputs.rate) * frameDt;\n\t\t\tlet born = Math.floor(state.carry);\n\t\t\tstate.carry -= born;\n\t\t\tborn += Math.max(0, Math.round(inputs.burst));\n\t\t\tborn = Math.min(born, s.max);\n\t\t\tconst mask = uploadMask(state, inputs);\n\t\t\tconst bindGroup = device.createBindGroup({\n\t\t\t\tlayout: p.simLayout,\n\t\t\t\tentries: [\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 0,\n\t\t\t\t\t\tresource: { buffer: state.ubo }\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 1,\n\t\t\t\t\t\tresource: { buffer: state.particles }\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 2,\n\t\t\t\t\t\tresource: { buffer: mask }\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t});\n\t\t\tfor (let k = 0; k < substeps; k++) {\n\t\t\t\tpackParams(s, inputs, params, {\n\t\t\t\t\tdt: frameDt / substeps,\n\t\t\t\t\ttime: (simFrame + k / substeps) * frameDt,\n\t\t\t\t\temitStart: state.emitted,\n\t\t\t\t\temitCount: k === 0 ? born : 0,\n\t\t\t\t\tframeDt\n\t\t\t\t}, {\n\t\t\t\t\tscaleX: 1,\n\t\t\t\t\tscaleY: 1\n\t\t\t\t});\n\t\t\t\tdevice.queue.writeBuffer(state.ubo, 0, params);\n\t\t\t\tconst encoder = device.createCommandEncoder({ label: \"particles_step\" });\n\t\t\t\tconst pass = encoder.beginComputePass({ label: \"particles_sim\" });\n\t\t\t\tpass.setPipeline(p.sim);\n\t\t\t\tpass.setBindGroup(0, bindGroup);\n\t\t\t\tpass.dispatchWorkgroups(Math.ceil(s.max / WORKGROUP));\n\t\t\t\tpass.end();\n\t\t\t\tdevice.queue.submit([encoder.finish()]);\n\t\t\t}\n\t\t\tstate.emitted += born;\n\t\t}\n\t\tstate.frame = f;\n\t\tif (f % SNAPSHOT_EVERY === 0 && !state.snapshots.has(f) && state.snapshots.size < MAX_SNAPSHOTS) {\n\t\t\tconst buffer = device.createBuffer({\n\t\t\t\tlabel: `particles_snapshot_${f}`,\n\t\t\t\tsize: s.max * PARTICLE_BYTES,\n\t\t\t\tusage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST\n\t\t\t});\n\t\t\tconst encoder = device.createCommandEncoder({ label: \"particles_snapshot\" });\n\t\t\tencoder.copyBufferToBuffer(state.particles, 0, buffer, 0, s.max * PARTICLE_BYTES);\n\t\t\tdevice.queue.submit([encoder.finish()]);\n\t\t\tstate.snapshots.set(f, {\n\t\t\t\tbuffer,\n\t\t\t\temitted: state.emitted,\n\t\t\t\tcarry: state.carry\n\t\t\t});\n\t\t}\n\t}\n}\nconst ParticlesWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Particles\" || !isParticleProgram(op.effect)) return;\n\tconst program = op.effect;\n\tconst s = program.particleStatic;\n\tconst fps = props.fps || 30;\n\tconst local = Math.max(0, Math.round(props.frame ?? 0));\n\tconst compositionFrame = Math.round(props.compositionFrame ?? local);\n\tconst compositionStart = compositionFrame - local;\n\tconst state = stateFor(program, ctx.device);\n\tadvance(program, state, local, compositionStart, fps);\n\tpass.end();\n\tconst params = new Float32Array(PARAM_VEC4S * 4);\n\tpackParams(s, program.particleFrame(compositionFrame, fps), params, {\n\t\tdt: 0,\n\t\ttime: 0,\n\t\temitStart: 0,\n\t\temitCount: 0,\n\t\tframeDt: 1 / fps\n\t}, {\n\t\tscaleX: targetWidth / s.layer.width,\n\t\tscaleY: targetHeight / s.layer.height\n\t});\n\tconst ubo = ctx.renderer.getTemporaryBuffer(params);\n\tconst draw = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"load\");\n\tdraw.setPipeline(drawPipeline(ctx.device, ctx.renderer.format, s.blend));\n\tdraw.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: getPipelines(ctx.device).drawLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: ubo }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: { buffer: state.particles }\n\t\t}]\n\t}));\n\tdraw.draw(6, s.max);\n\tdraw.end();\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ParticlesWebGPURenderer });\n\n//#endregion\nexport { ParticlesWebGPURenderer as n, isParticleProgram as r, renderers_default as t };\n//# sourceMappingURL=renderers-C4F7TVQQ.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-C-3qhk5x.mjs","names":[],"sources":["../../../nodes/node-particles/dist/renderers-C4F7TVQQ.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\n\n//#region src/shared/program.ts\nfunction isParticleProgram(value) {\n\treturn typeof value === \"object\" && value !== null && \"particleStatic\" in value && typeof value.particleFrame === \"function\";\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst PARTICLE_BYTES = 32;\nconst PARAM_VEC4S = 32;\nconst MAX_ATTRACTORS = 8;\nconst MAX_COLORS = 8;\nconst SNAPSHOT_EVERY = 24;\nconst MAX_SNAPSHOTS = 64;\nconst WORKGROUP = 64;\nconst COMMON_WGSL = `\nstruct Particle {\n\tpos : vec2<f32>,\n\tvel : vec2<f32>,\n\tage : f32,\n\tlife : f32,\n\tjitter : f32,\n\t_pad : f32,\n};\n\nstruct Params { v : array<vec4<f32>, ${PARAM_VEC4S}> };\n`;\nconst SIM_WGSL = `\n${COMMON_WGSL}\n@group(0) @binding(0) var<uniform> P : Params;\n@group(0) @binding(1) var<storage, read_write> particles : array<Particle>;\n@group(0) @binding(2) var<storage, read> mask : array<f32>;\n\nfn pcg(v : u32) -> u32 {\n\tlet state = v * 747796405u + 2891336453u;\n\tlet word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\n\treturn (word >> 22u) ^ word;\n}\nfn rnd(idx : u32, channel : u32, seed : u32) -> f32 {\n\treturn f32(pcg(idx * 16u + channel + pcg(seed))) / 4294967295.0;\n}\n\nfn hash2(p : vec2<f32>) -> f32 {\n\tlet q = fract(p * vec2<f32>(0.1031, 0.1030));\n\tlet r = q + dot(q, q.yx + 33.33);\n\treturn fract((r.x + r.y) * r.x);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\tlet a = hash2(i);\n\tlet b = hash2(i + vec2<f32>(1.0, 0.0));\n\tlet c = hash2(i + vec2<f32>(0.0, 1.0));\n\tlet d = hash2(i + vec2<f32>(1.0, 1.0));\n\treturn mix(mix(a, b, u.x), mix(c, d, u.x), u.y);\n}\nfn fbm(p : vec2<f32>) -> f32 {\n\treturn vnoise(p) * 0.6 + vnoise(p * 2.03 + 17.0) * 0.3 + vnoise(p * 4.01 + 41.0) * 0.1;\n}\n// Divergence-free flow: the curl of a scalar noise field.\nfn curl(p : vec2<f32>) -> vec2<f32> {\n\tlet e = 0.02;\n\tlet dx = fbm(p + vec2<f32>(e, 0.0)) - fbm(p - vec2<f32>(e, 0.0));\n\tlet dy = fbm(p + vec2<f32>(0.0, e)) - fbm(p - vec2<f32>(0.0, e));\n\treturn vec2<f32>(dy, -dx) / (2.0 * e);\n}\n\nfn maskAt(cell : vec2<f32>, offset : u32) -> f32 {\n\tlet w = i32(P.v[18].x);\n\tlet h = i32(P.v[18].y);\n\tlet c0 = vec2<i32>(floor(cell));\n\tlet t = cell - floor(cell);\n\tvar s = 0.0;\n\tfor (var k = 0; k < 4; k++) {\n\t\tlet o = vec2<i32>(k & 1, k >> 1);\n\t\tlet c = c0 + o;\n\t\tvar v = 0.0;\n\t\tif (c.x >= 0 && c.y >= 0 && c.x < w && c.y < h) {\n\t\t\tv = mask[offset + u32(c.y * w + c.x)];\n\t\t}\n\t\tlet wx = select(1.0 - t.x, t.x, o.x == 1);\n\t\tlet wy = select(1.0 - t.y, t.y, o.y == 1);\n\t\ts += v * wx * wy;\n\t}\n\treturn s;\n}\n\nfn spawn(i : u32, idx : u32, birthFrac : f32) {\n\tlet birthAge = birthFrac * P.v[1].z;\n\tlet seed = u32(P.v[1].y);\n\tlet shape = u32(P.v[4].x);\n\tlet ex = P.v[4].y; let ey = P.v[4].z; let ew = P.v[4].w;\n\tlet eh = P.v[5].x; let er = P.v[5].y;\n\tlet r0 = rnd(idx, 0u, seed); let r1 = rnd(idx, 1u, seed);\n\tvar pos = vec2<f32>(ex, ey);\n\tvar center = vec2<f32>(ex, ey);\n\tif (shape == 1u) { pos = vec2<f32>(ex + ew * r0, ey + eh * r0); center = vec2<f32>(ex + ew * 0.5, ey + eh * 0.5); }\n\telse if (shape == 2u) { pos = vec2<f32>(ex + ew * r0, ey + eh * r1); center = vec2<f32>(ex + ew * 0.5, ey + eh * 0.5); }\n\telse if (shape == 3u) {\n\t\tlet a = r0 * 6.2831853; let rr = er * sqrt(r1);\n\t\tpos = vec2<f32>(ex + cos(a) * rr, ey + sin(a) * rr);\n\t} else if (shape == 4u) {\n\t\tlet a = r0 * 6.2831853;\n\t\tpos = vec2<f32>(ex + cos(a) * er, ey + sin(a) * er);\n\t}\n\tlet radial = P.v[1].w > 0.5;\n\tvar dir = P.v[6].x + (rnd(idx, 2u, seed) - 0.5) * P.v[6].y;\n\tif (radial) {\n\t\tlet d = pos - center;\n\t\tif (dot(d, d) > 1e-6) { dir = atan2(d.y, d.x) + (rnd(idx, 2u, seed) - 0.5) * P.v[6].y; }\n\t}\n\t// A moving emitter: older births of the frame start nearer last frame's spot.\n\tif (P.v[30].z > 0.5) { pos += (P.v[30].xy - vec2<f32>(ex, ey)) * birthFrac; }\n\tlet speed = mix(P.v[5].z, P.v[5].w, rnd(idx, 3u, seed));\n\tlet vel = vec2<f32>(cos(dir), sin(dir)) * speed;\n\tvar p : Particle;\n\tp.vel = vel;\n\tp.pos = pos + vel * birthAge;\n\tp.age = birthAge;\n\tp.life = mix(P.v[6].z, P.v[6].w, rnd(idx, 4u, seed));\n\tp.jitter = 1.0 - P.v[16].w * rnd(idx, 5u, seed);\n\tp._pad = 0.0;\n\tparticles[i] = p;\n}\n\n@compute @workgroup_size(${WORKGROUP})\nfn simulate(@builtin(global_invocation_id) gid : vec3<u32>) {\n\tlet i = gid.x;\n\tlet maxN = u32(P.v[1].x);\n\tif (i >= maxN) { return; }\n\tlet dt = P.v[0].x;\n\tlet time = P.v[0].y;\n\tlet emitStart = u32(P.v[0].z);\n\tlet emitCount = u32(P.v[0].w);\n\tlet frameDt = P.v[1].z;\n\n\tif (emitCount > 0u) {\n\t\tlet k = (i + maxN - (emitStart % maxN)) % maxN;\n\t\tif (k < emitCount) {\n\t\t\t// Births spread over the frame, oldest first.\n\t\t\tspawn(i, emitStart + k, 1.0 - (f32(k) + 0.5) / f32(emitCount));\n\t\t\treturn;\n\t\t}\n\t}\n\n\tvar p = particles[i];\n\tif (p.life <= 0.0) { return; }\n\tp.age += dt;\n\tif (p.age >= p.life) { p.life = 0.0; particles[i] = p; return; }\n\n\tvar acc = vec2<f32>(P.v[2].z, P.v[2].w);\n\tlet ns = P.v[3].y;\n\tif (ns != 0.0) {\n\t\tlet sc = max(P.v[3].z, 1.0);\n\t\tacc += curl(p.pos / sc + vec2<f32>(time * P.v[3].w, time * P.v[3].w * 0.7)) * ns;\n\t}\n\tlet nAttr = u32(P.v[7].w);\n\tfor (var a = 0u; a < nAttr; a++) {\n\t\tlet at = P.v[8u + a];\n\t\tlet d = at.xy - p.pos;\n\t\tlet dist = length(d) + 1e-3;\n\t\tlet fall = exp(-(dist * dist) / max(at.w * at.w, 1.0));\n\t\tacc += d / dist * at.z * fall;\n\t}\n\tif (P.v[16].x > 0.5) {\n\t\t// Silhouette push: out along the gradient, harder where it just arrived.\n\t\tlet comp = p.pos + P.v[18].zw;\n\t\tlet cell = (comp - P.v[17].xy) / P.v[17].zw - 0.5;\n\t\tlet cellCount = u32(P.v[18].x * P.v[18].y);\n\t\tlet a0 = maskAt(cell, 0u);\n\t\tif (a0 > 0.02) {\n\t\t\tlet gx = maskAt(cell + vec2<f32>(1.0, 0.0), 0u) - maskAt(cell - vec2<f32>(1.0, 0.0), 0u);\n\t\t\tlet gy = maskAt(cell + vec2<f32>(0.0, 1.0), 0u) - maskAt(cell - vec2<f32>(0.0, 1.0), 0u);\n\t\t\tlet g = vec2<f32>(gx, gy);\n\t\t\tlet gl = length(g);\n\t\t\tif (gl > 1e-5) {\n\t\t\t\tlet before = maskAt(cell, cellCount);\n\t\t\t\tlet k = a0 * P.v[16].y + max(0.0, a0 - before) * P.v[16].z;\n\t\t\t\tacc -= g / gl * k;\n\t\t\t}\n\t\t}\n\t}\n\n\tp.vel += acc * dt;\n\tp.vel *= exp(-P.v[3].x * dt);\n\tp.pos += p.vel * dt;\n\n\tlet w = P.v[2].x; let h = P.v[2].y;\n\tlet floorY = P.v[7].y;\n\tlet bounce = P.v[7].z;\n\tif (floorY >= 0.0 && p.pos.y > floorY) { p.pos.y = floorY; p.vel.y = -abs(p.vel.y) * bounce; p.vel.x *= 0.9; }\n\tlet mode = u32(P.v[7].x);\n\tif (mode == 1u) {\n\t\tif (p.pos.x < 0.0 || p.pos.y < 0.0 || p.pos.x > w || p.pos.y > h) { p.life = 0.0; }\n\t} else if (mode == 2u) {\n\t\tif (p.pos.x < 0.0) { p.pos.x = 0.0; p.vel.x = abs(p.vel.x) * bounce; }\n\t\tif (p.pos.x > w) { p.pos.x = w; p.vel.x = -abs(p.vel.x) * bounce; }\n\t\tif (p.pos.y < 0.0) { p.pos.y = 0.0; p.vel.y = abs(p.vel.y) * bounce; }\n\t\tif (p.pos.y > h) { p.pos.y = h; p.vel.y = -abs(p.vel.y) * bounce; }\n\t} else if (mode == 3u) {\n\t\tp.pos = vec2<f32>(p.pos.x - floor(p.pos.x / w) * w, p.pos.y - floor(p.pos.y / h) * h);\n\t}\n\tparticles[i] = p;\n}\n`;\nconst DRAW_WGSL = `\n${COMMON_WGSL}\n@group(0) @binding(0) var<uniform> P : Params;\n@group(0) @binding(1) var<storage, read> particles : array<Particle>;\n\nstruct VOut {\n\t@builtin(position) pos : vec4<f32>,\n\t@location(0) uv : vec2<f32>,\n\t@location(1) color : vec4<f32>,\n\t@location(2) aspect : f32,\n};\n\nfn gradient(t : f32) -> vec4<f32> {\n\tlet n = i32(P.v[21].x);\n\tif (n <= 1) { return P.v[22]; }\n\tlet x = clamp(t, 0.0, 1.0) * f32(n - 1);\n\tlet i = min(i32(floor(x)), n - 2);\n\treturn mix(P.v[22 + i], P.v[23 + i], x - f32(i));\n}\n\n@vertex\nfn vs(@builtin(vertex_index) vi : u32, @builtin(instance_index) ii : u32) -> VOut {\n\tvar out : VOut;\n\tlet p = particles[ii];\n\tif (p.life <= 0.0) {\n\t\tout.pos = vec4<f32>(2.0, 2.0, 0.0, 1.0);\n\t\tout.color = vec4<f32>(0.0);\n\t\treturn out;\n\t}\n\tlet t = p.age / p.life;\n\tlet size = mix(P.v[19].x, P.v[19].y, t) * p.jitter;\n\tvar corner = vec2<f32>(0.0);\n\tswitch (vi) {\n\t\tcase 0u: { corner = vec2<f32>(-1.0, -1.0); }\n\t\tcase 1u: { corner = vec2<f32>(1.0, -1.0); }\n\t\tcase 2u: { corner = vec2<f32>(-1.0, 1.0); }\n\t\tcase 3u: { corner = vec2<f32>(-1.0, 1.0); }\n\t\tcase 4u: { corner = vec2<f32>(1.0, -1.0); }\n\t\tdefault: { corner = vec2<f32>(1.0, 1.0); }\n\t}\n\tlet speed = length(p.vel);\n\tvar axisX = vec2<f32>(1.0, 0.0);\n\tvar halfLen = size * 0.5;\n\tlet shape = u32(P.v[20].x);\n\tif (shape == 3u && speed > 1e-3) {\n\t\taxisX = p.vel / speed;\n\t\thalfLen = size * 0.5 + speed * P.v[20].y * 0.5;\n\t}\n\tlet axisY = vec2<f32>(-axisX.y, axisX.x);\n\tlet local = axisX * corner.x * halfLen + axisY * corner.y * size * 0.5;\n\tlet px = (p.pos + local) * P.v[21].yz;\n\tlet tsize = P.v[2].xy * P.v[21].yz;\n\tout.pos = vec4<f32>(px.x / tsize.x * 2.0 - 1.0, 1.0 - px.y / tsize.y * 2.0, 0.0, 1.0);\n\tout.uv = corner;\n\tout.aspect = halfLen / max(size * 0.5, 1e-3);\n\n\tvar c = gradient(t);\n\tif (P.v[20].z > 0.5) { c = gradient(speed / max(P.v[20].w, 1e-3)); }\n\tlet fadeIn = max(P.v[19].z, 1e-4);\n\tlet fadeOut = max(P.v[19].w, 1e-4);\n\tlet a = c.a * smoothstep(0.0, fadeIn, t) * (1.0 - smoothstep(1.0 - fadeOut, 1.0, t)) * P.v[21].w;\n\tout.color = vec4<f32>(c.rgb * a, a);\n\treturn out;\n}\n\n@fragment\nfn fs(in : VOut) -> @location(0) vec4<f32> {\n\tlet shape = u32(P.v[20].x);\n\tvar m = 1.0;\n\tif (shape == 0u) {\n\t\tlet d = length(in.uv);\n\t\tlet e = max(fwidth(d), 1e-3);\n\t\tm = 1.0 - smoothstep(1.0 - e, 1.0, d);\n\t} else if (shape == 1u) {\n\t\tlet d = length(in.uv);\n\t\tm = exp(-3.5 * d * d) * (1.0 - smoothstep(0.9, 1.0, d));\n\t} else if (shape == 3u) {\n\t\t// A capsule along the motion, soft at the sides.\n\t\tlet ax = abs(in.uv.x) * in.aspect;\n\t\tlet ex = max(ax - (in.aspect - 1.0), 0.0);\n\t\tlet d = length(vec2<f32>(ex, in.uv.y));\n\t\tm = 1.0 - smoothstep(0.5, 1.0, d);\n\t}\n\treturn in.color * m;\n}\n`;\nconst pipelines = /* @__PURE__ */ new WeakMap();\nfunction getPipelines(device) {\n\tlet p = pipelines.get(device);\n\tif (p) return p;\n\tconst simLayout = device.createBindGroupLayout({\n\t\tlabel: \"particles_sim_layout\",\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tvisibility: GPUShaderStage.COMPUTE,\n\t\t\t\tbuffer: { type: \"uniform\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tvisibility: GPUShaderStage.COMPUTE,\n\t\t\t\tbuffer: { type: \"storage\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tvisibility: GPUShaderStage.COMPUTE,\n\t\t\t\tbuffer: { type: \"read-only-storage\" }\n\t\t\t}\n\t\t]\n\t});\n\tp = {\n\t\tsimLayout,\n\t\tsim: device.createComputePipeline({\n\t\t\tlabel: \"particles_sim\",\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [simLayout] }),\n\t\t\tcompute: {\n\t\t\t\tmodule: device.createShaderModule({\n\t\t\t\t\tlabel: \"particles_sim.wgsl\",\n\t\t\t\t\tcode: SIM_WGSL\n\t\t\t\t}),\n\t\t\t\tentryPoint: \"simulate\"\n\t\t\t}\n\t\t}),\n\t\tdrawLayout: device.createBindGroupLayout({\n\t\t\tlabel: \"particles_draw_layout\",\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tvisibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n\t\t\t\tbuffer: { type: \"uniform\" }\n\t\t\t}, {\n\t\t\t\tbinding: 1,\n\t\t\t\tvisibility: GPUShaderStage.VERTEX,\n\t\t\t\tbuffer: { type: \"read-only-storage\" }\n\t\t\t}]\n\t\t}),\n\t\tdraw: /* @__PURE__ */ new Map(),\n\t\tdrawModule: device.createShaderModule({\n\t\t\tlabel: \"particles_draw.wgsl\",\n\t\t\tcode: DRAW_WGSL\n\t\t})\n\t};\n\tpipelines.set(device, p);\n\treturn p;\n}\nconst BLENDS = {\n\tnormal: {\n\t\tcolor: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\toperation: \"add\"\n\t\t},\n\t\talpha: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\toperation: \"add\"\n\t\t}\n\t},\n\tadd: {\n\t\tcolor: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one\",\n\t\t\toperation: \"add\"\n\t\t},\n\t\talpha: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one\",\n\t\t\toperation: \"add\"\n\t\t}\n\t},\n\tscreen: {\n\t\tcolor: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one-minus-src\",\n\t\t\toperation: \"add\"\n\t\t},\n\t\talpha: {\n\t\t\tsrcFactor: \"one\",\n\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\toperation: \"add\"\n\t\t}\n\t}\n};\nfunction drawPipeline(device, format, blend) {\n\tconst p = getPipelines(device);\n\tconst key = `${format}|${blend}`;\n\tlet pipe = p.draw.get(key);\n\tif (!pipe) {\n\t\tpipe = device.createRenderPipeline({\n\t\t\tlabel: `particles_draw_${blend}`,\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [p.drawLayout] }),\n\t\t\tvertex: {\n\t\t\t\tmodule: p.drawModule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule: p.drawModule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{\n\t\t\t\t\tformat,\n\t\t\t\t\tblend: BLENDS[blend]\n\t\t\t\t}]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-list\" }\n\t\t});\n\t\tp.draw.set(key, pipe);\n\t}\n\treturn pipe;\n}\nconst SHAPES = {\n\tcircle: 0,\n\tsoft: 1,\n\tsquare: 2,\n\tspark: 3\n};\nconst EMITTERS = {\n\tpoint: 0,\n\tline: 1,\n\trect: 2,\n\tcircle: 3,\n\tring: 4\n};\nconst BOUNDS = {\n\tnone: 0,\n\tkill: 1,\n\tbounce: 2,\n\twrap: 3\n};\n/** Packs static settings and one frame's inputs into the shared parameter block. */\nfunction packParams(s, f, out, sim, view) {\n\tout.fill(0);\n\tconst v = (i, a, b, c, d) => out.set([\n\t\ta,\n\t\tb,\n\t\tc,\n\t\td\n\t], i * 4);\n\tconst deg = Math.PI / 180;\n\tv(0, sim.dt, sim.time, sim.emitStart, sim.emitCount);\n\tv(1, s.max, s.seed, sim.frameDt, s.emitter.radial ? 1 : 0);\n\tv(2, s.layer.width, s.layer.height, f.gravity[0], f.gravity[1]);\n\tv(3, f.drag, f.noise.strength, f.noise.scale, f.noise.speed);\n\tconst e = s.emitter;\n\tconst ex = f.emitter?.x ?? e.x;\n\tconst ey = f.emitter?.y ?? e.y;\n\tv(4, EMITTERS[e.shape], ex, ey, e.width);\n\tif (f.emitter) v(30, f.emitter.previousX, f.emitter.previousY, 1, 0);\n\tv(5, e.height, e.radius, s.speed[0], s.speed[1]);\n\tv(6, s.direction * deg, s.spread * deg, s.lifetime[0], s.lifetime[1]);\n\tconst attractors = f.attractors.slice(0, MAX_ATTRACTORS);\n\tv(7, BOUNDS[s.bounds], s.floor ?? -1, s.bounce, attractors.length);\n\tfor (const [i, a] of attractors.entries()) v(8 + i, a.x, a.y, a.strength, a.radius);\n\tconst m = f.push?.mask;\n\tv(16, m ? 1 : 0, f.push?.strength ?? 0, f.push?.sweep ?? 0, s.sizeJitter);\n\tv(17, m?.originX ?? 0, m?.originY ?? 0, m?.scaleX ?? 1, m?.scaleY ?? 1);\n\tv(18, m?.width ?? 0, m?.height ?? 0, s.layer.x, s.layer.y);\n\tv(19, s.size[0], s.size[1], s.fade[0], s.fade[1]);\n\tv(20, SHAPES[s.shape], s.stretch, s.colorBySpeed !== null ? 1 : 0, s.colorBySpeed ?? 1);\n\tconst colors = s.colors.slice(0, MAX_COLORS);\n\tv(21, colors.length, view.scaleX, view.scaleY, s.opacity);\n\tfor (const [i, c] of colors.entries()) v(22 + i, c[0], c[1], c[2], c[3]);\n}\nfunction stateFor(program, device) {\n\tconst existing = program.particleState;\n\tif (existing && existing.device === device) return existing;\n\tconst s = program.particleStatic;\n\tconst state = {\n\t\tdevice,\n\t\tparticles: device.createBuffer({\n\t\t\tlabel: \"particles\",\n\t\t\tsize: s.max * PARTICLE_BYTES,\n\t\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST\n\t\t}),\n\t\tframe: -1,\n\t\temitted: 0,\n\t\tcarry: 0,\n\t\tsnapshots: /* @__PURE__ */ new Map(),\n\t\tmaskBuffer: null,\n\t\tmaskSize: 0,\n\t\tubo: device.createBuffer({\n\t\t\tlabel: \"particles_params\",\n\t\t\tsize: PARAM_VEC4S * 16,\n\t\t\tusage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n\t\t})\n\t};\n\tprogram.particleState = state;\n\treturn state;\n}\n/** Uploads this frame's (and the previous frame's) silhouette; a 1-float buffer when there is none. */\nfunction uploadMask(state, f) {\n\tconst m = f.push?.mask;\n\tconst cells = m ? m.width * m.height : 0;\n\tconst size = Math.max(16, cells * 2 * 4);\n\tif (!state.maskBuffer || state.maskSize < size) {\n\t\tstate.maskBuffer?.destroy();\n\t\tstate.maskBuffer = state.device.createBuffer({\n\t\t\tlabel: \"particles_mask\",\n\t\t\tsize,\n\t\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST\n\t\t});\n\t\tstate.maskSize = size;\n\t}\n\tif (m) {\n\t\tconst both = new Float32Array(cells * 2);\n\t\tboth.set(m.data.subarray(0, cells));\n\t\tboth.set((f.push?.previous ?? m).data.subarray(0, cells), cells);\n\t\tstate.device.queue.writeBuffer(state.maskBuffer, 0, both);\n\t}\n\treturn state.maskBuffer;\n}\n/** Steps the system from the frame it holds to `frame` (layer-local), restoring a snapshot to go back. */\nfunction advance(program, state, frame, compositionStart, fps) {\n\tconst { device } = state;\n\tconst s = program.particleStatic;\n\tif (frame < state.frame || state.frame < 0) {\n\t\tlet best = -1;\n\t\tfor (const k of state.snapshots.keys()) if (k <= frame && k > best) best = k;\n\t\tconst encoder = device.createCommandEncoder({ label: \"particles_restore\" });\n\t\tif (best >= 0) {\n\t\t\tconst snap = state.snapshots.get(best);\n\t\t\tencoder.copyBufferToBuffer(snap.buffer, 0, state.particles, 0, s.max * PARTICLE_BYTES);\n\t\t\tstate.emitted = snap.emitted;\n\t\t\tstate.carry = snap.carry;\n\t\t\tstate.frame = best;\n\t\t} else {\n\t\t\tencoder.clearBuffer(state.particles);\n\t\t\tstate.emitted = 0;\n\t\t\tstate.carry = 0;\n\t\t\tstate.frame = -1;\n\t\t}\n\t\tdevice.queue.submit([encoder.finish()]);\n\t}\n\tconst p = getPipelines(device);\n\tconst params = new Float32Array(PARAM_VEC4S * 4);\n\tconst substeps = Math.max(1, Math.round(s.substeps));\n\tconst frameDt = 1 / fps;\n\tconst prewarmFrames = Math.round(s.prewarm * fps);\n\tfor (let f = state.frame + 1; f <= frame; f++) {\n\t\tconst steps = f === 0 ? prewarmFrames + 1 : 1;\n\t\tfor (let w = 0; w < steps; w++) {\n\t\t\tconst simFrame = f === 0 ? w - prewarmFrames : f;\n\t\t\tconst inputs = program.particleFrame(compositionStart + Math.max(0, simFrame), fps);\n\t\t\tstate.carry += Math.max(0, inputs.rate) * frameDt;\n\t\t\tlet born = Math.floor(state.carry);\n\t\t\tstate.carry -= born;\n\t\t\tborn += Math.max(0, Math.round(inputs.burst));\n\t\t\tborn = Math.min(born, s.max);\n\t\t\tconst mask = uploadMask(state, inputs);\n\t\t\tconst bindGroup = device.createBindGroup({\n\t\t\t\tlayout: p.simLayout,\n\t\t\t\tentries: [\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 0,\n\t\t\t\t\t\tresource: { buffer: state.ubo }\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 1,\n\t\t\t\t\t\tresource: { buffer: state.particles }\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 2,\n\t\t\t\t\t\tresource: { buffer: mask }\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t});\n\t\t\tfor (let k = 0; k < substeps; k++) {\n\t\t\t\tpackParams(s, inputs, params, {\n\t\t\t\t\tdt: frameDt / substeps,\n\t\t\t\t\ttime: (simFrame + k / substeps) * frameDt,\n\t\t\t\t\temitStart: state.emitted,\n\t\t\t\t\temitCount: k === 0 ? born : 0,\n\t\t\t\t\tframeDt\n\t\t\t\t}, {\n\t\t\t\t\tscaleX: 1,\n\t\t\t\t\tscaleY: 1\n\t\t\t\t});\n\t\t\t\tdevice.queue.writeBuffer(state.ubo, 0, params);\n\t\t\t\tconst encoder = device.createCommandEncoder({ label: \"particles_step\" });\n\t\t\t\tconst pass = encoder.beginComputePass({ label: \"particles_sim\" });\n\t\t\t\tpass.setPipeline(p.sim);\n\t\t\t\tpass.setBindGroup(0, bindGroup);\n\t\t\t\tpass.dispatchWorkgroups(Math.ceil(s.max / WORKGROUP));\n\t\t\t\tpass.end();\n\t\t\t\tdevice.queue.submit([encoder.finish()]);\n\t\t\t}\n\t\t\tstate.emitted += born;\n\t\t}\n\t\tstate.frame = f;\n\t\tif (f % SNAPSHOT_EVERY === 0 && !state.snapshots.has(f) && state.snapshots.size < MAX_SNAPSHOTS) {\n\t\t\tconst buffer = device.createBuffer({\n\t\t\t\tlabel: `particles_snapshot_${f}`,\n\t\t\t\tsize: s.max * PARTICLE_BYTES,\n\t\t\t\tusage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST\n\t\t\t});\n\t\t\tconst encoder = device.createCommandEncoder({ label: \"particles_snapshot\" });\n\t\t\tencoder.copyBufferToBuffer(state.particles, 0, buffer, 0, s.max * PARTICLE_BYTES);\n\t\t\tdevice.queue.submit([encoder.finish()]);\n\t\t\tstate.snapshots.set(f, {\n\t\t\t\tbuffer,\n\t\t\t\temitted: state.emitted,\n\t\t\t\tcarry: state.carry\n\t\t\t});\n\t\t}\n\t}\n}\nconst ParticlesWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Particles\" || !isParticleProgram(op.effect)) return;\n\tconst program = op.effect;\n\tconst s = program.particleStatic;\n\tconst fps = props.fps || 30;\n\tconst local = Math.max(0, Math.round(props.frame ?? 0));\n\tconst compositionFrame = Math.round(props.compositionFrame ?? local);\n\tconst compositionStart = compositionFrame - local;\n\tconst state = stateFor(program, ctx.device);\n\tadvance(program, state, local, compositionStart, fps);\n\tpass.end();\n\tconst params = new Float32Array(PARAM_VEC4S * 4);\n\tpackParams(s, program.particleFrame(compositionFrame, fps), params, {\n\t\tdt: 0,\n\t\ttime: 0,\n\t\temitStart: 0,\n\t\temitCount: 0,\n\t\tframeDt: 1 / fps\n\t}, {\n\t\tscaleX: targetWidth / s.layer.width,\n\t\tscaleY: targetHeight / s.layer.height\n\t});\n\tconst ubo = ctx.renderer.getTemporaryBuffer(params);\n\tconst draw = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"load\");\n\tdraw.setPipeline(drawPipeline(ctx.device, ctx.renderer.format, s.blend));\n\tdraw.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: getPipelines(ctx.device).drawLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: ubo }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: { buffer: state.particles }\n\t\t}]\n\t}));\n\tdraw.draw(6, s.max);\n\tdraw.end();\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ParticlesWebGPURenderer });\n\n//#endregion\nexport { ParticlesWebGPURenderer as n, isParticleProgram as r, renderers_default as t };\n//# sourceMappingURL=renderers-C4F7TVQQ.mjs.map"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { vn as resolveBoolean, xn as resolveNumber } from "./dist-Bf2_efYP.mjs";
2
- import { i as isHandleConnected, n as defineRenderer } from "./renderer-DcvjSolU.mjs";
3
- import { g as WebGPUAudioProcessor } from "./dist-CWLLnigL.mjs";
1
+ import { vn as resolveBoolean, xn as resolveNumber } from "./dist-C8XSqfTx.mjs";
2
+ import { a as isHandleConnected, n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
3
+ import { g as WebGPUAudioProcessor } from "./dist-D3BeAZ7X.mjs";
4
4
 
5
5
  //#region ../../nodes/node-audio-delay/dist/renderers-DXaKpV2A.mjs
6
6
  const PARAM_ORDER = [
@@ -217,4 +217,4 @@ var renderers_default = defineRenderer({ audioProcessor: delayAudioProcessor });
217
217
 
218
218
  //#endregion
219
219
  export { renderers_default as t };
220
- //# sourceMappingURL=renderer-CLAvn9c6.mjs.map
220
+ //# sourceMappingURL=renderer-C-GTxnfv.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CLAvn9c6.mjs","names":[],"sources":["../../../nodes/node-audio-delay/dist/renderers-DXaKpV2A.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveBoolean, resolveNumber } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"delayTime\",\n\t\"feedback\",\n\t\"wet\",\n\t\"dry\"\n];\nconst DELAY_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n delaySec : f32,\n feedback : f32,\n wet : f32,\n dry : f32,\n pingPong : f32,\n bufferLength : f32,\n hasDelayTimeSig : f32,\n hasFeedbackSig : f32,\n hasWetSig : f32,\n hasDrySig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var<storage, read> inputChannels : array<f32>;\n@group(0) @binding(2) var<storage, read_write> outputChannels : array<f32>;\n@group(0) @binding(3) var<storage, read_write> state : array<f32>;\n@group(0) @binding(4) var<storage, read> delayTimeSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> feedbackSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> wetSignal : array<f32>;\n@group(0) @binding(7) var<storage, read> drySignal : array<f32>;\n\nfn tanh(x: f32) -> f32 {\n let exp2x = exp(2.0f * x);\n return (exp2x - 1.0f) / (exp2x + 1.0f);\n}\n\nfn is_nan_or_inf(v: f32) -> bool {\n return (v != v) || (abs(v) > 3.402823466e+38f);\n}\n\n@compute @workgroup_size(1)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n if (gid.x != 0u) { return; }\n\n let numSamples = u32(u.numSamples);\n let numChannels = u32(u.numChannels);\n let bufferLength = u32(u.bufferLength);\n\n var writeIndex = u32(state[0]);\n if (is_nan_or_inf(state[0])) {\n writeIndex = 0u;\n }\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n // 1. Dynamic Parameter Modulation & Anti-Explosion Clamping\n var effDelaySec = u.delaySec;\n if (u.hasDelayTimeSig > 0.5f) {\n effDelaySec = delayTimeSignal[index];\n }\n effDelaySec = clamp(effDelaySec, 0.001f, 5.0f);\n\n var effFeedback = u.feedback;\n if (u.hasFeedbackSig > 0.5f) {\n effFeedback = feedbackSignal[index];\n }\n effFeedback = clamp(effFeedback, 0.0f, 0.95f);\n\n var effWet = u.wet;\n if (u.hasWetSig > 0.5f) {\n effWet = wetSignal[index];\n }\n effWet = clamp(effWet, 0.0f, 2.0f);\n\n var effDry = u.dry;\n if (u.hasDrySig > 0.5f) {\n effDry = drySignal[index];\n }\n effDry = clamp(effDry, 0.0f, 2.0f);\n\n // 2. Safe Dynamic Read Index\n let readOffset = u32(clamp(effDelaySec * u.sampleRate, 1.0f, f32(bufferLength - 1u)));\n let readIndex = (writeIndex + bufferLength - readOffset) % bufferLength;\n\n if (numChannels == 1u || u.pingPong == 0.0f) {\n // Standard Delay\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let sampleIndex = c * numSamples + index;\n var inputVal = inputChannels[sampleIndex];\n if (is_nan_or_inf(inputVal)) {\n inputVal = 0.0f;\n }\n\n let stateOffset = c * bufferLength + 1u;\n var delayedSample = state[stateOffset + readIndex];\n if (is_nan_or_inf(delayedSample)) {\n delayedSample = 0.0f;\n }\n\n var nextStateVal = inputVal + delayedSample * effFeedback;\n if (is_nan_or_inf(nextStateVal)) {\n nextStateVal = 0.0f;\n }\n state[stateOffset + writeIndex] = clamp(nextStateVal, -4.0f, 4.0f);\n\n var outVal = effDry * inputVal + effWet * delayedSample;\n if (is_nan_or_inf(outVal)) {\n outVal = 0.0f;\n }\n if (outVal > 1.0f) {\n outVal = 1.0f;\n } else if (outVal < -1.0f) {\n outVal = -1.0f;\n } else if (outVal > 0.9f) {\n outVal = 0.9f + 0.1f * tanh((outVal - 0.9f) / 0.1f);\n } else if (outVal < -0.9f) {\n outVal = -0.9f + 0.1f * tanh((outVal + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = outVal;\n }\n } else {\n // Stereo Ping-Pong Delay\n var sampleL = inputChannels[index];\n if (is_nan_or_inf(sampleL)) { sampleL = 0.0f; }\n\n var sampleR = inputChannels[numSamples + index];\n if (is_nan_or_inf(sampleR)) { sampleR = 0.0f; }\n\n var delayedL = state[1u + readIndex];\n if (is_nan_or_inf(delayedL)) { delayedL = 0.0f; }\n\n var delayedR = state[bufferLength + 1u + readIndex];\n if (is_nan_or_inf(delayedR)) { delayedR = 0.0f; }\n\n // Ping-pong cross-feedback\n var nextL = sampleL + delayedR * effFeedback;\n var nextR = sampleR + delayedL * effFeedback;\n if (is_nan_or_inf(nextL)) { nextL = 0.0f; }\n if (is_nan_or_inf(nextR)) { nextR = 0.0f; }\n\n state[1u + writeIndex] = clamp(nextL, -4.0f, 4.0f);\n state[bufferLength + 1u + writeIndex] = clamp(nextR, -4.0f, 4.0f);\n\n var outL = effDry * sampleL + effWet * delayedL;\n var outR = effDry * sampleR + effWet * delayedR;\n if (is_nan_or_inf(outL)) { outL = 0.0f; }\n if (is_nan_or_inf(outR)) { outR = 0.0f; }\n\n if (outL > 1.0f) { outL = 1.0f; } else if (outL < -1.0f) { outL = -1.0f; }\n else if (outL > 0.9f) { outL = 0.9f + 0.1f * tanh((outL - 0.9f) / 0.1f); }\n else if (outL < -0.9f) { outL = -0.9f + 0.1f * tanh((outL + 0.9f) / 0.1f); }\n\n if (outR > 1.0f) { outR = 1.0f; } else if (outR < -1.0f) { outR = -1.0f; }\n else if (outR > 0.9f) { outR = 0.9f + 0.1f * tanh((outR - 0.9f) / 0.1f); }\n else if (outR < -0.9f) { outR = -0.9f + 0.1f * tanh((outR + 0.9f) / 0.1f); }\n\n outputChannels[index] = outL;\n outputChannels[numSamples + index] = outR;\n }\n\n writeIndex = (writeIndex + 1u) % bufferLength;\n }\n\n state[0] = f32(writeIndex);\n}\n`;\nconst delayAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Audio Delay.\");\n\tconst op = virtualMedia.operation || {};\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst delaySec = Math.max(.001, Math.min(resolveNumber(op.delayTime, .25), 5));\n\tconst feedbackInternal = Math.max(0, Math.min(resolveNumber(op.feedback, .4), .95));\n\tconst wetInternal = Math.max(0, Math.min(resolveNumber(op.wet, .3), 1));\n\tconst dryInternal = Math.max(0, Math.min(resolveNumber(op.dry, 1), 1));\n\tconst pingPongInternal = resolveBoolean(op.pingPong, false);\n\tconst hasDelayTimeSig = isHandleConnected(op, \"delayTimeHandleId\") ? 1 : 0;\n\tconst hasFeedbackSig = isHandleConnected(op, \"feedbackHandleId\") ? 1 : 0;\n\tconst hasWetSig = isHandleConnected(op, \"wetHandleId\") ? 1 : 0;\n\tconst hasDrySig = isHandleConnected(op, \"dryHandleId\") ? 1 : 0;\n\tconst bufferLength = Math.ceil(5 * sampleRate);\n\tconst nodeId = op.id || \"audio-delay\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = numChannels * bufferLength + 1;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, DELAY_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\tdelaySec,\n\t\tfeedbackInternal,\n\t\twetInternal,\n\t\tdryInternal,\n\t\tpingPongInternal ? 1 : 0,\n\t\tbufferLength,\n\t\thasDelayTimeSig,\n\t\thasFeedbackSig,\n\t\thasWetSig,\n\t\thasDrySig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\n\t\t0\n\t], 16, stateFloatCount, ctx?.renderId, true, ctx?.elapsedMs, ctx?.durationMs, void 0, void 0, PARAM_ORDER);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: delayAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-DXaKpV2A.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;CACA;AACD,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoKpC,MAAM,sBAAsB,OAAO,UAAU,YAAY,cAAc,QAAQ;AAC9E,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,gDAAgD;CAClF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,WAAW,KAAK,IAAI,MAAM,KAAK,IAAI,cAAc,GAAG,WAAW,IAAI,EAAE,EAAE,CAAC;CAC9E,MAAM,mBAAmB,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,GAAG,UAAU,GAAG,EAAE,IAAI,CAAC;CACnF,MAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,GAAG,KAAK,GAAG,EAAE,EAAE,CAAC;CACvE,MAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC;CACtE,MAAM,mBAAmB,eAAe,GAAG,UAAU,MAAM;CAC3D,MAAM,kBAAkB,kBAAkB,IAAI,oBAAoB,GAAG,IAAI;CACzE,MAAM,iBAAiB,kBAAkB,IAAI,mBAAmB,GAAG,IAAI;CACvE,MAAM,YAAY,kBAAkB,IAAI,cAAc,GAAG,IAAI;CAC7D,MAAM,YAAY,kBAAkB,IAAI,cAAc,GAAG,IAAI;CAC7D,MAAM,eAAe,KAAK,KAAK,IAAI,WAAW;CAC9C,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,cAAc,eAAe;AACrD,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,6BAA6B;EACnI;EACA;EACA;EACA;EACA;EACA,mBAAmB,IAAI;EACvB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,iBAAiB,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK3G,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,qBAAqB,CAAC"}
1
+ {"version":3,"file":"renderer-C-GTxnfv.mjs","names":[],"sources":["../../../nodes/node-audio-delay/dist/renderers-DXaKpV2A.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveBoolean, resolveNumber } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"delayTime\",\n\t\"feedback\",\n\t\"wet\",\n\t\"dry\"\n];\nconst DELAY_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n delaySec : f32,\n feedback : f32,\n wet : f32,\n dry : f32,\n pingPong : f32,\n bufferLength : f32,\n hasDelayTimeSig : f32,\n hasFeedbackSig : f32,\n hasWetSig : f32,\n hasDrySig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var<storage, read> inputChannels : array<f32>;\n@group(0) @binding(2) var<storage, read_write> outputChannels : array<f32>;\n@group(0) @binding(3) var<storage, read_write> state : array<f32>;\n@group(0) @binding(4) var<storage, read> delayTimeSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> feedbackSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> wetSignal : array<f32>;\n@group(0) @binding(7) var<storage, read> drySignal : array<f32>;\n\nfn tanh(x: f32) -> f32 {\n let exp2x = exp(2.0f * x);\n return (exp2x - 1.0f) / (exp2x + 1.0f);\n}\n\nfn is_nan_or_inf(v: f32) -> bool {\n return (v != v) || (abs(v) > 3.402823466e+38f);\n}\n\n@compute @workgroup_size(1)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n if (gid.x != 0u) { return; }\n\n let numSamples = u32(u.numSamples);\n let numChannels = u32(u.numChannels);\n let bufferLength = u32(u.bufferLength);\n\n var writeIndex = u32(state[0]);\n if (is_nan_or_inf(state[0])) {\n writeIndex = 0u;\n }\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n // 1. Dynamic Parameter Modulation & Anti-Explosion Clamping\n var effDelaySec = u.delaySec;\n if (u.hasDelayTimeSig > 0.5f) {\n effDelaySec = delayTimeSignal[index];\n }\n effDelaySec = clamp(effDelaySec, 0.001f, 5.0f);\n\n var effFeedback = u.feedback;\n if (u.hasFeedbackSig > 0.5f) {\n effFeedback = feedbackSignal[index];\n }\n effFeedback = clamp(effFeedback, 0.0f, 0.95f);\n\n var effWet = u.wet;\n if (u.hasWetSig > 0.5f) {\n effWet = wetSignal[index];\n }\n effWet = clamp(effWet, 0.0f, 2.0f);\n\n var effDry = u.dry;\n if (u.hasDrySig > 0.5f) {\n effDry = drySignal[index];\n }\n effDry = clamp(effDry, 0.0f, 2.0f);\n\n // 2. Safe Dynamic Read Index\n let readOffset = u32(clamp(effDelaySec * u.sampleRate, 1.0f, f32(bufferLength - 1u)));\n let readIndex = (writeIndex + bufferLength - readOffset) % bufferLength;\n\n if (numChannels == 1u || u.pingPong == 0.0f) {\n // Standard Delay\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let sampleIndex = c * numSamples + index;\n var inputVal = inputChannels[sampleIndex];\n if (is_nan_or_inf(inputVal)) {\n inputVal = 0.0f;\n }\n\n let stateOffset = c * bufferLength + 1u;\n var delayedSample = state[stateOffset + readIndex];\n if (is_nan_or_inf(delayedSample)) {\n delayedSample = 0.0f;\n }\n\n var nextStateVal = inputVal + delayedSample * effFeedback;\n if (is_nan_or_inf(nextStateVal)) {\n nextStateVal = 0.0f;\n }\n state[stateOffset + writeIndex] = clamp(nextStateVal, -4.0f, 4.0f);\n\n var outVal = effDry * inputVal + effWet * delayedSample;\n if (is_nan_or_inf(outVal)) {\n outVal = 0.0f;\n }\n if (outVal > 1.0f) {\n outVal = 1.0f;\n } else if (outVal < -1.0f) {\n outVal = -1.0f;\n } else if (outVal > 0.9f) {\n outVal = 0.9f + 0.1f * tanh((outVal - 0.9f) / 0.1f);\n } else if (outVal < -0.9f) {\n outVal = -0.9f + 0.1f * tanh((outVal + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = outVal;\n }\n } else {\n // Stereo Ping-Pong Delay\n var sampleL = inputChannels[index];\n if (is_nan_or_inf(sampleL)) { sampleL = 0.0f; }\n\n var sampleR = inputChannels[numSamples + index];\n if (is_nan_or_inf(sampleR)) { sampleR = 0.0f; }\n\n var delayedL = state[1u + readIndex];\n if (is_nan_or_inf(delayedL)) { delayedL = 0.0f; }\n\n var delayedR = state[bufferLength + 1u + readIndex];\n if (is_nan_or_inf(delayedR)) { delayedR = 0.0f; }\n\n // Ping-pong cross-feedback\n var nextL = sampleL + delayedR * effFeedback;\n var nextR = sampleR + delayedL * effFeedback;\n if (is_nan_or_inf(nextL)) { nextL = 0.0f; }\n if (is_nan_or_inf(nextR)) { nextR = 0.0f; }\n\n state[1u + writeIndex] = clamp(nextL, -4.0f, 4.0f);\n state[bufferLength + 1u + writeIndex] = clamp(nextR, -4.0f, 4.0f);\n\n var outL = effDry * sampleL + effWet * delayedL;\n var outR = effDry * sampleR + effWet * delayedR;\n if (is_nan_or_inf(outL)) { outL = 0.0f; }\n if (is_nan_or_inf(outR)) { outR = 0.0f; }\n\n if (outL > 1.0f) { outL = 1.0f; } else if (outL < -1.0f) { outL = -1.0f; }\n else if (outL > 0.9f) { outL = 0.9f + 0.1f * tanh((outL - 0.9f) / 0.1f); }\n else if (outL < -0.9f) { outL = -0.9f + 0.1f * tanh((outL + 0.9f) / 0.1f); }\n\n if (outR > 1.0f) { outR = 1.0f; } else if (outR < -1.0f) { outR = -1.0f; }\n else if (outR > 0.9f) { outR = 0.9f + 0.1f * tanh((outR - 0.9f) / 0.1f); }\n else if (outR < -0.9f) { outR = -0.9f + 0.1f * tanh((outR + 0.9f) / 0.1f); }\n\n outputChannels[index] = outL;\n outputChannels[numSamples + index] = outR;\n }\n\n writeIndex = (writeIndex + 1u) % bufferLength;\n }\n\n state[0] = f32(writeIndex);\n}\n`;\nconst delayAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Audio Delay.\");\n\tconst op = virtualMedia.operation || {};\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst delaySec = Math.max(.001, Math.min(resolveNumber(op.delayTime, .25), 5));\n\tconst feedbackInternal = Math.max(0, Math.min(resolveNumber(op.feedback, .4), .95));\n\tconst wetInternal = Math.max(0, Math.min(resolveNumber(op.wet, .3), 1));\n\tconst dryInternal = Math.max(0, Math.min(resolveNumber(op.dry, 1), 1));\n\tconst pingPongInternal = resolveBoolean(op.pingPong, false);\n\tconst hasDelayTimeSig = isHandleConnected(op, \"delayTimeHandleId\") ? 1 : 0;\n\tconst hasFeedbackSig = isHandleConnected(op, \"feedbackHandleId\") ? 1 : 0;\n\tconst hasWetSig = isHandleConnected(op, \"wetHandleId\") ? 1 : 0;\n\tconst hasDrySig = isHandleConnected(op, \"dryHandleId\") ? 1 : 0;\n\tconst bufferLength = Math.ceil(5 * sampleRate);\n\tconst nodeId = op.id || \"audio-delay\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = numChannels * bufferLength + 1;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, DELAY_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\tdelaySec,\n\t\tfeedbackInternal,\n\t\twetInternal,\n\t\tdryInternal,\n\t\tpingPongInternal ? 1 : 0,\n\t\tbufferLength,\n\t\thasDelayTimeSig,\n\t\thasFeedbackSig,\n\t\thasWetSig,\n\t\thasDrySig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\n\t\t0\n\t], 16, stateFloatCount, ctx?.renderId, true, ctx?.elapsedMs, ctx?.durationMs, void 0, void 0, PARAM_ORDER);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: delayAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-DXaKpV2A.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;CACA;AACD,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoKpC,MAAM,sBAAsB,OAAO,UAAU,YAAY,cAAc,QAAQ;AAC9E,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,gDAAgD;CAClF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,WAAW,KAAK,IAAI,MAAM,KAAK,IAAI,cAAc,GAAG,WAAW,IAAI,EAAE,EAAE,CAAC;CAC9E,MAAM,mBAAmB,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,GAAG,UAAU,GAAG,EAAE,IAAI,CAAC;CACnF,MAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,GAAG,KAAK,GAAG,EAAE,EAAE,CAAC;CACvE,MAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC;CACtE,MAAM,mBAAmB,eAAe,GAAG,UAAU,MAAM;CAC3D,MAAM,kBAAkB,kBAAkB,IAAI,oBAAoB,GAAG,IAAI;CACzE,MAAM,iBAAiB,kBAAkB,IAAI,mBAAmB,GAAG,IAAI;CACvE,MAAM,YAAY,kBAAkB,IAAI,cAAc,GAAG,IAAI;CAC7D,MAAM,YAAY,kBAAkB,IAAI,cAAc,GAAG,IAAI;CAC7D,MAAM,eAAe,KAAK,KAAK,IAAI,WAAW;CAC9C,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,cAAc,eAAe;AACrD,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,6BAA6B;EACnI;EACA;EACA;EACA;EACA;EACA,mBAAmB,IAAI;EACvB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,iBAAiB,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK3G,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,qBAAqB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-DOL2i2sR.mjs";
2
+ import "./dist-D3BeAZ7X.mjs";
3
+ import { t as renderers_default } from "./renderer-D8gN7aqk.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,6 +1,6 @@
1
- import { n as defineRenderer, u as unwrapFrameParam } from "./renderer-DcvjSolU.mjs";
2
- import { q as parseColor } from "./dist-CWLLnigL.mjs";
3
- import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CpkJJLQP.mjs";
1
+ import { d as unwrapFrameParam, n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
2
+ import { q as parseColor } from "./dist-D3BeAZ7X.mjs";
3
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTextureView, l as fragmentBindGroupLayout, m as texturesLayout, o as drawChildToTexture, p as signalTiming, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CWjgql4C.mjs";
4
4
 
5
5
  //#region ../../nodes/node-halftone-screen/dist/renderers-CvluQiq3.mjs
6
6
  const WGSL_HALFTONE_SHADER = `
@@ -456,4 +456,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: HalftoneScreenWebGPURen
456
456
 
457
457
  //#endregion
458
458
  export { renderers_default as t };
459
- //# sourceMappingURL=renderer-BDZC3o3N.mjs.map
459
+ //# sourceMappingURL=renderer-C1ctHdXl.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-BDZC3o3N.mjs","names":[],"sources":["../../../nodes/node-halftone-screen/dist/renderers-CvluQiq3.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { parseColor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_HALFTONE_SHADER = `\nstruct HalftoneUniforms {\n mode : f32, // 0 = Monochrome, 1 = CMYK\n dotShape : f32, // 0 = Circle, 1 = Diamond, 2 = Line, 3 = Square\n frequency : f32,\n angle : f32,\n\n contrast : f32,\n invert : f32,\n isSmooth : f32,\n opacity : f32,\n\n dotColor : vec4<f32>,\n paperColor : vec4<f32>,\n\n cyanAngle : f32,\n magentaAngle : f32,\n yellowAngle : f32,\n blackAngle : f32,\n\n hasFreqSig : f32,\n hasAngleSig : f32,\n hasContrastSig : f32,\n hasCyanSig : f32,\n\n hasMagSig : f32,\n hasYelSig : f32,\n hasBlkSig : f32,\n hasOpacitySig : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : HalftoneUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\n@group(2) @binding(0) var freqSigTex : texture_2d<f32>;\n@group(2) @binding(1) var angleSigTex : texture_2d<f32>;\n@group(2) @binding(2) var contrastSigTex : texture_2d<f32>;\n@group(2) @binding(3) var cyanSigTex : texture_2d<f32>;\n@group(2) @binding(4) var magSigTex : texture_2d<f32>;\n@group(2) @binding(5) var yelSigTex : texture_2d<f32>;\n@group(2) @binding(6) var blkSigTex : texture_2d<f32>;\n@group(2) @binding(7) var opacitySigTex : texture_2d<f32>;\n@group(2) @binding(8) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nconst PI: f32 = 3.141592653589793;\n\nfn getCellCenterUV(\n uv: vec2<f32>,\n dimensions: vec2<f32>,\n screenAngleDeg: f32,\n freq: f32\n) -> vec2<f32> {\n let rad = screenAngleDeg * PI / 180.0;\n let cosA = cos(rad);\n let sinA = sin(rad);\n let rot = mat2x2<f32>(cosA, -sinA, sinA, cosA);\n let invRot = mat2x2<f32>(cosA, sinA, -sinA, cosA);\n\n let minDim = min(dimensions.x, dimensions.y);\n let cellSize = max(minDim / max(freq, 1.0), 1.0);\n\n let center = dimensions * 0.5;\n let pixelPos = (uv * dimensions) - center;\n let rotPos = rot * pixelPos;\n\n let cellIndex = floor(rotPos / cellSize) + vec2<f32>(0.5);\n let cellCenterRot = cellIndex * cellSize;\n let cellCenterPixelPos = invRot * cellCenterRot;\n let cellCenterUV = (cellCenterPixelPos + center) / dimensions;\n return clamp(cellCenterUV, vec2<f32>(0.0), vec2<f32>(1.0));\n}\n\nfn evalDotCoverage(\n uv: vec2<f32>,\n dimensions: vec2<f32>,\n screenAngleDeg: f32,\n freq: f32,\n shape: f32,\n density: f32,\n contrastMultiplier: f32,\n isSmooth: f32\n) -> f32 {\n var d = clamp((density - 0.5) * contrastMultiplier + 0.5, 0.0, 1.0);\n if (d <= 0.0001) { return 0.0; }\n if (d >= 0.9999) { return 1.0; }\n\n let rad = screenAngleDeg * PI / 180.0;\n let cosA = cos(rad);\n let sinA = sin(rad);\n let rot = mat2x2<f32>(cosA, -sinA, sinA, cosA);\n\n let minDim = min(dimensions.x, dimensions.y);\n let cellSize = max(minDim / max(freq, 1.0), 1.0);\n\n let center = dimensions * 0.5;\n let pixelPos = (uv * dimensions) - center;\n let rotPos = rot * pixelPos;\n\n let cellUV = fract(rotPos / cellSize) - vec2<f32>(0.5);\n\n var spot: f32 = 0.0;\n\n if (shape < 0.5) {\n // 0: Euclidean Round Dot\n spot = 0.5 * (1.0 - (cos(cellUV.x * 2.0 * PI) + cos(cellUV.y * 2.0 * PI)) * 0.5);\n } else if (shape < 1.5) {\n // 1: Diamond\n spot = abs(cellUV.x) + abs(cellUV.y);\n } else if (shape < 2.5) {\n // 2: Line\n spot = abs(cellUV.y) * 2.0;\n } else {\n // 3: Square\n spot = max(abs(cellUV.x), abs(cellUV.y)) * 2.0;\n }\n\n let edgeWidth = select(0.001, max(1.5 / cellSize, 0.003), isSmooth > 0.5);\n\n return select(\n step(spot, d),\n smoothstep(d + edgeWidth, d - edgeWidth, spot),\n isSmooth > 0.5\n );\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n let sourceCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n if (sourceCol.a < 1e-5) {\n return sourceCol;\n }\n\n // Resolve parameter overrides or dynamic signals\n var frequency = u.frequency;\n if (u.hasFreqSig > 0.5) {\n frequency = textureSampleLevel(freqSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var baseAngle = u.angle;\n if (u.hasAngleSig > 0.5) {\n baseAngle = textureSampleLevel(angleSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var contrast = u.contrast;\n if (u.hasContrastSig > 0.5) {\n contrast = textureSampleLevel(contrastSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var cyanAngle = u.cyanAngle;\n if (u.hasCyanSig > 0.5) {\n cyanAngle = textureSampleLevel(cyanSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var magentaAngle = u.magentaAngle;\n if (u.hasMagSig > 0.5) {\n magentaAngle = textureSampleLevel(magSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var yellowAngle = u.yellowAngle;\n if (u.hasYelSig > 0.5) {\n yellowAngle = textureSampleLevel(yelSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var blackAngle = u.blackAngle;\n if (u.hasBlkSig > 0.5) {\n blackAngle = textureSampleLevel(blkSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var effectOpacity = u.opacity;\n if (u.hasOpacitySig > 0.5) {\n effectOpacity = textureSampleLevel(opacitySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n let dimensions = vec2<f32>(textureDimensions(tex));\n let unpremult = sourceCol.rgb / sourceCol.a;\n\n var screenedRgb: vec3<f32>;\n\n if (u.mode < 0.5) {\n // --- Monochrome Mode ---\n let cellCenterUV = getCellCenterUV(in.uv, dimensions, baseAngle, frequency);\n let cellCol = textureSampleLevel(tex, samp, cellCenterUV, 0.0);\n let cellRgb = select(cellCol.rgb, cellCol.rgb / cellCol.a, cellCol.a > 1e-5);\n let luminance = dot(cellRgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n var inkDensity = 1.0 - luminance;\n if (u.invert > 0.5) {\n inkDensity = luminance;\n }\n\n let coverage = evalDotCoverage(\n in.uv,\n dimensions,\n baseAngle,\n frequency,\n u.dotShape,\n inkDensity,\n contrast,\n u.isSmooth\n );\n\n screenedRgb = mix(u.paperColor.rgb, u.dotColor.rgb, coverage);\n } else {\n // --- CMYK Mode ---\n let cellCenterUVC = getCellCenterUV(in.uv, dimensions, baseAngle + cyanAngle, frequency);\n let colC = textureSampleLevel(tex, samp, cellCenterUVC, 0.0);\n let rgbC = select(colC.rgb, colC.rgb / colC.a, colC.a > 1e-5);\n let kC = 1.0 - max(max(rgbC.r, rgbC.g), rgbC.b);\n let invKC = 1.0 - kC;\n var densC = select(0.0, clamp((1.0 - rgbC.r - kC) / max(invKC, 0.0001), 0.0, 1.0), invKC > 0.0001);\n\n let cellCenterUVM = getCellCenterUV(in.uv, dimensions, baseAngle + magentaAngle, frequency);\n let colM = textureSampleLevel(tex, samp, cellCenterUVM, 0.0);\n let rgbM = select(colM.rgb, colM.rgb / colM.a, colM.a > 1e-5);\n let kM = 1.0 - max(max(rgbM.r, rgbM.g), rgbM.b);\n let invKM = 1.0 - kM;\n var densM = select(0.0, clamp((1.0 - rgbM.g - kM) / max(invKM, 0.0001), 0.0, 1.0), invKM > 0.0001);\n\n let cellCenterUVY = getCellCenterUV(in.uv, dimensions, baseAngle + yellowAngle, frequency);\n let colY = textureSampleLevel(tex, samp, cellCenterUVY, 0.0);\n let rgbY = select(colY.rgb, colY.rgb / colY.a, colY.a > 1e-5);\n let kY = 1.0 - max(max(rgbY.r, rgbY.g), rgbY.b);\n let invKY = 1.0 - kY;\n var densY = select(0.0, clamp((1.0 - rgbY.b - kY) / max(invKY, 0.0001), 0.0, 1.0), invKY > 0.0001);\n\n let cellCenterUVK = getCellCenterUV(in.uv, dimensions, baseAngle + blackAngle, frequency);\n let colK = textureSampleLevel(tex, samp, cellCenterUVK, 0.0);\n let rgbK = select(colK.rgb, colK.rgb / colK.a, colK.a > 1e-5);\n var densK = 1.0 - max(max(rgbK.r, rgbK.g), rgbK.b);\n\n if (u.invert > 0.5) {\n densC = 1.0 - densC;\n densM = 1.0 - densM;\n densY = 1.0 - densY;\n densK = 1.0 - densK;\n }\n\n let covC = evalDotCoverage(in.uv, dimensions, baseAngle + cyanAngle, frequency, u.dotShape, densC, contrast, u.isSmooth);\n let covM = evalDotCoverage(in.uv, dimensions, baseAngle + magentaAngle, frequency, u.dotShape, densM, contrast, u.isSmooth);\n let covY = evalDotCoverage(in.uv, dimensions, baseAngle + yellowAngle, frequency, u.dotShape, densY, contrast, u.isSmooth);\n let covK = evalDotCoverage(in.uv, dimensions, baseAngle + blackAngle, frequency, u.dotShape, densK, contrast, u.isSmooth);\n\n // Subtractive synthesis onto paper substrate\n let outR = u.paperColor.r * (1.0 - covC) * (1.0 - covK);\n let outG = u.paperColor.g * (1.0 - covM) * (1.0 - covK);\n let outB = u.paperColor.b * (1.0 - covY) * (1.0 - covK);\n\n screenedRgb = clamp(vec3<f32>(outR, outG, outB), vec3<f32>(0.0), vec3<f32>(1.0));\n }\n\n // Apply effect opacity blend\n let finalRgb = mix(unpremult, screenedRgb, clamp(effectOpacity, 0.0, 1.0));\n return vec4<f32>(finalRgb * sourceCol.a, sourceCol.a);\n}\n`;\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 8),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getHalftoneResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `halftone_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst halftoneModule = device.createShaderModule({\n\t\t\tlabel: `halftone_${format}.wgsl`,\n\t\t\tcode: WGSL_HALFTONE_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `HalftonePipeline_${format}`,\n\t\t\tmodule: halftoneModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\thalftonePipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst HalftoneScreenWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"HalftoneScreen\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"halftone_node\";\n\tconst resolveBindable = (configKey, defaultValue, minVal, maxVal) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && input.outputItem?.type === \"Signal\");\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = defaultValue;\n\t\tlet hasStaticSig = false;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") val = Math.max(minVal, Math.min(maxVal, Number(input.outputItem.data ?? defaultValue)));\n\t\telse {\n\t\t\tconst rawVal = unwrapFrameParam(op[configKey], compositionFrame, fps).value;\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(rawVal ?? defaultValue)));\n\t\t}\n\t\telse if (sd) {\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(sd.offset ?? 0)));\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd\n\t\t};\n\t};\n\tconst freqRes = resolveBindable(\"frequency\", 30, 1, 200);\n\tconst angleRes = resolveBindable(\"angle\", 45, 0, 360);\n\tconst contrastRes = resolveBindable(\"contrast\", 1, .1, 5);\n\tconst cyanRes = resolveBindable(\"cyanAngle\", 15, 0, 360);\n\tconst magRes = resolveBindable(\"magentaAngle\", 75, 0, 360);\n\tconst yelRes = resolveBindable(\"yellowAngle\", 0, 0, 360);\n\tconst blkRes = resolveBindable(\"blackAngle\", 45, 0, 360);\n\tconst opacityRes = resolveBindable(\"opacity\", 1, 0, 1);\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { halftonePipeline: pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getHalftoneResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst signalContext = {\n\t\targs,\n\t\twidth,\n\t\theight,\n\t\tframe,\n\t\tfps,\n\t\telapsedSeconds,\n\t\tdurationSeconds\n\t};\n\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\tconst freqView = getSignalView(freqRes, \"freq_sig\");\n\tconst angleView = getSignalView(angleRes, \"angle_sig\");\n\tconst contrastView = getSignalView(contrastRes, \"contrast_sig\");\n\tconst cyanView = getSignalView(cyanRes, \"cyan_sig\");\n\tconst magView = getSignalView(magRes, \"mag_sig\");\n\tconst yelView = getSignalView(yelRes, \"yel_sig\");\n\tconst blkView = getSignalView(blkRes, \"blk_sig\");\n\tconst opacityView = getSignalView(opacityRes, \"opacity_sig\");\n\tconst modeVal = op.mode === \"CMYK\" ? 1 : 0;\n\tlet dotShapeVal = 0;\n\tif (op.dotShape === \"Diamond\") dotShapeVal = 1;\n\telse if (op.dotShape === \"Line\") dotShapeVal = 2;\n\telse if (op.dotShape === \"Square\") dotShapeVal = 3;\n\tconst dotCol = parseColor(op.dotColor ?? \"#000000\");\n\tconst paperCol = parseColor(op.paperColor ?? \"#ffffff\");\n\tconst halftoneUniformData = new Float32Array(28);\n\thalftoneUniformData[0] = modeVal;\n\thalftoneUniformData[1] = dotShapeVal;\n\thalftoneUniformData[2] = freqRes.val;\n\thalftoneUniformData[3] = angleRes.val;\n\thalftoneUniformData[4] = contrastRes.val;\n\thalftoneUniformData[5] = op.invert ? 1 : 0;\n\thalftoneUniformData[6] = op.smooth !== false ? 1 : 0;\n\thalftoneUniformData[7] = opacityRes.val;\n\thalftoneUniformData[8] = dotCol.r;\n\thalftoneUniformData[9] = dotCol.g;\n\thalftoneUniformData[10] = dotCol.b;\n\thalftoneUniformData[11] = dotCol.a;\n\thalftoneUniformData[12] = paperCol.r;\n\thalftoneUniformData[13] = paperCol.g;\n\thalftoneUniformData[14] = paperCol.b;\n\thalftoneUniformData[15] = paperCol.a;\n\thalftoneUniformData[16] = cyanRes.val;\n\thalftoneUniformData[17] = magRes.val;\n\thalftoneUniformData[18] = yelRes.val;\n\thalftoneUniformData[19] = blkRes.val;\n\thalftoneUniformData[20] = freqRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[21] = angleRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[22] = contrastRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[23] = cyanRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[24] = magRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[25] = yelRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[26] = blkRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[27] = opacityRes.hasStaticSig ? 1 : 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(halftoneUniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uniformBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: freqView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: angleView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: contrastView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: cyanView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: magView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: yelView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\n\t\t\t\t\tresource: blkView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 7,\n\t\t\t\t\tresource: opacityView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 8,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: HalftoneScreenWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-CvluQiq3.mjs.map"],"mappings":";;;;;AAMA,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4C3B,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmNvB,MAAM,mBAAmB,WAAW,YAAY;CAC/C,eAAe,wBAAwB,QAAQ,CAAC,UAAU,CAAC;CAC3D,qBAAqB,wBAAwB,QAAQ,CAAC,WAAW,UAAU,CAAC;CAC5E,qBAAqB,eAAe,QAAQ,EAAE;CAC9C,+BAA+B,IAAI,KAAK;CACxC,EAAE;AACH,SAAS,qBAAqB,QAAQ,QAAQ;CAC7C,MAAM,UAAU,iBAAiB,OAAO;CACxC,MAAM,WAAW,YAAY;CAC7B,IAAI,WAAW,QAAQ,cAAc,IAAI,SAAS;AAClD,KAAI,CAAC,UAAU;EACd,MAAM,iBAAiB,OAAO,mBAAmB;GAChD,OAAO,YAAY,OAAO;GAC1B,MAAM;GACN,CAAC;AACF,aAAW,yBAAyB,QAAQ;GAC3C,OAAO,oBAAoB;GAC3B,QAAQ;GACR,SAAS;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR;GACD;GACA,CAAC;AACF,UAAQ,cAAc,IAAI,UAAU,SAAS;;AAE9C,QAAO;EACN,kBAAkB;EAClB,eAAe,QAAQ;EACvB,qBAAqB,QAAQ;EAC7B,qBAAqB,QAAQ;EAC7B;;AAEF,MAAM,+BAA+B,OAAO,SAAS;CACpD,MAAM,EAAE,KAAK,SAAS,MAAM,eAAe,aAAa,cAAc,UAAU;CAChF,MAAM,QAAQ,MAAM,SAAS;CAC7B,MAAM,mBAAmB,MAAM,oBAAoB;CACnD,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,oBAAoB,CAAC,GAAI;CACxC,MAAM,aAAa,MAAM,aAAa,WAAW;AACjD,KAAI,CAAC,WAAY;AACjB,MAAK,KAAK;CACV,MAAM,QAAQ;CACd,MAAM,SAAS;CACf,MAAM,SAAS,GAAG,SAAS,OAAO,KAAK,GAAG,OAAO,CAAC,KAAK;CACvD,MAAM,mBAAmB,WAAW,cAAc,QAAQ,WAAW;EACpE,MAAM,WAAW,GAAG,GAAG,UAAU;EACjC,MAAM,QAAQ,WAAW,GAAG,SAAS,YAAY;EACjD,MAAM,YAAY,CAAC,EAAE,OAAO,mBAAmB,MAAM,YAAY,SAAS;EAC1E,MAAM,KAAK,aAAa,OAAO,YAAY,OAAO,MAAM,WAAW,OAAO;EAC1E,IAAI,MAAM;EACV,IAAI,eAAe;AACnB,MAAI,CAAC,UAAW,KAAI,OAAO,mBAAmB,MAAM,YAAY,SAAS,SAAU,OAAM,KAAK,IAAI,QAAQ,KAAK,IAAI,QAAQ,OAAO,MAAM,WAAW,QAAQ,aAAa,CAAC,CAAC;OACrK;GACJ,MAAM,SAAS,iBAAiB,GAAG,YAAY,kBAAkB,IAAI,CAAC;AACtE,SAAM,KAAK,IAAI,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,aAAa,CAAC,CAAC;;WAEhE,IAAI;AACZ,SAAM,KAAK,IAAI,QAAQ,KAAK,IAAI,QAAQ,OAAO,GAAG,UAAU,EAAE,CAAC,CAAC;AAChE,kBAAe;;AAEhB,SAAO;GACN;GACA;GACA;GACA;;CAEF,MAAM,UAAU,gBAAgB,aAAa,IAAI,GAAG,IAAI;CACxD,MAAM,WAAW,gBAAgB,SAAS,IAAI,GAAG,IAAI;CACrD,MAAM,cAAc,gBAAgB,YAAY,GAAG,IAAI,EAAE;CACzD,MAAM,UAAU,gBAAgB,aAAa,IAAI,GAAG,IAAI;CACxD,MAAM,SAAS,gBAAgB,gBAAgB,IAAI,GAAG,IAAI;CAC1D,MAAM,SAAS,gBAAgB,eAAe,GAAG,GAAG,IAAI;CACxD,MAAM,SAAS,gBAAgB,cAAc,IAAI,GAAG,IAAI;CACxD,MAAM,aAAa,gBAAgB,WAAW,GAAG,GAAG,EAAE;CACtD,MAAM,EAAE,SAAS,WAAW,MAAM,mBAAmB,MAAM,WAAW;CACtE,MAAM,EAAE,kBAAkB,UAAU,eAAe,SAAS,qBAAqB,SAAS,qBAAqB,cAAc,qBAAqB,IAAI,QAAQ,IAAI,SAAS,OAAO;CAClL,MAAM,UAAU,IAAI,SAAS,aAAa,WAAW,IAAI,OAAO;CAChE,MAAM,EAAE,gBAAgB,oBAAoB,aAAa,OAAO,OAAO,IAAI;CAC3E,MAAM,gBAAgB;EACrB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD,MAAM,iBAAiB,KAAK,WAAW,kBAAkB,eAAe,KAAK,GAAG,OAAO,GAAG,SAAS;CACnG,MAAM,WAAW,cAAc,SAAS,WAAW;CACnD,MAAM,YAAY,cAAc,UAAU,YAAY;CACtD,MAAM,eAAe,cAAc,aAAa,eAAe;CAC/D,MAAM,WAAW,cAAc,SAAS,WAAW;CACnD,MAAM,UAAU,cAAc,QAAQ,UAAU;CAChD,MAAM,UAAU,cAAc,QAAQ,UAAU;CAChD,MAAM,UAAU,cAAc,QAAQ,UAAU;CAChD,MAAM,cAAc,cAAc,YAAY,cAAc;CAC5D,MAAM,UAAU,GAAG,SAAS,SAAS,IAAI;CACzC,IAAI,cAAc;AAClB,KAAI,GAAG,aAAa,UAAW,eAAc;UACpC,GAAG,aAAa,OAAQ,eAAc;UACtC,GAAG,aAAa,SAAU,eAAc;CACjD,MAAM,SAAS,WAAW,GAAG,YAAY,UAAU;CACnD,MAAM,WAAW,WAAW,GAAG,cAAc,UAAU;CACvD,MAAM,sBAAsB,IAAI,aAAa,GAAG;AAChD,qBAAoB,KAAK;AACzB,qBAAoB,KAAK;AACzB,qBAAoB,KAAK,QAAQ;AACjC,qBAAoB,KAAK,SAAS;AAClC,qBAAoB,KAAK,YAAY;AACrC,qBAAoB,KAAK,GAAG,SAAS,IAAI;AACzC,qBAAoB,KAAK,GAAG,WAAW,QAAQ,IAAI;AACnD,qBAAoB,KAAK,WAAW;AACpC,qBAAoB,KAAK,OAAO;AAChC,qBAAoB,KAAK,OAAO;AAChC,qBAAoB,MAAM,OAAO;AACjC,qBAAoB,MAAM,OAAO;AACjC,qBAAoB,MAAM,SAAS;AACnC,qBAAoB,MAAM,SAAS;AACnC,qBAAoB,MAAM,SAAS;AACnC,qBAAoB,MAAM,SAAS;AACnC,qBAAoB,MAAM,QAAQ;AAClC,qBAAoB,MAAM,OAAO;AACjC,qBAAoB,MAAM,OAAO;AACjC,qBAAoB,MAAM,OAAO;AACjC,qBAAoB,MAAM,QAAQ,eAAe,IAAI;AACrD,qBAAoB,MAAM,SAAS,eAAe,IAAI;AACtD,qBAAoB,MAAM,YAAY,eAAe,IAAI;AACzD,qBAAoB,MAAM,QAAQ,eAAe,IAAI;AACrD,qBAAoB,MAAM,OAAO,eAAe,IAAI;AACpD,qBAAoB,MAAM,OAAO,eAAe,IAAI;AACpD,qBAAoB,MAAM,OAAO,eAAe,IAAI;AACpD,qBAAoB,MAAM,WAAW,eAAe,IAAI;CACxD,MAAM,gBAAgB,IAAI,SAAS,mBAAmB,oBAAoB;CAC1E,MAAM,SAAS,IAAI,SAAS,oBAAoB,OAAO,QAAQ;EAC9D;EACA;EACA,GAAG,MAAM,mBAAmB,EAAE;EAC9B,CAAC;AACF,oBAAmB,SAAS,OAAO,YAAY,EAAE,UAAU;EAC1D,IAAI,OAAO,gBAAgB;GAC1B,QAAQ;GACR,SAAS,CAAC;IACT,SAAS;IACT,UAAU,EAAE,QAAQ,eAAe;IACnC,CAAC;GACF,CAAC;EACF,IAAI,SAAS,eAAe,aAAa,IAAI,QAAQ,SAAS,QAAQ,QAAQ;EAC9E,IAAI,OAAO,gBAAgB;GAC1B,QAAQ;GACR,SAAS;IACR;KACC,SAAS;KACT,UAAU;KACV;IACD;KACC,SAAS;KACT,UAAU;KACV;IACD;KACC,SAAS;KACT,UAAU;KACV;IACD;KACC,SAAS;KACT,UAAU;KACV;IACD;KACC,SAAS;KACT,UAAU;KACV;IACD;KACC,SAAS;KACT,UAAU;KACV;IACD;KACC,SAAS;KACT,UAAU;KACV;IACD;KACC,SAAS;KACT,UAAU;KACV;IACD;KACC,SAAS;KACT,UAAU;KACV;IACD;GACD,CAAC;EACF,CAAC;AACF,qBAAoB,MAAM,OAAO;;AAKlC,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,8BAA8B,CAAC"}
1
+ {"version":3,"file":"renderer-C1ctHdXl.mjs","names":[],"sources":["../../../nodes/node-halftone-screen/dist/renderers-CvluQiq3.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { parseColor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_HALFTONE_SHADER = `\nstruct HalftoneUniforms {\n mode : f32, // 0 = Monochrome, 1 = CMYK\n dotShape : f32, // 0 = Circle, 1 = Diamond, 2 = Line, 3 = Square\n frequency : f32,\n angle : f32,\n\n contrast : f32,\n invert : f32,\n isSmooth : f32,\n opacity : f32,\n\n dotColor : vec4<f32>,\n paperColor : vec4<f32>,\n\n cyanAngle : f32,\n magentaAngle : f32,\n yellowAngle : f32,\n blackAngle : f32,\n\n hasFreqSig : f32,\n hasAngleSig : f32,\n hasContrastSig : f32,\n hasCyanSig : f32,\n\n hasMagSig : f32,\n hasYelSig : f32,\n hasBlkSig : f32,\n hasOpacitySig : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : HalftoneUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\n@group(2) @binding(0) var freqSigTex : texture_2d<f32>;\n@group(2) @binding(1) var angleSigTex : texture_2d<f32>;\n@group(2) @binding(2) var contrastSigTex : texture_2d<f32>;\n@group(2) @binding(3) var cyanSigTex : texture_2d<f32>;\n@group(2) @binding(4) var magSigTex : texture_2d<f32>;\n@group(2) @binding(5) var yelSigTex : texture_2d<f32>;\n@group(2) @binding(6) var blkSigTex : texture_2d<f32>;\n@group(2) @binding(7) var opacitySigTex : texture_2d<f32>;\n@group(2) @binding(8) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nconst PI: f32 = 3.141592653589793;\n\nfn getCellCenterUV(\n uv: vec2<f32>,\n dimensions: vec2<f32>,\n screenAngleDeg: f32,\n freq: f32\n) -> vec2<f32> {\n let rad = screenAngleDeg * PI / 180.0;\n let cosA = cos(rad);\n let sinA = sin(rad);\n let rot = mat2x2<f32>(cosA, -sinA, sinA, cosA);\n let invRot = mat2x2<f32>(cosA, sinA, -sinA, cosA);\n\n let minDim = min(dimensions.x, dimensions.y);\n let cellSize = max(minDim / max(freq, 1.0), 1.0);\n\n let center = dimensions * 0.5;\n let pixelPos = (uv * dimensions) - center;\n let rotPos = rot * pixelPos;\n\n let cellIndex = floor(rotPos / cellSize) + vec2<f32>(0.5);\n let cellCenterRot = cellIndex * cellSize;\n let cellCenterPixelPos = invRot * cellCenterRot;\n let cellCenterUV = (cellCenterPixelPos + center) / dimensions;\n return clamp(cellCenterUV, vec2<f32>(0.0), vec2<f32>(1.0));\n}\n\nfn evalDotCoverage(\n uv: vec2<f32>,\n dimensions: vec2<f32>,\n screenAngleDeg: f32,\n freq: f32,\n shape: f32,\n density: f32,\n contrastMultiplier: f32,\n isSmooth: f32\n) -> f32 {\n var d = clamp((density - 0.5) * contrastMultiplier + 0.5, 0.0, 1.0);\n if (d <= 0.0001) { return 0.0; }\n if (d >= 0.9999) { return 1.0; }\n\n let rad = screenAngleDeg * PI / 180.0;\n let cosA = cos(rad);\n let sinA = sin(rad);\n let rot = mat2x2<f32>(cosA, -sinA, sinA, cosA);\n\n let minDim = min(dimensions.x, dimensions.y);\n let cellSize = max(minDim / max(freq, 1.0), 1.0);\n\n let center = dimensions * 0.5;\n let pixelPos = (uv * dimensions) - center;\n let rotPos = rot * pixelPos;\n\n let cellUV = fract(rotPos / cellSize) - vec2<f32>(0.5);\n\n var spot: f32 = 0.0;\n\n if (shape < 0.5) {\n // 0: Euclidean Round Dot\n spot = 0.5 * (1.0 - (cos(cellUV.x * 2.0 * PI) + cos(cellUV.y * 2.0 * PI)) * 0.5);\n } else if (shape < 1.5) {\n // 1: Diamond\n spot = abs(cellUV.x) + abs(cellUV.y);\n } else if (shape < 2.5) {\n // 2: Line\n spot = abs(cellUV.y) * 2.0;\n } else {\n // 3: Square\n spot = max(abs(cellUV.x), abs(cellUV.y)) * 2.0;\n }\n\n let edgeWidth = select(0.001, max(1.5 / cellSize, 0.003), isSmooth > 0.5);\n\n return select(\n step(spot, d),\n smoothstep(d + edgeWidth, d - edgeWidth, spot),\n isSmooth > 0.5\n );\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n let sourceCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n if (sourceCol.a < 1e-5) {\n return sourceCol;\n }\n\n // Resolve parameter overrides or dynamic signals\n var frequency = u.frequency;\n if (u.hasFreqSig > 0.5) {\n frequency = textureSampleLevel(freqSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var baseAngle = u.angle;\n if (u.hasAngleSig > 0.5) {\n baseAngle = textureSampleLevel(angleSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var contrast = u.contrast;\n if (u.hasContrastSig > 0.5) {\n contrast = textureSampleLevel(contrastSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var cyanAngle = u.cyanAngle;\n if (u.hasCyanSig > 0.5) {\n cyanAngle = textureSampleLevel(cyanSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var magentaAngle = u.magentaAngle;\n if (u.hasMagSig > 0.5) {\n magentaAngle = textureSampleLevel(magSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var yellowAngle = u.yellowAngle;\n if (u.hasYelSig > 0.5) {\n yellowAngle = textureSampleLevel(yelSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var blackAngle = u.blackAngle;\n if (u.hasBlkSig > 0.5) {\n blackAngle = textureSampleLevel(blkSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var effectOpacity = u.opacity;\n if (u.hasOpacitySig > 0.5) {\n effectOpacity = textureSampleLevel(opacitySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n let dimensions = vec2<f32>(textureDimensions(tex));\n let unpremult = sourceCol.rgb / sourceCol.a;\n\n var screenedRgb: vec3<f32>;\n\n if (u.mode < 0.5) {\n // --- Monochrome Mode ---\n let cellCenterUV = getCellCenterUV(in.uv, dimensions, baseAngle, frequency);\n let cellCol = textureSampleLevel(tex, samp, cellCenterUV, 0.0);\n let cellRgb = select(cellCol.rgb, cellCol.rgb / cellCol.a, cellCol.a > 1e-5);\n let luminance = dot(cellRgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n var inkDensity = 1.0 - luminance;\n if (u.invert > 0.5) {\n inkDensity = luminance;\n }\n\n let coverage = evalDotCoverage(\n in.uv,\n dimensions,\n baseAngle,\n frequency,\n u.dotShape,\n inkDensity,\n contrast,\n u.isSmooth\n );\n\n screenedRgb = mix(u.paperColor.rgb, u.dotColor.rgb, coverage);\n } else {\n // --- CMYK Mode ---\n let cellCenterUVC = getCellCenterUV(in.uv, dimensions, baseAngle + cyanAngle, frequency);\n let colC = textureSampleLevel(tex, samp, cellCenterUVC, 0.0);\n let rgbC = select(colC.rgb, colC.rgb / colC.a, colC.a > 1e-5);\n let kC = 1.0 - max(max(rgbC.r, rgbC.g), rgbC.b);\n let invKC = 1.0 - kC;\n var densC = select(0.0, clamp((1.0 - rgbC.r - kC) / max(invKC, 0.0001), 0.0, 1.0), invKC > 0.0001);\n\n let cellCenterUVM = getCellCenterUV(in.uv, dimensions, baseAngle + magentaAngle, frequency);\n let colM = textureSampleLevel(tex, samp, cellCenterUVM, 0.0);\n let rgbM = select(colM.rgb, colM.rgb / colM.a, colM.a > 1e-5);\n let kM = 1.0 - max(max(rgbM.r, rgbM.g), rgbM.b);\n let invKM = 1.0 - kM;\n var densM = select(0.0, clamp((1.0 - rgbM.g - kM) / max(invKM, 0.0001), 0.0, 1.0), invKM > 0.0001);\n\n let cellCenterUVY = getCellCenterUV(in.uv, dimensions, baseAngle + yellowAngle, frequency);\n let colY = textureSampleLevel(tex, samp, cellCenterUVY, 0.0);\n let rgbY = select(colY.rgb, colY.rgb / colY.a, colY.a > 1e-5);\n let kY = 1.0 - max(max(rgbY.r, rgbY.g), rgbY.b);\n let invKY = 1.0 - kY;\n var densY = select(0.0, clamp((1.0 - rgbY.b - kY) / max(invKY, 0.0001), 0.0, 1.0), invKY > 0.0001);\n\n let cellCenterUVK = getCellCenterUV(in.uv, dimensions, baseAngle + blackAngle, frequency);\n let colK = textureSampleLevel(tex, samp, cellCenterUVK, 0.0);\n let rgbK = select(colK.rgb, colK.rgb / colK.a, colK.a > 1e-5);\n var densK = 1.0 - max(max(rgbK.r, rgbK.g), rgbK.b);\n\n if (u.invert > 0.5) {\n densC = 1.0 - densC;\n densM = 1.0 - densM;\n densY = 1.0 - densY;\n densK = 1.0 - densK;\n }\n\n let covC = evalDotCoverage(in.uv, dimensions, baseAngle + cyanAngle, frequency, u.dotShape, densC, contrast, u.isSmooth);\n let covM = evalDotCoverage(in.uv, dimensions, baseAngle + magentaAngle, frequency, u.dotShape, densM, contrast, u.isSmooth);\n let covY = evalDotCoverage(in.uv, dimensions, baseAngle + yellowAngle, frequency, u.dotShape, densY, contrast, u.isSmooth);\n let covK = evalDotCoverage(in.uv, dimensions, baseAngle + blackAngle, frequency, u.dotShape, densK, contrast, u.isSmooth);\n\n // Subtractive synthesis onto paper substrate\n let outR = u.paperColor.r * (1.0 - covC) * (1.0 - covK);\n let outG = u.paperColor.g * (1.0 - covM) * (1.0 - covK);\n let outB = u.paperColor.b * (1.0 - covY) * (1.0 - covK);\n\n screenedRgb = clamp(vec3<f32>(outR, outG, outB), vec3<f32>(0.0), vec3<f32>(1.0));\n }\n\n // Apply effect opacity blend\n let finalRgb = mix(unpremult, screenedRgb, clamp(effectOpacity, 0.0, 1.0));\n return vec4<f32>(finalRgb * sourceCol.a, sourceCol.a);\n}\n`;\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 8),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getHalftoneResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `halftone_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst halftoneModule = device.createShaderModule({\n\t\t\tlabel: `halftone_${format}.wgsl`,\n\t\t\tcode: WGSL_HALFTONE_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `HalftonePipeline_${format}`,\n\t\t\tmodule: halftoneModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\thalftonePipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst HalftoneScreenWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"HalftoneScreen\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"halftone_node\";\n\tconst resolveBindable = (configKey, defaultValue, minVal, maxVal) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && input.outputItem?.type === \"Signal\");\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = defaultValue;\n\t\tlet hasStaticSig = false;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") val = Math.max(minVal, Math.min(maxVal, Number(input.outputItem.data ?? defaultValue)));\n\t\telse {\n\t\t\tconst rawVal = unwrapFrameParam(op[configKey], compositionFrame, fps).value;\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(rawVal ?? defaultValue)));\n\t\t}\n\t\telse if (sd) {\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(sd.offset ?? 0)));\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd\n\t\t};\n\t};\n\tconst freqRes = resolveBindable(\"frequency\", 30, 1, 200);\n\tconst angleRes = resolveBindable(\"angle\", 45, 0, 360);\n\tconst contrastRes = resolveBindable(\"contrast\", 1, .1, 5);\n\tconst cyanRes = resolveBindable(\"cyanAngle\", 15, 0, 360);\n\tconst magRes = resolveBindable(\"magentaAngle\", 75, 0, 360);\n\tconst yelRes = resolveBindable(\"yellowAngle\", 0, 0, 360);\n\tconst blkRes = resolveBindable(\"blackAngle\", 45, 0, 360);\n\tconst opacityRes = resolveBindable(\"opacity\", 1, 0, 1);\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { halftonePipeline: pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getHalftoneResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst signalContext = {\n\t\targs,\n\t\twidth,\n\t\theight,\n\t\tframe,\n\t\tfps,\n\t\telapsedSeconds,\n\t\tdurationSeconds\n\t};\n\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\tconst freqView = getSignalView(freqRes, \"freq_sig\");\n\tconst angleView = getSignalView(angleRes, \"angle_sig\");\n\tconst contrastView = getSignalView(contrastRes, \"contrast_sig\");\n\tconst cyanView = getSignalView(cyanRes, \"cyan_sig\");\n\tconst magView = getSignalView(magRes, \"mag_sig\");\n\tconst yelView = getSignalView(yelRes, \"yel_sig\");\n\tconst blkView = getSignalView(blkRes, \"blk_sig\");\n\tconst opacityView = getSignalView(opacityRes, \"opacity_sig\");\n\tconst modeVal = op.mode === \"CMYK\" ? 1 : 0;\n\tlet dotShapeVal = 0;\n\tif (op.dotShape === \"Diamond\") dotShapeVal = 1;\n\telse if (op.dotShape === \"Line\") dotShapeVal = 2;\n\telse if (op.dotShape === \"Square\") dotShapeVal = 3;\n\tconst dotCol = parseColor(op.dotColor ?? \"#000000\");\n\tconst paperCol = parseColor(op.paperColor ?? \"#ffffff\");\n\tconst halftoneUniformData = new Float32Array(28);\n\thalftoneUniformData[0] = modeVal;\n\thalftoneUniformData[1] = dotShapeVal;\n\thalftoneUniformData[2] = freqRes.val;\n\thalftoneUniformData[3] = angleRes.val;\n\thalftoneUniformData[4] = contrastRes.val;\n\thalftoneUniformData[5] = op.invert ? 1 : 0;\n\thalftoneUniformData[6] = op.smooth !== false ? 1 : 0;\n\thalftoneUniformData[7] = opacityRes.val;\n\thalftoneUniformData[8] = dotCol.r;\n\thalftoneUniformData[9] = dotCol.g;\n\thalftoneUniformData[10] = dotCol.b;\n\thalftoneUniformData[11] = dotCol.a;\n\thalftoneUniformData[12] = paperCol.r;\n\thalftoneUniformData[13] = paperCol.g;\n\thalftoneUniformData[14] = paperCol.b;\n\thalftoneUniformData[15] = paperCol.a;\n\thalftoneUniformData[16] = cyanRes.val;\n\thalftoneUniformData[17] = magRes.val;\n\thalftoneUniformData[18] = yelRes.val;\n\thalftoneUniformData[19] = blkRes.val;\n\thalftoneUniformData[20] = freqRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[21] = angleRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[22] = contrastRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[23] = cyanRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[24] = magRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[25] = yelRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[26] = blkRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[27] = opacityRes.hasStaticSig ? 1 : 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(halftoneUniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uniformBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: freqView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: angleView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: contrastView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: cyanView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: magView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: yelView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\n\t\t\t\t\tresource: blkView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 7,\n\t\t\t\t\tresource: opacityView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 8,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: HalftoneScreenWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-CvluQiq3.mjs.map"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import "./chunk-DOL2i2sR.mjs";
2
+ import "./dist-D3BeAZ7X.mjs";
3
+ import { t as renderers_default } from "./renderers-CP8CFWDs-BRQyvcut.mjs";
4
+ import "./renderer-Co2YqWX0.mjs";
5
+
6
+ export { renderers_default as default };
@@ -1,7 +1,7 @@
1
- import "./chunk-W71TSjRM.mjs";
2
- import { n as defineRenderer } from "./renderer-DcvjSolU.mjs";
3
- import "./dist-CWLLnigL.mjs";
4
- import { o as drawChildToTexture } from "./gpu-CpkJJLQP.mjs";
1
+ import "./chunk-DOL2i2sR.mjs";
2
+ import { n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
3
+ import "./dist-D3BeAZ7X.mjs";
4
+ import { o as drawChildToTexture } from "./gpu-CWjgql4C.mjs";
5
5
 
6
6
  //#region ../../nodes/node-extract-frame/dist/renderers-ByS_lnbu.mjs
7
7
  /**
@@ -58,4 +58,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: ExtractFrameWebGPURende
58
58
 
59
59
  //#endregion
60
60
  export { renderers_default as default };
61
- //# sourceMappingURL=renderer-pNmI-A9o.mjs.map
61
+ //# sourceMappingURL=renderer-C7m7Yxgc.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-pNmI-A9o.mjs","names":[],"sources":["../../../nodes/node-extract-frame/dist/renderers-ByS_lnbu.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { drawChildToTexture } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\n/**\n* WebGPU renderer for the ExtractFrame operation.\n*\n* Renders the child media (Video/Lottie/GIF) at a specific frame number,\n* producing a static image output. The frame number is stored in the operation\n* and the child is rendered at the corresponding timestamp.\n*/\nconst ExtractFrameWebGPURenderer = async (args) => {\n\tconst { ctx, props, targetView, targetWidth, targetHeight, encoder } = args;\n\tconst { virtualMedia, opacity = 1 } = props;\n\tconst op = virtualMedia?.operation;\n\tif (!op || op.op !== \"ExtractFrame\") return;\n\tconst childMedia = virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tconst frame = op.frame ?? 0;\n\tconst childMeta = childMedia.metadata;\n\tconst childFps = childMeta?.fps ?? 24;\n\tconst timestampSec = frame / childFps;\n\targs.pass.end();\n\tconst sourceWidth = childMeta?.width ?? props.containerWidth ?? targetWidth;\n\tconst sourceHeight = childMeta?.height ?? props.containerHeight ?? targetHeight;\n\tconst containerWidth = props.containerWidth ?? ctx.surface.width;\n\tconst containerHeight = props.containerHeight ?? ctx.surface.height;\n\tconst { texture: childTex } = await drawChildToTexture(args, childMedia, {\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tcontainerWidth: sourceWidth,\n\t\t\tcontainerHeight: sourceHeight,\n\t\t\tframe,\n\t\t\tfps: childFps,\n\t\t\ttimestampSec,\n\t\t\tforceWait: true\n\t\t}\n\t});\n\tconst outPass = 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\tctx.renderer.drawTexture(outPass, childTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: containerWidth,\n\t\theight: containerHeight\n\t}, { opacity });\n\targs.pass = outPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ExtractFrameWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-ByS_lnbu.mjs.map"],"mappings":";;;;;;;;;;;;;AAWA,MAAM,6BAA6B,OAAO,SAAS;CAClD,MAAM,EAAE,KAAK,OAAO,YAAY,aAAa,cAAc,YAAY;CACvE,MAAM,EAAE,cAAc,UAAU,MAAM;CACtC,MAAM,KAAK,cAAc;AACzB,KAAI,CAAC,MAAM,GAAG,OAAO,eAAgB;CACrC,MAAM,aAAa,aAAa,WAAW;AAC3C,KAAI,CAAC,WAAY;CACjB,MAAM,QAAQ,GAAG,SAAS;CAC1B,MAAM,YAAY,WAAW;CAC7B,MAAM,WAAW,WAAW,OAAO;CACnC,MAAM,eAAe,QAAQ;AAC7B,MAAK,KAAK,KAAK;CACf,MAAM,cAAc,WAAW,SAAS,MAAM,kBAAkB;CAChE,MAAM,eAAe,WAAW,UAAU,MAAM,mBAAmB;CACnE,MAAM,iBAAiB,MAAM,kBAAkB,IAAI,QAAQ;CAC3D,MAAM,kBAAkB,MAAM,mBAAmB,IAAI,QAAQ;CAC7D,MAAM,EAAE,SAAS,aAAa,MAAM,mBAAmB,MAAM,YAAY;EACxE,OAAO;EACP,QAAQ;EACR,OAAO;GACN,GAAG;GACH,gBAAgB;GAChB,iBAAiB;GACjB;GACA,KAAK;GACL;GACA,WAAW;GACX;EACD,CAAC;CACF,MAAM,UAAU,IAAI,SAAS,WAAW,SAAS,YAAY;EAC5D,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,EAAE,aAAa,cAAc,OAAO;AACrC,KAAI,SAAS,YAAY,SAAS,UAAU;EAC3C,GAAG;EACH,GAAG;EACH,OAAO;EACP,QAAQ;EACR,EAAE,EAAE,SAAS,CAAC;AACf,MAAK,OAAO;;AAKb,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,4BAA4B,CAAC"}
1
+ {"version":3,"file":"renderer-C7m7Yxgc.mjs","names":[],"sources":["../../../nodes/node-extract-frame/dist/renderers-ByS_lnbu.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { drawChildToTexture } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\n/**\n* WebGPU renderer for the ExtractFrame operation.\n*\n* Renders the child media (Video/Lottie/GIF) at a specific frame number,\n* producing a static image output. The frame number is stored in the operation\n* and the child is rendered at the corresponding timestamp.\n*/\nconst ExtractFrameWebGPURenderer = async (args) => {\n\tconst { ctx, props, targetView, targetWidth, targetHeight, encoder } = args;\n\tconst { virtualMedia, opacity = 1 } = props;\n\tconst op = virtualMedia?.operation;\n\tif (!op || op.op !== \"ExtractFrame\") return;\n\tconst childMedia = virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tconst frame = op.frame ?? 0;\n\tconst childMeta = childMedia.metadata;\n\tconst childFps = childMeta?.fps ?? 24;\n\tconst timestampSec = frame / childFps;\n\targs.pass.end();\n\tconst sourceWidth = childMeta?.width ?? props.containerWidth ?? targetWidth;\n\tconst sourceHeight = childMeta?.height ?? props.containerHeight ?? targetHeight;\n\tconst containerWidth = props.containerWidth ?? ctx.surface.width;\n\tconst containerHeight = props.containerHeight ?? ctx.surface.height;\n\tconst { texture: childTex } = await drawChildToTexture(args, childMedia, {\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tcontainerWidth: sourceWidth,\n\t\t\tcontainerHeight: sourceHeight,\n\t\t\tframe,\n\t\t\tfps: childFps,\n\t\t\ttimestampSec,\n\t\t\tforceWait: true\n\t\t}\n\t});\n\tconst outPass = 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\tctx.renderer.drawTexture(outPass, childTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: containerWidth,\n\t\theight: containerHeight\n\t}, { opacity });\n\targs.pass = outPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ExtractFrameWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-ByS_lnbu.mjs.map"],"mappings":";;;;;;;;;;;;;AAWA,MAAM,6BAA6B,OAAO,SAAS;CAClD,MAAM,EAAE,KAAK,OAAO,YAAY,aAAa,cAAc,YAAY;CACvE,MAAM,EAAE,cAAc,UAAU,MAAM;CACtC,MAAM,KAAK,cAAc;AACzB,KAAI,CAAC,MAAM,GAAG,OAAO,eAAgB;CACrC,MAAM,aAAa,aAAa,WAAW;AAC3C,KAAI,CAAC,WAAY;CACjB,MAAM,QAAQ,GAAG,SAAS;CAC1B,MAAM,YAAY,WAAW;CAC7B,MAAM,WAAW,WAAW,OAAO;CACnC,MAAM,eAAe,QAAQ;AAC7B,MAAK,KAAK,KAAK;CACf,MAAM,cAAc,WAAW,SAAS,MAAM,kBAAkB;CAChE,MAAM,eAAe,WAAW,UAAU,MAAM,mBAAmB;CACnE,MAAM,iBAAiB,MAAM,kBAAkB,IAAI,QAAQ;CAC3D,MAAM,kBAAkB,MAAM,mBAAmB,IAAI,QAAQ;CAC7D,MAAM,EAAE,SAAS,aAAa,MAAM,mBAAmB,MAAM,YAAY;EACxE,OAAO;EACP,QAAQ;EACR,OAAO;GACN,GAAG;GACH,gBAAgB;GAChB,iBAAiB;GACjB;GACA,KAAK;GACL;GACA,WAAW;GACX;EACD,CAAC;CACF,MAAM,UAAU,IAAI,SAAS,WAAW,SAAS,YAAY;EAC5D,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,EAAE,aAAa,cAAc,OAAO;AACrC,KAAI,SAAS,YAAY,SAAS,UAAU;EAC3C,GAAG;EACH,GAAG;EACH,OAAO;EACP,QAAQ;EACR,EAAE,EAAE,SAAS,CAAC;AACf,MAAK,OAAO;;AAKb,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,4BAA4B,CAAC"}
@@ -1,7 +1,7 @@
1
- import "./chunk-W71TSjRM.mjs";
2
- import { n as defineRenderer } from "./renderer-DcvjSolU.mjs";
3
- import "./dist-CWLLnigL.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-CpkJJLQP.mjs";
1
+ import "./chunk-DOL2i2sR.mjs";
2
+ import { n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
3
+ import "./dist-D3BeAZ7X.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-CWjgql4C.mjs";
5
5
 
6
6
  //#region ../../nodes/node-crt/dist/renderers-RZlSUb1G.mjs
7
7
  const OP = "CRT";
@@ -221,4 +221,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: CRTWebGPURenderer });
221
221
 
222
222
  //#endregion
223
223
  export { CRTWebGPURenderer, renderers_default as default };
224
- //# sourceMappingURL=renderer-Bf4-N7k7.mjs.map
224
+ //# sourceMappingURL=renderer-C9dqx3U7.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-Bf4-N7k7.mjs","names":[],"sources":["../../../nodes/node-crt/dist/renderers-RZlSUb1G.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 = \"CRT\";\nconst UNIFORM_FLOATS = 16;\n/** One fragment shader per pass; pass 0 reads the layer, later passes read the previous pass. */\nconst PASSES = [`struct U { v : array<vec4<f32>, 4> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet scanlines = u.v[1].x;\n\tlet lineCount = u.v[1].y;\n\tlet curvature = u.v[1].z;\n\tlet mask = u.v[1].w;\n\tlet vignette = u.v[2].x;\n\tlet noise = u.v[2].y;\n\tlet flicker = u.v[2].z;\n\tlet tracking = u.v[2].w;\n\tlet chroma = u.v[3].x;\n\n\tlet R = res();\n\tlet t = time;\n\tlet cc = in.uv * 2.0 - 1.0;\n\tvar uv = (cc * (1.0 + curvature * 0.25 * dot(cc, cc))) * 0.5 + 0.5;\n\tif (uv.x < 0.0 || uv.y < 0.0 || uv.x > 1.0 || uv.y > 1.0) { return vec4<f32>(0.0, 0.0, 0.0, 1.0); }\n\tlet line = floor(uv.y * lineCount);\n\tlet jitter = (hash12(vec2<f32>(line, floor(t * 30.0))) - 0.5) * tracking * 0.006;\n\tlet bandY = fract(t * 0.13);\n\tlet band = smoothstep(0.07, 0.0, abs(uv.y - bandY)) * tracking;\n\tuv.x += jitter + band * 0.015 * sin(uv.y * 400.0 + t * 20.0);\n\tlet base = sampleS(uv);\n\tvar rgb = base.rgb;\n\tif (chroma > 0.0) {\n\t\tlet off = chroma / R.x;\n\t\tlet avg = (sampleS(uv - vec2<f32>(off, 0.0)).rgb + base.rgb + sampleS(uv + vec2<f32>(off * 2.0, 0.0)).rgb) / 3.0;\n\t\tlet y = luma(base.rgb);\n\t\trgb = vec3<f32>(y) + (avg - vec3<f32>(luma(avg)));\n\t}\n\tlet sl = 0.5 + 0.5 * cos(uv.y * lineCount * 6.2831853);\n\trgb *= 1.0 - scanlines * (1.0 - sl) * 0.7;\n\tlet tri = u32(floor(in.uv.x * R.x)) % 3u;\n\tvar m = vec3<f32>(0.75);\n\tif (tri == 0u) { m.r = 1.25; } else if (tri == 1u) { m.g = 1.25; } else { m.b = 1.25; }\n\trgb *= mix(vec3<f32>(1.0), m, mask);\n\trgb += (hash12(in.uv * R + vec2<f32>(t * 61.0, t * 17.0)) - 0.5) * noise * 0.3;\n\trgb *= 1.0 - flicker * hash12(vec2<f32>(floor(t * 24.0), 3.0));\n\trgb *= 1.0 - vignette * dot(cc, cc) * 0.35;\n\trgb += band * 0.12;\n\treturn vec4<f32>(clamp(rgb, vec3<f32>(0.0), vec3<f32>(1.0)), 1.0);\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\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.scanlines, .45);\n\tdata[5] = num(raw.lineCount, 540);\n\tdata[6] = num(raw.curvature, .12);\n\tdata[7] = num(raw.mask, .25);\n\tdata[8] = num(raw.vignette, .35);\n\tdata[9] = num(raw.noise, .08);\n\tdata[10] = num(raw.flicker, .03);\n\tdata[11] = num(raw.tracking, 0);\n\tdata[12] = num(raw.chroma, 0);\n}\nconst CRTWebGPURenderer = 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: CRTWebGPURenderer });\n\n//#endregion\nexport { CRTWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-RZlSUb1G.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-C9dqx3U7.mjs","names":[],"sources":["../../../nodes/node-crt/dist/renderers-RZlSUb1G.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 = \"CRT\";\nconst UNIFORM_FLOATS = 16;\n/** One fragment shader per pass; pass 0 reads the layer, later passes read the previous pass. */\nconst PASSES = [`struct U { v : array<vec4<f32>, 4> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet scanlines = u.v[1].x;\n\tlet lineCount = u.v[1].y;\n\tlet curvature = u.v[1].z;\n\tlet mask = u.v[1].w;\n\tlet vignette = u.v[2].x;\n\tlet noise = u.v[2].y;\n\tlet flicker = u.v[2].z;\n\tlet tracking = u.v[2].w;\n\tlet chroma = u.v[3].x;\n\n\tlet R = res();\n\tlet t = time;\n\tlet cc = in.uv * 2.0 - 1.0;\n\tvar uv = (cc * (1.0 + curvature * 0.25 * dot(cc, cc))) * 0.5 + 0.5;\n\tif (uv.x < 0.0 || uv.y < 0.0 || uv.x > 1.0 || uv.y > 1.0) { return vec4<f32>(0.0, 0.0, 0.0, 1.0); }\n\tlet line = floor(uv.y * lineCount);\n\tlet jitter = (hash12(vec2<f32>(line, floor(t * 30.0))) - 0.5) * tracking * 0.006;\n\tlet bandY = fract(t * 0.13);\n\tlet band = smoothstep(0.07, 0.0, abs(uv.y - bandY)) * tracking;\n\tuv.x += jitter + band * 0.015 * sin(uv.y * 400.0 + t * 20.0);\n\tlet base = sampleS(uv);\n\tvar rgb = base.rgb;\n\tif (chroma > 0.0) {\n\t\tlet off = chroma / R.x;\n\t\tlet avg = (sampleS(uv - vec2<f32>(off, 0.0)).rgb + base.rgb + sampleS(uv + vec2<f32>(off * 2.0, 0.0)).rgb) / 3.0;\n\t\tlet y = luma(base.rgb);\n\t\trgb = vec3<f32>(y) + (avg - vec3<f32>(luma(avg)));\n\t}\n\tlet sl = 0.5 + 0.5 * cos(uv.y * lineCount * 6.2831853);\n\trgb *= 1.0 - scanlines * (1.0 - sl) * 0.7;\n\tlet tri = u32(floor(in.uv.x * R.x)) % 3u;\n\tvar m = vec3<f32>(0.75);\n\tif (tri == 0u) { m.r = 1.25; } else if (tri == 1u) { m.g = 1.25; } else { m.b = 1.25; }\n\trgb *= mix(vec3<f32>(1.0), m, mask);\n\trgb += (hash12(in.uv * R + vec2<f32>(t * 61.0, t * 17.0)) - 0.5) * noise * 0.3;\n\trgb *= 1.0 - flicker * hash12(vec2<f32>(floor(t * 24.0), 3.0));\n\trgb *= 1.0 - vignette * dot(cc, cc) * 0.35;\n\trgb += band * 0.12;\n\treturn vec4<f32>(clamp(rgb, vec3<f32>(0.0), vec3<f32>(1.0)), 1.0);\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\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.scanlines, .45);\n\tdata[5] = num(raw.lineCount, 540);\n\tdata[6] = num(raw.curvature, .12);\n\tdata[7] = num(raw.mask, .25);\n\tdata[8] = num(raw.vignette, .35);\n\tdata[9] = num(raw.noise, .08);\n\tdata[10] = num(raw.flicker, .03);\n\tdata[11] = num(raw.tracking, 0);\n\tdata[12] = num(raw.chroma, 0);\n}\nconst CRTWebGPURenderer = 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: CRTWebGPURenderer });\n\n//#endregion\nexport { CRTWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-RZlSUb1G.mjs.map"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-DOL2i2sR.mjs";
2
+ import "./dist-D3BeAZ7X.mjs";
3
+ import { t as renderers_default } from "./renderer-BZgJj8Cl.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,5 +1,5 @@
1
- import { n as defineRenderer } from "./renderer-DcvjSolU.mjs";
2
- import { i as beginTargetPass, l as fragmentBindGroupLayout, o as drawChildToTexture } from "./gpu-CpkJJLQP.mjs";
1
+ import { n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
2
+ import { i as beginTargetPass, l as fragmentBindGroupLayout, o as drawChildToTexture } from "./gpu-CWjgql4C.mjs";
3
3
 
4
4
  //#region ../../nodes/node-mesh-warp/dist/renderers-OcO6N-y5.mjs
5
5
  function createUniformGrid(cols, rows) {
@@ -223,4 +223,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: MeshWarpWebGPURenderer
223
223
 
224
224
  //#endregion
225
225
  export { renderers_default as t };
226
- //# sourceMappingURL=renderer-JHByuUNb.mjs.map
226
+ //# sourceMappingURL=renderer-CE4535aW.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-JHByuUNb.mjs","names":[],"sources":["../../../nodes/node-mesh-warp/dist/renderers-OcO6N-y5.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { beginTargetPass, drawChildToTexture, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/shared/utils.ts\nfunction createUniformGrid(cols, rows) {\n\tconst points = [];\n\tfor (let r = 0; r < rows; r++) {\n\t\tconst y = r / (rows - 1) * 100;\n\t\tfor (let c = 0; c < cols; c++) {\n\t\t\tconst x = c / (cols - 1) * 100;\n\t\t\tpoints.push({\n\t\t\t\tx,\n\t\t\t\ty\n\t\t\t});\n\t\t}\n\t}\n\treturn points;\n}\nfunction interpolateGridPoint(u, v, oldPoints, oldCols, oldRows) {\n\tconst px = u * (oldCols - 1);\n\tconst py = v * (oldRows - 1);\n\tconst x0 = Math.floor(px);\n\tconst x1 = Math.min(oldCols - 1, x0 + 1);\n\tconst y0 = Math.floor(py);\n\tconst y1 = Math.min(oldRows - 1, y0 + 1);\n\tconst tx = px - x0;\n\tconst ty = py - y0;\n\tconst p00 = oldPoints[y0 * oldCols + x0];\n\tconst p10 = oldPoints[y0 * oldCols + x1];\n\tconst p01 = oldPoints[y1 * oldCols + x0];\n\tconst p11 = oldPoints[y1 * oldCols + x1];\n\tif (!p00 || !p10 || !p01 || !p11) return {\n\t\tx: u * 100,\n\t\ty: v * 100\n\t};\n\treturn {\n\t\tx: (1 - tx) * (1 - ty) * p00.x + tx * (1 - ty) * p10.x + (1 - tx) * ty * p01.x + tx * ty * p11.x,\n\t\ty: (1 - tx) * (1 - ty) * p00.y + tx * (1 - ty) * p10.y + (1 - tx) * ty * p01.y + tx * ty * p11.y\n\t};\n}\nfunction resizeGrid(oldPoints, oldCols, oldRows, newCols, newRows) {\n\tif (!oldPoints || oldPoints.length !== oldCols * oldRows) return createUniformGrid(newCols, newRows);\n\tconst points = [];\n\tfor (let r = 0; r < newRows; r++) {\n\t\tconst v = r / (newRows - 1);\n\t\tfor (let c = 0; c < newCols; c++) {\n\t\t\tconst u = c / (newCols - 1);\n\t\t\tpoints.push(interpolateGridPoint(u, v, oldPoints, oldCols, oldRows));\n\t\t}\n\t}\n\treturn points;\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst meshWarpWgsl = `\nstruct MeshUniforms {\n\tgridSize : vec2<f32>,\n\tlayerSize : vec2<f32>,\n\tmatrix_col0 : vec4<f32>,\n\tmatrix_col1 : vec4<f32>,\n\tpoints : array<vec4<f32>, 144>,\n};\n\n@group(0) @binding(0) var<uniform> u : MeshUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\nstruct VSOut {\n\t@builtin(position) pos : vec4<f32>,\n\t@location(0) uv : vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\n\tlet cols = u32(u.gridSize.x);\n\tlet rows = u32(u.gridSize.y);\n\t\n\tlet cellsCol = cols - 1u;\n\tlet cellsRow = rows - 1u;\n\tlet totalCells = cellsCol * cellsRow;\n\t\n\tlet cellIndex = vi / 6u;\n\tlet vertexInCell = vi % 6u;\n\t\n\tif (cellIndex >= totalCells) {\n\t\treturn VSOut(vec4<f32>(0.0), vec4<f32>(0.0).xy);\n\t}\n\t\n\tlet cellC = cellIndex % cellsCol;\n\tlet cellR = cellIndex / cellsCol;\n\t\n\tvar colOffset = 0u;\n\tvar rowOffset = 0u;\n\t\n\t// Mapping vertex index in cell to quad corner offset\n\t// Triangle 1: TL (0,0), TR (1,0), BL (0,1)\n\t// Triangle 2: TR (1,0), BR (1,1), BL (0,1)\n\tif (vertexInCell == 1u) { // TR\n\t\tcolOffset = 1u;\n\t\trowOffset = 0u;\n\t} else if (vertexInCell == 2u) { // BL\n\t\tcolOffset = 0u;\n\t\trowOffset = 1u;\n\t} else if (vertexInCell == 3u) { // TR\n\t\tcolOffset = 1u;\n\t\trowOffset = 0u;\n\t} else if (vertexInCell == 4u) { // BR\n\t\tcolOffset = 1u;\n\t\trowOffset = 1u;\n\t} else if (vertexInCell == 5u) { // BL\n\t\tcolOffset = 0u;\n\t\trowOffset = 1u;\n\t}\n\t// Vertex 0 is TL (colOffset=0, rowOffset=0)\n\t\n\tlet gridC = cellC + colOffset;\n\tlet gridR = cellR + rowOffset;\n\t\n\tlet pointIndex = gridR * cols + gridC;\n\tlet warpedPoint = u.points[pointIndex].xy;\n\t\n\tlet lx = (warpedPoint.x / 100.0) * u.layerSize.x;\n\tlet ly = (warpedPoint.y / 100.0) * u.layerSize.y;\n\t\n\tlet tx = u.matrix_col0.x * lx + u.matrix_col0.y * ly + u.matrix_col0.z;\n\tlet ty = u.matrix_col1.x * lx + u.matrix_col1.y * ly + u.matrix_col1.z;\n\t\n\tlet targetW = u.matrix_col0.w;\n\tlet targetH = u.matrix_col1.w;\n\t\n\tlet x_clip = (tx / targetW) * 2.0 - 1.0;\n\tlet y_clip = 1.0 - (ty / targetH) * 2.0;\n\t\n\tlet u_coord = f32(gridC) / f32(cellsCol);\n\tlet v_coord = f32(gridR) / f32(cellsRow);\n\t\n\treturn VSOut(vec4<f32>(x_clip, y_clip, 0.0, 1.0), vec2<f32>(u_coord, v_coord));\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\treturn color;\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getMeshWarpResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (!res) {\n\t\tconst warpUniformLayout = device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n\t\t\tbuffer: { type: \"uniform\" }\n\t\t}] });\n\t\tconst warpTextureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: \"mesh_warp.wgsl\",\n\t\t\tcode: meshWarpWgsl\n\t\t});\n\t\tres = {\n\t\t\twarpPipeline: device.createRenderPipeline({\n\t\t\t\tlabel: \"MeshWarpPipeline\",\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [warpUniformLayout, warpTextureLayout] }),\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: [{\n\t\t\t\t\t\tformat,\n\t\t\t\t\t\tblend: {\n\t\t\t\t\t\t\tcolor: {\n\t\t\t\t\t\t\t\tsrcFactor: \"src-alpha\",\n\t\t\t\t\t\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\t\t\t\t\t\toperation: \"add\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\talpha: {\n\t\t\t\t\t\t\t\tsrcFactor: \"one\",\n\t\t\t\t\t\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\t\t\t\t\t\toperation: \"add\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-list\" }\n\t\t\t}),\n\t\t\twarpUniformLayout,\n\t\t\twarpTextureLayout\n\t\t};\n\t\tdeviceResourceCache.set(device, res);\n\t}\n\treturn res;\n}\nconst MeshWarpWebGPURenderer = async (args) => {\n\tconst { ctx, props, targetWidth, targetHeight } = args;\n\tconst { virtualMedia } = props;\n\tconst op = virtualMedia?.operation;\n\tif (!op || op.op !== \"MeshWarp\") return;\n\tconst childMedia = virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tconst sourceWidth = op.originalWidth ?? childMedia.metadata?.width ?? props.containerWidth ?? targetWidth;\n\tconst sourceHeight = op.originalHeight ?? childMedia.metadata?.height ?? props.containerHeight ?? targetHeight;\n\targs.pass.end();\n\tconst { texture: childTex } = await drawChildToTexture(args, childMedia, {\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tcontainerWidth: sourceWidth,\n\t\t\tcontainerHeight: sourceHeight\n\t\t}\n\t});\n\tconst cols = Number(op.cols) || 3;\n\tconst rows = Number(op.rows) || 3;\n\tconst points = op.points || [];\n\tconst finalPoints = points.length === cols * rows ? points : createUniformGrid(cols, rows);\n\tconst maxPoints = 144;\n\tconst uniformData = new Float32Array(12 + maxPoints * 4);\n\tuniformData[0] = cols;\n\tuniformData[1] = rows;\n\tuniformData[2] = props.containerWidth ?? sourceWidth;\n\tuniformData[3] = props.containerHeight ?? sourceHeight;\n\tconst matrix = ctx.renderer.getCurrentTransform();\n\tuniformData[4] = matrix.a;\n\tuniformData[5] = matrix.c;\n\tuniformData[6] = matrix.e;\n\tuniformData[7] = targetWidth;\n\tuniformData[8] = matrix.b;\n\tuniformData[9] = matrix.d;\n\tuniformData[10] = matrix.f;\n\tuniformData[11] = targetHeight;\n\tfor (let i = 0; i < maxPoints; i++) {\n\t\tconst pt = finalPoints[i] || {\n\t\t\tx: 0,\n\t\t\ty: 0\n\t\t};\n\t\tuniformData[12 + i * 4] = pt.x;\n\t\tuniformData[12 + i * 4 + 1] = pt.y;\n\t}\n\tconst { warpPipeline: pipeline, warpUniformLayout: uLayout, warpTextureLayout: tLayout } = getMeshWarpResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst uniformBindGroup = ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t});\n\tconst textureBindGroup = ctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, childTex, sampler);\n\tconst outPass = beginTargetPass(args);\n\toutPass.setPipeline(pipeline);\n\toutPass.setBindGroup(0, uniformBindGroup);\n\toutPass.setBindGroup(1, textureBindGroup);\n\tconst vertexCount = (cols - 1) * (rows - 1) * 6;\n\toutPass.draw(vertexCount);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: MeshWarpWebGPURenderer });\n\n//#endregion\nexport { resizeGrid as i, createUniformGrid as n, interpolateGridPoint as r, renderers_default as t };\n//# sourceMappingURL=renderers-OcO6N-y5.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-CE4535aW.mjs","names":[],"sources":["../../../nodes/node-mesh-warp/dist/renderers-OcO6N-y5.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { beginTargetPass, drawChildToTexture, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/shared/utils.ts\nfunction createUniformGrid(cols, rows) {\n\tconst points = [];\n\tfor (let r = 0; r < rows; r++) {\n\t\tconst y = r / (rows - 1) * 100;\n\t\tfor (let c = 0; c < cols; c++) {\n\t\t\tconst x = c / (cols - 1) * 100;\n\t\t\tpoints.push({\n\t\t\t\tx,\n\t\t\t\ty\n\t\t\t});\n\t\t}\n\t}\n\treturn points;\n}\nfunction interpolateGridPoint(u, v, oldPoints, oldCols, oldRows) {\n\tconst px = u * (oldCols - 1);\n\tconst py = v * (oldRows - 1);\n\tconst x0 = Math.floor(px);\n\tconst x1 = Math.min(oldCols - 1, x0 + 1);\n\tconst y0 = Math.floor(py);\n\tconst y1 = Math.min(oldRows - 1, y0 + 1);\n\tconst tx = px - x0;\n\tconst ty = py - y0;\n\tconst p00 = oldPoints[y0 * oldCols + x0];\n\tconst p10 = oldPoints[y0 * oldCols + x1];\n\tconst p01 = oldPoints[y1 * oldCols + x0];\n\tconst p11 = oldPoints[y1 * oldCols + x1];\n\tif (!p00 || !p10 || !p01 || !p11) return {\n\t\tx: u * 100,\n\t\ty: v * 100\n\t};\n\treturn {\n\t\tx: (1 - tx) * (1 - ty) * p00.x + tx * (1 - ty) * p10.x + (1 - tx) * ty * p01.x + tx * ty * p11.x,\n\t\ty: (1 - tx) * (1 - ty) * p00.y + tx * (1 - ty) * p10.y + (1 - tx) * ty * p01.y + tx * ty * p11.y\n\t};\n}\nfunction resizeGrid(oldPoints, oldCols, oldRows, newCols, newRows) {\n\tif (!oldPoints || oldPoints.length !== oldCols * oldRows) return createUniformGrid(newCols, newRows);\n\tconst points = [];\n\tfor (let r = 0; r < newRows; r++) {\n\t\tconst v = r / (newRows - 1);\n\t\tfor (let c = 0; c < newCols; c++) {\n\t\t\tconst u = c / (newCols - 1);\n\t\t\tpoints.push(interpolateGridPoint(u, v, oldPoints, oldCols, oldRows));\n\t\t}\n\t}\n\treturn points;\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst meshWarpWgsl = `\nstruct MeshUniforms {\n\tgridSize : vec2<f32>,\n\tlayerSize : vec2<f32>,\n\tmatrix_col0 : vec4<f32>,\n\tmatrix_col1 : vec4<f32>,\n\tpoints : array<vec4<f32>, 144>,\n};\n\n@group(0) @binding(0) var<uniform> u : MeshUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\nstruct VSOut {\n\t@builtin(position) pos : vec4<f32>,\n\t@location(0) uv : vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\n\tlet cols = u32(u.gridSize.x);\n\tlet rows = u32(u.gridSize.y);\n\t\n\tlet cellsCol = cols - 1u;\n\tlet cellsRow = rows - 1u;\n\tlet totalCells = cellsCol * cellsRow;\n\t\n\tlet cellIndex = vi / 6u;\n\tlet vertexInCell = vi % 6u;\n\t\n\tif (cellIndex >= totalCells) {\n\t\treturn VSOut(vec4<f32>(0.0), vec4<f32>(0.0).xy);\n\t}\n\t\n\tlet cellC = cellIndex % cellsCol;\n\tlet cellR = cellIndex / cellsCol;\n\t\n\tvar colOffset = 0u;\n\tvar rowOffset = 0u;\n\t\n\t// Mapping vertex index in cell to quad corner offset\n\t// Triangle 1: TL (0,0), TR (1,0), BL (0,1)\n\t// Triangle 2: TR (1,0), BR (1,1), BL (0,1)\n\tif (vertexInCell == 1u) { // TR\n\t\tcolOffset = 1u;\n\t\trowOffset = 0u;\n\t} else if (vertexInCell == 2u) { // BL\n\t\tcolOffset = 0u;\n\t\trowOffset = 1u;\n\t} else if (vertexInCell == 3u) { // TR\n\t\tcolOffset = 1u;\n\t\trowOffset = 0u;\n\t} else if (vertexInCell == 4u) { // BR\n\t\tcolOffset = 1u;\n\t\trowOffset = 1u;\n\t} else if (vertexInCell == 5u) { // BL\n\t\tcolOffset = 0u;\n\t\trowOffset = 1u;\n\t}\n\t// Vertex 0 is TL (colOffset=0, rowOffset=0)\n\t\n\tlet gridC = cellC + colOffset;\n\tlet gridR = cellR + rowOffset;\n\t\n\tlet pointIndex = gridR * cols + gridC;\n\tlet warpedPoint = u.points[pointIndex].xy;\n\t\n\tlet lx = (warpedPoint.x / 100.0) * u.layerSize.x;\n\tlet ly = (warpedPoint.y / 100.0) * u.layerSize.y;\n\t\n\tlet tx = u.matrix_col0.x * lx + u.matrix_col0.y * ly + u.matrix_col0.z;\n\tlet ty = u.matrix_col1.x * lx + u.matrix_col1.y * ly + u.matrix_col1.z;\n\t\n\tlet targetW = u.matrix_col0.w;\n\tlet targetH = u.matrix_col1.w;\n\t\n\tlet x_clip = (tx / targetW) * 2.0 - 1.0;\n\tlet y_clip = 1.0 - (ty / targetH) * 2.0;\n\t\n\tlet u_coord = f32(gridC) / f32(cellsCol);\n\tlet v_coord = f32(gridR) / f32(cellsRow);\n\t\n\treturn VSOut(vec4<f32>(x_clip, y_clip, 0.0, 1.0), vec2<f32>(u_coord, v_coord));\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\treturn color;\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getMeshWarpResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (!res) {\n\t\tconst warpUniformLayout = device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n\t\t\tbuffer: { type: \"uniform\" }\n\t\t}] });\n\t\tconst warpTextureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: \"mesh_warp.wgsl\",\n\t\t\tcode: meshWarpWgsl\n\t\t});\n\t\tres = {\n\t\t\twarpPipeline: device.createRenderPipeline({\n\t\t\t\tlabel: \"MeshWarpPipeline\",\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [warpUniformLayout, warpTextureLayout] }),\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: [{\n\t\t\t\t\t\tformat,\n\t\t\t\t\t\tblend: {\n\t\t\t\t\t\t\tcolor: {\n\t\t\t\t\t\t\t\tsrcFactor: \"src-alpha\",\n\t\t\t\t\t\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\t\t\t\t\t\toperation: \"add\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\talpha: {\n\t\t\t\t\t\t\t\tsrcFactor: \"one\",\n\t\t\t\t\t\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\t\t\t\t\t\toperation: \"add\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-list\" }\n\t\t\t}),\n\t\t\twarpUniformLayout,\n\t\t\twarpTextureLayout\n\t\t};\n\t\tdeviceResourceCache.set(device, res);\n\t}\n\treturn res;\n}\nconst MeshWarpWebGPURenderer = async (args) => {\n\tconst { ctx, props, targetWidth, targetHeight } = args;\n\tconst { virtualMedia } = props;\n\tconst op = virtualMedia?.operation;\n\tif (!op || op.op !== \"MeshWarp\") return;\n\tconst childMedia = virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tconst sourceWidth = op.originalWidth ?? childMedia.metadata?.width ?? props.containerWidth ?? targetWidth;\n\tconst sourceHeight = op.originalHeight ?? childMedia.metadata?.height ?? props.containerHeight ?? targetHeight;\n\targs.pass.end();\n\tconst { texture: childTex } = await drawChildToTexture(args, childMedia, {\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tcontainerWidth: sourceWidth,\n\t\t\tcontainerHeight: sourceHeight\n\t\t}\n\t});\n\tconst cols = Number(op.cols) || 3;\n\tconst rows = Number(op.rows) || 3;\n\tconst points = op.points || [];\n\tconst finalPoints = points.length === cols * rows ? points : createUniformGrid(cols, rows);\n\tconst maxPoints = 144;\n\tconst uniformData = new Float32Array(12 + maxPoints * 4);\n\tuniformData[0] = cols;\n\tuniformData[1] = rows;\n\tuniformData[2] = props.containerWidth ?? sourceWidth;\n\tuniformData[3] = props.containerHeight ?? sourceHeight;\n\tconst matrix = ctx.renderer.getCurrentTransform();\n\tuniformData[4] = matrix.a;\n\tuniformData[5] = matrix.c;\n\tuniformData[6] = matrix.e;\n\tuniformData[7] = targetWidth;\n\tuniformData[8] = matrix.b;\n\tuniformData[9] = matrix.d;\n\tuniformData[10] = matrix.f;\n\tuniformData[11] = targetHeight;\n\tfor (let i = 0; i < maxPoints; i++) {\n\t\tconst pt = finalPoints[i] || {\n\t\t\tx: 0,\n\t\t\ty: 0\n\t\t};\n\t\tuniformData[12 + i * 4] = pt.x;\n\t\tuniformData[12 + i * 4 + 1] = pt.y;\n\t}\n\tconst { warpPipeline: pipeline, warpUniformLayout: uLayout, warpTextureLayout: tLayout } = getMeshWarpResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst uniformBindGroup = ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t});\n\tconst textureBindGroup = ctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, childTex, sampler);\n\tconst outPass = beginTargetPass(args);\n\toutPass.setPipeline(pipeline);\n\toutPass.setBindGroup(0, uniformBindGroup);\n\toutPass.setBindGroup(1, textureBindGroup);\n\tconst vertexCount = (cols - 1) * (rows - 1) * 6;\n\toutPass.draw(vertexCount);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: MeshWarpWebGPURenderer });\n\n//#endregion\nexport { resizeGrid as i, createUniformGrid as n, interpolateGridPoint as r, renderers_default as t };\n//# sourceMappingURL=renderers-OcO6N-y5.mjs.map"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-DOL2i2sR.mjs";
2
+ import "./dist-D3BeAZ7X.mjs";
3
+ import { t as renderers_default } from "./renderer-CZ5mwBW1.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,7 +1,7 @@
1
- import "./chunk-W71TSjRM.mjs";
2
- import { n as defineRenderer } from "./renderer-DcvjSolU.mjs";
3
- import "./dist-CWLLnigL.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-CpkJJLQP.mjs";
1
+ import "./chunk-DOL2i2sR.mjs";
2
+ import { n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
3
+ import "./dist-D3BeAZ7X.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-CWjgql4C.mjs";
5
5
 
6
6
  //#region ../../nodes/node-painterly/dist/renderers-DhYrtjqf.mjs
7
7
  const OP = "Painterly";
@@ -219,4 +219,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: PainterlyWebGPURenderer
219
219
 
220
220
  //#endregion
221
221
  export { PainterlyWebGPURenderer, renderers_default as default };
222
- //# sourceMappingURL=renderer-ByjaseAo.mjs.map
222
+ //# sourceMappingURL=renderer-CL-vyXgX.mjs.map