framefields 2.2.0 → 2.3.1
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-CS104aUj.mjs} +3 -3
- package/dist/{audio-DMUr01vS.mjs.map → audio-CS104aUj.mjs.map} +1 -1
- package/dist/{dist-CT___nEU.mjs → dist-BOdxAhOT.mjs} +7 -5
- package/dist/dist-BOdxAhOT.mjs.map +1 -0
- package/dist/{dist-cjxDXQdx.mjs → dist-jU289ehm.mjs} +209 -31
- package/dist/{dist-cjxDXQdx.mjs.map → dist-jU289ehm.mjs.map} +1 -1
- package/dist/effects/index.d.mts +5 -5
- package/dist/effects/index.mjs +36 -36
- package/dist/{effects-C06-AOge.mjs → effects-BzOlVD-w.mjs} +532 -4
- package/dist/effects-BzOlVD-w.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-BhlV_3Qt.mjs} +2 -2
- package/dist/{fonts-C0UuLQvr.mjs.map → fonts-BhlV_3Qt.mjs.map} +1 -1
- package/dist/{gpu-Du7GpVFW.mjs → gpu-BA1Wz_mS.mjs} +2 -2
- package/dist/{gpu-Du7GpVFW.mjs.map → gpu-BA1Wz_mS.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-BVyG76gO.mjs} +2 -2
- package/dist/{preview-M0TsUzC6.mjs.map → preview-BVyG76gO.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-ZTHWCQ2A.mjs → chunk-FNE22WGA.mjs} +1 -1
- package/dist/preview-engine/chunk-GCTVRM7J.mjs +1522 -0
- 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-3F5AIDEL.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-CCSfHMfh.mjs} +346 -13
- package/dist/program-CCSfHMfh.mjs.map +1 -0
- package/dist/renderer/index.d.mts +2 -2
- package/dist/renderer/index.mjs +2 -2
- package/dist/renderer-1Kv7oA86.mjs +5 -0
- package/dist/{renderer-1vhaKMeg.mjs → renderer-1uLtqb74.mjs} +141 -56
- package/dist/renderer-1uLtqb74.mjs.map +1 -0
- package/dist/{renderer-BerD3T-X.mjs → renderer-4VpA7LfU.mjs} +2 -2
- package/dist/{renderer-BerD3T-X.mjs.map → renderer-4VpA7LfU.mjs.map} +1 -1
- package/dist/{renderer-BNqwn0gZ.mjs → renderer-8BM6sJUR.mjs} +2 -2
- package/dist/{renderer-BNqwn0gZ.mjs.map → renderer-8BM6sJUR.mjs.map} +1 -1
- package/dist/renderer-AVHJ33nv.mjs +5 -0
- package/dist/{renderer-0gY4IQhM.mjs → renderer-AtLlZMQ9.mjs} +2 -2
- package/dist/{renderer-0gY4IQhM.mjs.map → renderer-AtLlZMQ9.mjs.map} +1 -1
- package/dist/renderer-B8dJGf8R.mjs +6 -0
- package/dist/{renderer-57ATc_mQ.mjs → renderer-B93zd3sx.mjs} +2 -2
- package/dist/{renderer-57ATc_mQ.mjs.map → renderer-B93zd3sx.mjs.map} +1 -1
- package/dist/renderer-BARst3ZD.mjs +3 -0
- package/dist/{renderer-CJB9nU1x.mjs → renderer-BD7Lmb8h.mjs} +3 -3
- package/dist/{renderer-CJB9nU1x.mjs.map → renderer-BD7Lmb8h.mjs.map} +1 -1
- package/dist/renderer-BEA6nknY.mjs +5 -0
- package/dist/renderer-BFRI5alp.mjs +222 -0
- package/dist/renderer-BFRI5alp.mjs.map +1 -0
- package/dist/{renderer-BiwIh_w4.mjs → renderer-BG5sbTXt.mjs} +3 -3
- package/dist/{renderer-BiwIh_w4.mjs.map → renderer-BG5sbTXt.mjs.map} +1 -1
- package/dist/{renderer-DtgMsjyL.mjs → renderer-BI4OMlEx.mjs} +2 -2
- package/dist/{renderer-DtgMsjyL.mjs.map → renderer-BI4OMlEx.mjs.map} +1 -1
- package/dist/renderer-BOfi06L2.mjs +5 -0
- package/dist/renderer-BOhvtAGL.mjs +5 -0
- package/dist/renderer-BQT3GI9g.mjs +5 -0
- package/dist/{renderer-DJfFc-XW.mjs → renderer-BRwp1kV-.mjs} +3 -3
- package/dist/{renderer-DJfFc-XW.mjs.map → renderer-BRwp1kV-.mjs.map} +1 -1
- package/dist/{renderer-u8ynJtAC.mjs → renderer-BVUTOGHs.mjs} +2 -2
- package/dist/{renderer-u8ynJtAC.mjs.map → renderer-BVUTOGHs.mjs.map} +1 -1
- package/dist/renderer-BXmStgeT.mjs +5 -0
- package/dist/renderer-Bajxo7Nt.mjs +5 -0
- package/dist/{renderer-BHskWZNG.mjs → renderer-Bel1UHA5.mjs} +2 -2
- package/dist/{renderer-AF884a7T.mjs → renderer-BetA_iVd.mjs} +3 -3
- package/dist/{renderer-AF884a7T.mjs.map → renderer-BetA_iVd.mjs.map} +1 -1
- package/dist/{renderer-DpW_LxLO.mjs → renderer-BmDpyiII.mjs} +3 -3
- package/dist/{renderer-DpW_LxLO.mjs.map → renderer-BmDpyiII.mjs.map} +1 -1
- package/dist/{renderer-BteUC_7n.mjs → renderer-BonWt8jF.mjs} +3 -3
- package/dist/{renderer-BteUC_7n.mjs.map → renderer-BonWt8jF.mjs.map} +1 -1
- package/dist/{renderer-BC8XOVl5.mjs → renderer-BpEsZG3t.mjs} +3 -3
- package/dist/{renderer-BC8XOVl5.mjs.map → renderer-BpEsZG3t.mjs.map} +1 -1
- package/dist/{renderer-aArb4RwJ.mjs → renderer-BvBIHi6N.mjs} +2 -2
- package/dist/{renderer-aArb4RwJ.mjs.map → renderer-BvBIHi6N.mjs.map} +1 -1
- package/dist/{renderer-Db3JIF1K.mjs → renderer-BvvuGfZk.mjs} +3 -3
- package/dist/{renderer-Db3JIF1K.mjs.map → renderer-BvvuGfZk.mjs.map} +1 -1
- package/dist/renderer-BzRR0KMm.mjs +5 -0
- package/dist/{renderer-DEuIwr-t.mjs → renderer-Bzl0s07U.mjs} +2 -2
- package/dist/{renderer-DEuIwr-t.mjs.map → renderer-Bzl0s07U.mjs.map} +1 -1
- package/dist/renderer-C39GD6jP.mjs +331 -0
- package/dist/renderer-C39GD6jP.mjs.map +1 -0
- package/dist/renderer-C3Gjy2iE.mjs +5 -0
- package/dist/{renderer-Br6KyRO_.mjs → renderer-C3lPwajT.mjs} +3 -3
- package/dist/{renderer-Br6KyRO_.mjs.map → renderer-C3lPwajT.mjs.map} +1 -1
- package/dist/renderer-C5hQgkz-.mjs +5 -0
- package/dist/{renderer-CebB0v1y.mjs → renderer-C6cF5seJ.mjs} +2 -2
- package/dist/{renderer-CebB0v1y.mjs.map → renderer-C6cF5seJ.mjs.map} +1 -1
- package/dist/renderer-C8GZ0pCV.mjs +191 -0
- package/dist/renderer-C8GZ0pCV.mjs.map +1 -0
- package/dist/{renderer-CuVPo-wP.mjs → renderer-CFe9pZFN.mjs} +2 -2
- package/dist/{renderer-CuVPo-wP.mjs.map → renderer-CFe9pZFN.mjs.map} +1 -1
- package/dist/renderer-CLF-MiOA.mjs +5 -0
- package/dist/renderer-CLa43fCd.mjs +5 -0
- package/dist/{renderer-Bvx56GR6.mjs → renderer-CLdwOhST.mjs} +2 -2
- package/dist/{renderer-Bvx56GR6.mjs.map → renderer-CLdwOhST.mjs.map} +1 -1
- package/dist/renderer-CMK1d6w_.mjs +5 -0
- package/dist/{renderer-CursFKUf.mjs → renderer-CMdtUn5o.mjs} +2 -2
- package/dist/{renderer-CursFKUf.mjs.map → renderer-CMdtUn5o.mjs.map} +1 -1
- package/dist/{renderer-DXqIslFk.mjs → renderer-CNYfB5cC.mjs} +2 -2
- package/dist/{renderer-DXqIslFk.mjs.map → renderer-CNYfB5cC.mjs.map} +1 -1
- package/dist/renderer-CPEQOe3u.mjs +5 -0
- package/dist/{renderer-BbdZ0YHR.mjs → renderer-CWx3Kg79.mjs} +3 -3
- package/dist/{renderer-BbdZ0YHR.mjs.map → renderer-CWx3Kg79.mjs.map} +1 -1
- package/dist/{renderer-CWBHVCvA.mjs → renderer-CdOy3EBJ.mjs} +2 -2
- package/dist/{renderer-CWBHVCvA.mjs.map → renderer-CdOy3EBJ.mjs.map} +1 -1
- package/dist/{renderer-DupsdRIw.mjs → renderer-Celrh689.mjs} +3 -3
- package/dist/{renderer-DupsdRIw.mjs.map → renderer-Celrh689.mjs.map} +1 -1
- package/dist/renderer-CemfjOM9.mjs +5 -0
- package/dist/{renderer-jYxN4mHn.mjs → renderer-ChloaI6P.mjs} +3 -3
- package/dist/{renderer-jYxN4mHn.mjs.map → renderer-ChloaI6P.mjs.map} +1 -1
- package/dist/{renderer-DqdhsSwS.mjs → renderer-CiMpdh0s.mjs} +2 -2
- package/dist/{renderer-DqdhsSwS.mjs.map → renderer-CiMpdh0s.mjs.map} +1 -1
- package/dist/renderer-CkcrScs9.mjs +5 -0
- package/dist/{renderer-CMT4QcpV.mjs → renderer-Cn6VlWHZ.mjs} +3 -3
- package/dist/{renderer-CMT4QcpV.mjs.map → renderer-Cn6VlWHZ.mjs.map} +1 -1
- package/dist/renderer-CqewgazK.mjs +224 -0
- package/dist/renderer-CqewgazK.mjs.map +1 -0
- package/dist/{renderer-C6md3msE.mjs → renderer-Cu5k5D9N.mjs} +2 -2
- package/dist/{renderer-C6md3msE.mjs.map → renderer-Cu5k5D9N.mjs.map} +1 -1
- package/dist/{renderer-id8TbKBY.mjs → renderer-CuphUktB.mjs} +2 -2
- package/dist/{renderer-id8TbKBY.mjs.map → renderer-CuphUktB.mjs.map} +1 -1
- package/dist/renderer-CwrLihY6.mjs +5 -0
- package/dist/{renderer-BzDjy1_x.mjs → renderer-D1Jt-c3F.mjs} +2 -2
- package/dist/{renderer-BzDjy1_x.mjs.map → renderer-D1Jt-c3F.mjs.map} +1 -1
- package/dist/{renderer-Beg7FLt2.mjs → renderer-D1wd0FhZ.mjs} +75 -27
- package/dist/renderer-D1wd0FhZ.mjs.map +1 -0
- package/dist/{renderer-jqByPgkD.mjs → renderer-D26S5hUh.mjs} +2 -2
- package/dist/{renderer-jqByPgkD.mjs.map → renderer-D26S5hUh.mjs.map} +1 -1
- package/dist/renderer-D4S6i2MC.mjs +5 -0
- package/dist/{renderer-BmGPTWwV.mjs → renderer-D7ss6fLB.mjs} +3 -3
- package/dist/{renderer-BmGPTWwV.mjs.map → renderer-D7ss6fLB.mjs.map} +1 -1
- package/dist/renderer-DB8F0XoP.mjs +5 -0
- package/dist/{renderer-PKQNH21k.mjs → renderer-DCGLXnYW.mjs} +2 -2
- package/dist/{renderer-CrABA3lB.mjs → renderer-DCYabwlC.mjs} +2 -2
- package/dist/{renderer-CrABA3lB.mjs.map → renderer-DCYabwlC.mjs.map} +1 -1
- package/dist/renderer-DGpVLJOn.mjs +5 -0
- package/dist/renderer-DGxibeSa.mjs +5 -0
- package/dist/renderer-DJQm3bAW.mjs +5 -0
- package/dist/{renderer-DD8napek.mjs → renderer-DMZ5aLU1.mjs} +2 -2
- package/dist/{renderer-DD8napek.mjs.map → renderer-DMZ5aLU1.mjs.map} +1 -1
- package/dist/renderer-DMftVSfX.mjs +5 -0
- package/dist/renderer-DNpovOd8.mjs +5 -0
- package/dist/renderer-DO5r7ZV-.mjs +658 -0
- package/dist/renderer-DO5r7ZV-.mjs.map +1 -0
- package/dist/{renderer-DZXbgVMK.mjs → renderer-DOWekunR.mjs} +3 -3
- package/dist/{renderer-DZXbgVMK.mjs.map → renderer-DOWekunR.mjs.map} +1 -1
- package/dist/{renderer-Cce2fgpX.mjs → renderer-DPWeKe_x.mjs} +3 -3
- package/dist/{renderer-Cce2fgpX.mjs.map → renderer-DPWeKe_x.mjs.map} +1 -1
- package/dist/{renderer-CE7fwGgw.mjs → renderer-DQtk282o.mjs} +29 -8
- package/dist/renderer-DQtk282o.mjs.map +1 -0
- package/dist/renderer-DSHlvKQk.mjs +5 -0
- package/dist/renderer-DUBb7D17.mjs +219 -0
- package/dist/renderer-DUBb7D17.mjs.map +1 -0
- package/dist/renderer-DYtrdR2p.mjs +5 -0
- package/dist/{renderer-Bn2eQE-t.mjs → renderer-DaCsT-XU.mjs} +3 -3
- package/dist/{renderer-Bn2eQE-t.mjs.map → renderer-DaCsT-XU.mjs.map} +1 -1
- package/dist/{renderer-D1Cm21eq.mjs → renderer-DcAfp1Er.mjs} +2 -2
- package/dist/{renderer-D1Cm21eq.mjs.map → renderer-DcAfp1Er.mjs.map} +1 -1
- package/dist/{renderer-C8uKdelk.mjs → renderer-DdlaBsk_.mjs} +2 -2
- package/dist/{renderer-C8uKdelk.mjs.map → renderer-DdlaBsk_.mjs.map} +1 -1
- package/dist/renderer-DerDxKK3.mjs +220 -0
- package/dist/renderer-DerDxKK3.mjs.map +1 -0
- package/dist/{renderer-CeyAgJnw.mjs → renderer-DfkWYUTX.mjs} +2 -2
- package/dist/{renderer-DHGTzype.mjs → renderer-Dh-OF6aH.mjs} +2 -2
- package/dist/{renderer-DHGTzype.mjs.map → renderer-Dh-OF6aH.mjs.map} +1 -1
- package/dist/renderer-Dk-THZHp.mjs +222 -0
- package/dist/renderer-Dk-THZHp.mjs.map +1 -0
- 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-DpWRj6zF.mjs +203 -0
- package/dist/renderer-DpWRj6zF.mjs.map +1 -0
- package/dist/renderer-DpwlN4LH.mjs +233 -0
- package/dist/renderer-DpwlN4LH.mjs.map +1 -0
- package/dist/{renderer-DvFaC_-7.mjs → renderer-Dq4aO7az.mjs} +2 -2
- package/dist/{renderer-DvFaC_-7.mjs.map → renderer-Dq4aO7az.mjs.map} +1 -1
- package/dist/renderer-DuSImLUz.mjs +5 -0
- package/dist/{renderer-BeIUgp1r.mjs → renderer-DukD7S3w.mjs} +2 -2
- package/dist/{renderer-BeIUgp1r.mjs.map → renderer-DukD7S3w.mjs.map} +1 -1
- package/dist/{renderer-EemDpvv3.mjs → renderer-FXUCKps6.mjs} +3 -3
- package/dist/{renderer-EemDpvv3.mjs.map → renderer-FXUCKps6.mjs.map} +1 -1
- package/dist/renderer-FbyMYKXe.mjs +5 -0
- package/dist/renderer-HMl2V4iM.mjs +541 -0
- package/dist/renderer-HMl2V4iM.mjs.map +1 -0
- package/dist/renderer-LM_XIKl1.mjs +203 -0
- package/dist/renderer-LM_XIKl1.mjs.map +1 -0
- package/dist/renderer-NMFv7Auz.mjs +5 -0
- package/dist/{renderer-YbaCzPcG.mjs → renderer-O1b-oYJE.mjs} +2 -2
- package/dist/renderer-P3vpdUnb.mjs +5 -0
- package/dist/renderer-PknbdJyL.mjs +208 -0
- package/dist/renderer-PknbdJyL.mjs.map +1 -0
- package/dist/renderer-QTOm26Lg.mjs +5 -0
- package/dist/renderer-YJ3Yukou.mjs +215 -0
- package/dist/renderer-YJ3Yukou.mjs.map +1 -0
- package/dist/{renderer-p_C_T9Kn.mjs → renderer-YdLL2o6d.mjs} +2 -2
- package/dist/{renderer-p_C_T9Kn.mjs.map → renderer-YdLL2o6d.mjs.map} +1 -1
- package/dist/renderer-ahzhMa5q.mjs +5 -0
- package/dist/{renderer-D-vRKssW.mjs → renderer-c-bwxMde.mjs} +2 -2
- package/dist/{renderer-D-vRKssW.mjs.map → renderer-c-bwxMde.mjs.map} +1 -1
- package/dist/renderer-dThfTNge.mjs +5 -0
- package/dist/renderer-dUkOBfGB.mjs +308 -0
- package/dist/renderer-dUkOBfGB.mjs.map +1 -0
- package/dist/renderer-dgAS_k7B.mjs +5 -0
- package/dist/renderer-g-ui08Lh.mjs +204 -0
- package/dist/renderer-g-ui08Lh.mjs.map +1 -0
- package/dist/renderer-kSs8VtY7.mjs +223 -0
- package/dist/renderer-kSs8VtY7.mjs.map +1 -0
- package/dist/{renderer-KnCcN_Nz.mjs → renderer-pPiQwFYh.mjs} +2 -2
- package/dist/{renderer-KnCcN_Nz.mjs.map → renderer-pPiQwFYh.mjs.map} +1 -1
- package/dist/{renderer-D8thCpS7.mjs → renderer-wL-ly4fT.mjs} +3 -3
- package/dist/{renderer-D8thCpS7.mjs.map → renderer-wL-ly4fT.mjs.map} +1 -1
- package/dist/{renderers-CP8CFWDs-BA-4l6By.mjs → renderers-CP8CFWDs-CVHwMTiz.mjs} +2 -2
- package/dist/{renderers-CP8CFWDs-BA-4l6By.mjs.map → renderers-CP8CFWDs-CVHwMTiz.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,658 @@
|
|
|
1
|
+
import { n as defineRenderer } from "./renderer-BSitV56h.mjs";
|
|
2
|
+
|
|
3
|
+
//#region ../../nodes/node-particles/dist/renderers-C4F7TVQQ.mjs
|
|
4
|
+
function isParticleProgram(value) {
|
|
5
|
+
return typeof value === "object" && value !== null && "particleStatic" in value && typeof value.particleFrame === "function";
|
|
6
|
+
}
|
|
7
|
+
const PARTICLE_BYTES = 32;
|
|
8
|
+
const PARAM_VEC4S = 32;
|
|
9
|
+
const MAX_ATTRACTORS = 8;
|
|
10
|
+
const MAX_COLORS = 8;
|
|
11
|
+
const SNAPSHOT_EVERY = 24;
|
|
12
|
+
const MAX_SNAPSHOTS = 64;
|
|
13
|
+
const WORKGROUP = 64;
|
|
14
|
+
const COMMON_WGSL = `
|
|
15
|
+
struct Particle {
|
|
16
|
+
pos : vec2<f32>,
|
|
17
|
+
vel : vec2<f32>,
|
|
18
|
+
age : f32,
|
|
19
|
+
life : f32,
|
|
20
|
+
jitter : f32,
|
|
21
|
+
_pad : f32,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
struct Params { v : array<vec4<f32>, ${PARAM_VEC4S}> };
|
|
25
|
+
`;
|
|
26
|
+
const SIM_WGSL = `
|
|
27
|
+
${COMMON_WGSL}
|
|
28
|
+
@group(0) @binding(0) var<uniform> P : Params;
|
|
29
|
+
@group(0) @binding(1) var<storage, read_write> particles : array<Particle>;
|
|
30
|
+
@group(0) @binding(2) var<storage, read> mask : array<f32>;
|
|
31
|
+
|
|
32
|
+
fn pcg(v : u32) -> u32 {
|
|
33
|
+
let state = v * 747796405u + 2891336453u;
|
|
34
|
+
let word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;
|
|
35
|
+
return (word >> 22u) ^ word;
|
|
36
|
+
}
|
|
37
|
+
fn rnd(idx : u32, channel : u32, seed : u32) -> f32 {
|
|
38
|
+
return f32(pcg(idx * 16u + channel + pcg(seed))) / 4294967295.0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
fn hash2(p : vec2<f32>) -> f32 {
|
|
42
|
+
let q = fract(p * vec2<f32>(0.1031, 0.1030));
|
|
43
|
+
let r = q + dot(q, q.yx + 33.33);
|
|
44
|
+
return fract((r.x + r.y) * r.x);
|
|
45
|
+
}
|
|
46
|
+
fn vnoise(p : vec2<f32>) -> f32 {
|
|
47
|
+
let i = floor(p);
|
|
48
|
+
let f = fract(p);
|
|
49
|
+
let u = f * f * (3.0 - 2.0 * f);
|
|
50
|
+
let a = hash2(i);
|
|
51
|
+
let b = hash2(i + vec2<f32>(1.0, 0.0));
|
|
52
|
+
let c = hash2(i + vec2<f32>(0.0, 1.0));
|
|
53
|
+
let d = hash2(i + vec2<f32>(1.0, 1.0));
|
|
54
|
+
return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
|
|
55
|
+
}
|
|
56
|
+
fn fbm(p : vec2<f32>) -> f32 {
|
|
57
|
+
return vnoise(p) * 0.6 + vnoise(p * 2.03 + 17.0) * 0.3 + vnoise(p * 4.01 + 41.0) * 0.1;
|
|
58
|
+
}
|
|
59
|
+
// Divergence-free flow: the curl of a scalar noise field.
|
|
60
|
+
fn curl(p : vec2<f32>) -> vec2<f32> {
|
|
61
|
+
let e = 0.02;
|
|
62
|
+
let dx = fbm(p + vec2<f32>(e, 0.0)) - fbm(p - vec2<f32>(e, 0.0));
|
|
63
|
+
let dy = fbm(p + vec2<f32>(0.0, e)) - fbm(p - vec2<f32>(0.0, e));
|
|
64
|
+
return vec2<f32>(dy, -dx) / (2.0 * e);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
fn maskAt(cell : vec2<f32>, offset : u32) -> f32 {
|
|
68
|
+
let w = i32(P.v[18].x);
|
|
69
|
+
let h = i32(P.v[18].y);
|
|
70
|
+
let c0 = vec2<i32>(floor(cell));
|
|
71
|
+
let t = cell - floor(cell);
|
|
72
|
+
var s = 0.0;
|
|
73
|
+
for (var k = 0; k < 4; k++) {
|
|
74
|
+
let o = vec2<i32>(k & 1, k >> 1);
|
|
75
|
+
let c = c0 + o;
|
|
76
|
+
var v = 0.0;
|
|
77
|
+
if (c.x >= 0 && c.y >= 0 && c.x < w && c.y < h) {
|
|
78
|
+
v = mask[offset + u32(c.y * w + c.x)];
|
|
79
|
+
}
|
|
80
|
+
let wx = select(1.0 - t.x, t.x, o.x == 1);
|
|
81
|
+
let wy = select(1.0 - t.y, t.y, o.y == 1);
|
|
82
|
+
s += v * wx * wy;
|
|
83
|
+
}
|
|
84
|
+
return s;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
fn spawn(i : u32, idx : u32, birthFrac : f32) {
|
|
88
|
+
let birthAge = birthFrac * P.v[1].z;
|
|
89
|
+
let seed = u32(P.v[1].y);
|
|
90
|
+
let shape = u32(P.v[4].x);
|
|
91
|
+
let ex = P.v[4].y; let ey = P.v[4].z; let ew = P.v[4].w;
|
|
92
|
+
let eh = P.v[5].x; let er = P.v[5].y;
|
|
93
|
+
let r0 = rnd(idx, 0u, seed); let r1 = rnd(idx, 1u, seed);
|
|
94
|
+
var pos = vec2<f32>(ex, ey);
|
|
95
|
+
var center = vec2<f32>(ex, ey);
|
|
96
|
+
if (shape == 1u) { pos = vec2<f32>(ex + ew * r0, ey + eh * r0); center = vec2<f32>(ex + ew * 0.5, ey + eh * 0.5); }
|
|
97
|
+
else if (shape == 2u) { pos = vec2<f32>(ex + ew * r0, ey + eh * r1); center = vec2<f32>(ex + ew * 0.5, ey + eh * 0.5); }
|
|
98
|
+
else if (shape == 3u) {
|
|
99
|
+
let a = r0 * 6.2831853; let rr = er * sqrt(r1);
|
|
100
|
+
pos = vec2<f32>(ex + cos(a) * rr, ey + sin(a) * rr);
|
|
101
|
+
} else if (shape == 4u) {
|
|
102
|
+
let a = r0 * 6.2831853;
|
|
103
|
+
pos = vec2<f32>(ex + cos(a) * er, ey + sin(a) * er);
|
|
104
|
+
}
|
|
105
|
+
let radial = P.v[1].w > 0.5;
|
|
106
|
+
var dir = P.v[6].x + (rnd(idx, 2u, seed) - 0.5) * P.v[6].y;
|
|
107
|
+
if (radial) {
|
|
108
|
+
let d = pos - center;
|
|
109
|
+
if (dot(d, d) > 1e-6) { dir = atan2(d.y, d.x) + (rnd(idx, 2u, seed) - 0.5) * P.v[6].y; }
|
|
110
|
+
}
|
|
111
|
+
// A moving emitter: older births of the frame start nearer last frame's spot.
|
|
112
|
+
if (P.v[30].z > 0.5) { pos += (P.v[30].xy - vec2<f32>(ex, ey)) * birthFrac; }
|
|
113
|
+
let speed = mix(P.v[5].z, P.v[5].w, rnd(idx, 3u, seed));
|
|
114
|
+
let vel = vec2<f32>(cos(dir), sin(dir)) * speed;
|
|
115
|
+
var p : Particle;
|
|
116
|
+
p.vel = vel;
|
|
117
|
+
p.pos = pos + vel * birthAge;
|
|
118
|
+
p.age = birthAge;
|
|
119
|
+
p.life = mix(P.v[6].z, P.v[6].w, rnd(idx, 4u, seed));
|
|
120
|
+
p.jitter = 1.0 - P.v[16].w * rnd(idx, 5u, seed);
|
|
121
|
+
p._pad = 0.0;
|
|
122
|
+
particles[i] = p;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
@compute @workgroup_size(${WORKGROUP})
|
|
126
|
+
fn simulate(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
127
|
+
let i = gid.x;
|
|
128
|
+
let maxN = u32(P.v[1].x);
|
|
129
|
+
if (i >= maxN) { return; }
|
|
130
|
+
let dt = P.v[0].x;
|
|
131
|
+
let time = P.v[0].y;
|
|
132
|
+
let emitStart = u32(P.v[0].z);
|
|
133
|
+
let emitCount = u32(P.v[0].w);
|
|
134
|
+
let frameDt = P.v[1].z;
|
|
135
|
+
|
|
136
|
+
if (emitCount > 0u) {
|
|
137
|
+
let k = (i + maxN - (emitStart % maxN)) % maxN;
|
|
138
|
+
if (k < emitCount) {
|
|
139
|
+
// Births spread over the frame, oldest first.
|
|
140
|
+
spawn(i, emitStart + k, 1.0 - (f32(k) + 0.5) / f32(emitCount));
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
var p = particles[i];
|
|
146
|
+
if (p.life <= 0.0) { return; }
|
|
147
|
+
p.age += dt;
|
|
148
|
+
if (p.age >= p.life) { p.life = 0.0; particles[i] = p; return; }
|
|
149
|
+
|
|
150
|
+
var acc = vec2<f32>(P.v[2].z, P.v[2].w);
|
|
151
|
+
let ns = P.v[3].y;
|
|
152
|
+
if (ns != 0.0) {
|
|
153
|
+
let sc = max(P.v[3].z, 1.0);
|
|
154
|
+
acc += curl(p.pos / sc + vec2<f32>(time * P.v[3].w, time * P.v[3].w * 0.7)) * ns;
|
|
155
|
+
}
|
|
156
|
+
let nAttr = u32(P.v[7].w);
|
|
157
|
+
for (var a = 0u; a < nAttr; a++) {
|
|
158
|
+
let at = P.v[8u + a];
|
|
159
|
+
let d = at.xy - p.pos;
|
|
160
|
+
let dist = length(d) + 1e-3;
|
|
161
|
+
let fall = exp(-(dist * dist) / max(at.w * at.w, 1.0));
|
|
162
|
+
acc += d / dist * at.z * fall;
|
|
163
|
+
}
|
|
164
|
+
if (P.v[16].x > 0.5) {
|
|
165
|
+
// Silhouette push: out along the gradient, harder where it just arrived.
|
|
166
|
+
let comp = p.pos + P.v[18].zw;
|
|
167
|
+
let cell = (comp - P.v[17].xy) / P.v[17].zw - 0.5;
|
|
168
|
+
let cellCount = u32(P.v[18].x * P.v[18].y);
|
|
169
|
+
let a0 = maskAt(cell, 0u);
|
|
170
|
+
if (a0 > 0.02) {
|
|
171
|
+
let gx = maskAt(cell + vec2<f32>(1.0, 0.0), 0u) - maskAt(cell - vec2<f32>(1.0, 0.0), 0u);
|
|
172
|
+
let gy = maskAt(cell + vec2<f32>(0.0, 1.0), 0u) - maskAt(cell - vec2<f32>(0.0, 1.0), 0u);
|
|
173
|
+
let g = vec2<f32>(gx, gy);
|
|
174
|
+
let gl = length(g);
|
|
175
|
+
if (gl > 1e-5) {
|
|
176
|
+
let before = maskAt(cell, cellCount);
|
|
177
|
+
let k = a0 * P.v[16].y + max(0.0, a0 - before) * P.v[16].z;
|
|
178
|
+
acc -= g / gl * k;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
p.vel += acc * dt;
|
|
184
|
+
p.vel *= exp(-P.v[3].x * dt);
|
|
185
|
+
p.pos += p.vel * dt;
|
|
186
|
+
|
|
187
|
+
let w = P.v[2].x; let h = P.v[2].y;
|
|
188
|
+
let floorY = P.v[7].y;
|
|
189
|
+
let bounce = P.v[7].z;
|
|
190
|
+
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; }
|
|
191
|
+
let mode = u32(P.v[7].x);
|
|
192
|
+
if (mode == 1u) {
|
|
193
|
+
if (p.pos.x < 0.0 || p.pos.y < 0.0 || p.pos.x > w || p.pos.y > h) { p.life = 0.0; }
|
|
194
|
+
} else if (mode == 2u) {
|
|
195
|
+
if (p.pos.x < 0.0) { p.pos.x = 0.0; p.vel.x = abs(p.vel.x) * bounce; }
|
|
196
|
+
if (p.pos.x > w) { p.pos.x = w; p.vel.x = -abs(p.vel.x) * bounce; }
|
|
197
|
+
if (p.pos.y < 0.0) { p.pos.y = 0.0; p.vel.y = abs(p.vel.y) * bounce; }
|
|
198
|
+
if (p.pos.y > h) { p.pos.y = h; p.vel.y = -abs(p.vel.y) * bounce; }
|
|
199
|
+
} else if (mode == 3u) {
|
|
200
|
+
p.pos = vec2<f32>(p.pos.x - floor(p.pos.x / w) * w, p.pos.y - floor(p.pos.y / h) * h);
|
|
201
|
+
}
|
|
202
|
+
particles[i] = p;
|
|
203
|
+
}
|
|
204
|
+
`;
|
|
205
|
+
const DRAW_WGSL = `
|
|
206
|
+
${COMMON_WGSL}
|
|
207
|
+
@group(0) @binding(0) var<uniform> P : Params;
|
|
208
|
+
@group(0) @binding(1) var<storage, read> particles : array<Particle>;
|
|
209
|
+
|
|
210
|
+
struct VOut {
|
|
211
|
+
@builtin(position) pos : vec4<f32>,
|
|
212
|
+
@location(0) uv : vec2<f32>,
|
|
213
|
+
@location(1) color : vec4<f32>,
|
|
214
|
+
@location(2) aspect : f32,
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
fn gradient(t : f32) -> vec4<f32> {
|
|
218
|
+
let n = i32(P.v[21].x);
|
|
219
|
+
if (n <= 1) { return P.v[22]; }
|
|
220
|
+
let x = clamp(t, 0.0, 1.0) * f32(n - 1);
|
|
221
|
+
let i = min(i32(floor(x)), n - 2);
|
|
222
|
+
return mix(P.v[22 + i], P.v[23 + i], x - f32(i));
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
@vertex
|
|
226
|
+
fn vs(@builtin(vertex_index) vi : u32, @builtin(instance_index) ii : u32) -> VOut {
|
|
227
|
+
var out : VOut;
|
|
228
|
+
let p = particles[ii];
|
|
229
|
+
if (p.life <= 0.0) {
|
|
230
|
+
out.pos = vec4<f32>(2.0, 2.0, 0.0, 1.0);
|
|
231
|
+
out.color = vec4<f32>(0.0);
|
|
232
|
+
return out;
|
|
233
|
+
}
|
|
234
|
+
let t = p.age / p.life;
|
|
235
|
+
let size = mix(P.v[19].x, P.v[19].y, t) * p.jitter;
|
|
236
|
+
var corner = vec2<f32>(0.0);
|
|
237
|
+
switch (vi) {
|
|
238
|
+
case 0u: { corner = vec2<f32>(-1.0, -1.0); }
|
|
239
|
+
case 1u: { corner = vec2<f32>(1.0, -1.0); }
|
|
240
|
+
case 2u: { corner = vec2<f32>(-1.0, 1.0); }
|
|
241
|
+
case 3u: { corner = vec2<f32>(-1.0, 1.0); }
|
|
242
|
+
case 4u: { corner = vec2<f32>(1.0, -1.0); }
|
|
243
|
+
default: { corner = vec2<f32>(1.0, 1.0); }
|
|
244
|
+
}
|
|
245
|
+
let speed = length(p.vel);
|
|
246
|
+
var axisX = vec2<f32>(1.0, 0.0);
|
|
247
|
+
var halfLen = size * 0.5;
|
|
248
|
+
let shape = u32(P.v[20].x);
|
|
249
|
+
if (shape == 3u && speed > 1e-3) {
|
|
250
|
+
axisX = p.vel / speed;
|
|
251
|
+
halfLen = size * 0.5 + speed * P.v[20].y * 0.5;
|
|
252
|
+
}
|
|
253
|
+
let axisY = vec2<f32>(-axisX.y, axisX.x);
|
|
254
|
+
let local = axisX * corner.x * halfLen + axisY * corner.y * size * 0.5;
|
|
255
|
+
let px = (p.pos + local) * P.v[21].yz;
|
|
256
|
+
let tsize = P.v[2].xy * P.v[21].yz;
|
|
257
|
+
out.pos = vec4<f32>(px.x / tsize.x * 2.0 - 1.0, 1.0 - px.y / tsize.y * 2.0, 0.0, 1.0);
|
|
258
|
+
out.uv = corner;
|
|
259
|
+
out.aspect = halfLen / max(size * 0.5, 1e-3);
|
|
260
|
+
|
|
261
|
+
var c = gradient(t);
|
|
262
|
+
if (P.v[20].z > 0.5) { c = gradient(speed / max(P.v[20].w, 1e-3)); }
|
|
263
|
+
let fadeIn = max(P.v[19].z, 1e-4);
|
|
264
|
+
let fadeOut = max(P.v[19].w, 1e-4);
|
|
265
|
+
let a = c.a * smoothstep(0.0, fadeIn, t) * (1.0 - smoothstep(1.0 - fadeOut, 1.0, t)) * P.v[21].w;
|
|
266
|
+
out.color = vec4<f32>(c.rgb * a, a);
|
|
267
|
+
return out;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
@fragment
|
|
271
|
+
fn fs(in : VOut) -> @location(0) vec4<f32> {
|
|
272
|
+
let shape = u32(P.v[20].x);
|
|
273
|
+
var m = 1.0;
|
|
274
|
+
if (shape == 0u) {
|
|
275
|
+
let d = length(in.uv);
|
|
276
|
+
let e = max(fwidth(d), 1e-3);
|
|
277
|
+
m = 1.0 - smoothstep(1.0 - e, 1.0, d);
|
|
278
|
+
} else if (shape == 1u) {
|
|
279
|
+
let d = length(in.uv);
|
|
280
|
+
m = exp(-3.5 * d * d) * (1.0 - smoothstep(0.9, 1.0, d));
|
|
281
|
+
} else if (shape == 3u) {
|
|
282
|
+
// A capsule along the motion, soft at the sides.
|
|
283
|
+
let ax = abs(in.uv.x) * in.aspect;
|
|
284
|
+
let ex = max(ax - (in.aspect - 1.0), 0.0);
|
|
285
|
+
let d = length(vec2<f32>(ex, in.uv.y));
|
|
286
|
+
m = 1.0 - smoothstep(0.5, 1.0, d);
|
|
287
|
+
}
|
|
288
|
+
return in.color * m;
|
|
289
|
+
}
|
|
290
|
+
`;
|
|
291
|
+
const pipelines = /* @__PURE__ */ new WeakMap();
|
|
292
|
+
function getPipelines(device) {
|
|
293
|
+
let p = pipelines.get(device);
|
|
294
|
+
if (p) return p;
|
|
295
|
+
const simLayout = device.createBindGroupLayout({
|
|
296
|
+
label: "particles_sim_layout",
|
|
297
|
+
entries: [
|
|
298
|
+
{
|
|
299
|
+
binding: 0,
|
|
300
|
+
visibility: GPUShaderStage.COMPUTE,
|
|
301
|
+
buffer: { type: "uniform" }
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
binding: 1,
|
|
305
|
+
visibility: GPUShaderStage.COMPUTE,
|
|
306
|
+
buffer: { type: "storage" }
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
binding: 2,
|
|
310
|
+
visibility: GPUShaderStage.COMPUTE,
|
|
311
|
+
buffer: { type: "read-only-storage" }
|
|
312
|
+
}
|
|
313
|
+
]
|
|
314
|
+
});
|
|
315
|
+
p = {
|
|
316
|
+
simLayout,
|
|
317
|
+
sim: device.createComputePipeline({
|
|
318
|
+
label: "particles_sim",
|
|
319
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [simLayout] }),
|
|
320
|
+
compute: {
|
|
321
|
+
module: device.createShaderModule({
|
|
322
|
+
label: "particles_sim.wgsl",
|
|
323
|
+
code: SIM_WGSL
|
|
324
|
+
}),
|
|
325
|
+
entryPoint: "simulate"
|
|
326
|
+
}
|
|
327
|
+
}),
|
|
328
|
+
drawLayout: device.createBindGroupLayout({
|
|
329
|
+
label: "particles_draw_layout",
|
|
330
|
+
entries: [{
|
|
331
|
+
binding: 0,
|
|
332
|
+
visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,
|
|
333
|
+
buffer: { type: "uniform" }
|
|
334
|
+
}, {
|
|
335
|
+
binding: 1,
|
|
336
|
+
visibility: GPUShaderStage.VERTEX,
|
|
337
|
+
buffer: { type: "read-only-storage" }
|
|
338
|
+
}]
|
|
339
|
+
}),
|
|
340
|
+
draw: /* @__PURE__ */ new Map(),
|
|
341
|
+
drawModule: device.createShaderModule({
|
|
342
|
+
label: "particles_draw.wgsl",
|
|
343
|
+
code: DRAW_WGSL
|
|
344
|
+
})
|
|
345
|
+
};
|
|
346
|
+
pipelines.set(device, p);
|
|
347
|
+
return p;
|
|
348
|
+
}
|
|
349
|
+
const BLENDS = {
|
|
350
|
+
normal: {
|
|
351
|
+
color: {
|
|
352
|
+
srcFactor: "one",
|
|
353
|
+
dstFactor: "one-minus-src-alpha",
|
|
354
|
+
operation: "add"
|
|
355
|
+
},
|
|
356
|
+
alpha: {
|
|
357
|
+
srcFactor: "one",
|
|
358
|
+
dstFactor: "one-minus-src-alpha",
|
|
359
|
+
operation: "add"
|
|
360
|
+
}
|
|
361
|
+
},
|
|
362
|
+
add: {
|
|
363
|
+
color: {
|
|
364
|
+
srcFactor: "one",
|
|
365
|
+
dstFactor: "one",
|
|
366
|
+
operation: "add"
|
|
367
|
+
},
|
|
368
|
+
alpha: {
|
|
369
|
+
srcFactor: "one",
|
|
370
|
+
dstFactor: "one",
|
|
371
|
+
operation: "add"
|
|
372
|
+
}
|
|
373
|
+
},
|
|
374
|
+
screen: {
|
|
375
|
+
color: {
|
|
376
|
+
srcFactor: "one",
|
|
377
|
+
dstFactor: "one-minus-src",
|
|
378
|
+
operation: "add"
|
|
379
|
+
},
|
|
380
|
+
alpha: {
|
|
381
|
+
srcFactor: "one",
|
|
382
|
+
dstFactor: "one-minus-src-alpha",
|
|
383
|
+
operation: "add"
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
};
|
|
387
|
+
function drawPipeline(device, format, blend) {
|
|
388
|
+
const p = getPipelines(device);
|
|
389
|
+
const key = `${format}|${blend}`;
|
|
390
|
+
let pipe = p.draw.get(key);
|
|
391
|
+
if (!pipe) {
|
|
392
|
+
pipe = device.createRenderPipeline({
|
|
393
|
+
label: `particles_draw_${blend}`,
|
|
394
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [p.drawLayout] }),
|
|
395
|
+
vertex: {
|
|
396
|
+
module: p.drawModule,
|
|
397
|
+
entryPoint: "vs"
|
|
398
|
+
},
|
|
399
|
+
fragment: {
|
|
400
|
+
module: p.drawModule,
|
|
401
|
+
entryPoint: "fs",
|
|
402
|
+
targets: [{
|
|
403
|
+
format,
|
|
404
|
+
blend: BLENDS[blend]
|
|
405
|
+
}]
|
|
406
|
+
},
|
|
407
|
+
primitive: { topology: "triangle-list" }
|
|
408
|
+
});
|
|
409
|
+
p.draw.set(key, pipe);
|
|
410
|
+
}
|
|
411
|
+
return pipe;
|
|
412
|
+
}
|
|
413
|
+
const SHAPES = {
|
|
414
|
+
circle: 0,
|
|
415
|
+
soft: 1,
|
|
416
|
+
square: 2,
|
|
417
|
+
spark: 3
|
|
418
|
+
};
|
|
419
|
+
const EMITTERS = {
|
|
420
|
+
point: 0,
|
|
421
|
+
line: 1,
|
|
422
|
+
rect: 2,
|
|
423
|
+
circle: 3,
|
|
424
|
+
ring: 4
|
|
425
|
+
};
|
|
426
|
+
const BOUNDS = {
|
|
427
|
+
none: 0,
|
|
428
|
+
kill: 1,
|
|
429
|
+
bounce: 2,
|
|
430
|
+
wrap: 3
|
|
431
|
+
};
|
|
432
|
+
/** Packs static settings and one frame's inputs into the shared parameter block. */
|
|
433
|
+
function packParams(s, f, out, sim, view) {
|
|
434
|
+
out.fill(0);
|
|
435
|
+
const v = (i, a, b, c, d) => out.set([
|
|
436
|
+
a,
|
|
437
|
+
b,
|
|
438
|
+
c,
|
|
439
|
+
d
|
|
440
|
+
], i * 4);
|
|
441
|
+
const deg = Math.PI / 180;
|
|
442
|
+
v(0, sim.dt, sim.time, sim.emitStart, sim.emitCount);
|
|
443
|
+
v(1, s.max, s.seed, sim.frameDt, s.emitter.radial ? 1 : 0);
|
|
444
|
+
v(2, s.layer.width, s.layer.height, f.gravity[0], f.gravity[1]);
|
|
445
|
+
v(3, f.drag, f.noise.strength, f.noise.scale, f.noise.speed);
|
|
446
|
+
const e = s.emitter;
|
|
447
|
+
const ex = f.emitter?.x ?? e.x;
|
|
448
|
+
const ey = f.emitter?.y ?? e.y;
|
|
449
|
+
v(4, EMITTERS[e.shape], ex, ey, e.width);
|
|
450
|
+
if (f.emitter) v(30, f.emitter.previousX, f.emitter.previousY, 1, 0);
|
|
451
|
+
v(5, e.height, e.radius, s.speed[0], s.speed[1]);
|
|
452
|
+
v(6, s.direction * deg, s.spread * deg, s.lifetime[0], s.lifetime[1]);
|
|
453
|
+
const attractors = f.attractors.slice(0, MAX_ATTRACTORS);
|
|
454
|
+
v(7, BOUNDS[s.bounds], s.floor ?? -1, s.bounce, attractors.length);
|
|
455
|
+
for (const [i, a] of attractors.entries()) v(8 + i, a.x, a.y, a.strength, a.radius);
|
|
456
|
+
const m = f.push?.mask;
|
|
457
|
+
v(16, m ? 1 : 0, f.push?.strength ?? 0, f.push?.sweep ?? 0, s.sizeJitter);
|
|
458
|
+
v(17, m?.originX ?? 0, m?.originY ?? 0, m?.scaleX ?? 1, m?.scaleY ?? 1);
|
|
459
|
+
v(18, m?.width ?? 0, m?.height ?? 0, s.layer.x, s.layer.y);
|
|
460
|
+
v(19, s.size[0], s.size[1], s.fade[0], s.fade[1]);
|
|
461
|
+
v(20, SHAPES[s.shape], s.stretch, s.colorBySpeed !== null ? 1 : 0, s.colorBySpeed ?? 1);
|
|
462
|
+
const colors = s.colors.slice(0, MAX_COLORS);
|
|
463
|
+
v(21, colors.length, view.scaleX, view.scaleY, s.opacity);
|
|
464
|
+
for (const [i, c] of colors.entries()) v(22 + i, c[0], c[1], c[2], c[3]);
|
|
465
|
+
}
|
|
466
|
+
function stateFor(program, device) {
|
|
467
|
+
const existing = program.particleState;
|
|
468
|
+
if (existing && existing.device === device) return existing;
|
|
469
|
+
const s = program.particleStatic;
|
|
470
|
+
const state = {
|
|
471
|
+
device,
|
|
472
|
+
particles: device.createBuffer({
|
|
473
|
+
label: "particles",
|
|
474
|
+
size: s.max * PARTICLE_BYTES,
|
|
475
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST
|
|
476
|
+
}),
|
|
477
|
+
frame: -1,
|
|
478
|
+
emitted: 0,
|
|
479
|
+
carry: 0,
|
|
480
|
+
snapshots: /* @__PURE__ */ new Map(),
|
|
481
|
+
maskBuffer: null,
|
|
482
|
+
maskSize: 0,
|
|
483
|
+
ubo: device.createBuffer({
|
|
484
|
+
label: "particles_params",
|
|
485
|
+
size: PARAM_VEC4S * 16,
|
|
486
|
+
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
|
|
487
|
+
})
|
|
488
|
+
};
|
|
489
|
+
program.particleState = state;
|
|
490
|
+
return state;
|
|
491
|
+
}
|
|
492
|
+
/** Uploads this frame's (and the previous frame's) silhouette; a 1-float buffer when there is none. */
|
|
493
|
+
function uploadMask(state, f) {
|
|
494
|
+
const m = f.push?.mask;
|
|
495
|
+
const cells = m ? m.width * m.height : 0;
|
|
496
|
+
const size = Math.max(16, cells * 2 * 4);
|
|
497
|
+
if (!state.maskBuffer || state.maskSize < size) {
|
|
498
|
+
state.maskBuffer?.destroy();
|
|
499
|
+
state.maskBuffer = state.device.createBuffer({
|
|
500
|
+
label: "particles_mask",
|
|
501
|
+
size,
|
|
502
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST
|
|
503
|
+
});
|
|
504
|
+
state.maskSize = size;
|
|
505
|
+
}
|
|
506
|
+
if (m) {
|
|
507
|
+
const both = new Float32Array(cells * 2);
|
|
508
|
+
both.set(m.data.subarray(0, cells));
|
|
509
|
+
both.set((f.push?.previous ?? m).data.subarray(0, cells), cells);
|
|
510
|
+
state.device.queue.writeBuffer(state.maskBuffer, 0, both);
|
|
511
|
+
}
|
|
512
|
+
return state.maskBuffer;
|
|
513
|
+
}
|
|
514
|
+
/** Steps the system from the frame it holds to `frame` (layer-local), restoring a snapshot to go back. */
|
|
515
|
+
function advance(program, state, frame, compositionStart, fps) {
|
|
516
|
+
const { device } = state;
|
|
517
|
+
const s = program.particleStatic;
|
|
518
|
+
if (frame < state.frame || state.frame < 0) {
|
|
519
|
+
let best = -1;
|
|
520
|
+
for (const k of state.snapshots.keys()) if (k <= frame && k > best) best = k;
|
|
521
|
+
const encoder = device.createCommandEncoder({ label: "particles_restore" });
|
|
522
|
+
if (best >= 0) {
|
|
523
|
+
const snap = state.snapshots.get(best);
|
|
524
|
+
encoder.copyBufferToBuffer(snap.buffer, 0, state.particles, 0, s.max * PARTICLE_BYTES);
|
|
525
|
+
state.emitted = snap.emitted;
|
|
526
|
+
state.carry = snap.carry;
|
|
527
|
+
state.frame = best;
|
|
528
|
+
} else {
|
|
529
|
+
encoder.clearBuffer(state.particles);
|
|
530
|
+
state.emitted = 0;
|
|
531
|
+
state.carry = 0;
|
|
532
|
+
state.frame = -1;
|
|
533
|
+
}
|
|
534
|
+
device.queue.submit([encoder.finish()]);
|
|
535
|
+
}
|
|
536
|
+
const p = getPipelines(device);
|
|
537
|
+
const params = new Float32Array(PARAM_VEC4S * 4);
|
|
538
|
+
const substeps = Math.max(1, Math.round(s.substeps));
|
|
539
|
+
const frameDt = 1 / fps;
|
|
540
|
+
const prewarmFrames = Math.round(s.prewarm * fps);
|
|
541
|
+
for (let f = state.frame + 1; f <= frame; f++) {
|
|
542
|
+
const steps = f === 0 ? prewarmFrames + 1 : 1;
|
|
543
|
+
for (let w = 0; w < steps; w++) {
|
|
544
|
+
const simFrame = f === 0 ? w - prewarmFrames : f;
|
|
545
|
+
const inputs = program.particleFrame(compositionStart + Math.max(0, simFrame), fps);
|
|
546
|
+
state.carry += Math.max(0, inputs.rate) * frameDt;
|
|
547
|
+
let born = Math.floor(state.carry);
|
|
548
|
+
state.carry -= born;
|
|
549
|
+
born += Math.max(0, Math.round(inputs.burst));
|
|
550
|
+
born = Math.min(born, s.max);
|
|
551
|
+
const mask = uploadMask(state, inputs);
|
|
552
|
+
const bindGroup = device.createBindGroup({
|
|
553
|
+
layout: p.simLayout,
|
|
554
|
+
entries: [
|
|
555
|
+
{
|
|
556
|
+
binding: 0,
|
|
557
|
+
resource: { buffer: state.ubo }
|
|
558
|
+
},
|
|
559
|
+
{
|
|
560
|
+
binding: 1,
|
|
561
|
+
resource: { buffer: state.particles }
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
binding: 2,
|
|
565
|
+
resource: { buffer: mask }
|
|
566
|
+
}
|
|
567
|
+
]
|
|
568
|
+
});
|
|
569
|
+
for (let k = 0; k < substeps; k++) {
|
|
570
|
+
packParams(s, inputs, params, {
|
|
571
|
+
dt: frameDt / substeps,
|
|
572
|
+
time: (simFrame + k / substeps) * frameDt,
|
|
573
|
+
emitStart: state.emitted,
|
|
574
|
+
emitCount: k === 0 ? born : 0,
|
|
575
|
+
frameDt
|
|
576
|
+
}, {
|
|
577
|
+
scaleX: 1,
|
|
578
|
+
scaleY: 1
|
|
579
|
+
});
|
|
580
|
+
device.queue.writeBuffer(state.ubo, 0, params);
|
|
581
|
+
const encoder = device.createCommandEncoder({ label: "particles_step" });
|
|
582
|
+
const pass = encoder.beginComputePass({ label: "particles_sim" });
|
|
583
|
+
pass.setPipeline(p.sim);
|
|
584
|
+
pass.setBindGroup(0, bindGroup);
|
|
585
|
+
pass.dispatchWorkgroups(Math.ceil(s.max / WORKGROUP));
|
|
586
|
+
pass.end();
|
|
587
|
+
device.queue.submit([encoder.finish()]);
|
|
588
|
+
}
|
|
589
|
+
state.emitted += born;
|
|
590
|
+
}
|
|
591
|
+
state.frame = f;
|
|
592
|
+
if (f % SNAPSHOT_EVERY === 0 && !state.snapshots.has(f) && state.snapshots.size < MAX_SNAPSHOTS) {
|
|
593
|
+
const buffer = device.createBuffer({
|
|
594
|
+
label: `particles_snapshot_${f}`,
|
|
595
|
+
size: s.max * PARTICLE_BYTES,
|
|
596
|
+
usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST
|
|
597
|
+
});
|
|
598
|
+
const encoder = device.createCommandEncoder({ label: "particles_snapshot" });
|
|
599
|
+
encoder.copyBufferToBuffer(state.particles, 0, buffer, 0, s.max * PARTICLE_BYTES);
|
|
600
|
+
device.queue.submit([encoder.finish()]);
|
|
601
|
+
state.snapshots.set(f, {
|
|
602
|
+
buffer,
|
|
603
|
+
emitted: state.emitted,
|
|
604
|
+
carry: state.carry
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
const ParticlesWebGPURenderer = async (args) => {
|
|
610
|
+
const { ctx, encoder, pass, targetView, targetWidth, targetHeight, props } = args;
|
|
611
|
+
const op = props.virtualMedia?.operation;
|
|
612
|
+
if (op?.op !== "Particles" || !isParticleProgram(op.effect)) return;
|
|
613
|
+
const program = op.effect;
|
|
614
|
+
const s = program.particleStatic;
|
|
615
|
+
const fps = props.fps || 30;
|
|
616
|
+
const local = Math.max(0, Math.round(props.frame ?? 0));
|
|
617
|
+
const compositionFrame = Math.round(props.compositionFrame ?? local);
|
|
618
|
+
const compositionStart = compositionFrame - local;
|
|
619
|
+
const state = stateFor(program, ctx.device);
|
|
620
|
+
advance(program, state, local, compositionStart, fps);
|
|
621
|
+
pass.end();
|
|
622
|
+
const params = new Float32Array(PARAM_VEC4S * 4);
|
|
623
|
+
packParams(s, program.particleFrame(compositionFrame, fps), params, {
|
|
624
|
+
dt: 0,
|
|
625
|
+
time: 0,
|
|
626
|
+
emitStart: 0,
|
|
627
|
+
emitCount: 0,
|
|
628
|
+
frameDt: 1 / fps
|
|
629
|
+
}, {
|
|
630
|
+
scaleX: targetWidth / s.layer.width,
|
|
631
|
+
scaleY: targetHeight / s.layer.height
|
|
632
|
+
});
|
|
633
|
+
const ubo = ctx.renderer.getTemporaryBuffer(params);
|
|
634
|
+
const draw = ctx.renderer.beginFrame(encoder, targetView, {
|
|
635
|
+
r: 0,
|
|
636
|
+
g: 0,
|
|
637
|
+
b: 0,
|
|
638
|
+
a: 0
|
|
639
|
+
}, targetWidth, targetHeight, "load");
|
|
640
|
+
draw.setPipeline(drawPipeline(ctx.device, ctx.renderer.format, s.blend));
|
|
641
|
+
draw.setBindGroup(0, ctx.device.createBindGroup({
|
|
642
|
+
layout: getPipelines(ctx.device).drawLayout,
|
|
643
|
+
entries: [{
|
|
644
|
+
binding: 0,
|
|
645
|
+
resource: { buffer: ubo }
|
|
646
|
+
}, {
|
|
647
|
+
binding: 1,
|
|
648
|
+
resource: { buffer: state.particles }
|
|
649
|
+
}]
|
|
650
|
+
}));
|
|
651
|
+
draw.draw(6, s.max);
|
|
652
|
+
draw.end();
|
|
653
|
+
};
|
|
654
|
+
var renderers_default = defineRenderer({ WebGPURenderer: ParticlesWebGPURenderer });
|
|
655
|
+
|
|
656
|
+
//#endregion
|
|
657
|
+
export { ParticlesWebGPURenderer, renderers_default as default };
|
|
658
|
+
//# sourceMappingURL=renderer-DO5r7ZV-.mjs.map
|