framefields 2.2.0-beta.4 → 2.3.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 (322) hide show
  1. package/README.md +11 -2
  2. package/dist/audio/index.d.mts +4 -4
  3. package/dist/audio/index.mjs +10 -10
  4. package/dist/{audio-BvYmTu5T.d.mts → audio-BNnEclHU.d.mts} +3 -3
  5. package/dist/{audio-BvYmTu5T.d.mts.map → audio-BNnEclHU.d.mts.map} +1 -1
  6. package/dist/{audio-DMUr01vS.mjs → audio-ChRqnFwB.mjs} +3 -3
  7. package/dist/{audio-DMUr01vS.mjs.map → audio-ChRqnFwB.mjs.map} +1 -1
  8. package/dist/{dist-cjxDXQdx.mjs → dist-PwT_Vmax.mjs} +102 -6
  9. package/dist/{dist-cjxDXQdx.mjs.map → dist-PwT_Vmax.mjs.map} +1 -1
  10. package/dist/{dist-CT___nEU.mjs → dist-t-NLlnhM.mjs} +7 -5
  11. package/dist/dist-t-NLlnhM.mjs.map +1 -0
  12. package/dist/effects/index.d.mts +5 -5
  13. package/dist/effects/index.mjs +36 -36
  14. package/dist/{effects-C06-AOge.mjs → effects-Duoqc_Oa.mjs} +532 -4
  15. package/dist/effects-Duoqc_Oa.mjs.map +1 -0
  16. package/dist/fonts/index.d.mts +1 -1
  17. package/dist/fonts/index.mjs +2 -2
  18. package/dist/{fonts-C0UuLQvr.mjs → fonts-CgNmeFXh.mjs} +2 -2
  19. package/dist/{fonts-C0UuLQvr.mjs.map → fonts-CgNmeFXh.mjs.map} +1 -1
  20. package/dist/{gpu-Du7GpVFW.mjs → gpu-1ZpAuQOR.mjs} +2 -2
  21. package/dist/{gpu-Du7GpVFW.mjs.map → gpu-1ZpAuQOR.mjs.map} +1 -1
  22. package/dist/{index-B-oUlLoO.d.mts → index-AdrZIWT0.d.mts} +27 -2
  23. package/dist/index-AdrZIWT0.d.mts.map +1 -0
  24. package/dist/{index-BcA8rep0.d.mts → index-B-55dXDu.d.mts} +1 -1
  25. package/dist/{index-BcA8rep0.d.mts.map → index-B-55dXDu.d.mts.map} +1 -1
  26. package/dist/{index-D-Iek5sq.d.mts → index-B3BwLHa6.d.mts} +3 -3
  27. package/dist/{index-D-Iek5sq.d.mts.map → index-B3BwLHa6.d.mts.map} +1 -1
  28. package/dist/{index-CwbszPDG.d.mts → index-BU51pxZO.d.mts} +956 -9
  29. package/dist/index-BU51pxZO.d.mts.map +1 -0
  30. package/dist/{index-XdQPNJnq.d.mts → index-CeRv1KC0.d.mts} +3 -3
  31. package/dist/{index-XdQPNJnq.d.mts.map → index-CeRv1KC0.d.mts.map} +1 -1
  32. package/dist/{index-DXfp_T-3.d.mts → index-Cg2ptXcs.d.mts} +2 -2
  33. package/dist/{index-DXfp_T-3.d.mts.map → index-Cg2ptXcs.d.mts.map} +1 -1
  34. package/dist/{index-CdyE1tst.d.mts → index-QmkcUL3W.d.mts} +2 -2
  35. package/dist/{index-CdyE1tst.d.mts.map → index-QmkcUL3W.d.mts.map} +1 -1
  36. package/dist/index.d.mts +1438 -66
  37. package/dist/index.d.mts.map +1 -1
  38. package/dist/index.mjs +3122 -83
  39. package/dist/index.mjs.map +1 -1
  40. package/dist/preview/index.d.mts +2 -2
  41. package/dist/preview/index.mjs +10 -10
  42. package/dist/{preview-M0TsUzC6.mjs → preview-CArsjmkd.mjs} +2 -2
  43. package/dist/{preview-M0TsUzC6.mjs.map → preview-CArsjmkd.mjs.map} +1 -1
  44. package/dist/preview-engine/audio.mjs +1 -1
  45. package/dist/preview-engine/chunk-2JKXYG6J.mjs +127 -0
  46. package/dist/preview-engine/chunk-7I7PKKDL.mjs +214 -0
  47. package/dist/preview-engine/chunk-BQY4BUMN.mjs +1 -0
  48. package/dist/preview-engine/{chunk-RSMO7NPN.mjs → chunk-BSOJR4JU.mjs} +1 -1
  49. package/dist/preview-engine/chunk-BVA5NGSH.mjs +1 -0
  50. package/dist/preview-engine/chunk-DLAHSLNX.mjs +1522 -0
  51. package/dist/preview-engine/{chunk-ZTHWCQ2A.mjs → chunk-FNE22WGA.mjs} +1 -1
  52. package/dist/preview-engine/chunk-KERW7QJ4.mjs +174 -0
  53. package/dist/preview-engine/{chunk-7B5S5D4N.mjs → chunk-TPAEN6VV.mjs} +1 -1
  54. package/dist/preview-engine/chunk-YQRKT47I.mjs +1 -0
  55. package/dist/preview-engine/crypto-W5UAWSNT.mjs +1 -0
  56. package/dist/preview-engine/effects.mjs +1 -1
  57. package/dist/preview-engine/framefields.mjs +26 -26
  58. package/dist/preview-engine/player.mjs +5 -5
  59. package/dist/preview-engine/rapier-AHBIGHEL.mjs +1 -0
  60. package/dist/preview-engine/rapier-JD7KNQRV.mjs +1 -0
  61. package/dist/preview-engine/renderers-527ONFIA.mjs +228 -0
  62. package/dist/preview-engine/renderers-6ODPWZ2R.mjs +96 -0
  63. package/dist/preview-engine/renderers-7NCG6BYS.mjs +94 -0
  64. package/dist/preview-engine/renderers-BGGRPAVV.mjs +363 -0
  65. package/dist/preview-engine/renderers-DN2GF3I7.mjs +82 -0
  66. package/dist/preview-engine/renderers-FGHOLJJK.mjs +44 -0
  67. package/dist/preview-engine/renderers-FK72LKQC.mjs +275 -0
  68. package/dist/preview-engine/renderers-FQWWAETX.mjs +203 -0
  69. package/dist/preview-engine/renderers-HMR2NAD7.mjs +81 -0
  70. package/dist/preview-engine/renderers-HUW2ZMS3.mjs +1 -0
  71. package/dist/preview-engine/renderers-JLFGBYN4.mjs +78 -0
  72. package/dist/preview-engine/renderers-LLUEOW5T.mjs +77 -0
  73. package/dist/preview-engine/renderers-NC64EQDE.mjs +1 -0
  74. package/dist/preview-engine/renderers-PVYP2ONH.mjs +76 -0
  75. package/dist/preview-engine/renderers-TPBPNXWH.mjs +26 -0
  76. package/dist/preview-engine/renderers-UJ4YVJZT.mjs +80 -0
  77. package/dist/preview-engine/renderers-WHBDHTRI.mjs +78 -0
  78. package/dist/preview-engine/renderers-WP67KK5K.mjs +89 -0
  79. package/dist/preview-engine/renderers-YNFKFM7D.mjs +67 -0
  80. package/dist/preview-engine/renderers-ZSENYGIY.mjs +84 -0
  81. package/dist/preview-engine/signals.mjs +1 -1
  82. package/dist/{program-DzknMiY0.mjs → program-Dd9tJFkY.mjs} +346 -13
  83. package/dist/program-Dd9tJFkY.mjs.map +1 -0
  84. package/dist/renderer/index.d.mts +2 -2
  85. package/dist/renderer/index.mjs +2 -2
  86. package/dist/{renderer-C8uKdelk.mjs → renderer-0L9MEb3A.mjs} +2 -2
  87. package/dist/{renderer-C8uKdelk.mjs.map → renderer-0L9MEb3A.mjs.map} +1 -1
  88. package/dist/renderer-0lp9ClNc.mjs +5 -0
  89. package/dist/{renderer-BbdZ0YHR.mjs → renderer-257LxOyx.mjs} +3 -3
  90. package/dist/{renderer-BbdZ0YHR.mjs.map → renderer-257LxOyx.mjs.map} +1 -1
  91. package/dist/renderer-2BnBo6CX.mjs +219 -0
  92. package/dist/renderer-2BnBo6CX.mjs.map +1 -0
  93. package/dist/renderer-4g_BfiKp.mjs +5 -0
  94. package/dist/renderer-72A4SvOE.mjs +220 -0
  95. package/dist/renderer-72A4SvOE.mjs.map +1 -0
  96. package/dist/renderer-7Aw6AHqW.mjs +5 -0
  97. package/dist/{renderer-PKQNH21k.mjs → renderer-7OvgLE8w.mjs} +2 -2
  98. package/dist/{renderer-BerD3T-X.mjs → renderer-94byj7Mk.mjs} +2 -2
  99. package/dist/{renderer-BerD3T-X.mjs.map → renderer-94byj7Mk.mjs.map} +1 -1
  100. package/dist/{renderer-D-vRKssW.mjs → renderer-B2aXfdW_.mjs} +2 -2
  101. package/dist/{renderer-D-vRKssW.mjs.map → renderer-B2aXfdW_.mjs.map} +1 -1
  102. package/dist/{renderer-DD8napek.mjs → renderer-B3c-j-e5.mjs} +2 -2
  103. package/dist/{renderer-DD8napek.mjs.map → renderer-B3c-j-e5.mjs.map} +1 -1
  104. package/dist/renderer-B3ypX3MH.mjs +308 -0
  105. package/dist/renderer-B3ypX3MH.mjs.map +1 -0
  106. package/dist/renderer-B82v8PyC.mjs +5 -0
  107. package/dist/renderer-B8BDMJNz.mjs +5 -0
  108. package/dist/renderer-BARst3ZD.mjs +3 -0
  109. package/dist/renderer-BCPRrhP8.mjs +5 -0
  110. package/dist/{renderer-CMT4QcpV.mjs → renderer-BEdc-7JW.mjs} +3 -3
  111. package/dist/{renderer-CMT4QcpV.mjs.map → renderer-BEdc-7JW.mjs.map} +1 -1
  112. package/dist/renderer-BEpANdcO.mjs +204 -0
  113. package/dist/renderer-BEpANdcO.mjs.map +1 -0
  114. package/dist/renderer-BFhzO6En.mjs +5 -0
  115. package/dist/renderer-BH0KF-y-.mjs +6 -0
  116. package/dist/renderer-BHrqEgIA.mjs +541 -0
  117. package/dist/renderer-BHrqEgIA.mjs.map +1 -0
  118. package/dist/{renderer-DpW_LxLO.mjs → renderer-BId5hBLb.mjs} +3 -3
  119. package/dist/{renderer-DpW_LxLO.mjs.map → renderer-BId5hBLb.mjs.map} +1 -1
  120. package/dist/renderer-BK32cV7E.mjs +203 -0
  121. package/dist/renderer-BK32cV7E.mjs.map +1 -0
  122. package/dist/renderer-BTI5ybyH.mjs +5 -0
  123. package/dist/{renderer-0gY4IQhM.mjs → renderer-BVR0mEIT.mjs} +2 -2
  124. package/dist/{renderer-0gY4IQhM.mjs.map → renderer-BVR0mEIT.mjs.map} +1 -1
  125. package/dist/{renderer-CebB0v1y.mjs → renderer-BY08hHFS.mjs} +2 -2
  126. package/dist/{renderer-CebB0v1y.mjs.map → renderer-BY08hHFS.mjs.map} +1 -1
  127. package/dist/renderer-Ba7LH8U2.mjs +5 -0
  128. package/dist/renderer-BcQBlfhC.mjs +5 -0
  129. package/dist/renderer-BdMJzCTz.mjs +5 -0
  130. package/dist/{renderer-D1Cm21eq.mjs → renderer-BmQbSQHf.mjs} +2 -2
  131. package/dist/{renderer-D1Cm21eq.mjs.map → renderer-BmQbSQHf.mjs.map} +1 -1
  132. package/dist/{renderer-DqdhsSwS.mjs → renderer-BmTDXIUI.mjs} +2 -2
  133. package/dist/{renderer-DqdhsSwS.mjs.map → renderer-BmTDXIUI.mjs.map} +1 -1
  134. package/dist/renderer-BpdzhZE7.mjs +224 -0
  135. package/dist/renderer-BpdzhZE7.mjs.map +1 -0
  136. package/dist/renderer-Bxi2j-tG.mjs +5 -0
  137. package/dist/{renderer-D8thCpS7.mjs → renderer-C-Qj0BnT.mjs} +3 -3
  138. package/dist/{renderer-D8thCpS7.mjs.map → renderer-C-Qj0BnT.mjs.map} +1 -1
  139. package/dist/{renderer-BiwIh_w4.mjs → renderer-C4tUATd_.mjs} +3 -3
  140. package/dist/{renderer-BiwIh_w4.mjs.map → renderer-C4tUATd_.mjs.map} +1 -1
  141. package/dist/{renderer-1vhaKMeg.mjs → renderer-CC72sZ8l.mjs} +141 -56
  142. package/dist/renderer-CC72sZ8l.mjs.map +1 -0
  143. package/dist/renderer-CCn5ISVM.mjs +5 -0
  144. package/dist/renderer-CDRsdhg9.mjs +5 -0
  145. package/dist/{renderer-BC8XOVl5.mjs → renderer-CI9Pq77W.mjs} +3 -3
  146. package/dist/{renderer-BC8XOVl5.mjs.map → renderer-CI9Pq77W.mjs.map} +1 -1
  147. package/dist/{renderer-CrABA3lB.mjs → renderer-CIMI33Yd.mjs} +2 -2
  148. package/dist/{renderer-CrABA3lB.mjs.map → renderer-CIMI33Yd.mjs.map} +1 -1
  149. package/dist/renderer-CKSdl0Xf.mjs +331 -0
  150. package/dist/renderer-CKSdl0Xf.mjs.map +1 -0
  151. package/dist/{renderer-Cce2fgpX.mjs → renderer-CKpwEo1w.mjs} +3 -3
  152. package/dist/{renderer-Cce2fgpX.mjs.map → renderer-CKpwEo1w.mjs.map} +1 -1
  153. package/dist/{renderer-CursFKUf.mjs → renderer-CLUyYFqS.mjs} +2 -2
  154. package/dist/{renderer-CursFKUf.mjs.map → renderer-CLUyYFqS.mjs.map} +1 -1
  155. package/dist/{renderer-Br6KyRO_.mjs → renderer-CS-goRD3.mjs} +3 -3
  156. package/dist/{renderer-Br6KyRO_.mjs.map → renderer-CS-goRD3.mjs.map} +1 -1
  157. package/dist/{renderer-DtgMsjyL.mjs → renderer-CSPpKLi3.mjs} +2 -2
  158. package/dist/{renderer-DtgMsjyL.mjs.map → renderer-CSPpKLi3.mjs.map} +1 -1
  159. package/dist/{renderer-CuVPo-wP.mjs → renderer-CWQ-Bct7.mjs} +2 -2
  160. package/dist/{renderer-CuVPo-wP.mjs.map → renderer-CWQ-Bct7.mjs.map} +1 -1
  161. package/dist/{renderer-DHGTzype.mjs → renderer-ChoYV7Ko.mjs} +2 -2
  162. package/dist/{renderer-DHGTzype.mjs.map → renderer-ChoYV7Ko.mjs.map} +1 -1
  163. package/dist/renderer-CiCK8ZG_.mjs +5 -0
  164. package/dist/{renderer-CJB9nU1x.mjs → renderer-Ck2pRec0.mjs} +3 -3
  165. package/dist/{renderer-CJB9nU1x.mjs.map → renderer-Ck2pRec0.mjs.map} +1 -1
  166. package/dist/{renderer-BzDjy1_x.mjs → renderer-CrUudSLP.mjs} +2 -2
  167. package/dist/{renderer-BzDjy1_x.mjs.map → renderer-CrUudSLP.mjs.map} +1 -1
  168. package/dist/{renderer-DupsdRIw.mjs → renderer-CraudZUC.mjs} +3 -3
  169. package/dist/{renderer-DupsdRIw.mjs.map → renderer-CraudZUC.mjs.map} +1 -1
  170. package/dist/renderer-CsEk9TFz.mjs +5 -0
  171. package/dist/renderer-CvOzuDX3.mjs +215 -0
  172. package/dist/renderer-CvOzuDX3.mjs.map +1 -0
  173. package/dist/{renderer-DJfFc-XW.mjs → renderer-Cvysm2Jg.mjs} +3 -3
  174. package/dist/{renderer-DJfFc-XW.mjs.map → renderer-Cvysm2Jg.mjs.map} +1 -1
  175. package/dist/{renderer-Bn2eQE-t.mjs → renderer-CwwmwM7J.mjs} +3 -3
  176. package/dist/{renderer-Bn2eQE-t.mjs.map → renderer-CwwmwM7J.mjs.map} +1 -1
  177. package/dist/{renderer-KnCcN_Nz.mjs → renderer-CxP2e6Ov.mjs} +2 -2
  178. package/dist/{renderer-KnCcN_Nz.mjs.map → renderer-CxP2e6Ov.mjs.map} +1 -1
  179. package/dist/{renderer-BteUC_7n.mjs → renderer-D-yNHLG7.mjs} +3 -3
  180. package/dist/{renderer-BteUC_7n.mjs.map → renderer-D-yNHLG7.mjs.map} +1 -1
  181. package/dist/renderer-D0xLIq1r.mjs +203 -0
  182. package/dist/renderer-D0xLIq1r.mjs.map +1 -0
  183. package/dist/{renderer-id8TbKBY.mjs → renderer-D1MOTlWS.mjs} +2 -2
  184. package/dist/{renderer-id8TbKBY.mjs.map → renderer-D1MOTlWS.mjs.map} +1 -1
  185. package/dist/renderer-D1T7A3NF.mjs +233 -0
  186. package/dist/renderer-D1T7A3NF.mjs.map +1 -0
  187. package/dist/renderer-D1gx_-hi.mjs +5 -0
  188. package/dist/renderer-D5MCGNAF.mjs +5 -0
  189. package/dist/{renderer-Db3JIF1K.mjs → renderer-D6YcQTLI.mjs} +3 -3
  190. package/dist/{renderer-Db3JIF1K.mjs.map → renderer-D6YcQTLI.mjs.map} +1 -1
  191. package/dist/{renderer-BNqwn0gZ.mjs → renderer-D8_UYdDb.mjs} +2 -2
  192. package/dist/{renderer-BNqwn0gZ.mjs.map → renderer-D8_UYdDb.mjs.map} +1 -1
  193. package/dist/renderer-DD_MzvM-.mjs +5 -0
  194. package/dist/{renderer-BHskWZNG.mjs → renderer-DIqwz7dV.mjs} +2 -2
  195. package/dist/{renderer-57ATc_mQ.mjs → renderer-DJQD7tai.mjs} +2 -2
  196. package/dist/{renderer-57ATc_mQ.mjs.map → renderer-DJQD7tai.mjs.map} +1 -1
  197. package/dist/{renderer-CWBHVCvA.mjs → renderer-DKXK5hDm.mjs} +2 -2
  198. package/dist/{renderer-CWBHVCvA.mjs.map → renderer-DKXK5hDm.mjs.map} +1 -1
  199. package/dist/{renderer-p_C_T9Kn.mjs → renderer-DNYSf2Fl.mjs} +2 -2
  200. package/dist/{renderer-p_C_T9Kn.mjs.map → renderer-DNYSf2Fl.mjs.map} +1 -1
  201. package/dist/{renderer-DXqIslFk.mjs → renderer-DNaHFctD.mjs} +2 -2
  202. package/dist/{renderer-DXqIslFk.mjs.map → renderer-DNaHFctD.mjs.map} +1 -1
  203. package/dist/renderer-DO5r7ZV-.mjs +658 -0
  204. package/dist/renderer-DO5r7ZV-.mjs.map +1 -0
  205. package/dist/renderer-DP7YoZ0K.mjs +5 -0
  206. package/dist/{renderer-CE7fwGgw.mjs → renderer-DQtk282o.mjs} +29 -8
  207. package/dist/renderer-DQtk282o.mjs.map +1 -0
  208. package/dist/{renderer-u8ynJtAC.mjs → renderer-DWcbrx2M.mjs} +2 -2
  209. package/dist/{renderer-u8ynJtAC.mjs.map → renderer-DWcbrx2M.mjs.map} +1 -1
  210. package/dist/renderer-DXiWvKij.mjs +5 -0
  211. package/dist/renderer-DZnUiiBp.mjs +222 -0
  212. package/dist/renderer-DZnUiiBp.mjs.map +1 -0
  213. package/dist/renderer-Dc6fW-o1.mjs +5 -0
  214. package/dist/renderer-DiurlsNT.mjs +5 -0
  215. package/dist/{renderer-BmGPTWwV.mjs → renderer-Dju3SEAJ.mjs} +3 -3
  216. package/dist/{renderer-BmGPTWwV.mjs.map → renderer-Dju3SEAJ.mjs.map} +1 -1
  217. package/dist/{renderer-BT-_EoXw.d.mts → renderer-DlESyfg7.d.mts} +2 -2
  218. package/dist/{renderer-BT-_EoXw.d.mts.map → renderer-DlESyfg7.d.mts.map} +1 -1
  219. package/dist/{renderer-aArb4RwJ.mjs → renderer-DpQaiH6C.mjs} +2 -2
  220. package/dist/{renderer-aArb4RwJ.mjs.map → renderer-DpQaiH6C.mjs.map} +1 -1
  221. package/dist/{renderer-CeyAgJnw.mjs → renderer-DuxzqfoE.mjs} +2 -2
  222. package/dist/renderer-DvCUdgVz.mjs +5 -0
  223. package/dist/{renderer-AF884a7T.mjs → renderer-Dvg5nbgU.mjs} +3 -3
  224. package/dist/{renderer-AF884a7T.mjs.map → renderer-Dvg5nbgU.mjs.map} +1 -1
  225. package/dist/{renderer-DvFaC_-7.mjs → renderer-Dvq11SEA.mjs} +2 -2
  226. package/dist/{renderer-DvFaC_-7.mjs.map → renderer-Dvq11SEA.mjs.map} +1 -1
  227. package/dist/renderer-DyPgVl1l.mjs +223 -0
  228. package/dist/renderer-DyPgVl1l.mjs.map +1 -0
  229. package/dist/{renderer-DEuIwr-t.mjs → renderer-DzOzVxNS.mjs} +2 -2
  230. package/dist/{renderer-DEuIwr-t.mjs.map → renderer-DzOzVxNS.mjs.map} +1 -1
  231. package/dist/renderer-EhCkD11e.mjs +208 -0
  232. package/dist/renderer-EhCkD11e.mjs.map +1 -0
  233. package/dist/renderer-IiwAh9-K.mjs +5 -0
  234. package/dist/{renderer-jqByPgkD.mjs → renderer-JiEpssIz.mjs} +2 -2
  235. package/dist/{renderer-jqByPgkD.mjs.map → renderer-JiEpssIz.mjs.map} +1 -1
  236. package/dist/renderer-JlGXqH0E.mjs +5 -0
  237. package/dist/{renderer-Beg7FLt2.mjs → renderer-OxafT7Xm.mjs} +75 -27
  238. package/dist/renderer-OxafT7Xm.mjs.map +1 -0
  239. package/dist/renderer-TZFKKgL1.mjs +5 -0
  240. package/dist/renderer-UT0CcmMZ.mjs +191 -0
  241. package/dist/renderer-UT0CcmMZ.mjs.map +1 -0
  242. package/dist/{renderer-YbaCzPcG.mjs → renderer-YyEBKPcE.mjs} +2 -2
  243. package/dist/{renderer-jYxN4mHn.mjs → renderer-_AuL8mAi.mjs} +3 -3
  244. package/dist/{renderer-jYxN4mHn.mjs.map → renderer-_AuL8mAi.mjs.map} +1 -1
  245. package/dist/{renderer-C6md3msE.mjs → renderer-aCDIEYb3.mjs} +2 -2
  246. package/dist/{renderer-C6md3msE.mjs.map → renderer-aCDIEYb3.mjs.map} +1 -1
  247. package/dist/renderer-aEecoNPX.mjs +5 -0
  248. package/dist/{renderer-BeIUgp1r.mjs → renderer-aN60v8jR.mjs} +2 -2
  249. package/dist/{renderer-BeIUgp1r.mjs.map → renderer-aN60v8jR.mjs.map} +1 -1
  250. package/dist/renderer-ewhliYYP.mjs +5 -0
  251. package/dist/renderer-hQc6GgTi.mjs +5 -0
  252. package/dist/renderer-iuX0RZIi.mjs +5 -0
  253. package/dist/renderer-j4vkTzHa.mjs +5 -0
  254. package/dist/{renderer-EemDpvv3.mjs → renderer-mpInX4Iy.mjs} +3 -3
  255. package/dist/{renderer-EemDpvv3.mjs.map → renderer-mpInX4Iy.mjs.map} +1 -1
  256. package/dist/renderer-msPjwx_9.mjs +5 -0
  257. package/dist/renderer-pI2ndu-b.mjs +5 -0
  258. package/dist/renderer-x1OGMhsC.mjs +5 -0
  259. package/dist/{renderer-DZXbgVMK.mjs → renderer-xezE7IZX.mjs} +3 -3
  260. package/dist/{renderer-DZXbgVMK.mjs.map → renderer-xezE7IZX.mjs.map} +1 -1
  261. package/dist/renderer-yGAk7J9P.mjs +222 -0
  262. package/dist/renderer-yGAk7J9P.mjs.map +1 -0
  263. package/dist/{renderer-Bvx56GR6.mjs → renderer-zQIB2VZZ.mjs} +2 -2
  264. package/dist/{renderer-Bvx56GR6.mjs.map → renderer-zQIB2VZZ.mjs.map} +1 -1
  265. package/dist/{renderers-CP8CFWDs-BA-4l6By.mjs → renderers-CP8CFWDs-i6u_rhCX.mjs} +2 -2
  266. package/dist/{renderers-CP8CFWDs-BA-4l6By.mjs.map → renderers-CP8CFWDs-i6u_rhCX.mjs.map} +1 -1
  267. package/dist/signals/index.d.mts +5 -5
  268. package/dist/signals/index.mjs +4 -4
  269. package/package.json +58 -55
  270. package/dist/dist-CT___nEU.mjs.map +0 -1
  271. package/dist/effects-C06-AOge.mjs.map +0 -1
  272. package/dist/index-B-oUlLoO.d.mts.map +0 -1
  273. package/dist/index-CwbszPDG.d.mts.map +0 -1
  274. package/dist/preview-engine/chunk-G4K6TLNA.mjs +0 -1
  275. package/dist/preview-engine/chunk-HVCAOHNI.mjs +0 -1
  276. package/dist/preview-engine/chunk-KBO6EX3M.mjs +0 -1448
  277. package/dist/preview-engine/chunk-N4LHIPHZ.mjs +0 -340
  278. package/dist/preview-engine/chunk-NECOKNHA.mjs +0 -174
  279. package/dist/preview-engine/renderers-T4JMJXWL.mjs +0 -1
  280. package/dist/preview-engine/renderers-VFV5QWO3.mjs +0 -1
  281. package/dist/preview-engine/renderers-VUL4HBX3.mjs +0 -228
  282. package/dist/program-DzknMiY0.mjs.map +0 -1
  283. package/dist/renderer--IDyGdqT.mjs +0 -5
  284. package/dist/renderer-17K4tjid.mjs +0 -5
  285. package/dist/renderer-1vhaKMeg.mjs.map +0 -1
  286. package/dist/renderer-Ab9Ttn_m.mjs +0 -5
  287. package/dist/renderer-B-roDBBo.mjs +0 -5
  288. package/dist/renderer-B03uwoUX.mjs +0 -5
  289. package/dist/renderer-B3BI_7YJ.mjs +0 -5
  290. package/dist/renderer-BGD4lQ74.mjs +0 -5
  291. package/dist/renderer-BHXhYfeC.mjs +0 -5
  292. package/dist/renderer-BRsTIMFa.mjs +0 -5
  293. package/dist/renderer-Beg7FLt2.mjs.map +0 -1
  294. package/dist/renderer-BjMTtYZw.mjs +0 -5
  295. package/dist/renderer-BoCh3Yts.mjs +0 -5
  296. package/dist/renderer-BqPbR8c4.mjs +0 -5
  297. package/dist/renderer-Bxa4SDm9.mjs +0 -3
  298. package/dist/renderer-C4Da2I1-.mjs +0 -5
  299. package/dist/renderer-C93X6dgl.mjs +0 -5
  300. package/dist/renderer-CE7fwGgw.mjs.map +0 -1
  301. package/dist/renderer-CMAwFfGx.mjs +0 -6
  302. package/dist/renderer-CRXeSuX2.mjs +0 -5
  303. package/dist/renderer-CSp6WYBN.mjs +0 -5
  304. package/dist/renderer-CUXX7HTL.mjs +0 -5
  305. package/dist/renderer-CUgThpka.mjs +0 -5
  306. package/dist/renderer-CeVtufiT.mjs +0 -5
  307. package/dist/renderer-CespkZUk.mjs +0 -5
  308. package/dist/renderer-D1l47xhL.mjs +0 -5
  309. package/dist/renderer-DDuG18J8.mjs +0 -5
  310. package/dist/renderer-DFhrFSMn.mjs +0 -5
  311. package/dist/renderer-DO48vQ7Y.mjs +0 -5
  312. package/dist/renderer-DTC39B_n.mjs +0 -5
  313. package/dist/renderer-DbyU3hNF.mjs +0 -5
  314. package/dist/renderer-DftVpmfu.mjs +0 -5
  315. package/dist/renderer-Dj5jm63K.mjs +0 -5
  316. package/dist/renderer-Dju57ZaF.mjs +0 -5
  317. package/dist/renderer-Dn8TQCw7.mjs +0 -5
  318. package/dist/renderer-ETF46K0D.mjs +0 -5
  319. package/dist/renderer-azYzWGC3.mjs +0 -5
  320. package/dist/renderer-dxNoRW59.mjs +0 -5
  321. package/dist/renderer-fdfelx_I.mjs +0 -5
  322. package/dist/renderer-snwEKwMw.mjs +0 -5
@@ -0,0 +1,44 @@
1
+ import{a as x,d as g,f as T,h as v,j as U,m as P}from"./chunk-ENKKLU7B.mjs";import"./chunk-6YJP57MZ.mjs";import{z as h}from"./chunk-63SFBHEH.mjs";import{e as p}from"./chunk-BVF64D6H.mjs";p();p();var w="rgba16float",k=`
2
+ struct U { a : vec4<f32>, b : vec4<f32> };
3
+ @group(0) @binding(0) var<uniform> u : U;
4
+ @group(0) @binding(1) var historyTex : texture_2d<f32>;
5
+ @group(0) @binding(2) var currentTex : texture_2d<f32>;
6
+ @group(0) @binding(3) var samp : sampler;
7
+ ${x}
8
+
9
+ // Hue rotation in YIQ: linear, so it works on premultiplied color.
10
+ fn hueRotate(c : vec3<f32>, angle : f32) -> vec3<f32> {
11
+ let yiq = mat3x3<f32>(0.299, 0.596, 0.211, 0.587, -0.274, -0.523, 0.114, -0.322, 0.312) * c;
12
+ let cs = cos(angle);
13
+ let sn = sin(angle);
14
+ let rot = vec3<f32>(yiq.x, yiq.y * cs - yiq.z * sn, yiq.y * sn + yiq.z * cs);
15
+ return mat3x3<f32>(1.0, 1.0, 1.0, 0.956, -0.272, -1.106, 0.621, -0.647, 1.703) * rot;
16
+ }
17
+
18
+ @fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
19
+ let decay = u.a.x;
20
+ let mode = u.a.y;
21
+ let zoom = max(u.a.z, 1e-3);
22
+ let angle = u.a.w;
23
+ let offset = u.b.xy;
24
+ let hue = u.b.z;
25
+ let fresh = u.b.w;
26
+ let cur = textureSampleLevel(currentTex, samp, in.uv, 0.0);
27
+ if (fresh > 0.5) { return cur; }
28
+ let c = in.uv - 0.5;
29
+ let cs = cos(-angle);
30
+ let sn = sin(-angle);
31
+ let src = vec2<f32>(c.x * cs - c.y * sn, c.x * sn + c.y * cs) / zoom + 0.5 - offset;
32
+ var hist = vec4<f32>(0.0);
33
+ if (all(src >= vec2<f32>(0.0)) && all(src <= vec2<f32>(1.0))) {
34
+ hist = textureSampleLevel(historyTex, samp, src, 0.0);
35
+ }
36
+ if (hue != 0.0) { hist = vec4<f32>(max(hueRotate(hist.rgb, hue), vec3<f32>(0.0)), hist.a); }
37
+ hist *= decay;
38
+ if (mode < 0.5) { return cur + hist * (1.0 - cur.a); }
39
+ if (mode < 1.5) { return vec4<f32>(cur.rgb + hist.rgb, min(cur.a + hist.a, 1.0)); }
40
+ if (mode < 2.5) { return max(cur, hist); }
41
+ // blend: a running average, so opaque footage shows its own echoes.
42
+ return mix(cur, hist / max(decay, 1e-4), decay);
43
+ }
44
+ `,S=T(e=>{let r=g(e,["uniform","texture","texture","sampler"],"trails_layout"),t=e.createShaderModule({code:k,label:"trails.wgsl"});return{layout:r,pipeline:e.createRenderPipeline({label:"trails",layout:e.createPipelineLayout({bindGroupLayouts:[r]}),vertex:{module:t,entryPoint:"vs"},fragment:{module:t,entryPoint:"fs",targets:[{format:w}]},primitive:{topology:"triangle-strip"}}),sampler:e.createSampler({magFilter:"linear",minFilter:"linear"})}});function F(e,r,t,n){let o=e.feedbackHistory;if(o&&o.device===r&&o.width===t&&o.height===n)return o;o?.front.destroy(),o?.back.destroy();let a=c=>r.createTexture({label:c,size:[t,n],format:w,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC|GPUTextureUsage.COPY_DST}),i={device:r,width:t,height:n,front:a("trails_front"),back:a("trails_back"),frame:-1};return e.feedbackHistory=i,i}async function H(e,r,t,n){let o=e.props.virtualMedia?.children?.[0];return o?v(e,o,{exclude:[n.front,n.back],props:{...e.props,virtualMedia:o,frame:r,compositionFrame:t+r}}):null}function _(e){let r=e.front;e.front=e.back,e.back=r}async function z(e,r,t,n,o,a){let i=await H(e,n,o,r);if(!i)return;let c=S(e.ctx.device),s=new Float32Array([t.decay,{over:0,add:1,max:2,blend:3}[t.mode]??0,t.zoom,t.rotation*Math.PI/180,t.offsetX/r.width,t.offsetY/r.height,t.hueShift*Math.PI/180,a?1:0]);P(e.encoder,r.back.createView(),c.pipeline,[e.ctx.device.createBindGroup({layout:c.layout,entries:[{binding:0,resource:{buffer:e.ctx.renderer.getTemporaryBuffer(s)}},{binding:1,resource:r.front.createView()},{binding:2,resource:i.view},{binding:3,resource:c.sampler}]})]),_(r),r.frame=n}function f(e,r){return typeof e=="number"&&Number.isFinite(e)?e:r}var G=async e=>{let{ctx:r,pass:t,targetWidth:n,targetHeight:o,props:a}=e,i=a.virtualMedia?.operation;if(i?.op!=="Trails"||!i.effect?.resolveUniforms||!a.virtualMedia?.children?.[0])return;t.end();let c=a.fps||30,s=Math.max(0,Math.round(a.frame??0)),b=Math.round(a.compositionFrame??s),M=b-s,u=i.effect.resolveUniforms({frame:b,fps:c,time:b/c}),l=F(i.effect,r.device,n,o);{let m={decay:Math.min(1,Math.max(0,f(u.decay,.9))),mode:u.mode??"blend",zoom:f(u.zoom,1),rotation:f(u.rotation,0),offsetX:f(u.offsetX,0),offsetY:f(u.offsetY,0),hueShift:f(u.hueShift,0),warmup:Math.max(0,Math.round(f(u.warmup,60)))};if(l.frame!==s){let y=s;if(l.frame===s-1)y=s;else{let d=m.decay>0&&m.decay<1?Math.ceil(Math.log(.005)/Math.log(m.decay)):m.warmup;y=Math.max(0,s-Math.min(m.warmup,d)),l.frame=-1}for(let d=y;d<=s;d++)await z(e,l,m,d,M,l.frame<0)}}U(e,l.front)};var D=h({WebGPURenderer:G});export{G as TrailsWebGPURenderer,D as default};
@@ -0,0 +1,275 @@
1
+ import{z as B}from"./chunk-63SFBHEH.mjs";import{e as h}from"./chunk-BVF64D6H.mjs";h();h();h();function M(r){return typeof r=="object"&&r!==null&&"particleStatic"in r&&typeof r.particleFrame=="function"}var w=32,S=32,R=8,L=8,T=24,E=64,_=64,F=`
2
+ struct Particle {
3
+ pos : vec2<f32>,
4
+ vel : vec2<f32>,
5
+ age : f32,
6
+ life : f32,
7
+ jitter : f32,
8
+ _pad : f32,
9
+ };
10
+
11
+ struct Params { v : array<vec4<f32>, ${S}> };
12
+ `,Y=`
13
+ ${F}
14
+ @group(0) @binding(0) var<uniform> P : Params;
15
+ @group(0) @binding(1) var<storage, read_write> particles : array<Particle>;
16
+ @group(0) @binding(2) var<storage, read> mask : array<f32>;
17
+
18
+ fn pcg(v : u32) -> u32 {
19
+ let state = v * 747796405u + 2891336453u;
20
+ let word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;
21
+ return (word >> 22u) ^ word;
22
+ }
23
+ fn rnd(idx : u32, channel : u32, seed : u32) -> f32 {
24
+ return f32(pcg(idx * 16u + channel + pcg(seed))) / 4294967295.0;
25
+ }
26
+
27
+ fn hash2(p : vec2<f32>) -> f32 {
28
+ let q = fract(p * vec2<f32>(0.1031, 0.1030));
29
+ let r = q + dot(q, q.yx + 33.33);
30
+ return fract((r.x + r.y) * r.x);
31
+ }
32
+ fn vnoise(p : vec2<f32>) -> f32 {
33
+ let i = floor(p);
34
+ let f = fract(p);
35
+ let u = f * f * (3.0 - 2.0 * f);
36
+ let a = hash2(i);
37
+ let b = hash2(i + vec2<f32>(1.0, 0.0));
38
+ let c = hash2(i + vec2<f32>(0.0, 1.0));
39
+ let d = hash2(i + vec2<f32>(1.0, 1.0));
40
+ return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
41
+ }
42
+ fn fbm(p : vec2<f32>) -> f32 {
43
+ return vnoise(p) * 0.6 + vnoise(p * 2.03 + 17.0) * 0.3 + vnoise(p * 4.01 + 41.0) * 0.1;
44
+ }
45
+ // Divergence-free flow: the curl of a scalar noise field.
46
+ fn curl(p : vec2<f32>) -> vec2<f32> {
47
+ let e = 0.02;
48
+ let dx = fbm(p + vec2<f32>(e, 0.0)) - fbm(p - vec2<f32>(e, 0.0));
49
+ let dy = fbm(p + vec2<f32>(0.0, e)) - fbm(p - vec2<f32>(0.0, e));
50
+ return vec2<f32>(dy, -dx) / (2.0 * e);
51
+ }
52
+
53
+ fn maskAt(cell : vec2<f32>, offset : u32) -> f32 {
54
+ let w = i32(P.v[18].x);
55
+ let h = i32(P.v[18].y);
56
+ let c0 = vec2<i32>(floor(cell));
57
+ let t = cell - floor(cell);
58
+ var s = 0.0;
59
+ for (var k = 0; k < 4; k++) {
60
+ let o = vec2<i32>(k & 1, k >> 1);
61
+ let c = c0 + o;
62
+ var v = 0.0;
63
+ if (c.x >= 0 && c.y >= 0 && c.x < w && c.y < h) {
64
+ v = mask[offset + u32(c.y * w + c.x)];
65
+ }
66
+ let wx = select(1.0 - t.x, t.x, o.x == 1);
67
+ let wy = select(1.0 - t.y, t.y, o.y == 1);
68
+ s += v * wx * wy;
69
+ }
70
+ return s;
71
+ }
72
+
73
+ fn spawn(i : u32, idx : u32, birthFrac : f32) {
74
+ let birthAge = birthFrac * P.v[1].z;
75
+ let seed = u32(P.v[1].y);
76
+ let shape = u32(P.v[4].x);
77
+ let ex = P.v[4].y; let ey = P.v[4].z; let ew = P.v[4].w;
78
+ let eh = P.v[5].x; let er = P.v[5].y;
79
+ let r0 = rnd(idx, 0u, seed); let r1 = rnd(idx, 1u, seed);
80
+ var pos = vec2<f32>(ex, ey);
81
+ var center = vec2<f32>(ex, ey);
82
+ if (shape == 1u) { pos = vec2<f32>(ex + ew * r0, ey + eh * r0); center = vec2<f32>(ex + ew * 0.5, ey + eh * 0.5); }
83
+ else if (shape == 2u) { pos = vec2<f32>(ex + ew * r0, ey + eh * r1); center = vec2<f32>(ex + ew * 0.5, ey + eh * 0.5); }
84
+ else if (shape == 3u) {
85
+ let a = r0 * 6.2831853; let rr = er * sqrt(r1);
86
+ pos = vec2<f32>(ex + cos(a) * rr, ey + sin(a) * rr);
87
+ } else if (shape == 4u) {
88
+ let a = r0 * 6.2831853;
89
+ pos = vec2<f32>(ex + cos(a) * er, ey + sin(a) * er);
90
+ }
91
+ let radial = P.v[1].w > 0.5;
92
+ var dir = P.v[6].x + (rnd(idx, 2u, seed) - 0.5) * P.v[6].y;
93
+ if (radial) {
94
+ let d = pos - center;
95
+ if (dot(d, d) > 1e-6) { dir = atan2(d.y, d.x) + (rnd(idx, 2u, seed) - 0.5) * P.v[6].y; }
96
+ }
97
+ // A moving emitter: older births of the frame start nearer last frame's spot.
98
+ if (P.v[30].z > 0.5) { pos += (P.v[30].xy - vec2<f32>(ex, ey)) * birthFrac; }
99
+ let speed = mix(P.v[5].z, P.v[5].w, rnd(idx, 3u, seed));
100
+ let vel = vec2<f32>(cos(dir), sin(dir)) * speed;
101
+ var p : Particle;
102
+ p.vel = vel;
103
+ p.pos = pos + vel * birthAge;
104
+ p.age = birthAge;
105
+ p.life = mix(P.v[6].z, P.v[6].w, rnd(idx, 4u, seed));
106
+ p.jitter = 1.0 - P.v[16].w * rnd(idx, 5u, seed);
107
+ p._pad = 0.0;
108
+ particles[i] = p;
109
+ }
110
+
111
+ @compute @workgroup_size(${_})
112
+ fn simulate(@builtin(global_invocation_id) gid : vec3<u32>) {
113
+ let i = gid.x;
114
+ let maxN = u32(P.v[1].x);
115
+ if (i >= maxN) { return; }
116
+ let dt = P.v[0].x;
117
+ let time = P.v[0].y;
118
+ let emitStart = u32(P.v[0].z);
119
+ let emitCount = u32(P.v[0].w);
120
+ let frameDt = P.v[1].z;
121
+
122
+ if (emitCount > 0u) {
123
+ let k = (i + maxN - (emitStart % maxN)) % maxN;
124
+ if (k < emitCount) {
125
+ // Births spread over the frame, oldest first.
126
+ spawn(i, emitStart + k, 1.0 - (f32(k) + 0.5) / f32(emitCount));
127
+ return;
128
+ }
129
+ }
130
+
131
+ var p = particles[i];
132
+ if (p.life <= 0.0) { return; }
133
+ p.age += dt;
134
+ if (p.age >= p.life) { p.life = 0.0; particles[i] = p; return; }
135
+
136
+ var acc = vec2<f32>(P.v[2].z, P.v[2].w);
137
+ let ns = P.v[3].y;
138
+ if (ns != 0.0) {
139
+ let sc = max(P.v[3].z, 1.0);
140
+ acc += curl(p.pos / sc + vec2<f32>(time * P.v[3].w, time * P.v[3].w * 0.7)) * ns;
141
+ }
142
+ let nAttr = u32(P.v[7].w);
143
+ for (var a = 0u; a < nAttr; a++) {
144
+ let at = P.v[8u + a];
145
+ let d = at.xy - p.pos;
146
+ let dist = length(d) + 1e-3;
147
+ let fall = exp(-(dist * dist) / max(at.w * at.w, 1.0));
148
+ acc += d / dist * at.z * fall;
149
+ }
150
+ if (P.v[16].x > 0.5) {
151
+ // Silhouette push: out along the gradient, harder where it just arrived.
152
+ let comp = p.pos + P.v[18].zw;
153
+ let cell = (comp - P.v[17].xy) / P.v[17].zw - 0.5;
154
+ let cellCount = u32(P.v[18].x * P.v[18].y);
155
+ let a0 = maskAt(cell, 0u);
156
+ if (a0 > 0.02) {
157
+ let gx = maskAt(cell + vec2<f32>(1.0, 0.0), 0u) - maskAt(cell - vec2<f32>(1.0, 0.0), 0u);
158
+ let gy = maskAt(cell + vec2<f32>(0.0, 1.0), 0u) - maskAt(cell - vec2<f32>(0.0, 1.0), 0u);
159
+ let g = vec2<f32>(gx, gy);
160
+ let gl = length(g);
161
+ if (gl > 1e-5) {
162
+ let before = maskAt(cell, cellCount);
163
+ let k = a0 * P.v[16].y + max(0.0, a0 - before) * P.v[16].z;
164
+ acc -= g / gl * k;
165
+ }
166
+ }
167
+ }
168
+
169
+ p.vel += acc * dt;
170
+ p.vel *= exp(-P.v[3].x * dt);
171
+ p.pos += p.vel * dt;
172
+
173
+ let w = P.v[2].x; let h = P.v[2].y;
174
+ let floorY = P.v[7].y;
175
+ let bounce = P.v[7].z;
176
+ if (floorY >= 0.0 && p.pos.y > floorY) { p.pos.y = floorY; p.vel.y = -abs(p.vel.y) * bounce; p.vel.x *= 0.9; }
177
+ let mode = u32(P.v[7].x);
178
+ if (mode == 1u) {
179
+ if (p.pos.x < 0.0 || p.pos.y < 0.0 || p.pos.x > w || p.pos.y > h) { p.life = 0.0; }
180
+ } else if (mode == 2u) {
181
+ if (p.pos.x < 0.0) { p.pos.x = 0.0; p.vel.x = abs(p.vel.x) * bounce; }
182
+ if (p.pos.x > w) { p.pos.x = w; p.vel.x = -abs(p.vel.x) * bounce; }
183
+ if (p.pos.y < 0.0) { p.pos.y = 0.0; p.vel.y = abs(p.vel.y) * bounce; }
184
+ if (p.pos.y > h) { p.pos.y = h; p.vel.y = -abs(p.vel.y) * bounce; }
185
+ } else if (mode == 3u) {
186
+ p.pos = vec2<f32>(p.pos.x - floor(p.pos.x / w) * w, p.pos.y - floor(p.pos.y / h) * h);
187
+ }
188
+ particles[i] = p;
189
+ }
190
+ `,X=`
191
+ ${F}
192
+ @group(0) @binding(0) var<uniform> P : Params;
193
+ @group(0) @binding(1) var<storage, read> particles : array<Particle>;
194
+
195
+ struct VOut {
196
+ @builtin(position) pos : vec4<f32>,
197
+ @location(0) uv : vec2<f32>,
198
+ @location(1) color : vec4<f32>,
199
+ @location(2) aspect : f32,
200
+ };
201
+
202
+ fn gradient(t : f32) -> vec4<f32> {
203
+ let n = i32(P.v[21].x);
204
+ if (n <= 1) { return P.v[22]; }
205
+ let x = clamp(t, 0.0, 1.0) * f32(n - 1);
206
+ let i = min(i32(floor(x)), n - 2);
207
+ return mix(P.v[22 + i], P.v[23 + i], x - f32(i));
208
+ }
209
+
210
+ @vertex
211
+ fn vs(@builtin(vertex_index) vi : u32, @builtin(instance_index) ii : u32) -> VOut {
212
+ var out : VOut;
213
+ let p = particles[ii];
214
+ if (p.life <= 0.0) {
215
+ out.pos = vec4<f32>(2.0, 2.0, 0.0, 1.0);
216
+ out.color = vec4<f32>(0.0);
217
+ return out;
218
+ }
219
+ let t = p.age / p.life;
220
+ let size = mix(P.v[19].x, P.v[19].y, t) * p.jitter;
221
+ var corner = vec2<f32>(0.0);
222
+ switch (vi) {
223
+ case 0u: { corner = vec2<f32>(-1.0, -1.0); }
224
+ case 1u: { corner = vec2<f32>(1.0, -1.0); }
225
+ case 2u: { corner = vec2<f32>(-1.0, 1.0); }
226
+ case 3u: { corner = vec2<f32>(-1.0, 1.0); }
227
+ case 4u: { corner = vec2<f32>(1.0, -1.0); }
228
+ default: { corner = vec2<f32>(1.0, 1.0); }
229
+ }
230
+ let speed = length(p.vel);
231
+ var axisX = vec2<f32>(1.0, 0.0);
232
+ var halfLen = size * 0.5;
233
+ let shape = u32(P.v[20].x);
234
+ if (shape == 3u && speed > 1e-3) {
235
+ axisX = p.vel / speed;
236
+ halfLen = size * 0.5 + speed * P.v[20].y * 0.5;
237
+ }
238
+ let axisY = vec2<f32>(-axisX.y, axisX.x);
239
+ let local = axisX * corner.x * halfLen + axisY * corner.y * size * 0.5;
240
+ let px = (p.pos + local) * P.v[21].yz;
241
+ let tsize = P.v[2].xy * P.v[21].yz;
242
+ out.pos = vec4<f32>(px.x / tsize.x * 2.0 - 1.0, 1.0 - px.y / tsize.y * 2.0, 0.0, 1.0);
243
+ out.uv = corner;
244
+ out.aspect = halfLen / max(size * 0.5, 1e-3);
245
+
246
+ var c = gradient(t);
247
+ if (P.v[20].z > 0.5) { c = gradient(speed / max(P.v[20].w, 1e-3)); }
248
+ let fadeIn = max(P.v[19].z, 1e-4);
249
+ let fadeOut = max(P.v[19].w, 1e-4);
250
+ let a = c.a * smoothstep(0.0, fadeIn, t) * (1.0 - smoothstep(1.0 - fadeOut, 1.0, t)) * P.v[21].w;
251
+ out.color = vec4<f32>(c.rgb * a, a);
252
+ return out;
253
+ }
254
+
255
+ @fragment
256
+ fn fs(in : VOut) -> @location(0) vec4<f32> {
257
+ let shape = u32(P.v[20].x);
258
+ var m = 1.0;
259
+ if (shape == 0u) {
260
+ let d = length(in.uv);
261
+ let e = max(fwidth(d), 1e-3);
262
+ m = 1.0 - smoothstep(1.0 - e, 1.0, d);
263
+ } else if (shape == 1u) {
264
+ let d = length(in.uv);
265
+ m = exp(-3.5 * d * d) * (1.0 - smoothstep(0.9, 1.0, d));
266
+ } else if (shape == 3u) {
267
+ // A capsule along the motion, soft at the sides.
268
+ let ax = abs(in.uv.x) * in.aspect;
269
+ let ex = max(ax - (in.aspect - 1.0), 0.0);
270
+ let d = length(vec2<f32>(ex, in.uv.y));
271
+ m = 1.0 - smoothstep(0.5, 1.0, d);
272
+ }
273
+ return in.color * m;
274
+ }
275
+ `,z=new WeakMap;function k(r){let e=z.get(r);if(e)return e;let i=r.createBindGroupLayout({label:"particles_sim_layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}}]}),n=r.createComputePipeline({label:"particles_sim",layout:r.createPipelineLayout({bindGroupLayouts:[i]}),compute:{module:r.createShaderModule({label:"particles_sim.wgsl",code:Y}),entryPoint:"simulate"}}),s=r.createBindGroupLayout({label:"particles_draw_layout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.VERTEX,buffer:{type:"read-only-storage"}}]});return e={simLayout:i,sim:n,drawLayout:s,draw:new Map,drawModule:r.createShaderModule({label:"particles_draw.wgsl",code:X})},z.set(r,e),e}var D={normal:{color:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}},add:{color:{srcFactor:"one",dstFactor:"one",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one",operation:"add"}},screen:{color:{srcFactor:"one",dstFactor:"one-minus-src",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}};function N(r,e,i){let n=k(r),s=`${e}|${i}`,t=n.draw.get(s);return t||(t=r.createRenderPipeline({label:`particles_draw_${i}`,layout:r.createPipelineLayout({bindGroupLayouts:[n.drawLayout]}),vertex:{module:n.drawModule,entryPoint:"vs"},fragment:{module:n.drawModule,entryPoint:"fs",targets:[{format:e,blend:D[i]}]},primitive:{topology:"triangle-list"}}),n.draw.set(s,t)),t}var W={circle:0,soft:1,square:2,spark:3},q={point:0,line:1,rect:2,circle:3,ring:4},V={none:0,kill:1,bounce:2,wrap:3};function A(r,e,i,n,s){i.fill(0);let t=(p,a,d,b,v)=>i.set([a,d,b,v],p*4),c=Math.PI/180;t(0,n.dt,n.time,n.emitStart,n.emitCount),t(1,r.max,r.seed,n.frameDt,r.emitter.radial?1:0),t(2,r.layer.width,r.layer.height,e.gravity[0],e.gravity[1]),t(3,e.drag,e.noise.strength,e.noise.scale,e.noise.speed);let l=r.emitter,P=e.emitter?.x??l.x,m=e.emitter?.y??l.y;t(4,q[l.shape],P,m,l.width),e.emitter&&t(30,e.emitter.previousX,e.emitter.previousY,1,0),t(5,l.height,l.radius,r.speed[0],r.speed[1]),t(6,r.direction*c,r.spread*c,r.lifetime[0],r.lifetime[1]);let f=e.attractors.slice(0,R);t(7,V[r.bounds],r.floor??-1,r.bounce,f.length);for(let[p,a]of f.entries())t(8+p,a.x,a.y,a.strength,a.radius);let u=e.push?.mask;t(16,u?1:0,e.push?.strength??0,e.push?.sweep??0,r.sizeJitter),t(17,u?.originX??0,u?.originY??0,u?.scaleX??1,u?.scaleY??1),t(18,u?.width??0,u?.height??0,r.layer.x,r.layer.y),t(19,r.size[0],r.size[1],r.fade[0],r.fade[1]),t(20,W[r.shape],r.stretch,r.colorBySpeed!==null?1:0,r.colorBySpeed??1);let o=r.colors.slice(0,L);t(21,o.length,s.scaleX,s.scaleY,r.opacity);for(let[p,a]of o.entries())t(22+p,a[0],a[1],a[2],a[3])}function $(r,e){let i=r.particleState;if(i&&i.device===e)return i;let n=r.particleStatic,s={device:e,particles:e.createBuffer({label:"particles",size:n.max*w,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}),frame:-1,emitted:0,carry:0,snapshots:new Map,maskBuffer:null,maskSize:0,ubo:e.createBuffer({label:"particles_params",size:S*16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})};return r.particleState=s,s}function I(r,e){let i=e.push?.mask,n=i?i.width*i.height:0,s=Math.max(16,n*2*4);if((!r.maskBuffer||r.maskSize<s)&&(r.maskBuffer?.destroy(),r.maskBuffer=r.device.createBuffer({label:"particles_mask",size:s,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),r.maskSize=s),i){let t=new Float32Array(n*2);t.set(i.data.subarray(0,n)),t.set((e.push?.previous??i).data.subarray(0,n),n),r.device.queue.writeBuffer(r.maskBuffer,0,t)}return r.maskBuffer}function j(r,e,i,n,s){let{device:t}=e,c=r.particleStatic;if(i<e.frame||e.frame<0){let o=-1;for(let a of e.snapshots.keys())a<=i&&a>o&&(o=a);let p=t.createCommandEncoder({label:"particles_restore"});if(o>=0){let a=e.snapshots.get(o);p.copyBufferToBuffer(a.buffer,0,e.particles,0,c.max*w),e.emitted=a.emitted,e.carry=a.carry,e.frame=o}else p.clearBuffer(e.particles),e.emitted=0,e.carry=0,e.frame=-1;t.queue.submit([p.finish()])}let l=k(t),P=new Float32Array(S*4),m=Math.max(1,Math.round(c.substeps)),f=1/s,u=Math.round(c.prewarm*s);for(let o=e.frame+1;o<=i;o++){let p=o===0?u+1:1;for(let a=0;a<p;a++){let d=o===0?a-u:o,b=r.particleFrame(n+Math.max(0,d),s);e.carry+=Math.max(0,b.rate)*f;let v=Math.floor(e.carry);e.carry-=v,v+=Math.max(0,Math.round(b.burst)),v=Math.min(v,c.max);let y=I(e,b),O=t.createBindGroup({layout:l.simLayout,entries:[{binding:0,resource:{buffer:e.ubo}},{binding:1,resource:{buffer:e.particles}},{binding:2,resource:{buffer:y}}]});for(let x=0;x<m;x++){A(c,b,P,{dt:f/m,time:(d+x/m)*f,emitStart:e.emitted,emitCount:x===0?v:0,frameDt:f},{scaleX:1,scaleY:1}),t.queue.writeBuffer(e.ubo,0,P);let G=t.createCommandEncoder({label:"particles_step"}),g=G.beginComputePass({label:"particles_sim"});g.setPipeline(l.sim),g.setBindGroup(0,O),g.dispatchWorkgroups(Math.ceil(c.max/_)),g.end(),t.queue.submit([G.finish()])}e.emitted+=v}if(e.frame=o,o%T===0&&!e.snapshots.has(o)&&e.snapshots.size<E){let a=t.createBuffer({label:`particles_snapshot_${o}`,size:c.max*w,usage:GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}),d=t.createCommandEncoder({label:"particles_snapshot"});d.copyBufferToBuffer(e.particles,0,a,0,c.max*w),t.queue.submit([d.finish()]),e.snapshots.set(o,{buffer:a,emitted:e.emitted,carry:e.carry})}}}var C=async r=>{let{ctx:e,encoder:i,pass:n,targetView:s,targetWidth:t,targetHeight:c,props:l}=r,P=l.virtualMedia?.operation;if(P?.op!=="Particles"||!M(P.effect))return;let m=P.effect,f=m.particleStatic,u=l.fps||30,o=Math.max(0,Math.round(l.frame??0)),p=Math.round(l.compositionFrame??o),a=p-o,d=$(m,e.device);j(m,d,o,a,u),n.end();let b=new Float32Array(S*4);A(f,m.particleFrame(p,u),b,{dt:0,time:0,emitStart:0,emitCount:0,frameDt:1/u},{scaleX:t/f.layer.width,scaleY:c/f.layer.height});let v=e.renderer.getTemporaryBuffer(b),y=e.renderer.beginFrame(i,s,{r:0,g:0,b:0,a:0},t,c,"load");y.setPipeline(N(e.device,e.renderer.format,f.blend)),y.setBindGroup(0,e.device.createBindGroup({layout:k(e.device).drawLayout,entries:[{binding:0,resource:{buffer:v}},{binding:1,resource:{buffer:d.particles}}]})),y.draw(6,f.max),y.end()};var te=B({WebGPURenderer:C});export{C as ParticlesWebGPURenderer,te as default};
@@ -0,0 +1,203 @@
1
+ import{a as l,d as P,f as w,h as U,j as L,m as G}from"./chunk-ENKKLU7B.mjs";import"./chunk-6YJP57MZ.mjs";import{z as S}from"./chunk-63SFBHEH.mjs";import{e as o}from"./chunk-BVF64D6H.mjs";o();o();var v="Gooey",$=8,V=[`struct U { v : array<vec4<f32>, 2> };
2
+ @group(0) @binding(0) var<uniform> u : U;
3
+ @group(0) @binding(1) var src : texture_2d<f32>;
4
+ @group(0) @binding(2) var prev : texture_2d<f32>;
5
+ @group(0) @binding(3) var samp : sampler;
6
+ ${l}
7
+
8
+ fn straight(c : vec4<f32>) -> vec4<f32> {
9
+ if (c.a <= 0.0001) { return vec4<f32>(0.0); }
10
+ return vec4<f32>(c.rgb / c.a, c.a);
11
+ }
12
+ fn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }
13
+ fn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }
14
+ /** Straight-alpha color of the layer at a uv (filtered). */
15
+ fn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }
16
+ /** Premultiplied color of the layer at a uv (filtered). */
17
+ fn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }
18
+ /** Straight-alpha color of the layer's texel at a pixel position (nearest). */
19
+ fn texelS(p : vec2<f32>) -> vec4<f32> {
20
+ let d = vec2<i32>(textureDimensions(src));
21
+ let q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));
22
+ return straight(textureLoad(src, q, 0));
23
+ }
24
+ fn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }
25
+ fn hash12(p : vec2<f32>) -> f32 {
26
+ var p3 = fract(vec3<f32>(p.xyx) * 0.1031);
27
+ p3 += dot(p3, p3.yzx + 33.33);
28
+ return fract((p3.x + p3.y) * p3.z);
29
+ }
30
+ fn vnoise(p : vec2<f32>) -> f32 {
31
+ let i = floor(p);
32
+ let f = fract(p);
33
+ let u = f * f * (3.0 - 2.0 * f);
34
+ return mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),
35
+ mix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);
36
+ }
37
+ /** 8x8 ordered-dither threshold, 0..1. */
38
+ fn bayer8(p : vec2<f32>) -> f32 {
39
+ let x = u32(p.x) & 7u;
40
+ let y = u32(p.y) & 7u;
41
+ var v = 0u;
42
+ for (var k = 0u; k < 3u; k++) {
43
+ let bx = (x >> k) & 1u;
44
+ let by = (y >> k) & 1u;
45
+ let m = ((bx ^ by) << 1u) | by;
46
+ v += m * (1u << (2u * (2u - k)));
47
+ }
48
+ return (f32(v) + 0.5) / 64.0;
49
+ }
50
+ fn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }
51
+ @fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
52
+ let time = u.v[0].x;
53
+ let frame = u.v[0].y;
54
+ let radius = u.v[1].x;
55
+ let threshold = u.v[1].y;
56
+ let softness = u.v[1].z;
57
+
58
+ let R = res();
59
+ let rr = max(radius, 0.5);
60
+ let stepPx = max(1.0, rr / 16.0);
61
+ let sigma = rr * 0.5;
62
+ var acc = vec4<f32>(0.0);
63
+ var wsum = 0.0;
64
+ for (var k = -rr; k <= rr; k += stepPx) {
65
+ let w = exp(-(k * k) / (2.0 * sigma * sigma));
66
+ acc += textureSampleLevel(prev, samp, in.uv + vec2<f32>(1.0, 0.0) * k / R, 0.0) * w;
67
+ wsum += w;
68
+ }
69
+ return acc / wsum;
70
+ }
71
+ `,`struct U { v : array<vec4<f32>, 2> };
72
+ @group(0) @binding(0) var<uniform> u : U;
73
+ @group(0) @binding(1) var src : texture_2d<f32>;
74
+ @group(0) @binding(2) var prev : texture_2d<f32>;
75
+ @group(0) @binding(3) var samp : sampler;
76
+ ${l}
77
+
78
+ fn straight(c : vec4<f32>) -> vec4<f32> {
79
+ if (c.a <= 0.0001) { return vec4<f32>(0.0); }
80
+ return vec4<f32>(c.rgb / c.a, c.a);
81
+ }
82
+ fn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }
83
+ fn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }
84
+ /** Straight-alpha color of the layer at a uv (filtered). */
85
+ fn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }
86
+ /** Premultiplied color of the layer at a uv (filtered). */
87
+ fn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }
88
+ /** Straight-alpha color of the layer's texel at a pixel position (nearest). */
89
+ fn texelS(p : vec2<f32>) -> vec4<f32> {
90
+ let d = vec2<i32>(textureDimensions(src));
91
+ let q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));
92
+ return straight(textureLoad(src, q, 0));
93
+ }
94
+ fn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }
95
+ fn hash12(p : vec2<f32>) -> f32 {
96
+ var p3 = fract(vec3<f32>(p.xyx) * 0.1031);
97
+ p3 += dot(p3, p3.yzx + 33.33);
98
+ return fract((p3.x + p3.y) * p3.z);
99
+ }
100
+ fn vnoise(p : vec2<f32>) -> f32 {
101
+ let i = floor(p);
102
+ let f = fract(p);
103
+ let u = f * f * (3.0 - 2.0 * f);
104
+ return mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),
105
+ mix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);
106
+ }
107
+ /** 8x8 ordered-dither threshold, 0..1. */
108
+ fn bayer8(p : vec2<f32>) -> f32 {
109
+ let x = u32(p.x) & 7u;
110
+ let y = u32(p.y) & 7u;
111
+ var v = 0u;
112
+ for (var k = 0u; k < 3u; k++) {
113
+ let bx = (x >> k) & 1u;
114
+ let by = (y >> k) & 1u;
115
+ let m = ((bx ^ by) << 1u) | by;
116
+ v += m * (1u << (2u * (2u - k)));
117
+ }
118
+ return (f32(v) + 0.5) / 64.0;
119
+ }
120
+ fn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }
121
+ @fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
122
+ let time = u.v[0].x;
123
+ let frame = u.v[0].y;
124
+ let radius = u.v[1].x;
125
+ let threshold = u.v[1].y;
126
+ let softness = u.v[1].z;
127
+
128
+ let R = res();
129
+ let rr = max(radius, 0.5);
130
+ let stepPx = max(1.0, rr / 16.0);
131
+ let sigma = rr * 0.5;
132
+ var acc = vec4<f32>(0.0);
133
+ var wsum = 0.0;
134
+ for (var k = -rr; k <= rr; k += stepPx) {
135
+ let w = exp(-(k * k) / (2.0 * sigma * sigma));
136
+ acc += textureSampleLevel(prev, samp, in.uv + vec2<f32>(0.0, 1.0) * k / R, 0.0) * w;
137
+ wsum += w;
138
+ }
139
+ return acc / wsum;
140
+ }
141
+ `,`struct U { v : array<vec4<f32>, 2> };
142
+ @group(0) @binding(0) var<uniform> u : U;
143
+ @group(0) @binding(1) var src : texture_2d<f32>;
144
+ @group(0) @binding(2) var prev : texture_2d<f32>;
145
+ @group(0) @binding(3) var samp : sampler;
146
+ ${l}
147
+
148
+ fn straight(c : vec4<f32>) -> vec4<f32> {
149
+ if (c.a <= 0.0001) { return vec4<f32>(0.0); }
150
+ return vec4<f32>(c.rgb / c.a, c.a);
151
+ }
152
+ fn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }
153
+ fn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }
154
+ /** Straight-alpha color of the layer at a uv (filtered). */
155
+ fn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }
156
+ /** Premultiplied color of the layer at a uv (filtered). */
157
+ fn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }
158
+ /** Straight-alpha color of the layer's texel at a pixel position (nearest). */
159
+ fn texelS(p : vec2<f32>) -> vec4<f32> {
160
+ let d = vec2<i32>(textureDimensions(src));
161
+ let q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));
162
+ return straight(textureLoad(src, q, 0));
163
+ }
164
+ fn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }
165
+ fn hash12(p : vec2<f32>) -> f32 {
166
+ var p3 = fract(vec3<f32>(p.xyx) * 0.1031);
167
+ p3 += dot(p3, p3.yzx + 33.33);
168
+ return fract((p3.x + p3.y) * p3.z);
169
+ }
170
+ fn vnoise(p : vec2<f32>) -> f32 {
171
+ let i = floor(p);
172
+ let f = fract(p);
173
+ let u = f * f * (3.0 - 2.0 * f);
174
+ return mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),
175
+ mix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);
176
+ }
177
+ /** 8x8 ordered-dither threshold, 0..1. */
178
+ fn bayer8(p : vec2<f32>) -> f32 {
179
+ let x = u32(p.x) & 7u;
180
+ let y = u32(p.y) & 7u;
181
+ var v = 0u;
182
+ for (var k = 0u; k < 3u; k++) {
183
+ let bx = (x >> k) & 1u;
184
+ let by = (y >> k) & 1u;
185
+ let m = ((bx ^ by) << 1u) | by;
186
+ v += m * (1u << (2u * (2u - k)));
187
+ }
188
+ return (f32(v) + 0.5) / 64.0;
189
+ }
190
+ fn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }
191
+ @fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
192
+ let time = u.v[0].x;
193
+ let frame = u.v[0].y;
194
+ let radius = u.v[1].x;
195
+ let threshold = u.v[1].y;
196
+ let softness = u.v[1].z;
197
+
198
+ let b = textureSampleLevel(prev, samp, in.uv, 0.0);
199
+ let a = smoothstep(threshold - softness, threshold + softness, b.a);
200
+ if (b.a <= 0.0001) { return vec4<f32>(0.0); }
201
+ return vec4<f32>(b.rgb / b.a * a, a);
202
+ }
203
+ `],R=w(e=>({layout:P(e,["uniform","texture","texture","sampler"],`${v}_layout`),pipelines:new Map,sampler:e.createSampler({magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"})}));function W(e,r){let t=R(e),a=t.pipelines.get(r);return a||(a=V.map((p,f)=>{let u=e.createShaderModule({code:p,label:`${v}_${f}.wgsl`});return e.createRenderPipeline({label:`${v}_${f}`,layout:e.createPipelineLayout({bindGroupLayouts:[t.layout]}),vertex:{module:u,entryPoint:"vs"},fragment:{module:u,entryPoint:"fs",targets:[{format:r}]},primitive:{topology:"triangle-strip"}})}),t.pipelines.set(r,a)),a}function h(e,r){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:r}function q(e,r,t,a){r.fill(0),r[0]=t,r[1]=a,r[4]=h(e.radius,12),r[5]=h(e.threshold,.5),r[6]=h(e.softness,.04)}var T=async e=>{let{ctx:r,encoder:t,pass:a,targetTexture:p,targetWidth:f,targetHeight:u,props:n}=e,c=n.virtualMedia?.operation;if(c?.op!==v)return;let g=n.virtualMedia?.children?.[0];if(!g)return;a.end();let m=n.fps||30,i=Math.round(n.compositionFrame??n.frame??0),F=c.effect?.resolveUniforms?c.effect.resolveUniforms({frame:i,fps:m,time:i/m}):c,y=new Float32Array($);q(F,y,i/m,i);let{texture:x}=await U(e,g),d=r.device,b=R(d),_=W(d,r.renderer.format),D=r.renderer.getTemporaryBuffer(y),s=x;for(let z of _){let k=r.renderer.getTemporaryTexture(f,u,[x,s,p,...n.excludeTextures||[]]);G(t,k.createView(),z,[d.createBindGroup({layout:b.layout,entries:[{binding:0,resource:{buffer:D}},{binding:1,resource:x.createView()},{binding:2,resource:s.createView()},{binding:3,resource:b.sampler}]})]),s=k}L(e,s)};var C=S({WebGPURenderer:T});export{T as GooeyWebGPURenderer,C as default};
@@ -0,0 +1,81 @@
1
+ import{a as P,d as S,f as U,h as R,j as G,m as T}from"./chunk-ENKKLU7B.mjs";import"./chunk-6YJP57MZ.mjs";import{z as h}from"./chunk-63SFBHEH.mjs";import{e as s}from"./chunk-BVF64D6H.mjs";s();s();var a="Ascii",z=16,D=[`struct U { v : array<vec4<f32>, 4> };
2
+ @group(0) @binding(0) var<uniform> u : U;
3
+ @group(0) @binding(1) var src : texture_2d<f32>;
4
+ @group(0) @binding(2) var prev : texture_2d<f32>;
5
+ @group(0) @binding(3) var samp : sampler;
6
+ ${P}
7
+
8
+ fn straight(c : vec4<f32>) -> vec4<f32> {
9
+ if (c.a <= 0.0001) { return vec4<f32>(0.0); }
10
+ return vec4<f32>(c.rgb / c.a, c.a);
11
+ }
12
+ fn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }
13
+ fn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }
14
+ /** Straight-alpha color of the layer at a uv (filtered). */
15
+ fn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }
16
+ /** Premultiplied color of the layer at a uv (filtered). */
17
+ fn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }
18
+ /** Straight-alpha color of the layer's texel at a pixel position (nearest). */
19
+ fn texelS(p : vec2<f32>) -> vec4<f32> {
20
+ let d = vec2<i32>(textureDimensions(src));
21
+ let q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));
22
+ return straight(textureLoad(src, q, 0));
23
+ }
24
+ fn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }
25
+ fn hash12(p : vec2<f32>) -> f32 {
26
+ var p3 = fract(vec3<f32>(p.xyx) * 0.1031);
27
+ p3 += dot(p3, p3.yzx + 33.33);
28
+ return fract((p3.x + p3.y) * p3.z);
29
+ }
30
+ fn vnoise(p : vec2<f32>) -> f32 {
31
+ let i = floor(p);
32
+ let f = fract(p);
33
+ let u = f * f * (3.0 - 2.0 * f);
34
+ return mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),
35
+ mix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);
36
+ }
37
+ /** 8x8 ordered-dither threshold, 0..1. */
38
+ fn bayer8(p : vec2<f32>) -> f32 {
39
+ let x = u32(p.x) & 7u;
40
+ let y = u32(p.y) & 7u;
41
+ var v = 0u;
42
+ for (var k = 0u; k < 3u; k++) {
43
+ let bx = (x >> k) & 1u;
44
+ let by = (y >> k) & 1u;
45
+ let m = ((bx ^ by) << 1u) | by;
46
+ v += m * (1u << (2u * (2u - k)));
47
+ }
48
+ return (f32(v) + 0.5) / 64.0;
49
+ }
50
+ fn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }
51
+ const GLYPH_BITS = array<u32, 10>(0u, 4194304u, 131200u, 14336u, 459200u, 145536u, 332096u, 11512810u, 27070835u, 15652782u);
52
+ @fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
53
+ let time = u.v[0].x;
54
+ let frame = u.v[0].y;
55
+ let cellSize = u.v[1].x;
56
+ let colorMode = u32(u.v[1].y + 0.5);
57
+ let fg = u.v[2];
58
+ let bg = u.v[3];
59
+ let contrast = u.v[1].z;
60
+ let invert = u.v[1].w;
61
+
62
+ let R = res();
63
+ let cs = max(cellSize, 2.0);
64
+ let cp = floor(in.uv * R / cs);
65
+ let col = sampleS((cp + 0.5) * cs / R);
66
+ var l = clamp((luma(col.rgb) - 0.5) * contrast + 0.5, 0.0, 1.0) * col.a;
67
+ if (invert > 0.5) { l = 1.0 - l; }
68
+ let idx = min(u32(l * 9.999), 9u);
69
+ let f = in.uv * R / cs - cp;
70
+ let gx = i32(floor(f.x * 6.0));
71
+ let gy = i32(floor(f.y * 6.0));
72
+ var on = 0.0;
73
+ if (gx < 5 && gy < 5) {
74
+ on = f32((GLYPH_BITS[idx] >> u32(gy * 5 + gx)) & 1u);
75
+ }
76
+ var fgc = fg.rgb;
77
+ if (colorMode == 1u) { fgc = col.rgb * 1.25; }
78
+ if (colorMode == 2u) { fgc = vec3<f32>(0.25, 1.0, 0.45) * (0.4 + 0.6 * l); }
79
+ return vec4<f32>(mix(bg.rgb, fgc, on), 1.0);
80
+ }
81
+ `],M=U(r=>({layout:S(r,["uniform","texture","texture","sampler"],`${a}_layout`),pipelines:new Map,sampler:r.createSampler({magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"})}));function $(r,e){let t=M(r),n=t.pipelines.get(e);return n||(n=D.map((p,i)=>{let u=r.createShaderModule({code:p,label:`${a}_${i}.wgsl`});return r.createRenderPipeline({label:`${a}_${i}`,layout:r.createPipelineLayout({bindGroupLayouts:[t.layout]}),vertex:{module:u,entryPoint:"vs"},fragment:{module:u,entryPoint:"fs",targets:[{format:e}]},primitive:{topology:"triangle-strip"}})}),t.pipelines.set(e,n)),n}function k(r,e){let t=typeof r=="number"?r:Number(r);return Number.isFinite(t)?t:e}function F(r){let e=r.trim().replace("#","");(e.length===3||e.length===4)&&(e=[...e].map(n=>n+n).join(""));let t=n=>Number.parseInt(e.slice(n,n+2),16)/255;return[t(0),t(2),t(4),e.length>=8?t(6):1]}function B(r,e,t,n){e.fill(0),e[0]=t,e[1]=n,e[4]=k(r.cellSize,10),e[5]=Math.max(0,["mono","source","green"].indexOf(String(r.colorMode??"mono"))),e.set(F(String(r.fg??"#e8e8e8")),8),e.set(F(String(r.bg??"#0b0b0b")),12),e[6]=k(r.contrast,1.2),e[7]=r.invert===void 0?0:r.invert?1:0}var L=async r=>{let{ctx:e,encoder:t,pass:n,targetTexture:p,targetWidth:i,targetHeight:u,props:o}=r,c=o.virtualMedia?.operation;if(c?.op!==a)return;let g=o.virtualMedia?.children?.[0];if(!g)return;n.end();let m=o.fps||30,l=Math.round(o.compositionFrame??o.frame??0),w=c.effect?.resolveUniforms?c.effect.resolveUniforms({frame:l,fps:m,time:l/m}):c,x=new Float32Array(z);B(w,x,l/m,l);let{texture:v}=await R(r,g),d=e.device,b=M(d),_=$(d,e.renderer.format),A=e.renderer.getTemporaryBuffer(x),f=v;for(let N of _){let y=e.renderer.getTemporaryTexture(i,u,[v,f,p,...o.excludeTextures||[]]);T(t,y.createView(),N,[d.createBindGroup({layout:b.layout,entries:[{binding:0,resource:{buffer:A}},{binding:1,resource:v.createView()},{binding:2,resource:f.createView()},{binding:3,resource:b.sampler}]})]),f=y}G(r,f)};var q=h({WebGPURenderer:L});export{L as AsciiWebGPURenderer,q as default};
@@ -0,0 +1 @@
1
+ import{a}from"./chunk-BSOJR4JU.mjs";import"./chunk-2JKXYG6J.mjs";import"./chunk-7I7PKKDL.mjs";import"./chunk-ENKKLU7B.mjs";import"./chunk-6YJP57MZ.mjs";import"./chunk-63SFBHEH.mjs";import"./chunk-BVF64D6H.mjs";export{a as default};