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.
- package/README.md +11 -2
- package/dist/audio/index.d.mts +4 -4
- package/dist/audio/index.mjs +10 -10
- package/dist/{audio-BvYmTu5T.d.mts → audio-BNnEclHU.d.mts} +3 -3
- package/dist/{audio-BvYmTu5T.d.mts.map → audio-BNnEclHU.d.mts.map} +1 -1
- package/dist/{audio-DMUr01vS.mjs → audio-ChRqnFwB.mjs} +3 -3
- package/dist/{audio-DMUr01vS.mjs.map → audio-ChRqnFwB.mjs.map} +1 -1
- package/dist/{dist-cjxDXQdx.mjs → dist-PwT_Vmax.mjs} +102 -6
- package/dist/{dist-cjxDXQdx.mjs.map → dist-PwT_Vmax.mjs.map} +1 -1
- package/dist/{dist-CT___nEU.mjs → dist-t-NLlnhM.mjs} +7 -5
- package/dist/dist-t-NLlnhM.mjs.map +1 -0
- package/dist/effects/index.d.mts +5 -5
- package/dist/effects/index.mjs +36 -36
- package/dist/{effects-C06-AOge.mjs → effects-Duoqc_Oa.mjs} +532 -4
- package/dist/effects-Duoqc_Oa.mjs.map +1 -0
- package/dist/fonts/index.d.mts +1 -1
- package/dist/fonts/index.mjs +2 -2
- package/dist/{fonts-C0UuLQvr.mjs → fonts-CgNmeFXh.mjs} +2 -2
- package/dist/{fonts-C0UuLQvr.mjs.map → fonts-CgNmeFXh.mjs.map} +1 -1
- package/dist/{gpu-Du7GpVFW.mjs → gpu-1ZpAuQOR.mjs} +2 -2
- package/dist/{gpu-Du7GpVFW.mjs.map → gpu-1ZpAuQOR.mjs.map} +1 -1
- package/dist/{index-B-oUlLoO.d.mts → index-AdrZIWT0.d.mts} +27 -2
- package/dist/index-AdrZIWT0.d.mts.map +1 -0
- package/dist/{index-BcA8rep0.d.mts → index-B-55dXDu.d.mts} +1 -1
- package/dist/{index-BcA8rep0.d.mts.map → index-B-55dXDu.d.mts.map} +1 -1
- package/dist/{index-D-Iek5sq.d.mts → index-B3BwLHa6.d.mts} +3 -3
- package/dist/{index-D-Iek5sq.d.mts.map → index-B3BwLHa6.d.mts.map} +1 -1
- package/dist/{index-CwbszPDG.d.mts → index-BU51pxZO.d.mts} +956 -9
- package/dist/index-BU51pxZO.d.mts.map +1 -0
- package/dist/{index-XdQPNJnq.d.mts → index-CeRv1KC0.d.mts} +3 -3
- package/dist/{index-XdQPNJnq.d.mts.map → index-CeRv1KC0.d.mts.map} +1 -1
- package/dist/{index-DXfp_T-3.d.mts → index-Cg2ptXcs.d.mts} +2 -2
- package/dist/{index-DXfp_T-3.d.mts.map → index-Cg2ptXcs.d.mts.map} +1 -1
- package/dist/{index-CdyE1tst.d.mts → index-QmkcUL3W.d.mts} +2 -2
- package/dist/{index-CdyE1tst.d.mts.map → index-QmkcUL3W.d.mts.map} +1 -1
- package/dist/index.d.mts +1438 -66
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +3122 -83
- package/dist/index.mjs.map +1 -1
- package/dist/preview/index.d.mts +2 -2
- package/dist/preview/index.mjs +10 -10
- package/dist/{preview-M0TsUzC6.mjs → preview-CArsjmkd.mjs} +2 -2
- package/dist/{preview-M0TsUzC6.mjs.map → preview-CArsjmkd.mjs.map} +1 -1
- package/dist/preview-engine/audio.mjs +1 -1
- package/dist/preview-engine/chunk-2JKXYG6J.mjs +127 -0
- package/dist/preview-engine/chunk-7I7PKKDL.mjs +214 -0
- package/dist/preview-engine/chunk-BQY4BUMN.mjs +1 -0
- package/dist/preview-engine/{chunk-RSMO7NPN.mjs → chunk-BSOJR4JU.mjs} +1 -1
- package/dist/preview-engine/chunk-BVA5NGSH.mjs +1 -0
- package/dist/preview-engine/chunk-DLAHSLNX.mjs +1522 -0
- package/dist/preview-engine/{chunk-ZTHWCQ2A.mjs → chunk-FNE22WGA.mjs} +1 -1
- package/dist/preview-engine/chunk-KERW7QJ4.mjs +174 -0
- package/dist/preview-engine/{chunk-7B5S5D4N.mjs → chunk-TPAEN6VV.mjs} +1 -1
- package/dist/preview-engine/chunk-YQRKT47I.mjs +1 -0
- package/dist/preview-engine/crypto-W5UAWSNT.mjs +1 -0
- package/dist/preview-engine/effects.mjs +1 -1
- package/dist/preview-engine/framefields.mjs +26 -26
- package/dist/preview-engine/player.mjs +5 -5
- package/dist/preview-engine/rapier-AHBIGHEL.mjs +1 -0
- package/dist/preview-engine/rapier-JD7KNQRV.mjs +1 -0
- package/dist/preview-engine/renderers-527ONFIA.mjs +228 -0
- package/dist/preview-engine/renderers-6ODPWZ2R.mjs +96 -0
- package/dist/preview-engine/renderers-7NCG6BYS.mjs +94 -0
- package/dist/preview-engine/renderers-BGGRPAVV.mjs +363 -0
- package/dist/preview-engine/renderers-DN2GF3I7.mjs +82 -0
- package/dist/preview-engine/renderers-FGHOLJJK.mjs +44 -0
- package/dist/preview-engine/renderers-FK72LKQC.mjs +275 -0
- package/dist/preview-engine/renderers-FQWWAETX.mjs +203 -0
- package/dist/preview-engine/renderers-HMR2NAD7.mjs +81 -0
- package/dist/preview-engine/renderers-HUW2ZMS3.mjs +1 -0
- package/dist/preview-engine/renderers-JLFGBYN4.mjs +78 -0
- package/dist/preview-engine/renderers-LLUEOW5T.mjs +77 -0
- package/dist/preview-engine/renderers-NC64EQDE.mjs +1 -0
- package/dist/preview-engine/renderers-PVYP2ONH.mjs +76 -0
- package/dist/preview-engine/renderers-TPBPNXWH.mjs +26 -0
- package/dist/preview-engine/renderers-UJ4YVJZT.mjs +80 -0
- package/dist/preview-engine/renderers-WHBDHTRI.mjs +78 -0
- package/dist/preview-engine/renderers-WP67KK5K.mjs +89 -0
- package/dist/preview-engine/renderers-YNFKFM7D.mjs +67 -0
- package/dist/preview-engine/renderers-ZSENYGIY.mjs +84 -0
- package/dist/preview-engine/signals.mjs +1 -1
- package/dist/{program-DzknMiY0.mjs → program-Dd9tJFkY.mjs} +346 -13
- package/dist/program-Dd9tJFkY.mjs.map +1 -0
- package/dist/renderer/index.d.mts +2 -2
- package/dist/renderer/index.mjs +2 -2
- package/dist/{renderer-C8uKdelk.mjs → renderer-0L9MEb3A.mjs} +2 -2
- package/dist/{renderer-C8uKdelk.mjs.map → renderer-0L9MEb3A.mjs.map} +1 -1
- package/dist/renderer-0lp9ClNc.mjs +5 -0
- package/dist/{renderer-BbdZ0YHR.mjs → renderer-257LxOyx.mjs} +3 -3
- package/dist/{renderer-BbdZ0YHR.mjs.map → renderer-257LxOyx.mjs.map} +1 -1
- package/dist/renderer-2BnBo6CX.mjs +219 -0
- package/dist/renderer-2BnBo6CX.mjs.map +1 -0
- package/dist/renderer-4g_BfiKp.mjs +5 -0
- package/dist/renderer-72A4SvOE.mjs +220 -0
- package/dist/renderer-72A4SvOE.mjs.map +1 -0
- package/dist/renderer-7Aw6AHqW.mjs +5 -0
- package/dist/{renderer-PKQNH21k.mjs → renderer-7OvgLE8w.mjs} +2 -2
- package/dist/{renderer-BerD3T-X.mjs → renderer-94byj7Mk.mjs} +2 -2
- package/dist/{renderer-BerD3T-X.mjs.map → renderer-94byj7Mk.mjs.map} +1 -1
- package/dist/{renderer-D-vRKssW.mjs → renderer-B2aXfdW_.mjs} +2 -2
- package/dist/{renderer-D-vRKssW.mjs.map → renderer-B2aXfdW_.mjs.map} +1 -1
- package/dist/{renderer-DD8napek.mjs → renderer-B3c-j-e5.mjs} +2 -2
- package/dist/{renderer-DD8napek.mjs.map → renderer-B3c-j-e5.mjs.map} +1 -1
- package/dist/renderer-B3ypX3MH.mjs +308 -0
- package/dist/renderer-B3ypX3MH.mjs.map +1 -0
- package/dist/renderer-B82v8PyC.mjs +5 -0
- package/dist/renderer-B8BDMJNz.mjs +5 -0
- package/dist/renderer-BARst3ZD.mjs +3 -0
- package/dist/renderer-BCPRrhP8.mjs +5 -0
- package/dist/{renderer-CMT4QcpV.mjs → renderer-BEdc-7JW.mjs} +3 -3
- package/dist/{renderer-CMT4QcpV.mjs.map → renderer-BEdc-7JW.mjs.map} +1 -1
- package/dist/renderer-BEpANdcO.mjs +204 -0
- package/dist/renderer-BEpANdcO.mjs.map +1 -0
- package/dist/renderer-BFhzO6En.mjs +5 -0
- package/dist/renderer-BH0KF-y-.mjs +6 -0
- package/dist/renderer-BHrqEgIA.mjs +541 -0
- package/dist/renderer-BHrqEgIA.mjs.map +1 -0
- package/dist/{renderer-DpW_LxLO.mjs → renderer-BId5hBLb.mjs} +3 -3
- package/dist/{renderer-DpW_LxLO.mjs.map → renderer-BId5hBLb.mjs.map} +1 -1
- package/dist/renderer-BK32cV7E.mjs +203 -0
- package/dist/renderer-BK32cV7E.mjs.map +1 -0
- package/dist/renderer-BTI5ybyH.mjs +5 -0
- package/dist/{renderer-0gY4IQhM.mjs → renderer-BVR0mEIT.mjs} +2 -2
- package/dist/{renderer-0gY4IQhM.mjs.map → renderer-BVR0mEIT.mjs.map} +1 -1
- package/dist/{renderer-CebB0v1y.mjs → renderer-BY08hHFS.mjs} +2 -2
- package/dist/{renderer-CebB0v1y.mjs.map → renderer-BY08hHFS.mjs.map} +1 -1
- package/dist/renderer-Ba7LH8U2.mjs +5 -0
- package/dist/renderer-BcQBlfhC.mjs +5 -0
- package/dist/renderer-BdMJzCTz.mjs +5 -0
- package/dist/{renderer-D1Cm21eq.mjs → renderer-BmQbSQHf.mjs} +2 -2
- package/dist/{renderer-D1Cm21eq.mjs.map → renderer-BmQbSQHf.mjs.map} +1 -1
- package/dist/{renderer-DqdhsSwS.mjs → renderer-BmTDXIUI.mjs} +2 -2
- package/dist/{renderer-DqdhsSwS.mjs.map → renderer-BmTDXIUI.mjs.map} +1 -1
- package/dist/renderer-BpdzhZE7.mjs +224 -0
- package/dist/renderer-BpdzhZE7.mjs.map +1 -0
- package/dist/renderer-Bxi2j-tG.mjs +5 -0
- package/dist/{renderer-D8thCpS7.mjs → renderer-C-Qj0BnT.mjs} +3 -3
- package/dist/{renderer-D8thCpS7.mjs.map → renderer-C-Qj0BnT.mjs.map} +1 -1
- package/dist/{renderer-BiwIh_w4.mjs → renderer-C4tUATd_.mjs} +3 -3
- package/dist/{renderer-BiwIh_w4.mjs.map → renderer-C4tUATd_.mjs.map} +1 -1
- package/dist/{renderer-1vhaKMeg.mjs → renderer-CC72sZ8l.mjs} +141 -56
- package/dist/renderer-CC72sZ8l.mjs.map +1 -0
- package/dist/renderer-CCn5ISVM.mjs +5 -0
- package/dist/renderer-CDRsdhg9.mjs +5 -0
- package/dist/{renderer-BC8XOVl5.mjs → renderer-CI9Pq77W.mjs} +3 -3
- package/dist/{renderer-BC8XOVl5.mjs.map → renderer-CI9Pq77W.mjs.map} +1 -1
- package/dist/{renderer-CrABA3lB.mjs → renderer-CIMI33Yd.mjs} +2 -2
- package/dist/{renderer-CrABA3lB.mjs.map → renderer-CIMI33Yd.mjs.map} +1 -1
- package/dist/renderer-CKSdl0Xf.mjs +331 -0
- package/dist/renderer-CKSdl0Xf.mjs.map +1 -0
- package/dist/{renderer-Cce2fgpX.mjs → renderer-CKpwEo1w.mjs} +3 -3
- package/dist/{renderer-Cce2fgpX.mjs.map → renderer-CKpwEo1w.mjs.map} +1 -1
- package/dist/{renderer-CursFKUf.mjs → renderer-CLUyYFqS.mjs} +2 -2
- package/dist/{renderer-CursFKUf.mjs.map → renderer-CLUyYFqS.mjs.map} +1 -1
- package/dist/{renderer-Br6KyRO_.mjs → renderer-CS-goRD3.mjs} +3 -3
- package/dist/{renderer-Br6KyRO_.mjs.map → renderer-CS-goRD3.mjs.map} +1 -1
- package/dist/{renderer-DtgMsjyL.mjs → renderer-CSPpKLi3.mjs} +2 -2
- package/dist/{renderer-DtgMsjyL.mjs.map → renderer-CSPpKLi3.mjs.map} +1 -1
- package/dist/{renderer-CuVPo-wP.mjs → renderer-CWQ-Bct7.mjs} +2 -2
- package/dist/{renderer-CuVPo-wP.mjs.map → renderer-CWQ-Bct7.mjs.map} +1 -1
- package/dist/{renderer-DHGTzype.mjs → renderer-ChoYV7Ko.mjs} +2 -2
- package/dist/{renderer-DHGTzype.mjs.map → renderer-ChoYV7Ko.mjs.map} +1 -1
- package/dist/renderer-CiCK8ZG_.mjs +5 -0
- package/dist/{renderer-CJB9nU1x.mjs → renderer-Ck2pRec0.mjs} +3 -3
- package/dist/{renderer-CJB9nU1x.mjs.map → renderer-Ck2pRec0.mjs.map} +1 -1
- package/dist/{renderer-BzDjy1_x.mjs → renderer-CrUudSLP.mjs} +2 -2
- package/dist/{renderer-BzDjy1_x.mjs.map → renderer-CrUudSLP.mjs.map} +1 -1
- package/dist/{renderer-DupsdRIw.mjs → renderer-CraudZUC.mjs} +3 -3
- package/dist/{renderer-DupsdRIw.mjs.map → renderer-CraudZUC.mjs.map} +1 -1
- package/dist/renderer-CsEk9TFz.mjs +5 -0
- package/dist/renderer-CvOzuDX3.mjs +215 -0
- package/dist/renderer-CvOzuDX3.mjs.map +1 -0
- package/dist/{renderer-DJfFc-XW.mjs → renderer-Cvysm2Jg.mjs} +3 -3
- package/dist/{renderer-DJfFc-XW.mjs.map → renderer-Cvysm2Jg.mjs.map} +1 -1
- package/dist/{renderer-Bn2eQE-t.mjs → renderer-CwwmwM7J.mjs} +3 -3
- package/dist/{renderer-Bn2eQE-t.mjs.map → renderer-CwwmwM7J.mjs.map} +1 -1
- package/dist/{renderer-KnCcN_Nz.mjs → renderer-CxP2e6Ov.mjs} +2 -2
- package/dist/{renderer-KnCcN_Nz.mjs.map → renderer-CxP2e6Ov.mjs.map} +1 -1
- package/dist/{renderer-BteUC_7n.mjs → renderer-D-yNHLG7.mjs} +3 -3
- package/dist/{renderer-BteUC_7n.mjs.map → renderer-D-yNHLG7.mjs.map} +1 -1
- package/dist/renderer-D0xLIq1r.mjs +203 -0
- package/dist/renderer-D0xLIq1r.mjs.map +1 -0
- package/dist/{renderer-id8TbKBY.mjs → renderer-D1MOTlWS.mjs} +2 -2
- package/dist/{renderer-id8TbKBY.mjs.map → renderer-D1MOTlWS.mjs.map} +1 -1
- package/dist/renderer-D1T7A3NF.mjs +233 -0
- package/dist/renderer-D1T7A3NF.mjs.map +1 -0
- package/dist/renderer-D1gx_-hi.mjs +5 -0
- package/dist/renderer-D5MCGNAF.mjs +5 -0
- package/dist/{renderer-Db3JIF1K.mjs → renderer-D6YcQTLI.mjs} +3 -3
- package/dist/{renderer-Db3JIF1K.mjs.map → renderer-D6YcQTLI.mjs.map} +1 -1
- package/dist/{renderer-BNqwn0gZ.mjs → renderer-D8_UYdDb.mjs} +2 -2
- package/dist/{renderer-BNqwn0gZ.mjs.map → renderer-D8_UYdDb.mjs.map} +1 -1
- package/dist/renderer-DD_MzvM-.mjs +5 -0
- package/dist/{renderer-BHskWZNG.mjs → renderer-DIqwz7dV.mjs} +2 -2
- package/dist/{renderer-57ATc_mQ.mjs → renderer-DJQD7tai.mjs} +2 -2
- package/dist/{renderer-57ATc_mQ.mjs.map → renderer-DJQD7tai.mjs.map} +1 -1
- package/dist/{renderer-CWBHVCvA.mjs → renderer-DKXK5hDm.mjs} +2 -2
- package/dist/{renderer-CWBHVCvA.mjs.map → renderer-DKXK5hDm.mjs.map} +1 -1
- package/dist/{renderer-p_C_T9Kn.mjs → renderer-DNYSf2Fl.mjs} +2 -2
- package/dist/{renderer-p_C_T9Kn.mjs.map → renderer-DNYSf2Fl.mjs.map} +1 -1
- package/dist/{renderer-DXqIslFk.mjs → renderer-DNaHFctD.mjs} +2 -2
- package/dist/{renderer-DXqIslFk.mjs.map → renderer-DNaHFctD.mjs.map} +1 -1
- package/dist/renderer-DO5r7ZV-.mjs +658 -0
- package/dist/renderer-DO5r7ZV-.mjs.map +1 -0
- package/dist/renderer-DP7YoZ0K.mjs +5 -0
- package/dist/{renderer-CE7fwGgw.mjs → renderer-DQtk282o.mjs} +29 -8
- package/dist/renderer-DQtk282o.mjs.map +1 -0
- package/dist/{renderer-u8ynJtAC.mjs → renderer-DWcbrx2M.mjs} +2 -2
- package/dist/{renderer-u8ynJtAC.mjs.map → renderer-DWcbrx2M.mjs.map} +1 -1
- package/dist/renderer-DXiWvKij.mjs +5 -0
- package/dist/renderer-DZnUiiBp.mjs +222 -0
- package/dist/renderer-DZnUiiBp.mjs.map +1 -0
- package/dist/renderer-Dc6fW-o1.mjs +5 -0
- package/dist/renderer-DiurlsNT.mjs +5 -0
- package/dist/{renderer-BmGPTWwV.mjs → renderer-Dju3SEAJ.mjs} +3 -3
- package/dist/{renderer-BmGPTWwV.mjs.map → renderer-Dju3SEAJ.mjs.map} +1 -1
- package/dist/{renderer-BT-_EoXw.d.mts → renderer-DlESyfg7.d.mts} +2 -2
- package/dist/{renderer-BT-_EoXw.d.mts.map → renderer-DlESyfg7.d.mts.map} +1 -1
- package/dist/{renderer-aArb4RwJ.mjs → renderer-DpQaiH6C.mjs} +2 -2
- package/dist/{renderer-aArb4RwJ.mjs.map → renderer-DpQaiH6C.mjs.map} +1 -1
- package/dist/{renderer-CeyAgJnw.mjs → renderer-DuxzqfoE.mjs} +2 -2
- package/dist/renderer-DvCUdgVz.mjs +5 -0
- package/dist/{renderer-AF884a7T.mjs → renderer-Dvg5nbgU.mjs} +3 -3
- package/dist/{renderer-AF884a7T.mjs.map → renderer-Dvg5nbgU.mjs.map} +1 -1
- package/dist/{renderer-DvFaC_-7.mjs → renderer-Dvq11SEA.mjs} +2 -2
- package/dist/{renderer-DvFaC_-7.mjs.map → renderer-Dvq11SEA.mjs.map} +1 -1
- package/dist/renderer-DyPgVl1l.mjs +223 -0
- package/dist/renderer-DyPgVl1l.mjs.map +1 -0
- package/dist/{renderer-DEuIwr-t.mjs → renderer-DzOzVxNS.mjs} +2 -2
- package/dist/{renderer-DEuIwr-t.mjs.map → renderer-DzOzVxNS.mjs.map} +1 -1
- package/dist/renderer-EhCkD11e.mjs +208 -0
- package/dist/renderer-EhCkD11e.mjs.map +1 -0
- package/dist/renderer-IiwAh9-K.mjs +5 -0
- package/dist/{renderer-jqByPgkD.mjs → renderer-JiEpssIz.mjs} +2 -2
- package/dist/{renderer-jqByPgkD.mjs.map → renderer-JiEpssIz.mjs.map} +1 -1
- package/dist/renderer-JlGXqH0E.mjs +5 -0
- package/dist/{renderer-Beg7FLt2.mjs → renderer-OxafT7Xm.mjs} +75 -27
- package/dist/renderer-OxafT7Xm.mjs.map +1 -0
- package/dist/renderer-TZFKKgL1.mjs +5 -0
- package/dist/renderer-UT0CcmMZ.mjs +191 -0
- package/dist/renderer-UT0CcmMZ.mjs.map +1 -0
- package/dist/{renderer-YbaCzPcG.mjs → renderer-YyEBKPcE.mjs} +2 -2
- package/dist/{renderer-jYxN4mHn.mjs → renderer-_AuL8mAi.mjs} +3 -3
- package/dist/{renderer-jYxN4mHn.mjs.map → renderer-_AuL8mAi.mjs.map} +1 -1
- package/dist/{renderer-C6md3msE.mjs → renderer-aCDIEYb3.mjs} +2 -2
- package/dist/{renderer-C6md3msE.mjs.map → renderer-aCDIEYb3.mjs.map} +1 -1
- package/dist/renderer-aEecoNPX.mjs +5 -0
- package/dist/{renderer-BeIUgp1r.mjs → renderer-aN60v8jR.mjs} +2 -2
- package/dist/{renderer-BeIUgp1r.mjs.map → renderer-aN60v8jR.mjs.map} +1 -1
- package/dist/renderer-ewhliYYP.mjs +5 -0
- package/dist/renderer-hQc6GgTi.mjs +5 -0
- package/dist/renderer-iuX0RZIi.mjs +5 -0
- package/dist/renderer-j4vkTzHa.mjs +5 -0
- package/dist/{renderer-EemDpvv3.mjs → renderer-mpInX4Iy.mjs} +3 -3
- package/dist/{renderer-EemDpvv3.mjs.map → renderer-mpInX4Iy.mjs.map} +1 -1
- package/dist/renderer-msPjwx_9.mjs +5 -0
- package/dist/renderer-pI2ndu-b.mjs +5 -0
- package/dist/renderer-x1OGMhsC.mjs +5 -0
- package/dist/{renderer-DZXbgVMK.mjs → renderer-xezE7IZX.mjs} +3 -3
- package/dist/{renderer-DZXbgVMK.mjs.map → renderer-xezE7IZX.mjs.map} +1 -1
- package/dist/renderer-yGAk7J9P.mjs +222 -0
- package/dist/renderer-yGAk7J9P.mjs.map +1 -0
- package/dist/{renderer-Bvx56GR6.mjs → renderer-zQIB2VZZ.mjs} +2 -2
- package/dist/{renderer-Bvx56GR6.mjs.map → renderer-zQIB2VZZ.mjs.map} +1 -1
- package/dist/{renderers-CP8CFWDs-BA-4l6By.mjs → renderers-CP8CFWDs-i6u_rhCX.mjs} +2 -2
- package/dist/{renderers-CP8CFWDs-BA-4l6By.mjs.map → renderers-CP8CFWDs-i6u_rhCX.mjs.map} +1 -1
- package/dist/signals/index.d.mts +5 -5
- package/dist/signals/index.mjs +4 -4
- package/package.json +58 -55
- package/dist/dist-CT___nEU.mjs.map +0 -1
- package/dist/effects-C06-AOge.mjs.map +0 -1
- package/dist/index-B-oUlLoO.d.mts.map +0 -1
- package/dist/index-CwbszPDG.d.mts.map +0 -1
- package/dist/preview-engine/chunk-G4K6TLNA.mjs +0 -1
- package/dist/preview-engine/chunk-HVCAOHNI.mjs +0 -1
- package/dist/preview-engine/chunk-KBO6EX3M.mjs +0 -1448
- package/dist/preview-engine/chunk-N4LHIPHZ.mjs +0 -340
- package/dist/preview-engine/chunk-NECOKNHA.mjs +0 -174
- package/dist/preview-engine/renderers-T4JMJXWL.mjs +0 -1
- package/dist/preview-engine/renderers-VFV5QWO3.mjs +0 -1
- package/dist/preview-engine/renderers-VUL4HBX3.mjs +0 -228
- package/dist/program-DzknMiY0.mjs.map +0 -1
- package/dist/renderer--IDyGdqT.mjs +0 -5
- package/dist/renderer-17K4tjid.mjs +0 -5
- package/dist/renderer-1vhaKMeg.mjs.map +0 -1
- package/dist/renderer-Ab9Ttn_m.mjs +0 -5
- package/dist/renderer-B-roDBBo.mjs +0 -5
- package/dist/renderer-B03uwoUX.mjs +0 -5
- package/dist/renderer-B3BI_7YJ.mjs +0 -5
- package/dist/renderer-BGD4lQ74.mjs +0 -5
- package/dist/renderer-BHXhYfeC.mjs +0 -5
- package/dist/renderer-BRsTIMFa.mjs +0 -5
- package/dist/renderer-Beg7FLt2.mjs.map +0 -1
- package/dist/renderer-BjMTtYZw.mjs +0 -5
- package/dist/renderer-BoCh3Yts.mjs +0 -5
- package/dist/renderer-BqPbR8c4.mjs +0 -5
- package/dist/renderer-Bxa4SDm9.mjs +0 -3
- package/dist/renderer-C4Da2I1-.mjs +0 -5
- package/dist/renderer-C93X6dgl.mjs +0 -5
- package/dist/renderer-CE7fwGgw.mjs.map +0 -1
- package/dist/renderer-CMAwFfGx.mjs +0 -6
- package/dist/renderer-CRXeSuX2.mjs +0 -5
- package/dist/renderer-CSp6WYBN.mjs +0 -5
- package/dist/renderer-CUXX7HTL.mjs +0 -5
- package/dist/renderer-CUgThpka.mjs +0 -5
- package/dist/renderer-CeVtufiT.mjs +0 -5
- package/dist/renderer-CespkZUk.mjs +0 -5
- package/dist/renderer-D1l47xhL.mjs +0 -5
- package/dist/renderer-DDuG18J8.mjs +0 -5
- package/dist/renderer-DFhrFSMn.mjs +0 -5
- package/dist/renderer-DO48vQ7Y.mjs +0 -5
- package/dist/renderer-DTC39B_n.mjs +0 -5
- package/dist/renderer-DbyU3hNF.mjs +0 -5
- package/dist/renderer-DftVpmfu.mjs +0 -5
- package/dist/renderer-Dj5jm63K.mjs +0 -5
- package/dist/renderer-Dju57ZaF.mjs +0 -5
- package/dist/renderer-Dn8TQCw7.mjs +0 -5
- package/dist/renderer-ETF46K0D.mjs +0 -5
- package/dist/renderer-azYzWGC3.mjs +0 -5
- package/dist/renderer-dxNoRW59.mjs +0 -5
- package/dist/renderer-fdfelx_I.mjs +0 -5
- 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};
|