framefields 2.2.0 → 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 +1383 -11
- 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,96 @@
|
|
|
1
|
+
import{a as k,d as U,f as R,h as S,j as G,m as w}from"./chunk-ENKKLU7B.mjs";import"./chunk-6YJP57MZ.mjs";import{z as P}from"./chunk-63SFBHEH.mjs";import{e as f}from"./chunk-BVF64D6H.mjs";f();f();var p="Painterly",_=12,W=[`struct U { v : array<vec4<f32>, 3> };
|
|
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
|
+
${k}
|
|
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 style = u32(u.v[1].x + 0.5);
|
|
55
|
+
let radius = u.v[1].y;
|
|
56
|
+
let edgeDarkening = u.v[1].z;
|
|
57
|
+
let paper = u.v[1].w;
|
|
58
|
+
let saturation = u.v[2].x;
|
|
59
|
+
|
|
60
|
+
let R = res();
|
|
61
|
+
let r = i32(radius);
|
|
62
|
+
var mean = array<vec3<f32>, 4>(vec3<f32>(0.0), vec3<f32>(0.0), vec3<f32>(0.0), vec3<f32>(0.0));
|
|
63
|
+
var sq = array<vec3<f32>, 4>(vec3<f32>(0.0), vec3<f32>(0.0), vec3<f32>(0.0), vec3<f32>(0.0));
|
|
64
|
+
var a = 0.0;
|
|
65
|
+
for (var j = -r; j <= r; j++) {
|
|
66
|
+
for (var i = -r; i <= r; i++) {
|
|
67
|
+
let c = sampleS(in.uv + vec2<f32>(f32(i), f32(j)) / R);
|
|
68
|
+
a += c.a;
|
|
69
|
+
let q = select(select(3, 2, i <= 0), select(1, 0, i <= 0), j <= 0);
|
|
70
|
+
mean[q] += c.rgb;
|
|
71
|
+
sq[q] += c.rgb * c.rgb;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
let n = f32((r + 1) * (r + 1));
|
|
75
|
+
var best = vec3<f32>(0.0);
|
|
76
|
+
var bestV = 1e9;
|
|
77
|
+
for (var k = 0; k < 4; k++) {
|
|
78
|
+
let m = mean[k] / n;
|
|
79
|
+
let v = sq[k] / n - m * m;
|
|
80
|
+
let vs = v.r + v.g + v.b;
|
|
81
|
+
if (vs < bestV) { bestV = vs; best = m; }
|
|
82
|
+
}
|
|
83
|
+
var rgb = best;
|
|
84
|
+
let grain = vnoise(in.uv * R / 3.0) * 0.6 + vnoise(in.uv * R / 11.0) * 0.4;
|
|
85
|
+
if (style == 1u) {
|
|
86
|
+
rgb = mix(rgb, vec3<f32>(1.0), 0.06);
|
|
87
|
+
rgb *= 1.0 - edgeDarkening * 0.45 * smoothstep(0.004, 0.05, sqrt(max(bestV, 0.0)));
|
|
88
|
+
rgb *= 1.0 - paper * 0.18 * (grain - 0.5);
|
|
89
|
+
} else {
|
|
90
|
+
rgb *= 1.0 - paper * 0.1 * (grain - 0.5);
|
|
91
|
+
}
|
|
92
|
+
rgb = clamp(mix(vec3<f32>(luma(rgb)), rgb, saturation), vec3<f32>(0.0), vec3<f32>(1.0));
|
|
93
|
+
let alpha = a / f32((2 * r + 1) * (2 * r + 1));
|
|
94
|
+
return premul(vec4<f32>(rgb, alpha));
|
|
95
|
+
}
|
|
96
|
+
`],T=R(e=>({layout:U(e,["uniform","texture","texture","sampler"],`${p}_layout`),pipelines:new Map,sampler:e.createSampler({magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"})}));function N(e,r){let t=T(e),n=t.pipelines.get(r);return n||(n=W.map((v,a)=>{let o=e.createShaderModule({code:v,label:`${p}_${a}.wgsl`});return e.createRenderPipeline({label:`${p}_${a}`,layout:e.createPipelineLayout({bindGroupLayouts:[t.layout]}),vertex:{module:o,entryPoint:"vs"},fragment:{module:o,entryPoint:"fs",targets:[{format:r}]},primitive:{topology:"triangle-strip"}})}),t.pipelines.set(r,n)),n}function l(e,r){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:r}function $(e,r,t,n){r.fill(0),r[0]=t,r[1]=n,r[4]=Math.max(0,["oil","watercolor"].indexOf(String(e.style??"oil"))),r[5]=l(e.radius,5),r[6]=l(e.edgeDarkening,.5),r[7]=l(e.paper,.3),r[8]=l(e.saturation,1.05)}var F=async e=>{let{ctx:r,encoder:t,pass:n,targetTexture:v,targetWidth:a,targetHeight:o,props:i}=e,c=i.virtualMedia?.operation;if(c?.op!==p)return;let b=i.virtualMedia?.children?.[0];if(!b)return;n.end();let m=i.fps||30,s=Math.round(i.compositionFrame??i.frame??0),L=c.effect?.resolveUniforms?c.effect.resolveUniforms({frame:s,fps:m,time:s/m}):c,x=new Float32Array(_);$(L,x,s/m,s);let{texture:d}=await S(e,b),g=r.device,y=T(g),q=N(g,r.renderer.format),D=r.renderer.getTemporaryBuffer(x),u=d;for(let M of q){let h=r.renderer.getTemporaryTexture(a,o,[d,u,v,...i.excludeTextures||[]]);w(t,h.createView(),M,[g.createBindGroup({layout:y.layout,entries:[{binding:0,resource:{buffer:D}},{binding:1,resource:d.createView()},{binding:2,resource:u.createView()},{binding:3,resource:y.sampler}]})]),u=h}G(e,u)};var E=P({WebGPURenderer:F});export{F as PainterlyWebGPURenderer,E as default};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import{a as P,d as R,f as U,h as S,j as T,m as G}from"./chunk-ENKKLU7B.mjs";import"./chunk-6YJP57MZ.mjs";import{z as k}from"./chunk-63SFBHEH.mjs";import{e as f}from"./chunk-BVF64D6H.mjs";f();f();var v="CRT",D=16,N=[`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
|
+
@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 scanlines = u.v[1].x;
|
|
55
|
+
let lineCount = u.v[1].y;
|
|
56
|
+
let curvature = u.v[1].z;
|
|
57
|
+
let mask = u.v[1].w;
|
|
58
|
+
let vignette = u.v[2].x;
|
|
59
|
+
let noise = u.v[2].y;
|
|
60
|
+
let flicker = u.v[2].z;
|
|
61
|
+
let tracking = u.v[2].w;
|
|
62
|
+
let chroma = u.v[3].x;
|
|
63
|
+
|
|
64
|
+
let R = res();
|
|
65
|
+
let t = time;
|
|
66
|
+
let cc = in.uv * 2.0 - 1.0;
|
|
67
|
+
var uv = (cc * (1.0 + curvature * 0.25 * dot(cc, cc))) * 0.5 + 0.5;
|
|
68
|
+
if (uv.x < 0.0 || uv.y < 0.0 || uv.x > 1.0 || uv.y > 1.0) { return vec4<f32>(0.0, 0.0, 0.0, 1.0); }
|
|
69
|
+
let line = floor(uv.y * lineCount);
|
|
70
|
+
let jitter = (hash12(vec2<f32>(line, floor(t * 30.0))) - 0.5) * tracking * 0.006;
|
|
71
|
+
let bandY = fract(t * 0.13);
|
|
72
|
+
let band = smoothstep(0.07, 0.0, abs(uv.y - bandY)) * tracking;
|
|
73
|
+
uv.x += jitter + band * 0.015 * sin(uv.y * 400.0 + t * 20.0);
|
|
74
|
+
let base = sampleS(uv);
|
|
75
|
+
var rgb = base.rgb;
|
|
76
|
+
if (chroma > 0.0) {
|
|
77
|
+
let off = chroma / R.x;
|
|
78
|
+
let avg = (sampleS(uv - vec2<f32>(off, 0.0)).rgb + base.rgb + sampleS(uv + vec2<f32>(off * 2.0, 0.0)).rgb) / 3.0;
|
|
79
|
+
let y = luma(base.rgb);
|
|
80
|
+
rgb = vec3<f32>(y) + (avg - vec3<f32>(luma(avg)));
|
|
81
|
+
}
|
|
82
|
+
let sl = 0.5 + 0.5 * cos(uv.y * lineCount * 6.2831853);
|
|
83
|
+
rgb *= 1.0 - scanlines * (1.0 - sl) * 0.7;
|
|
84
|
+
let tri = u32(floor(in.uv.x * R.x)) % 3u;
|
|
85
|
+
var m = vec3<f32>(0.75);
|
|
86
|
+
if (tri == 0u) { m.r = 1.25; } else if (tri == 1u) { m.g = 1.25; } else { m.b = 1.25; }
|
|
87
|
+
rgb *= mix(vec3<f32>(1.0), m, mask);
|
|
88
|
+
rgb += (hash12(in.uv * R + vec2<f32>(t * 61.0, t * 17.0)) - 0.5) * noise * 0.3;
|
|
89
|
+
rgb *= 1.0 - flicker * hash12(vec2<f32>(floor(t * 24.0), 3.0));
|
|
90
|
+
rgb *= 1.0 - vignette * dot(cc, cc) * 0.35;
|
|
91
|
+
rgb += band * 0.12;
|
|
92
|
+
return vec4<f32>(clamp(rgb, vec3<f32>(0.0), vec3<f32>(1.0)), 1.0);
|
|
93
|
+
}
|
|
94
|
+
`],F=U(e=>({layout:R(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 $(e,r){let t=F(e),i=t.pipelines.get(r);return i||(i=N.map((p,c)=>{let u=e.createShaderModule({code:p,label:`${v}_${c}.wgsl`});return e.createRenderPipeline({label:`${v}_${c}`,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,i)),i}function n(e,r){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:r}function A(e,r,t,i){r.fill(0),r[0]=t,r[1]=i,r[4]=n(e.scanlines,.45),r[5]=n(e.lineCount,540),r[6]=n(e.curvature,.12),r[7]=n(e.mask,.25),r[8]=n(e.vignette,.35),r[9]=n(e.noise,.08),r[10]=n(e.flicker,.03),r[11]=n(e.tracking,0),r[12]=n(e.chroma,0)}var w=async e=>{let{ctx:r,encoder:t,pass:i,targetTexture:p,targetWidth:c,targetHeight:u,props:o}=e,l=o.virtualMedia?.operation;if(l?.op!==v)return;let b=o.virtualMedia?.children?.[0];if(!b)return;i.end();let m=o.fps||30,a=Math.round(o.compositionFrame??o.frame??0),L=l.effect?.resolveUniforms?l.effect.resolveUniforms({frame:a,fps:m,time:a/m}):l,x=new Float32Array(D);A(L,x,a/m,a);let{texture:d}=await S(e,b),g=r.device,y=F(g),C=$(g,r.renderer.format),M=r.renderer.getTemporaryBuffer(x),s=d;for(let _ of C){let h=r.renderer.getTemporaryTexture(c,u,[d,s,p,...o.excludeTextures||[]]);G(t,h.createView(),_,[g.createBindGroup({layout:y.layout,entries:[{binding:0,resource:{buffer:M}},{binding:1,resource:d.createView()},{binding:2,resource:s.createView()},{binding:3,resource:y.sampler}]})]),s=h}T(e,s)};var j=k({WebGPURenderer:w});export{w as CRTWebGPURenderer,j as default};
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import{a as k,d as F,e as V,f as T,g as D,k as L}from"./chunk-ENKKLU7B.mjs";import{d as b}from"./chunk-6YJP57MZ.mjs";import{x as o,z as A}from"./chunk-63SFBHEH.mjs";import{e as u}from"./chunk-BVF64D6H.mjs";u();u();var z=`
|
|
2
|
+
struct VFXUniforms {
|
|
3
|
+
effectType : f32,
|
|
4
|
+
outputType : f32,
|
|
5
|
+
time : f32,
|
|
6
|
+
_pad0 : f32,
|
|
7
|
+
|
|
8
|
+
density : f32,
|
|
9
|
+
scale : f32,
|
|
10
|
+
speed : f32,
|
|
11
|
+
intensity : f32,
|
|
12
|
+
|
|
13
|
+
seed : f32,
|
|
14
|
+
hasSigDensity : f32,
|
|
15
|
+
hasSigScale : f32,
|
|
16
|
+
hasSigSpeed : f32,
|
|
17
|
+
|
|
18
|
+
hasSigIntensity : f32,
|
|
19
|
+
hasSigSeed : f32,
|
|
20
|
+
_pad1 : f32,
|
|
21
|
+
_pad2 : f32,
|
|
22
|
+
|
|
23
|
+
colorStart : vec4<f32>,
|
|
24
|
+
colorEnd : vec4<f32>,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
@group(0) @binding(0) var<uniform> u : VFXUniforms;
|
|
28
|
+
|
|
29
|
+
@group(1) @binding(0) var densityTex : texture_2d<f32>;
|
|
30
|
+
@group(1) @binding(1) var scaleTex : texture_2d<f32>;
|
|
31
|
+
@group(1) @binding(2) var speedTex : texture_2d<f32>;
|
|
32
|
+
@group(1) @binding(3) var intensityTex : texture_2d<f32>;
|
|
33
|
+
@group(1) @binding(4) var seedTex : texture_2d<f32>;
|
|
34
|
+
@group(1) @binding(5) var signalSamp : sampler;
|
|
35
|
+
${k}
|
|
36
|
+
|
|
37
|
+
// ---- hashing & noise primitives -------------------------------------------
|
|
38
|
+
fn hash21(p: vec2<f32>) -> vec2<f32> {
|
|
39
|
+
let p3 = fract(vec3<f32>(p.xyx) * vec3<f32>(0.1031, 0.1030, 0.0973));
|
|
40
|
+
let p4 = p3 + dot(p3, p3.yzx + 33.33);
|
|
41
|
+
return fract((p4.xx + p4.yz) * p4.zy);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
fn hash1(n: f32) -> f32 {
|
|
45
|
+
return fract(sin(n) * 43758.5453);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
fn valueNoise(p: vec2<f32>) -> f32 {
|
|
49
|
+
let i = floor(p);
|
|
50
|
+
let f = fract(p);
|
|
51
|
+
let u = f * f * (3.0 - 2.0 * f);
|
|
52
|
+
let a = hash1(dot(i, vec2<f32>(127.1, 311.7)));
|
|
53
|
+
let b = hash1(dot(i + vec2<f32>(1.0, 0.0), vec2<f32>(127.1, 311.7)));
|
|
54
|
+
let c = hash1(dot(i + vec2<f32>(0.0, 1.0), vec2<f32>(127.1, 311.7)));
|
|
55
|
+
let d = hash1(dot(i + vec2<f32>(1.0, 1.0), vec2<f32>(127.1, 311.7)));
|
|
56
|
+
return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
fn fbm(p: vec2<f32>, octaves: i32) -> f32 {
|
|
60
|
+
var value = 0.0;
|
|
61
|
+
var amp = 0.5;
|
|
62
|
+
var freq = 1.0;
|
|
63
|
+
for (var i = 0; i < 8; i++) {
|
|
64
|
+
if (i >= octaves) { break; }
|
|
65
|
+
value += amp * valueNoise(p * freq);
|
|
66
|
+
freq *= 2.0;
|
|
67
|
+
amp *= 0.5;
|
|
68
|
+
}
|
|
69
|
+
return value;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
fn get_field(val: f32, hasSig: f32, tex: texture_2d<f32>, samp: sampler) -> f32 {
|
|
73
|
+
if (hasSig > 0.5) {
|
|
74
|
+
return textureSampleLevel(tex, samp, vec2<f32>(0.5, 0.5), 0.0).r;
|
|
75
|
+
}
|
|
76
|
+
return val;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// ---- effect synthesizers (return straight-alpha RGBA) ----------------------
|
|
80
|
+
fn fxSmoke(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
|
|
81
|
+
let sp = p * scl;
|
|
82
|
+
// Domain-warped FBM gives structured puffs instead of a solid fill.
|
|
83
|
+
let q = vec2<f32>(fbm(sp + time * 0.10, 4), fbm(sp + vec2<f32>(5.2, 1.3) + time * 0.08, 4));
|
|
84
|
+
let f = fbm(sp + 4.0 * q + vec2<f32>(1.7, 9.2) + time * 0.05, 4); // ~[0, 0.94]
|
|
85
|
+
// Billowing plume: denser at the base (bottom, p.y=0), dissipating toward the top.
|
|
86
|
+
let vgrad = 1.0 - smoothstep(0.45, 0.9, p.y);
|
|
87
|
+
let n = f * 2.0 - 1.0; // remap to [-1, 1]
|
|
88
|
+
// Thresholded so only bright fbm patches are opaque -> reads as puffs, not solid.
|
|
89
|
+
let cov = smoothstep(0.28, 0.6, n) * dens * (0.25 + 0.75 * vgrad);
|
|
90
|
+
let alpha = cov * inten;
|
|
91
|
+
let col = mix(cB * 0.35, cA, clamp(f + vgrad * 0.5, 0.0, 1.0));
|
|
92
|
+
return vec4<f32>(col, clamp(alpha, 0.0, 1.0));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
fn fxFire(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
|
|
96
|
+
let pn = vec2<f32>(p.x * 1.5, p.y) * scl;
|
|
97
|
+
let n = fbm(pn * 6.0 + vec2<f32>(time * 2.0, time * 3.0), 4);
|
|
98
|
+
// Heat concentrated near base, flickering upward
|
|
99
|
+
let heat = n * smoothstep(1.0, 0.0 + (1.0 - dens) * 0.3, p.y);
|
|
100
|
+
// Channeled vertical columns
|
|
101
|
+
let columns = smoothstep(0.45, 0.9, n + 0.4 * sin(p.x * (20.0 + 40.0 * dens) * scl + time * 8.0));
|
|
102
|
+
let d = clamp(heat * inten + columns * 0.3 * inten, 0.0, 1.0);
|
|
103
|
+
// Fire color ramp mapped dynamically to cA and cB
|
|
104
|
+
let dark = cB * 0.15;
|
|
105
|
+
let orange = cB;
|
|
106
|
+
let yellow = mix(cB, cA, 0.5);
|
|
107
|
+
let white = cA;
|
|
108
|
+
var col = mix(dark, orange, smoothstep(0.0, 0.4, d));
|
|
109
|
+
col = mix(col, yellow, smoothstep(0.4, 0.75, d));
|
|
110
|
+
col = mix(col, white, smoothstep(0.75, 1.0, d));
|
|
111
|
+
let alpha = smoothstep(0.0, 0.3, d) * inten;
|
|
112
|
+
return vec4<f32>(col, clamp(alpha, 0.0, 1.0));
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
fn fxRain(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
|
|
116
|
+
let n = (60.0 * dens + 4.0) * scl;
|
|
117
|
+
let gx = floor(p.x * n);
|
|
118
|
+
let h = hash1(gx);
|
|
119
|
+
let speed = 0.8 + h;
|
|
120
|
+
let yFrac = fract(p.y * 8.0 - time * speed);
|
|
121
|
+
let dropY = abs(yFrac - 0.5);
|
|
122
|
+
let reveal = step(0.35, yFrac);
|
|
123
|
+
let st = smoothstep(0.18, 0.02, dropY);
|
|
124
|
+
let d = st * reveal;
|
|
125
|
+
let g = smoothstep(0.18, 0.02, abs(fract(p.x * n) + h * 0.2 - 0.5));
|
|
126
|
+
let a = d * g * inten;
|
|
127
|
+
let col = mix(cA, cB, h);
|
|
128
|
+
return vec4<f32>(col, clamp(a, 0.0, 1.0));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
fn fxSnow(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
|
|
132
|
+
let n = (50.0 * dens + 6.0) * scl;
|
|
133
|
+
let cell = floor(p * n);
|
|
134
|
+
let f = fract(p * n);
|
|
135
|
+
let h = hash21(cell);
|
|
136
|
+
let center = vec2<f32>(0.5, 0.5) + 0.3 * hash21(cell + 7.0);
|
|
137
|
+
let sway = 0.1 * sin(time * 1.2 + cell.y * 3.0);
|
|
138
|
+
// Fall downward (toward p.y=0, the bottom): subtract an advancing phase.
|
|
139
|
+
let fall = fract(time * (0.25 + 0.45 * h.y) + h.x);
|
|
140
|
+
let pos = vec2<f32>(f.x - center.x - sway, f.y - center.y) - vec2<f32>(0.0, fall);
|
|
141
|
+
let d = length(pos);
|
|
142
|
+
let size = 0.05 + 0.07 * h.x;
|
|
143
|
+
let a = smoothstep(size, size * 0.4, d) * inten;
|
|
144
|
+
let col = mix(cA, cB, h.x);
|
|
145
|
+
return vec4<f32>(col, clamp(a, 0.0, 1.0));
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
fn fxDust(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
|
|
149
|
+
let n = (90.0 * dens + 6.0) * scl;
|
|
150
|
+
let cell = floor(p * n);
|
|
151
|
+
let f = fract(p * n);
|
|
152
|
+
let h = hash21(cell);
|
|
153
|
+
let center = h;
|
|
154
|
+
let drift = fract(time * 0.05 * (0.5 + h.y) + cell.x * 0.01);
|
|
155
|
+
let pos = vec2<f32>(f.x - center.x, f.y - center.y) + vec2<f32>((drift - 0.5) * 0.03, 0.0);
|
|
156
|
+
let d = length(pos);
|
|
157
|
+
let a = smoothstep(0.12, 0.0, d) * smoothstep(0.0, 0.3, dens) * inten * 0.6;
|
|
158
|
+
let col = mix(cA, cB, h.y);
|
|
159
|
+
return vec4<f32>(col, clamp(a, 0.0, 1.0));
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
fn fxEmbers(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
|
|
163
|
+
let n = (50.0 * dens + 4.0) * scl;
|
|
164
|
+
let cell = floor(p * n);
|
|
165
|
+
let f = fract(p * n);
|
|
166
|
+
let h = hash21(cell);
|
|
167
|
+
let sway = 0.12 * sin(time * 2.0 + cell.y * 2.0);
|
|
168
|
+
let rise = fract(time * 0.18 * (0.7 + h.y) + cell.y * 0.12);
|
|
169
|
+
// Rising: as rise grows, move toward p.y=1 (top).
|
|
170
|
+
let pos = vec2<f32>(f.x - 0.5 - sway, f.y + rise * 1.2);
|
|
171
|
+
let d = length(pos);
|
|
172
|
+
let a = smoothstep(0.12, 0.0, d) * (1.0 - rise) * inten;
|
|
173
|
+
let col = mix(cA, cB, clamp(rise, 0.0, 1.0));
|
|
174
|
+
return vec4<f32>(col, clamp(a, 0.0, 1.0));
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
fn fxSparks(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
|
|
178
|
+
// Burst radiating from a low-center source; travel grows over time so it expands outward.
|
|
179
|
+
let src = vec2<f32>(0.5, 0.15);
|
|
180
|
+
let dir = p - src;
|
|
181
|
+
let dist = length(dir);
|
|
182
|
+
let ang = atan2(dir.y, dir.x);
|
|
183
|
+
let n = (20.0 * dens + 5.0) * scl;
|
|
184
|
+
let seg = floor(ang * n);
|
|
185
|
+
let tFrame = floor(time * 3.0);
|
|
186
|
+
let timeVal = tFrame - 10000.0 * floor(tFrame / 10000.0);
|
|
187
|
+
let h = hash1(seg + timeVal * 97.0);
|
|
188
|
+
let launch = fract(0.5 + h + time * 0.5);
|
|
189
|
+
let travel = launch * 0.8;
|
|
190
|
+
let trail = smoothstep(0.9, 0.4, dist - travel);
|
|
191
|
+
let w = 0.02 + 0.02 * h;
|
|
192
|
+
let blast = smoothstep(0.0, w * 2.0, dist - travel) * trail;
|
|
193
|
+
let streak = smoothstep(w, 0.0, abs(dist - travel)) * trail;
|
|
194
|
+
let a = clamp(max(streak, blast * 0.4), 0.0, 1.0) * inten;
|
|
195
|
+
let col = mix(cA, cB, clamp(h, 0.0, 1.0));
|
|
196
|
+
return vec4<f32>(col, clamp(a, 0.0, 1.0));
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
fn fxMagic(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
|
|
200
|
+
let center = vec2<f32>(0.5, 0.5);
|
|
201
|
+
let dv = p - center;
|
|
202
|
+
let r = length(dv);
|
|
203
|
+
let ang = atan2(dv.y, dv.x);
|
|
204
|
+
let swirl = fbm(vec2<f32>(r * 8.0 * scl + time * 0.5, ang * 3.0 + time * 0.8), 4);
|
|
205
|
+
let halo = smoothstep(0.5, 0.1, r) * 0.4 * dens;
|
|
206
|
+
let wisp = smoothstep(1.0 - dens * 0.8, 1.5 - dens * 0.8, swirl) * (0.5 + 0.5 * sin(r * 20.0 * scl - time * 3.0));
|
|
207
|
+
let a = clamp((halo + wisp * 0.8) * inten, 0.0, 1.0);
|
|
208
|
+
let col = mix(cA, cB, clamp(swirl, 0.0, 1.0));
|
|
209
|
+
return vec4<f32>(col * 0.8 + vec3<f32>(1.0) * halo * 0.4, a);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
fn fxLensFlare(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
|
|
213
|
+
let center = vec2<f32>(0.5, 0.5);
|
|
214
|
+
let dv = p - center;
|
|
215
|
+
let r = length(dv) * scl;
|
|
216
|
+
let ang = atan2(dv.y, dv.x);
|
|
217
|
+
// Radial streak
|
|
218
|
+
let streakCount = 2.0 * floor(1.0 + dens * 3.0);
|
|
219
|
+
let streak = smoothstep(0.35, 0.6, fract(ang / 3.14159 * streakCount + 0.5)) * pow(1.0 - r, 3.0);
|
|
220
|
+
// Concentric halos / chromatic rings
|
|
221
|
+
let rings = (0.5 + 0.5 * sin(r * 40.0 - time * 2.0)) * dens;
|
|
222
|
+
let core = smoothstep(0.25, 0.0, r);
|
|
223
|
+
let chroma = mix(cA, cB, 0.5 + 0.5 * cos(ang * 3.0 + r * 30.0));
|
|
224
|
+
let a = clamp((core * 0.9 + streak * 0.5 * dens + rings * 0.15 * (1.0 - r)) * inten, 0.0, 1.0);
|
|
225
|
+
return vec4<f32>(chroma, a);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
fn fxLightning(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
|
|
229
|
+
// Periodic bolt striking vertically, flickering briefly
|
|
230
|
+
let period = mix(4.0, 0.6, clamp(dens, 0.0, 1.0));
|
|
231
|
+
let cycle = fract(time / period);
|
|
232
|
+
let flashWindow = mix(0.05, 0.35, clamp(dens, 0.0, 1.0));
|
|
233
|
+
let flash = smoothstep(flashWindow, 0.0, cycle);
|
|
234
|
+
|
|
235
|
+
let tFlicker = floor(time * 60.0);
|
|
236
|
+
let flickerVal = tFlicker - 10000.0 * floor(tFlicker / 10000.0);
|
|
237
|
+
let flicker = step(hash1(flickerVal * 1.7), 0.8); // rapid on/off shimmer
|
|
238
|
+
|
|
239
|
+
// Jitter a vertical bolt with per-row hashes and interpolate between rows
|
|
240
|
+
let rows = 18.0 * scl;
|
|
241
|
+
let rg = p.y * rows;
|
|
242
|
+
let row = floor(rg);
|
|
243
|
+
let fr = fract(rg);
|
|
244
|
+
|
|
245
|
+
let tLightning = floor(time * 24.0);
|
|
246
|
+
let lightningVal = tLightning - 10000.0 * floor(tLightning / 10000.0);
|
|
247
|
+
let x0 = 0.3 + 0.4 * hash1(row * 13.7 + lightningVal * 3.1);
|
|
248
|
+
let x1 = 0.3 + 0.4 * hash1((row + 1.0) * 13.7 + lightningVal * 3.1);
|
|
249
|
+
let boltX = mix(x0, x1, fr);
|
|
250
|
+
|
|
251
|
+
// Secondary tiny forks
|
|
252
|
+
let forkDrift = (hash1(row * 7.3) - 0.5) * 0.12 * smoothstep(0.0, 0.6, 1.0 - p.y);
|
|
253
|
+
let boltDist = abs(p.x - (boltX + forkDrift)) * scl;
|
|
254
|
+
let core = smoothstep(0.012, 0.0, boltDist);
|
|
255
|
+
let glow = smoothstep(0.07, 0.0, boltDist) * 0.5;
|
|
256
|
+
let a = clamp((core + glow) * flash * flicker * inten, 0.0, 1.0);
|
|
257
|
+
let col = mix(cA, cB, clamp(boltDist * 8.0, 0.0, 1.0) + 0.3 * flash);
|
|
258
|
+
// Soft ambient flash behind the bolt
|
|
259
|
+
let amb = smoothstep(0.35, 0.0, length(p - vec2<f32>(boltX, p.y)) * scl) * flash * 0.15;
|
|
260
|
+
return vec4<f32>(col * (1.0 + amb), clamp(a + amb, 0.0, 1.0));
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
fn fxEnergyBeam(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
|
|
264
|
+
let src = vec2<f32>(0.15, 0.5);
|
|
265
|
+
let dirv = vec2<f32>(1.0, 0.0);
|
|
266
|
+
let w = p - src;
|
|
267
|
+
let along = dot(w, dirv) * scl;
|
|
268
|
+
let perp = dot(w, vec2<f32>(-dirv.y, dirv.x)) * scl;
|
|
269
|
+
let beamWidth = 0.01 + 0.03 * dens;
|
|
270
|
+
let glowWidth = 0.05 + 0.1 * dens;
|
|
271
|
+
let core = smoothstep(beamWidth, 0.0, abs(perp));
|
|
272
|
+
let glow = smoothstep(glowWidth, 0.0, abs(perp)) * 0.4 * dens;
|
|
273
|
+
let falloff = smoothstep(0.0, 1.0, along);
|
|
274
|
+
let pulse = 0.7 + 0.3 * sin(along * 30.0 - time * 10.0);
|
|
275
|
+
let a = clamp((core + glow) * falloff * pulse * inten, 0.0, 1.0);
|
|
276
|
+
let col = mix(cA, cB, clamp(along, 0.0, 1.0));
|
|
277
|
+
return vec4<f32>(col * (1.0 + glow * 2.0), a);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
fn fxAurora(p: vec2<f32>, seedOff: f32, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
|
|
281
|
+
// Northern lights: curtains hanging from a wavy band across the upper sky,
|
|
282
|
+
// rippling sideways, with fine vertical rays. cA at the base, cB at the top.
|
|
283
|
+
var acc = vec3<f32>(0.0);
|
|
284
|
+
var keep = 1.0;
|
|
285
|
+
for (var k = 0; k < 3; k++) {
|
|
286
|
+
let fk = f32(k);
|
|
287
|
+
let x = p.x * (1.0 + fk * 0.35) * scl * 1.5 + seedOff * 13.0 + fk * 3.1;
|
|
288
|
+
// Curtain base line, a slow wave across the frame.
|
|
289
|
+
let base = 0.42 + fk * 0.06 + 0.12 * (fbm(vec2<f32>(x * 1.3, time * 0.05 + fk), 3) - 0.5)
|
|
290
|
+
+ 0.05 * sin(x * 4.0 + time * 0.3 + fk);
|
|
291
|
+
let h = 0.38 + 0.2 * fbm(vec2<f32>(x * 2.0 + 7.0, time * 0.04), 3);
|
|
292
|
+
let d = base - p.y; // 0 at the base, rising upward
|
|
293
|
+
let body = smoothstep(-0.06, 0.035, d) * pow(1.0 - smoothstep(0.0, h, d), 1.5);
|
|
294
|
+
// Vertical rays drifting sideways.
|
|
295
|
+
let rn = fbm(vec2<f32>(x * 40.0 + time * 0.3, d * 2.0 - time * 0.1), 3);
|
|
296
|
+
let rays = 0.25 + 1.2 * rn * rn;
|
|
297
|
+
let fold = 0.6 + 0.4 * sin(x * 9.0 + time * 0.5 + fbm(vec2<f32>(x * 3.0, time * 0.1), 2) * 6.0);
|
|
298
|
+
let a = body * rays * fold * (1.0 - fk * 0.25);
|
|
299
|
+
let col = mix(cA, cB, clamp(d / max(h, 1e-3), 0.0, 1.0));
|
|
300
|
+
acc += col * a;
|
|
301
|
+
keep *= 1.0 - clamp(a, 0.0, 1.0);
|
|
302
|
+
}
|
|
303
|
+
let alpha = 1.0 - keep;
|
|
304
|
+
let a = clamp(alpha * (0.35 + 0.65 * dens) * inten * 1.4, 0.0, 1.0);
|
|
305
|
+
return vec4<f32>(acc / max(alpha, 1e-3) * min(alpha * 2.0, 1.0), a);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// ---- main dispatch ---------------------------------------------------------
|
|
309
|
+
@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
|
|
310
|
+
let density = get_field(u.density, u.hasSigDensity, densityTex, signalSamp);
|
|
311
|
+
let scale = get_field(u.scale, u.hasSigScale, scaleTex, signalSamp);
|
|
312
|
+
let speed = get_field(u.speed, u.hasSigSpeed, speedTex, signalSamp);
|
|
313
|
+
let intensity = get_field(u.intensity, u.hasSigIntensity, intensityTex, signalSamp);
|
|
314
|
+
let seed = get_field(u.seed, u.hasSigSeed, seedTex, signalSamp);
|
|
315
|
+
|
|
316
|
+
let isVideo = u.outputType > 0.5;
|
|
317
|
+
let time = select(0.0, u.time * max(speed, 1e-4), isVideo);
|
|
318
|
+
let seedOff = fract(seed * 1.618033);
|
|
319
|
+
|
|
320
|
+
// Aspect correction
|
|
321
|
+
let uv = in.uv;
|
|
322
|
+
let p = vec2<f32>(uv.x, uv.y);
|
|
323
|
+
|
|
324
|
+
// Move to a seed-scrambled space so different seeds look different
|
|
325
|
+
let sp = p + vec2<f32>(seedOff * 17.0, seedOff * 31.0);
|
|
326
|
+
|
|
327
|
+
var eff = vec4<f32>(0.0, 0.0, 0.0, 0.0);
|
|
328
|
+
let cA = u.colorStart.rgb;
|
|
329
|
+
let cB = u.colorEnd.rgb;
|
|
330
|
+
let scl = max(scale, 1e-4);
|
|
331
|
+
let factor = scl * 100.0;
|
|
332
|
+
|
|
333
|
+
if (u.effectType < 0.5) {
|
|
334
|
+
eff = fxSmoke(sp, time, factor, density, intensity, cA, cB);
|
|
335
|
+
} else if (u.effectType < 1.5) {
|
|
336
|
+
eff = fxFire(sp, time, factor, density, intensity, cA, cB);
|
|
337
|
+
} else if (u.effectType < 2.5) {
|
|
338
|
+
eff = fxRain(sp, time, factor, density, intensity, cA, cB);
|
|
339
|
+
} else if (u.effectType < 3.5) {
|
|
340
|
+
eff = fxSparks(sp, time, factor, density, intensity, cA, cB);
|
|
341
|
+
} else if (u.effectType < 4.5) {
|
|
342
|
+
eff = fxSnow(sp, time, factor, density, intensity, cA, cB);
|
|
343
|
+
} else if (u.effectType < 5.5) {
|
|
344
|
+
eff = fxDust(sp, time, factor, density, intensity, cA, cB);
|
|
345
|
+
} else if (u.effectType < 6.5) {
|
|
346
|
+
eff = fxLightning(sp, time, factor, density, intensity, cA, cB);
|
|
347
|
+
} else if (u.effectType < 7.5) {
|
|
348
|
+
eff = fxMagic(sp, time, factor, density, intensity, cA, cB);
|
|
349
|
+
} else if (u.effectType < 8.5) {
|
|
350
|
+
eff = fxLensFlare(sp, time, factor, density, intensity, cA, cB);
|
|
351
|
+
} else if (u.effectType < 9.5) {
|
|
352
|
+
eff = fxEmbers(sp, time, factor, density, intensity, cA, cB);
|
|
353
|
+
} else if (u.effectType < 10.5) {
|
|
354
|
+
eff = fxEnergyBeam(sp, time, factor, density, intensity, cA, cB);
|
|
355
|
+
} else {
|
|
356
|
+
eff = fxAurora(p, seedOff, time, factor, density, intensity, cA, cB);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// Straight alpha is fine for compositing onto a transparent canvas.
|
|
360
|
+
let a = clamp(eff.a, 0.0, 1.0);
|
|
361
|
+
return vec4<f32>(clamp(eff.rgb, vec3<f32>(0.0), vec3<f32>(1.0)) * a, a);
|
|
362
|
+
}
|
|
363
|
+
`,e=new Float32Array(24),N=T(l=>({uniformLayout:F(l,["uniform"]),signalsLayout:V(l,5),pipelineCache:new Map}));function q(l,t){let s=N(l),i=`procedural_vfx_${t}`,a=s.pipelineCache.get(i);if(!a){let c=l.createShaderModule({label:`procedural_vfx_${t}.wgsl`,code:z});a=D(l,{label:`ProceduralVFXPipeline_${t}`,module:c,layouts:[s.uniformLayout,s.signalsLayout],format:t}),s.pipelineCache.set(i,a)}return{vfxPipeline:a,uniformLayout:s.uniformLayout,signalsLayout:s.signalsLayout}}function _(l){let t=l.replace("#","");(t.length===3||t.length===4)&&(t=t.split("").map(r=>r+r).join(""));let s=parseInt(t.substring(0,2),16)/255,i=parseInt(t.substring(2,4),16)/255,a=parseInt(t.substring(4,6),16)/255,c=1;return t.length===8&&(c=parseInt(t.substring(6,8),16)/255),[s,i,a,c]}var $={Smoke:0,Fire:1,Rain:2,Sparks:3,Snow:4,Dust:5,Lightning:6,Magic:7,LensFlare:8,Embers:9,EnergyBeam:10,Aurora:11},I=async l=>{let{ctx:t,encoder:s,pass:i,targetWidth:a,targetHeight:c,props:r}=l,n=r.virtualMedia?.operation;if(n?.op!=="ProceduralVFX"||!n)return;let{vfxPipeline:P,uniformLayout:X,signalsLayout:R}=q(t.device,t.renderer.format),w=r.frame??0,S=r.fps||30,g=o(n,"density",.6),h=o(n,"scale",.01),v=o(n,"speed",1),y=o(n,"intensity",.8),x=o(n,"seed",1234),G=$[n.effectType??"Smoke"]??0,E=n.outputType==="Video"?1:0,{elapsedSeconds:B,durationSeconds:U}=L(r,w,S),d=_(n.colorStart??"#ffffff"),m=_(n.colorEnd??"#ff5500");e[0]=G,e[1]=E,e[2]=B,e[3]=0,e[4]=g.value,e[5]=h.value,e[6]=v.value,e[7]=y.value,e[8]=x.value,e[9]=g.hasSignal?1:0,e[10]=h.hasSignal?1:0,e[11]=v.hasSignal?1:0,e[12]=y.hasSignal?1:0,e[13]=x.hasSignal?1:0,e[14]=0,e[15]=0,e[16]=d[0],e[17]=d[1],e[18]=d[2],e[19]=d[3],e[20]=m[0],e[21]=m[1],e[22]=m[2],e[23]=m[3];let W=t.renderer.getTemporaryBuffer(e),C=[{name:"density",info:g},{name:"scale",info:h},{name:"speed",info:v},{name:"intensity",info:y},{name:"seed",info:x}],f=[],M=t.renderer.samplerCache.getSampler(t.device);for(let p of C)if(!!(p.info.hasSignal&&p.info.sd)){let O=b.getOrCreate2DTextureView(t.device,s,p.info.sd?.nodeId??`procedural_vfx_${p.name}_sig`,B,U,p.info.sd,a,c,r.renderId,w,S);f.push(O)}else f.push(b.getDummy1x1TextureView(t.device));i.setPipeline(P),i.setBindGroup(0,t.device.createBindGroup({layout:X,entries:[{binding:0,resource:{buffer:W}}]})),i.setBindGroup(1,t.device.createBindGroup({layout:R,entries:[{binding:0,resource:f[0]},{binding:1,resource:f[1]},{binding:2,resource:f[2]},{binding:3,resource:f[3]},{binding:4,resource:f[4]},{binding:5,resource:M}]})),i.draw(4)};var ne=A({WebGPURenderer:I});export{I as ProceduralVFXWebGPURenderer,ne as default};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import{a as P,d as T,f as U,h as R,j as k,m as G}from"./chunk-ENKKLU7B.mjs";import"./chunk-6YJP57MZ.mjs";import{z as S}from"./chunk-63SFBHEH.mjs";import{e as s}from"./chunk-BVF64D6H.mjs";s();s();var p="Toon",D=12,$=[`struct U { v : array<vec4<f32>, 3> };
|
|
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
|
+
@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 levels = u.v[1].x;
|
|
55
|
+
let edgeThreshold = u.v[1].y;
|
|
56
|
+
let edgeWidth = u.v[1].z;
|
|
57
|
+
let edgeColor = u.v[2];
|
|
58
|
+
let saturation = u.v[1].w;
|
|
59
|
+
|
|
60
|
+
let R = res();
|
|
61
|
+
let o = edgeWidth / R;
|
|
62
|
+
let c = sampleS(in.uv);
|
|
63
|
+
let tl = luma(sampleS(in.uv + vec2<f32>(-o.x, -o.y)).rgb);
|
|
64
|
+
let t = luma(sampleS(in.uv + vec2<f32>(0.0, -o.y)).rgb);
|
|
65
|
+
let tr = luma(sampleS(in.uv + vec2<f32>(o.x, -o.y)).rgb);
|
|
66
|
+
let l = luma(sampleS(in.uv + vec2<f32>(-o.x, 0.0)).rgb);
|
|
67
|
+
let r = luma(sampleS(in.uv + vec2<f32>(o.x, 0.0)).rgb);
|
|
68
|
+
let bl = luma(sampleS(in.uv + vec2<f32>(-o.x, o.y)).rgb);
|
|
69
|
+
let b = luma(sampleS(in.uv + vec2<f32>(0.0, o.y)).rgb);
|
|
70
|
+
let br = luma(sampleS(in.uv + vec2<f32>(o.x, o.y)).rgb);
|
|
71
|
+
let gx = (tr + 2.0 * r + br) - (tl + 2.0 * l + bl);
|
|
72
|
+
let gy = (bl + 2.0 * b + br) - (tl + 2.0 * t + tr);
|
|
73
|
+
let edge = length(vec2<f32>(gx, gy));
|
|
74
|
+
let ink = smoothstep(edgeThreshold, edgeThreshold * 1.5 + 0.03, edge);
|
|
75
|
+
let lum = luma(c.rgb);
|
|
76
|
+
let band = (floor(lum * levels) + 0.5) / levels;
|
|
77
|
+
var rgb = c.rgb * (band / max(lum, 0.001));
|
|
78
|
+
rgb = clamp(mix(vec3<f32>(luma(rgb)), rgb, saturation), vec3<f32>(0.0), vec3<f32>(1.0));
|
|
79
|
+
rgb = mix(rgb, edgeColor.rgb, ink);
|
|
80
|
+
return premul(vec4<f32>(rgb, max(c.a, ink * c.a)));
|
|
81
|
+
}
|
|
82
|
+
`],w=U(r=>({layout:T(r,["uniform","texture","texture","sampler"],`${p}_layout`),pipelines:new Map,sampler:r.createSampler({magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"})}));function A(r,e){let t=w(r),n=t.pipelines.get(e);return n||(n=$.map((m,l)=>{let i=r.createShaderModule({code:m,label:`${p}_${l}.wgsl`});return r.createRenderPipeline({label:`${p}_${l}`,layout:r.createPipelineLayout({bindGroupLayouts:[t.layout]}),vertex:{module:i,entryPoint:"vs"},fragment:{module:i,entryPoint:"fs",targets:[{format:e}]},primitive:{topology:"triangle-strip"}})}),t.pipelines.set(e,n)),n}function f(r,e){let t=typeof r=="number"?r:Number(r);return Number.isFinite(t)?t:e}function C(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 V(r,e,t,n){e.fill(0),e[0]=t,e[1]=n,e[4]=f(r.levels,4),e[5]=f(r.edgeThreshold,.2),e[6]=f(r.edgeWidth,1),e.set(C(String(r.edgeColor??"#111111")),8),e[7]=f(r.saturation,1.15)}var F=async r=>{let{ctx:e,encoder:t,pass:n,targetTexture:m,targetWidth:l,targetHeight:i,props:o}=r,u=o.virtualMedia?.operation;if(u?.op!==p)return;let b=o.virtualMedia?.children?.[0];if(!b)return;n.end();let v=o.fps||30,a=Math.round(o.compositionFrame??o.frame??0),L=u.effect?.resolveUniforms?u.effect.resolveUniforms({frame:a,fps:v,time:a/v}):u,x=new Float32Array(D);V(L,x,a/v,a);let{texture:d}=await R(r,b),g=e.device,h=w(g),W=A(g,e.renderer.format),M=e.renderer.getTemporaryBuffer(x),c=d;for(let _ of W){let y=e.renderer.getTemporaryTexture(l,i,[d,c,m,...o.excludeTextures||[]]);G(t,y.createView(),_,[g.createBindGroup({layout:h.layout,entries:[{binding:0,resource:{buffer:M}},{binding:1,resource:d.createView()},{binding:2,resource:c.createView()},{binding:3,resource:h.sampler}]})]),c=y}k(r,c)};var I=S({WebGPURenderer:F});export{F as ToonWebGPURenderer,I as default};
|