framefields 2.13.1 → 2.14.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/dist/audio/index.d.mts +5 -5
- package/dist/audio/index.mjs +10 -10
- package/dist/{audio-C4B9p_yq.d.mts → audio-CdCuGK5d.d.mts} +3 -3
- package/dist/{audio-C4B9p_yq.d.mts.map → audio-CdCuGK5d.d.mts.map} +1 -1
- package/dist/{audio-DIvi6hTD.mjs → audio-DFwRbID_.mjs} +3 -3
- package/dist/{audio-DIvi6hTD.mjs.map → audio-DFwRbID_.mjs.map} +1 -1
- package/dist/cli/check-worker.mjs +43 -43
- package/dist/components/index.d.mts +13 -13
- package/dist/components/index.mjs +42 -42
- package/dist/{dist-DtPPPsZV.mjs → dist--Uu5bQ_6.mjs} +557 -212
- package/dist/dist--Uu5bQ_6.mjs.map +1 -0
- package/dist/{dist-CCrYOkcc.mjs → dist-B8Nby2CU.mjs} +2 -2
- package/dist/{dist-CCrYOkcc.mjs.map → dist-B8Nby2CU.mjs.map} +1 -1
- package/dist/effects/index.d.mts +5 -5
- package/dist/effects/index.mjs +34 -34
- package/dist/{effects-B-L3rLs6.mjs → effects-WMgv8ZaD.mjs} +2 -2
- package/dist/{effects-B-L3rLs6.mjs.map → effects-WMgv8ZaD.mjs.map} +1 -1
- package/dist/fonts/index.mjs +2 -2
- package/dist/{fonts-k5ll8NTE.mjs → fonts-OW3yAfO5.mjs} +2 -2
- package/dist/{fonts-k5ll8NTE.mjs.map → fonts-OW3yAfO5.mjs.map} +1 -1
- package/dist/{gpu-D2HT3KcE.mjs → gpu-R4T2Tndu.mjs} +2 -2
- package/dist/{gpu-D2HT3KcE.mjs.map → gpu-R4T2Tndu.mjs.map} +1 -1
- package/dist/{index-CtKUQ2VG.d.mts → index-9xte4JgL.d.mts} +109 -60
- package/dist/index-9xte4JgL.d.mts.map +1 -0
- package/dist/{index-BGlaws7-.d.mts → index-B0Vq8Bwf.d.mts} +3 -3
- package/dist/{index-BGlaws7-.d.mts.map → index-B0Vq8Bwf.d.mts.map} +1 -1
- package/dist/{index-BFTtXosj.d.mts → index-BVd6nXd5.d.mts} +2 -2
- package/dist/{index-BFTtXosj.d.mts.map → index-BVd6nXd5.d.mts.map} +1 -1
- package/dist/{index-CnZhBlob.d.mts → index-Bv7gxGK1.d.mts} +2 -2
- package/dist/{index-CnZhBlob.d.mts.map → index-Bv7gxGK1.d.mts.map} +1 -1
- package/dist/{index-a6JrbAK0.d.mts → index-C-V6CAhP.d.mts} +32 -2
- package/dist/index-C-V6CAhP.d.mts.map +1 -0
- package/dist/{index-DQ1U3HC3.d.mts → index-C7-p9zwU.d.mts} +3 -3
- package/dist/{index-DQ1U3HC3.d.mts.map → index-C7-p9zwU.d.mts.map} +1 -1
- package/dist/{index-rtCXNxGO.d.mts → index-CEKxvGY-.d.mts} +2 -2
- package/dist/{index-rtCXNxGO.d.mts.map → index-CEKxvGY-.d.mts.map} +1 -1
- package/dist/{index-C2yaponf.d.mts → index-CRaydvLi.d.mts} +28 -9
- package/dist/index-CRaydvLi.d.mts.map +1 -0
- package/dist/{index-DBh3WphX.d.mts → index-D1FqV1eu.d.mts} +2 -2
- package/dist/{index-DBh3WphX.d.mts.map → index-D1FqV1eu.d.mts.map} +1 -1
- package/dist/{index-ByhlTwxh.d.mts → index-DoP6EiHj.d.mts} +5 -5
- package/dist/{index-ByhlTwxh.d.mts.map → index-DoP6EiHj.d.mts.map} +1 -1
- package/dist/{index-B08eSpaI.d.mts → index-GA9_Z8Fn.d.mts} +2 -2
- package/dist/{index-B08eSpaI.d.mts.map → index-GA9_Z8Fn.d.mts.map} +1 -1
- package/dist/index.d.mts +14 -14
- package/dist/index.mjs +50 -50
- package/dist/preview/index.d.mts +5 -5
- package/dist/preview/index.mjs +10 -10
- package/dist/{preview-lHH8Tv4j.mjs → preview-D7BGmE1E.mjs} +3 -3
- package/dist/{preview-lHH8Tv4j.mjs.map → preview-D7BGmE1E.mjs.map} +1 -1
- package/dist/preview-engine/{chunk-XCPRRMMW.mjs → chunk-5DZTPUMH.mjs} +195 -89
- package/dist/preview-engine/chunk-GNDE3OXQ.mjs +5 -0
- package/dist/preview-engine/{chunk-N3XTDAL6.mjs → chunk-UPZURPJY.mjs} +31 -31
- package/dist/preview-engine/components.mjs +1 -1
- package/dist/preview-engine/framefields.mjs +1 -1
- package/dist/preview-engine/player.mjs +1 -1
- package/dist/preview-engine/renderers-DLJOA3BM.mjs +228 -0
- package/dist/{program-BfiB9ttP.mjs → program-tFKCWU2j.mjs} +96 -12
- package/dist/program-tFKCWU2j.mjs.map +1 -0
- package/dist/renderer/index.d.mts +4 -4
- package/dist/renderer/index.mjs +2 -2
- package/dist/{renderer-CU6WT5jW.mjs → renderer-03mYJLgX.mjs} +3 -3
- package/dist/{renderer-CU6WT5jW.mjs.map → renderer-03mYJLgX.mjs.map} +1 -1
- package/dist/{renderer-BmyFfvVA.mjs → renderer-0rveCDm-.mjs} +3 -3
- package/dist/{renderer-BmyFfvVA.mjs.map → renderer-0rveCDm-.mjs.map} +1 -1
- package/dist/{renderer-QbSrnPZU.mjs → renderer-2PjR3w-q.mjs} +3 -3
- package/dist/{renderer-QbSrnPZU.mjs.map → renderer-2PjR3w-q.mjs.map} +1 -1
- package/dist/{renderer-BZMh2io2.mjs → renderer-47y12Z37.mjs} +2 -2
- package/dist/{renderer-BZMh2io2.mjs.map → renderer-47y12Z37.mjs.map} +1 -1
- package/dist/renderer-6_bzbbXt.mjs +5 -0
- package/dist/renderer-8M-9G6F_.mjs +5 -0
- package/dist/{renderer-CHCRcCKw.mjs → renderer-B0yVUOPP.mjs} +2 -2
- package/dist/{renderer-CHCRcCKw.mjs.map → renderer-B0yVUOPP.mjs.map} +1 -1
- package/dist/renderer-B5OzKvF8.mjs +5 -0
- package/dist/{renderer-CldjJmRR.mjs → renderer-B7G1KohJ.mjs} +2 -2
- package/dist/renderer-BBCZ2qbE.mjs +5 -0
- package/dist/{renderer-Y1kjtOto.mjs → renderer-BBMtmxks.mjs} +3 -3
- package/dist/{renderer-Y1kjtOto.mjs.map → renderer-BBMtmxks.mjs.map} +1 -1
- package/dist/renderer-BChbxCux.mjs +5 -0
- package/dist/{renderer-CdXBRdFf.mjs → renderer-BDzn1AKF.mjs} +2 -2
- package/dist/{renderer-CdXBRdFf.mjs.map → renderer-BDzn1AKF.mjs.map} +1 -1
- package/dist/renderer-BGeMPr8C.mjs +5 -0
- package/dist/{renderer-CSu_vYPn.mjs → renderer-BGp0An5A.mjs} +3 -3
- package/dist/{renderer-CSu_vYPn.mjs.map → renderer-BGp0An5A.mjs.map} +1 -1
- package/dist/{renderer-BZX932Lj.mjs → renderer-BH7UCMPQ.mjs} +2 -2
- package/dist/{renderer-BZX932Lj.mjs.map → renderer-BH7UCMPQ.mjs.map} +1 -1
- package/dist/{renderer-fG8Jy8Rx.d.mts → renderer-BHYJlK6H.d.mts} +2 -2
- package/dist/{renderer-fG8Jy8Rx.d.mts.map → renderer-BHYJlK6H.d.mts.map} +1 -1
- package/dist/{renderer-D-mX1EVA.mjs → renderer-BJ8ea92W.mjs} +3 -3
- package/dist/{renderer-D-mX1EVA.mjs.map → renderer-BJ8ea92W.mjs.map} +1 -1
- package/dist/{renderer-B6bK9rXm.mjs → renderer-BOSZAdgF.mjs} +2 -2
- package/dist/{renderer-B6bK9rXm.mjs.map → renderer-BOSZAdgF.mjs.map} +1 -1
- package/dist/renderer-BPQ8Pkjb.mjs +5 -0
- package/dist/renderer-BTRpA3HD.mjs +5 -0
- package/dist/{renderer-Dv_iRIyx.mjs → renderer-BVIXKfbC.mjs} +121 -105
- package/dist/renderer-BVIXKfbC.mjs.map +1 -0
- package/dist/{renderer-D0xM67cK.mjs → renderer-BVU22lBS.mjs} +2 -2
- package/dist/{renderer-D0xM67cK.mjs.map → renderer-BVU22lBS.mjs.map} +1 -1
- package/dist/renderer-BVsECSn-.mjs +5 -0
- package/dist/{renderer-HKv5cBdp.mjs → renderer-BWSRryIA.mjs} +2 -2
- package/dist/{renderer-HKv5cBdp.mjs.map → renderer-BWSRryIA.mjs.map} +1 -1
- package/dist/{renderer-D0h1hTOo.mjs → renderer-BacY4nh8.mjs} +2 -2
- package/dist/{renderer-D0h1hTOo.mjs.map → renderer-BacY4nh8.mjs.map} +1 -1
- package/dist/{renderer-D_m6Qbsi.mjs → renderer-Baw6Utxi.mjs} +2 -2
- package/dist/{renderer-D_m6Qbsi.mjs.map → renderer-Baw6Utxi.mjs.map} +1 -1
- package/dist/{renderer-CQ4h8n7p.mjs → renderer-Bcu3UrI-.mjs} +3 -3
- package/dist/{renderer-CQ4h8n7p.mjs.map → renderer-Bcu3UrI-.mjs.map} +1 -1
- package/dist/{renderer-yNWYqvvq.mjs → renderer-BeNl_6EG.mjs} +2 -2
- package/dist/{renderer-yNWYqvvq.mjs.map → renderer-BeNl_6EG.mjs.map} +1 -1
- package/dist/{renderer-pn52dzZz.mjs → renderer-BfZNIiSv.mjs} +2 -2
- package/dist/{renderer-pn52dzZz.mjs.map → renderer-BfZNIiSv.mjs.map} +1 -1
- package/dist/renderer-Bgos68gc.mjs +6 -0
- package/dist/{renderer-C64_B8It.mjs → renderer-BjDddtw9.mjs} +2 -2
- package/dist/renderer-BjHOvoqO.mjs +5 -0
- package/dist/renderer-BjXMPPlV.mjs +5 -0
- package/dist/{renderer-C98XwEIr.mjs → renderer-BpVOk9ux.mjs} +2 -2
- package/dist/{renderer-C98XwEIr.mjs.map → renderer-BpVOk9ux.mjs.map} +1 -1
- package/dist/{renderer-7xQmXXMH.mjs → renderer-Bpm145BW.mjs} +3 -3
- package/dist/{renderer-7xQmXXMH.mjs.map → renderer-Bpm145BW.mjs.map} +1 -1
- package/dist/{renderer-_J9JcCMR.mjs → renderer-Brmbl12Y.mjs} +3 -3
- package/dist/{renderer-_J9JcCMR.mjs.map → renderer-Brmbl12Y.mjs.map} +1 -1
- package/dist/renderer-Byobxqkv.mjs +5 -0
- package/dist/{renderer-B3un4Pdi.mjs → renderer-C20efMI0.mjs} +3 -3
- package/dist/{renderer-B3un4Pdi.mjs.map → renderer-C20efMI0.mjs.map} +1 -1
- package/dist/{renderer-Cfx_FCSf.mjs → renderer-C5AoaymD.mjs} +3 -3
- package/dist/{renderer-Cfx_FCSf.mjs.map → renderer-C5AoaymD.mjs.map} +1 -1
- package/dist/{renderer-DWYmJSrl.mjs → renderer-CCxk-RJR.mjs} +2 -2
- package/dist/{renderer-DWYmJSrl.mjs.map → renderer-CCxk-RJR.mjs.map} +1 -1
- package/dist/{renderer-DhGZ41hQ.mjs → renderer-CKo7VR8x.mjs} +3 -3
- package/dist/{renderer-DhGZ41hQ.mjs.map → renderer-CKo7VR8x.mjs.map} +1 -1
- package/dist/renderer-CKrsg3EG.mjs +5 -0
- package/dist/{renderer-BIKkxw_Z.mjs → renderer-COgwYqev.mjs} +3 -3
- package/dist/{renderer-BIKkxw_Z.mjs.map → renderer-COgwYqev.mjs.map} +1 -1
- package/dist/{renderer-uzU6dsdR.mjs → renderer-CP108ABB.mjs} +2 -2
- package/dist/{renderer-uzU6dsdR.mjs.map → renderer-CP108ABB.mjs.map} +1 -1
- package/dist/{renderer-Cv9CKKWG.mjs → renderer-CP8wLzTU.mjs} +2 -2
- package/dist/{renderer-Cv9CKKWG.mjs.map → renderer-CP8wLzTU.mjs.map} +1 -1
- package/dist/{renderer-uER8kn7f.mjs → renderer-CT3zkfbf.mjs} +2 -2
- package/dist/{renderer-uER8kn7f.mjs.map → renderer-CT3zkfbf.mjs.map} +1 -1
- package/dist/{renderer-DNynPM6X.mjs → renderer-Ca1KjNCO.mjs} +2 -2
- package/dist/{renderer-DNynPM6X.mjs.map → renderer-Ca1KjNCO.mjs.map} +1 -1
- package/dist/renderer-Cj875NuH.mjs +5 -0
- package/dist/{renderer-BsrKj6Td.mjs → renderer-Cm0tsbQH.mjs} +2 -2
- package/dist/{renderer-BsrKj6Td.mjs.map → renderer-Cm0tsbQH.mjs.map} +1 -1
- package/dist/renderer-CnmzJoMv.mjs +5 -0
- package/dist/{renderer-Dm57W73p.mjs → renderer-Cqb7PGrI.mjs} +2 -2
- package/dist/{renderer-BTwuM9u-.mjs → renderer-CrxwW6VQ.mjs} +3 -3
- package/dist/{renderer-BTwuM9u-.mjs.map → renderer-CrxwW6VQ.mjs.map} +1 -1
- package/dist/renderer-CtklDaMg.mjs +5 -0
- package/dist/{renderer-TfeohPxt.mjs → renderer-Cw6_NL2i.mjs} +3 -3
- package/dist/{renderer-TfeohPxt.mjs.map → renderer-Cw6_NL2i.mjs.map} +1 -1
- package/dist/{renderer-B10HDC13.mjs → renderer-D-KHHWQD.mjs} +3 -3
- package/dist/{renderer-B10HDC13.mjs.map → renderer-D-KHHWQD.mjs.map} +1 -1
- package/dist/{renderer-CO9vE3sd.mjs → renderer-D-RhYvVl.mjs} +2 -2
- package/dist/{renderer-CO9vE3sd.mjs.map → renderer-D-RhYvVl.mjs.map} +1 -1
- package/dist/renderer-D1tK3in_.mjs +5 -0
- package/dist/{renderer-BEhZiOT4.mjs → renderer-D2wNFNRf.mjs} +2 -2
- package/dist/{renderer-BEhZiOT4.mjs.map → renderer-D2wNFNRf.mjs.map} +1 -1
- package/dist/renderer-D2yc9P61.mjs +5 -0
- package/dist/renderer-D4v-JvSr.mjs +5 -0
- package/dist/renderer-D7WRWDwB.mjs +5 -0
- package/dist/{renderer-DzON3wDZ.mjs → renderer-DA8YEo_d.mjs} +3 -3
- package/dist/{renderer-DzON3wDZ.mjs.map → renderer-DA8YEo_d.mjs.map} +1 -1
- package/dist/{renderer-DYlx7VHo.mjs → renderer-DEjo6dw_.mjs} +2 -2
- package/dist/{renderer-DYlx7VHo.mjs.map → renderer-DEjo6dw_.mjs.map} +1 -1
- package/dist/renderer-DGvA0tdB.mjs +5 -0
- package/dist/{renderer-B3_GddgJ.mjs → renderer-DIEeHiQA.mjs} +2 -2
- package/dist/{renderer-B3_GddgJ.mjs.map → renderer-DIEeHiQA.mjs.map} +1 -1
- package/dist/{renderer-C4hd6Cqi.mjs → renderer-DNxWOz8Q.mjs} +2 -2
- package/dist/{renderer-C4hd6Cqi.mjs.map → renderer-DNxWOz8Q.mjs.map} +1 -1
- package/dist/renderer-DO7v5Sdm.mjs +5 -0
- package/dist/renderer-DRVvt7-V.mjs +5 -0
- package/dist/{renderer-CkTehyRX.mjs → renderer-DVPgWHZw.mjs} +3 -3
- package/dist/{renderer-CkTehyRX.mjs.map → renderer-DVPgWHZw.mjs.map} +1 -1
- package/dist/{renderer-4nsuReW2.mjs → renderer-DWq9gYRw.mjs} +3 -3
- package/dist/{renderer-4nsuReW2.mjs.map → renderer-DWq9gYRw.mjs.map} +1 -1
- package/dist/renderer-DYMCd3jL.mjs +5 -0
- package/dist/{renderer-DvHi_wXE.mjs → renderer-D_j1WKMD.mjs} +3 -3
- package/dist/{renderer-DvHi_wXE.mjs.map → renderer-D_j1WKMD.mjs.map} +1 -1
- package/dist/{renderer-CRhEGqW4.mjs → renderer-DcAKDAnS.mjs} +3 -3
- package/dist/{renderer-CRhEGqW4.mjs.map → renderer-DcAKDAnS.mjs.map} +1 -1
- package/dist/{renderer-DtFZbE1j.mjs → renderer-Dgj46uEU.mjs} +2 -2
- package/dist/{renderer-B2IUPjhw.mjs → renderer-DhyMfG1v.mjs} +3 -3
- package/dist/{renderer-B2IUPjhw.mjs.map → renderer-DhyMfG1v.mjs.map} +1 -1
- package/dist/{renderer-BvBqTAtk.mjs → renderer-Dj2H5JPR.mjs} +3 -3
- package/dist/{renderer-BvBqTAtk.mjs.map → renderer-Dj2H5JPR.mjs.map} +1 -1
- package/dist/{renderer-CoC64eam.mjs → renderer-DkOuQi84.mjs} +3 -3
- package/dist/{renderer-CoC64eam.mjs.map → renderer-DkOuQi84.mjs.map} +1 -1
- package/dist/renderer-DmHKw-MM.mjs +5 -0
- package/dist/renderer-DoDsuZ6G.mjs +5 -0
- package/dist/{renderer-BhcTYhaP.mjs → renderer-Dr0tXA4k.mjs} +3 -3
- package/dist/{renderer-BhcTYhaP.mjs.map → renderer-Dr0tXA4k.mjs.map} +1 -1
- package/dist/{renderer-BrEeUw7T.mjs → renderer-DtMVitEF.mjs} +2 -2
- package/dist/{renderer-BrEeUw7T.mjs.map → renderer-DtMVitEF.mjs.map} +1 -1
- package/dist/{renderer-BGchUBW_.mjs → renderer-Dwwnx7Dk.mjs} +2 -2
- package/dist/{renderer-BGchUBW_.mjs.map → renderer-Dwwnx7Dk.mjs.map} +1 -1
- package/dist/{renderer-zLi2qFGT.mjs → renderer-DzLrvCB2.mjs} +2 -2
- package/dist/{renderer-zLi2qFGT.mjs.map → renderer-DzLrvCB2.mjs.map} +1 -1
- package/dist/renderer-EpgclS70.mjs +5 -0
- package/dist/{renderer-DCrKEVjb.mjs → renderer-FYOL5Za6.mjs} +3 -3
- package/dist/{renderer-DCrKEVjb.mjs.map → renderer-FYOL5Za6.mjs.map} +1 -1
- package/dist/renderer-GroKiYyK.mjs +5 -0
- package/dist/{renderer-DYeNNc_G.mjs → renderer-I0Hh9cLK.mjs} +3 -3
- package/dist/{renderer-DYeNNc_G.mjs.map → renderer-I0Hh9cLK.mjs.map} +1 -1
- package/dist/renderer-MQ5K_xIS.mjs +5 -0
- package/dist/{renderer-BEuXJY-C.mjs → renderer-NRMlYkX6.mjs} +3 -3
- package/dist/{renderer-BEuXJY-C.mjs.map → renderer-NRMlYkX6.mjs.map} +1 -1
- package/dist/{renderer-YONlI6W-.mjs → renderer-Nnmi8Gt6.mjs} +3 -3
- package/dist/{renderer-YONlI6W-.mjs.map → renderer-Nnmi8Gt6.mjs.map} +1 -1
- package/dist/renderer-U43SflML.mjs +5 -0
- package/dist/renderer-UqOmBgCv.mjs +5 -0
- package/dist/{renderer-DiZkZ0Pr.mjs → renderer-W1bVNVR6.mjs} +3 -3
- package/dist/{renderer-DiZkZ0Pr.mjs.map → renderer-W1bVNVR6.mjs.map} +1 -1
- package/dist/renderer-XLULgJM0.mjs +5 -0
- package/dist/{renderer-BOlHW3Mi.mjs → renderer-ZnrEfkYh.mjs} +2 -2
- package/dist/{renderer-BOlHW3Mi.mjs.map → renderer-ZnrEfkYh.mjs.map} +1 -1
- package/dist/{renderer-GIlQ9lZq.mjs → renderer-_pC-jB9O.mjs} +2 -2
- package/dist/{renderer-GIlQ9lZq.mjs.map → renderer-_pC-jB9O.mjs.map} +1 -1
- package/dist/{renderer-BM19iK8v.mjs → renderer-iMiYStcW.mjs} +2 -2
- package/dist/{renderer-BM19iK8v.mjs.map → renderer-iMiYStcW.mjs.map} +1 -1
- package/dist/{renderer-CO4NGvAh.mjs → renderer-jUKdkmG5.mjs} +69 -69
- package/dist/{renderer-CO4NGvAh.mjs.map → renderer-jUKdkmG5.mjs.map} +1 -1
- package/dist/{renderer-mDBoz0zT.mjs → renderer-k5d7JSbs.mjs} +3 -3
- package/dist/{renderer-mDBoz0zT.mjs.map → renderer-k5d7JSbs.mjs.map} +1 -1
- package/dist/renderer-lNjxY1GG.mjs +5 -0
- package/dist/{renderer-CC22Djgi.mjs → renderer-nHS3Sius.mjs} +3 -3
- package/dist/{renderer-CC22Djgi.mjs.map → renderer-nHS3Sius.mjs.map} +1 -1
- package/dist/{renderer-CXrnzihz.mjs → renderer-ngmYIIob.mjs} +3 -3
- package/dist/{renderer-CXrnzihz.mjs.map → renderer-ngmYIIob.mjs.map} +1 -1
- package/dist/{renderer-Bw0O--gW.mjs → renderer-raxwsiGI.mjs} +3 -3
- package/dist/{renderer-Bw0O--gW.mjs.map → renderer-raxwsiGI.mjs.map} +1 -1
- package/dist/renderer-ukufL7pl.mjs +5 -0
- package/dist/renderer-wb0NCKdF.mjs +5 -0
- package/dist/{renderer-Bw-_GZVw.mjs → renderer-zRq0j6Xy.mjs} +3 -3
- package/dist/{renderer-Bw-_GZVw.mjs.map → renderer-zRq0j6Xy.mjs.map} +1 -1
- package/dist/{renderers-CP8CFWDs-BufiCyn7.mjs → renderers-CP8CFWDs-CshljORp.mjs} +2 -2
- package/dist/{renderers-CP8CFWDs-BufiCyn7.mjs.map → renderers-CP8CFWDs-CshljORp.mjs.map} +1 -1
- package/dist/sam/index.d.mts +3 -3
- package/dist/signals/index.d.mts +5 -5
- package/dist/signals/index.mjs +4 -4
- package/dist/{src-DrP7fGJX.mjs → src-Dy4gnc6w.mjs} +13 -8
- package/dist/src-Dy4gnc6w.mjs.map +1 -0
- package/package.json +60 -60
- package/dist/dist-DtPPPsZV.mjs.map +0 -1
- package/dist/index-C2yaponf.d.mts.map +0 -1
- package/dist/index-CtKUQ2VG.d.mts.map +0 -1
- package/dist/index-a6JrbAK0.d.mts.map +0 -1
- package/dist/preview-engine/chunk-5ZS46EFB.mjs +0 -5
- package/dist/preview-engine/renderers-ZMMQ7S2A.mjs +0 -228
- package/dist/program-BfiB9ttP.mjs.map +0 -1
- package/dist/renderer-0rLmztAv.mjs +0 -5
- package/dist/renderer-B0pjOXFY.mjs +0 -5
- package/dist/renderer-B7J13reL.mjs +0 -5
- package/dist/renderer-BPGIKGgl.mjs +0 -5
- package/dist/renderer-Bv-Artj1.mjs +0 -5
- package/dist/renderer-BvLjbhcL.mjs +0 -5
- package/dist/renderer-By6awWaf.mjs +0 -5
- package/dist/renderer-C0rvsz7m.mjs +0 -5
- package/dist/renderer-CDgud_HB.mjs +0 -5
- package/dist/renderer-CDiRF3bG.mjs +0 -6
- package/dist/renderer-CIIEQd4B.mjs +0 -5
- package/dist/renderer-CJblwOA9.mjs +0 -5
- package/dist/renderer-CNMOXtXE.mjs +0 -5
- package/dist/renderer-COeSeNGg.mjs +0 -5
- package/dist/renderer-CUfElmtZ.mjs +0 -5
- package/dist/renderer-CYh2lFoJ.mjs +0 -5
- package/dist/renderer-CYtVZYMH.mjs +0 -5
- package/dist/renderer-CjxZlkjb.mjs +0 -5
- package/dist/renderer-Cpd6TvTC.mjs +0 -5
- package/dist/renderer-D3ziOPhX.mjs +0 -5
- package/dist/renderer-DL-phtL5.mjs +0 -5
- package/dist/renderer-DSnmYnHg.mjs +0 -5
- package/dist/renderer-DUGfsT-E.mjs +0 -5
- package/dist/renderer-DW5af9x1.mjs +0 -5
- package/dist/renderer-DYMrol1t.mjs +0 -5
- package/dist/renderer-DekeUHaz.mjs +0 -5
- package/dist/renderer-Dt5uyJdZ.mjs +0 -5
- package/dist/renderer-Dv_iRIyx.mjs.map +0 -1
- package/dist/renderer-DwLQAnaK.mjs +0 -5
- package/dist/renderer-IXQP2CWM.mjs +0 -5
- package/dist/renderer-K-Pkw63O.mjs +0 -5
- package/dist/renderer-MPw2KH9P.mjs +0 -5
- package/dist/renderer-RPu8RMav.mjs +0 -5
- package/dist/renderer-dCqxd5N2.mjs +0 -5
- package/dist/renderer-lhjmE-Fp.mjs +0 -5
- package/dist/renderer-u9cmBuvM.mjs +0 -5
- package/dist/renderer-vH12jcpz.mjs +0 -5
- package/dist/src-DrP7fGJX.mjs.map +0 -1
|
@@ -16151,9 +16151,9 @@ var ShaderStore = class {
|
|
|
16151
16151
|
getCacheKey(nodeId, renderId) {
|
|
16152
16152
|
return `${renderId ?? "global"}:${nodeId}`;
|
|
16153
16153
|
}
|
|
16154
|
-
register(nodeId, shader, renderId) {
|
|
16155
|
-
this.store.set(this.getCacheKey(nodeId, renderId), shader);
|
|
16156
|
-
if (renderId) this.store.set(this.getCacheKey(nodeId, void 0), shader);
|
|
16154
|
+
register(nodeId, shader$1, renderId) {
|
|
16155
|
+
this.store.set(this.getCacheKey(nodeId, renderId), shader$1);
|
|
16156
|
+
if (renderId) this.store.set(this.getCacheKey(nodeId, void 0), shader$1);
|
|
16157
16157
|
}
|
|
16158
16158
|
get(nodeId, renderId) {
|
|
16159
16159
|
const res = this.store.get(this.getCacheKey(nodeId, renderId));
|
|
@@ -24530,9 +24530,11 @@ function drawParagraphNode(ctx, pass, props) {
|
|
|
24530
24530
|
scale = effect.scale;
|
|
24531
24531
|
if (blurOverride === void 0) blurAmount = effect.blurAmount;
|
|
24532
24532
|
}
|
|
24533
|
+
const isHighlighted = props.highlightWordIndex !== void 0 && glyph.wordIndex === props.highlightWordIndex;
|
|
24534
|
+
const spanColor = glyph.fill ? parseColor(glyph.fill) : void 0;
|
|
24535
|
+
let fillColor = isHighlighted ? highlightColor : spanColor ?? baseColor;
|
|
24533
24536
|
let customScaleX = 1;
|
|
24534
24537
|
let customScaleY = 1;
|
|
24535
|
-
let animatorColor;
|
|
24536
24538
|
let transZ = 0;
|
|
24537
24539
|
let chromaticShift = 0;
|
|
24538
24540
|
let dissolveProgress = 0;
|
|
@@ -24551,7 +24553,7 @@ function drawParagraphNode(ctx, pass, props) {
|
|
|
24551
24553
|
scaleY: customScaleY,
|
|
24552
24554
|
opacity,
|
|
24553
24555
|
blurAmount,
|
|
24554
|
-
color:
|
|
24556
|
+
color: fillColor
|
|
24555
24557
|
}, false, props.frame ?? 0, props.fps ?? 24, props.signals);
|
|
24556
24558
|
transX = kResult.transX;
|
|
24557
24559
|
transY = kResult.transY;
|
|
@@ -24561,7 +24563,7 @@ function drawParagraphNode(ctx, pass, props) {
|
|
|
24561
24563
|
customScaleY = kResult.scaleY;
|
|
24562
24564
|
opacity = kResult.opacity;
|
|
24563
24565
|
if (blurOverride === void 0) blurAmount = kResult.blurAmount;
|
|
24564
|
-
if (kResult.color)
|
|
24566
|
+
if (kResult.color) fillColor = kResult.color;
|
|
24565
24567
|
if (kResult.lineSpacing !== void 0) transY += computeLineLeadingDisplacement(glyph.lineIndex, layout.linesCount, kResult.lineSpacing, kResult.lineAnchor ?? 0);
|
|
24566
24568
|
transZ = kResult.transZ ?? 0;
|
|
24567
24569
|
chromaticShift = kResult.chromaticShift ?? 0;
|
|
@@ -24579,9 +24581,7 @@ function drawParagraphNode(ctx, pass, props) {
|
|
|
24579
24581
|
const contentWidth = layout.glyphs.length > 0 ? layout.glyphs[layout.glyphs.length - 1].x + fontSize : props.dstRect.width;
|
|
24580
24582
|
glyphX = evaluateMarqueeOffset(glyph.x, props.dstRect.width, contentWidth, props.marquee, elapsedSec);
|
|
24581
24583
|
}
|
|
24582
|
-
const
|
|
24583
|
-
const spanColor = glyph.fill ? parseColor(glyph.fill) : void 0;
|
|
24584
|
-
const col = animatorColor ?? colorOverride ?? (isHighlighted ? highlightColor : spanColor ?? baseColor);
|
|
24584
|
+
const col = colorOverride ?? fillColor;
|
|
24585
24585
|
const writeInstance = (boldShift) => {
|
|
24586
24586
|
const offset = visibleCount * 24;
|
|
24587
24587
|
const fontScale = glyph.fontScale ?? fontSize / targetFont.unitsPerEm;
|
|
@@ -30983,8 +30983,13 @@ var BloomPipeline = class {
|
|
|
30983
30983
|
module;
|
|
30984
30984
|
pipelineLayout;
|
|
30985
30985
|
sampler;
|
|
30986
|
-
|
|
30987
|
-
|
|
30986
|
+
/**
|
|
30987
|
+
* Mip chains by size and depth. Scenes with different bloom share a frame
|
|
30988
|
+
* (one command buffer), so a chain stays alive until the frame is done:
|
|
30989
|
+
* chains not used in a frame are destroyed at the next `resetPools`.
|
|
30990
|
+
*/
|
|
30991
|
+
chains = /* @__PURE__ */ new Map();
|
|
30992
|
+
usedThisFrame = /* @__PURE__ */ new Set();
|
|
30988
30993
|
placeholder;
|
|
30989
30994
|
uniformPool = new BufferPool(48, GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST);
|
|
30990
30995
|
constructor(device) {
|
|
@@ -31087,17 +31092,18 @@ var BloomPipeline = class {
|
|
|
31087
31092
|
}
|
|
31088
31093
|
return pipe$1;
|
|
31089
31094
|
}
|
|
31090
|
-
|
|
31095
|
+
mipChain(width, height, levels) {
|
|
31091
31096
|
const key = `${width}x${height}x${levels}`;
|
|
31092
|
-
|
|
31093
|
-
|
|
31094
|
-
|
|
31097
|
+
this.usedThisFrame.add(key);
|
|
31098
|
+
const cached$1 = this.chains.get(key);
|
|
31099
|
+
if (cached$1) return cached$1;
|
|
31100
|
+
const chain = [];
|
|
31095
31101
|
let w = width;
|
|
31096
31102
|
let h = height;
|
|
31097
31103
|
for (let i = 0; i < levels; i++) {
|
|
31098
31104
|
w = Math.max(1, Math.floor(w / 2));
|
|
31099
31105
|
h = Math.max(1, Math.floor(h / 2));
|
|
31100
|
-
|
|
31106
|
+
chain.push(this.device.createTexture({
|
|
31101
31107
|
label: `BloomMip${i}`,
|
|
31102
31108
|
size: {
|
|
31103
31109
|
width: w,
|
|
@@ -31108,7 +31114,8 @@ var BloomPipeline = class {
|
|
|
31108
31114
|
}));
|
|
31109
31115
|
if (w === 1 && h === 1) break;
|
|
31110
31116
|
}
|
|
31111
|
-
this.
|
|
31117
|
+
this.chains.set(key, chain);
|
|
31118
|
+
return chain;
|
|
31112
31119
|
}
|
|
31113
31120
|
uniforms(texelW, texelH, opts) {
|
|
31114
31121
|
const data = new Float32Array([
|
|
@@ -31186,8 +31193,7 @@ var BloomPipeline = class {
|
|
|
31186
31193
|
mode: display ? 1 : 0
|
|
31187
31194
|
};
|
|
31188
31195
|
const levels = Math.max(1, Math.min(8, Math.round(options.radius ?? 6)));
|
|
31189
|
-
this.
|
|
31190
|
-
const mips = this.mips;
|
|
31196
|
+
const mips = this.mipChain(source.width, source.height, levels);
|
|
31191
31197
|
const u = (w, h) => this.uniforms(1 / w, 1 / h, opts);
|
|
31192
31198
|
const glowSource = hdrSource ?? source;
|
|
31193
31199
|
this.pass(encoder, this.prefilterPipe, mips[0].createView(), glowSource, this.placeholder, u(glowSource.width, glowSource.height), "clear");
|
|
@@ -31201,12 +31207,22 @@ var BloomPipeline = class {
|
|
|
31201
31207
|
}
|
|
31202
31208
|
this.pass(encoder, this.compositePipe(dest.format), dest.createView(), mips[0], source, u(mips[0].width, mips[0].height), "clear");
|
|
31203
31209
|
}
|
|
31204
|
-
/**
|
|
31210
|
+
/**
|
|
31211
|
+
* Call once per frame before `apply`: recycles the per-pass uniforms and
|
|
31212
|
+
* frees the mip chains the last frame did not use.
|
|
31213
|
+
*/
|
|
31205
31214
|
resetPools() {
|
|
31206
31215
|
this.uniformPool.reset();
|
|
31216
|
+
for (const [key, chain] of this.chains) {
|
|
31217
|
+
if (this.usedThisFrame.has(key)) continue;
|
|
31218
|
+
for (const t of chain) t.destroy();
|
|
31219
|
+
this.chains.delete(key);
|
|
31220
|
+
}
|
|
31221
|
+
this.usedThisFrame.clear();
|
|
31207
31222
|
}
|
|
31208
31223
|
destroy() {
|
|
31209
|
-
for (const
|
|
31224
|
+
for (const chain of this.chains.values()) for (const t of chain) t.destroy();
|
|
31225
|
+
this.chains.clear();
|
|
31210
31226
|
this.placeholder.destroy();
|
|
31211
31227
|
this.uniformPool.destroy();
|
|
31212
31228
|
}
|
|
@@ -31595,15 +31611,56 @@ struct Shaded {
|
|
|
31595
31611
|
hdr : vec3<f32>,
|
|
31596
31612
|
};
|
|
31597
31613
|
|
|
31614
|
+
// Two-sided, art-directed diffuse lighting. Shares the full direct-light
|
|
31615
|
+
// storage, range/spot attenuation and PCF shadows with the physical renderer.
|
|
31616
|
+
fn shadeToon(worldPos: vec3<f32>, worldNormal: vec3<f32>, base: vec3<f32>, ambient: f32, shade: vec4<f32>, lightTint: vec4<f32>, params: vec4<f32>) -> vec3<f32> {
|
|
31617
|
+
if (lights.params.y < 0.5) { return base; }
|
|
31618
|
+
var N = normalize(worldNormal);
|
|
31619
|
+
let V = normalize(cam.cameraPos.xyz - worldPos);
|
|
31620
|
+
if (dot(N, V) < 0.0) { N = -N; }
|
|
31621
|
+
var illumination = lights.ambientColor.rgb * ambient * lightTint.rgb;
|
|
31622
|
+
var visibility = clamp(max(illumination.r, max(illumination.g, illumination.b)), 0.0, 1.0);
|
|
31623
|
+
for (var i = 0; i < i32(lights.params.x); i++) {
|
|
31624
|
+
let ls = sampleLight(i, worldPos);
|
|
31625
|
+
if (!ls.valid) { continue; }
|
|
31626
|
+
let cosine = dot(N, ls.L);
|
|
31627
|
+
let softness = max(params.x, 0.0001);
|
|
31628
|
+
let band = smoothstep(lightTint.w - softness * 0.5, lightTint.w + softness * 0.5, cosine);
|
|
31629
|
+
let light = directLights[i];
|
|
31630
|
+
let strength = band * ls.attenuation * light.colorIntensity.w * shadowFactor(worldPos, N, i);
|
|
31631
|
+
let contribution = light.colorIntensity.rgb * lightTint.rgb * strength * mix(1.0, max(cosine, 0.0), shade.w);
|
|
31632
|
+
// Remove the shadow floor only as actual modeled light arrives.
|
|
31633
|
+
// Using the pre-diffuse band here creates a dark ring between the
|
|
31634
|
+
// shadow floor and the lit region, which slides as a surface turns.
|
|
31635
|
+
let energy = max(contribution.r, max(contribution.g, contribution.b));
|
|
31636
|
+
visibility = max(visibility, clamp(energy, 0.0, 1.0));
|
|
31637
|
+
illumination += contribution;
|
|
31638
|
+
}
|
|
31639
|
+
return base * (shade.rgb * (1.0 - visibility) + illumination);
|
|
31640
|
+
}
|
|
31641
|
+
|
|
31642
|
+
// The existing linear-depth attachment doubles as a geometry buffer:
|
|
31643
|
+
// r = optical depth, gb = octahedral world normal, a = outline participation.
|
|
31644
|
+
// Geometric normals deliberately ignore normal maps and texture seams.
|
|
31645
|
+
fn geometryPixel(depth: f32, normal: vec3<f32>, outlined: f32) -> vec4<f32> {
|
|
31646
|
+
let n = normalize(normal);
|
|
31647
|
+
let p = n.xy / max(abs(n.x) + abs(n.y) + abs(n.z), 1e-6);
|
|
31648
|
+
let signs = select(vec2<f32>(-1.0), vec2<f32>(1.0), p >= vec2<f32>(0.0));
|
|
31649
|
+
let oct = select((1.0 - abs(p.yx)) * signs, p, n.z >= 0.0);
|
|
31650
|
+
return vec4<f32>(depth, oct * 0.5 + 0.5, outlined);
|
|
31651
|
+
}
|
|
31652
|
+
|
|
31598
31653
|
/// Shades a surface for the scene's mode.
|
|
31599
31654
|
/// material: x shininess, y specularIntensity, z ambientIntensity, w mode (0 unlit).
|
|
31600
31655
|
/// pbr: x roughness (<0 = default), y metallic, z/w unused.
|
|
31601
31656
|
/// emissive: rgb sRGB color, w strength.
|
|
31602
|
-
fn shadeSurfaceFull(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3<f32>, material: vec4<f32>, pbr: vec4<f32>, emissive: vec4<f32>) -> Shaded {
|
|
31657
|
+
fn shadeSurfaceFull(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3<f32>, material: vec4<f32>, pbr: vec4<f32>, emissive: vec4<f32>, toonShadow: vec4<f32>, toonLight: vec4<f32>, toonParams: vec4<f32>) -> Shaded {
|
|
31603
31658
|
var out: Shaded;
|
|
31604
31659
|
if (lights.params.z < 0.5) {
|
|
31605
31660
|
var c = baseColor;
|
|
31606
|
-
if (material.w
|
|
31661
|
+
if (material.w > 1.5) {
|
|
31662
|
+
c = shadeToon(worldPos, worldNormal, baseColor, material.z, toonShadow, toonLight, toonParams);
|
|
31663
|
+
} else if (material.w >= 0.5) {
|
|
31607
31664
|
c = applyLighting3D(worldPos, worldNormal, baseColor, material);
|
|
31608
31665
|
}
|
|
31609
31666
|
c += emissive.rgb * emissive.w;
|
|
@@ -31614,6 +31671,8 @@ fn shadeSurfaceFull(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3
|
|
|
31614
31671
|
var radiance: vec3<f32>;
|
|
31615
31672
|
if (material.w < 0.5) {
|
|
31616
31673
|
radiance = srgbToLinear(baseColor);
|
|
31674
|
+
} else if (material.w > 1.5) {
|
|
31675
|
+
radiance = srgbToLinear(shadeToon(worldPos, worldNormal, baseColor, material.z, toonShadow, toonLight, toonParams));
|
|
31617
31676
|
} else {
|
|
31618
31677
|
let rough = select(pbr.x, 0.5, pbr.x < 0.0);
|
|
31619
31678
|
radiance = shadePhysical(worldPos, worldNormal, srgbToLinear(baseColor), rough, clamp(pbr.y, 0.0, 1.0), material.z);
|
|
@@ -31649,9 +31708,6 @@ fn shadeSurfaceFull(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3
|
|
|
31649
31708
|
return out;
|
|
31650
31709
|
}
|
|
31651
31710
|
|
|
31652
|
-
fn shadeSurface(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3<f32>, material: vec4<f32>, pbr: vec4<f32>, emissive: vec4<f32>) -> vec3<f32> {
|
|
31653
|
-
return shadeSurfaceFull(worldPos, worldNormal, baseColor, material, pbr, emissive).display;
|
|
31654
|
-
}
|
|
31655
31711
|
`;
|
|
31656
31712
|
/** Group-3 bindings every lit 3D shader declares. */
|
|
31657
31713
|
const lightsBindingsWgsl = `
|
|
@@ -31962,7 +32018,7 @@ fn fs_mrt(in: VsOut) -> FsOutputMrt {
|
|
|
31962
32018
|
var out: FsOutputMrt;
|
|
31963
32019
|
let s = shadeFloor(in);
|
|
31964
32020
|
out.color = vec4<f32>(s.display * s.alpha, s.alpha);
|
|
31965
|
-
out.linearDepth =
|
|
32021
|
+
out.linearDepth = geometryPixel(s.linearDepth, vec3<f32>(0.0, -1.0, 0.0), 1.0);
|
|
31966
32022
|
out.depth = s.depth;
|
|
31967
32023
|
return out;
|
|
31968
32024
|
}
|
|
@@ -31982,7 +32038,7 @@ fn fs_mrt_bloom(in: VsOut) -> FsOutputMrtBloom {
|
|
|
31982
32038
|
var out: FsOutputMrtBloom;
|
|
31983
32039
|
let s = shadeFloor(in);
|
|
31984
32040
|
out.color = vec4<f32>(s.display * s.alpha, s.alpha);
|
|
31985
|
-
out.linearDepth =
|
|
32041
|
+
out.linearDepth = geometryPixel(s.linearDepth, vec3<f32>(0.0, -1.0, 0.0), 1.0);
|
|
31986
32042
|
out.hdr = vec4<f32>(s.hdr * s.alpha, 1.0);
|
|
31987
32043
|
out.depth = s.depth;
|
|
31988
32044
|
return out;
|
|
@@ -32702,6 +32758,9 @@ struct ModelUniforms {
|
|
|
32702
32758
|
shade : vec4<f32>, // rgb = toon shadow-side color multiplier, a = alpha cutoff (0 = none)
|
|
32703
32759
|
pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
|
|
32704
32760
|
emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
|
|
32761
|
+
toonShadow : vec4<f32>, // rgb shadow-side multiplier, w diffuse modelling
|
|
32762
|
+
toonLight : vec4<f32>, // rgb lit-side multiplier, w terminator threshold
|
|
32763
|
+
toonParams : vec4<f32>, // x terminator softness, y outline participation
|
|
32705
32764
|
maps : vec4<f32>, // x = normal scale (0 = no map), y = occlusion strength, z = has metallic-roughness map, w = has emissive map
|
|
32706
32765
|
};
|
|
32707
32766
|
|
|
@@ -32842,37 +32901,6 @@ fn vs_main(
|
|
|
32842
32901
|
return out;
|
|
32843
32902
|
}
|
|
32844
32903
|
|
|
32845
|
-
// Toon (MToon-style): the base color as authored where the light reaches,
|
|
32846
|
-
// the shade color past a soft terminator. Highlights stay out: the texture
|
|
32847
|
-
// already paints them.
|
|
32848
|
-
fn toonLighting(in: VertexOutput, baseColor: vec3<f32>) -> vec3<f32> {
|
|
32849
|
-
var N = normalize(in.worldNormal);
|
|
32850
|
-
let V = normalize(cam.cameraPos.xyz - in.worldPos);
|
|
32851
|
-
if (dot(N, V) < 0.0) {
|
|
32852
|
-
N = -N;
|
|
32853
|
-
}
|
|
32854
|
-
var lit = 0.0;
|
|
32855
|
-
let numLights = i32(lights.params.x);
|
|
32856
|
-
for (var i = 0; i < 8; i++) {
|
|
32857
|
-
if (i >= numLights) {
|
|
32858
|
-
break;
|
|
32859
|
-
}
|
|
32860
|
-
let light = lights.lights[i];
|
|
32861
|
-
let lightType = light.posType.w;
|
|
32862
|
-
var L = vec3<f32>(0.0, 0.0, 1.0);
|
|
32863
|
-
if (lightType > 0.5 && lightType < 1.5) {
|
|
32864
|
-
L = normalize(-light.dirRadius.xyz);
|
|
32865
|
-
} else if (lightType >= 1.5) {
|
|
32866
|
-
L = normalize(light.posType.xyz - in.worldPos);
|
|
32867
|
-
} else {
|
|
32868
|
-
continue;
|
|
32869
|
-
}
|
|
32870
|
-
let terminator = smoothstep(-0.05, 0.2, dot(N, L));
|
|
32871
|
-
lit = max(lit, terminator * min(light.colorIntensity.w, 1.0));
|
|
32872
|
-
}
|
|
32873
|
-
return baseColor * mix(model.shade.rgb, vec3<f32>(1.0), lit);
|
|
32874
|
-
}
|
|
32875
|
-
|
|
32876
32904
|
struct MeshFragment {
|
|
32877
32905
|
color : vec4<f32>, // premultiplied display color
|
|
32878
32906
|
hdr : vec4<f32>, // premultiplied scene radiance (bloom source)
|
|
@@ -32940,7 +32968,7 @@ fn shadeGlass(in: VertexOutput, Nin: vec3<f32>, tint: vec3<f32>, alpha: f32, rim
|
|
|
32940
32968
|
let transmitted = col * depthTint * (1.0 - 0.45 * rim * rim);
|
|
32941
32969
|
let f0 = pow((ior - 1.0) / (ior + 1.0), 2.0);
|
|
32942
32970
|
let F = f0 + (1.0 - f0) * pow(rim, 5.0);
|
|
32943
|
-
let lit = shadeSurfaceFull(in.worldPos, N, vec3<f32>(0.0), model.materialParams, vec4<f32>(model.pbr.x, 0.0, 0.0, 0.0), vec4<f32>(0.0));
|
|
32971
|
+
let lit = shadeSurfaceFull(in.worldPos, N, vec3<f32>(0.0), model.materialParams, vec4<f32>(model.pbr.x, 0.0, 0.0, 0.0), vec4<f32>(0.0), model.toonShadow, model.toonLight, model.toonParams);
|
|
32944
32972
|
// Grazing faces mirror the room; keep that faint so dark scenes stay dark
|
|
32945
32973
|
// and the studio highlights below carry the shape.
|
|
32946
32974
|
let sheen = vec3<f32>(0.9, 0.94, 1.0) * F * 0.22 + tint * 0.05 * (0.4 + rim);
|
|
@@ -32988,19 +33016,6 @@ fn shadeMesh(in: VertexOutput, isFront: bool) -> MeshFragment {
|
|
|
32988
33016
|
|
|
32989
33017
|
let baseRgb = texColor.rgb * in.color.rgb * model.colorTint.rgb;
|
|
32990
33018
|
var out: MeshFragment;
|
|
32991
|
-
if (model.materialParams.w > 1.5) {
|
|
32992
|
-
var toon = baseRgb;
|
|
32993
|
-
if (lights.params.y >= 0.5) {
|
|
32994
|
-
toon = toonLighting(in, baseRgb);
|
|
32995
|
-
}
|
|
32996
|
-
if (model.params.w > 0.5 && (in.emissive.w > 0.0 || dot(in.emissive.rgb, in.emissive.rgb) > 0.0)) {
|
|
32997
|
-
toon += in.emissive.rgb * in.emissive.w;
|
|
32998
|
-
}
|
|
32999
|
-
out.color = vec4<f32>(toon * alpha, alpha);
|
|
33000
|
-
out.hdr = vec4<f32>(srgbToLinear(toon) * alpha, alpha);
|
|
33001
|
-
return out;
|
|
33002
|
-
}
|
|
33003
|
-
|
|
33004
33019
|
var N = normalize(in.worldNormal);
|
|
33005
33020
|
if (model.maps.x > 0.0) {
|
|
33006
33021
|
var tn = normalSample * 2.0 - 1.0;
|
|
@@ -33030,7 +33045,7 @@ fn shadeMesh(in: VertexOutput, isFront: bool) -> MeshFragment {
|
|
|
33030
33045
|
if (model.params.w > 0.5 && (in.emissive.w > 0.0 || dot(in.emissive.rgb, in.emissive.rgb) > 0.0)) {
|
|
33031
33046
|
emissive = in.emissive;
|
|
33032
33047
|
}
|
|
33033
|
-
let shaded = shadeSurfaceFull(in.worldPos, N, baseRgb, material, pbr, emissive);
|
|
33048
|
+
let shaded = shadeSurfaceFull(in.worldPos, N, baseRgb, material, pbr, emissive, model.toonShadow, model.toonLight, model.toonParams);
|
|
33034
33049
|
out.color = vec4<f32>(shaded.display * alpha, alpha);
|
|
33035
33050
|
out.hdr = vec4<f32>(shaded.hdr * alpha, alpha);
|
|
33036
33051
|
return out;
|
|
@@ -33061,7 +33076,7 @@ fn fs_single(in: VertexOutput, @builtin(front_facing) isFront: bool) -> @locatio
|
|
|
33061
33076
|
fn fs_mrt(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtOutput {
|
|
33062
33077
|
var out: MrtOutput;
|
|
33063
33078
|
out.color = shadeMesh(in, isFront).color;
|
|
33064
|
-
out.depth =
|
|
33079
|
+
out.depth = geometryPixel(in.linearDepth, in.worldNormal, model.toonParams.y);
|
|
33065
33080
|
return out;
|
|
33066
33081
|
}
|
|
33067
33082
|
|
|
@@ -33079,7 +33094,7 @@ fn fs_mrt_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtBl
|
|
|
33079
33094
|
let f = shadeMesh(in, isFront);
|
|
33080
33095
|
var out: MrtBloomOutput;
|
|
33081
33096
|
out.color = f.color;
|
|
33082
|
-
out.depth =
|
|
33097
|
+
out.depth = geometryPixel(in.linearDepth, in.worldNormal, model.toonParams.y);
|
|
33083
33098
|
out.hdr = f.hdr;
|
|
33084
33099
|
return out;
|
|
33085
33100
|
}
|
|
@@ -33104,6 +33119,9 @@ struct ModelUniforms {
|
|
|
33104
33119
|
materialParams : vec4<f32>, // x = shininess, y = specularIntensity, z = ambientIntensity, w = materialMode (0=unlit, 1=lit)
|
|
33105
33120
|
pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
|
|
33106
33121
|
emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
|
|
33122
|
+
toonShadow : vec4<f32>, // rgb shadow-side multiplier, w diffuse modelling
|
|
33123
|
+
toonLight : vec4<f32>, // rgb lit-side multiplier, w terminator threshold
|
|
33124
|
+
toonParams : vec4<f32>, // x terminator softness, y outline participation
|
|
33107
33125
|
relief : vec4<f32>, // x = amount (px), y = on, w = grid cells per side
|
|
33108
33126
|
reliefRect : vec4<f32>, // xy = where the layer's box starts in reliefTex (0..1), zw = its size
|
|
33109
33127
|
reliefEye : vec4<f32>, // xyz = the eye the surface keeps its look from (the default camera)
|
|
@@ -33298,7 +33316,7 @@ fn shadeQuad(in: VertexOutput, isFront: bool) -> QuadFragment {
|
|
|
33298
33316
|
discard;
|
|
33299
33317
|
}
|
|
33300
33318
|
|
|
33301
|
-
let shaded = shadeSurfaceFull(in.worldPos, in.worldNormal, baseRgb, model.materialParams, model.pbr, model.emissive);
|
|
33319
|
+
let shaded = shadeSurfaceFull(in.worldPos, in.worldNormal, baseRgb, model.materialParams, model.pbr, model.emissive, model.toonShadow, model.toonLight, model.toonParams);
|
|
33302
33320
|
var out: QuadFragment;
|
|
33303
33321
|
out.color = vec4<f32>(shaded.display * alpha, alpha);
|
|
33304
33322
|
out.hdr = vec4<f32>(shaded.hdr * alpha, alpha);
|
|
@@ -33330,7 +33348,7 @@ fn fs_single(in: VertexOutput, @builtin(front_facing) isFront: bool) -> @locatio
|
|
|
33330
33348
|
fn fs_mrt(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtOutput {
|
|
33331
33349
|
var out: MrtOutput;
|
|
33332
33350
|
out.color = shadeQuad(in, isFront).color;
|
|
33333
|
-
out.depth =
|
|
33351
|
+
out.depth = geometryPixel(in.linearDepth, in.worldNormal, model.toonParams.y);
|
|
33334
33352
|
return out;
|
|
33335
33353
|
}
|
|
33336
33354
|
|
|
@@ -33348,7 +33366,7 @@ fn fs_mrt_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtBl
|
|
|
33348
33366
|
let f = shadeQuad(in, isFront);
|
|
33349
33367
|
var out: MrtBloomOutput;
|
|
33350
33368
|
out.color = f.color;
|
|
33351
|
-
out.depth =
|
|
33369
|
+
out.depth = geometryPixel(in.linearDepth, in.worldNormal, model.toonParams.y);
|
|
33352
33370
|
out.hdr = f.hdr;
|
|
33353
33371
|
return out;
|
|
33354
33372
|
}
|
|
@@ -33374,13 +33392,37 @@ const SHADOW_DEPTH_STENCIL = {
|
|
|
33374
33392
|
depthBiasSlopeScale: 2.5,
|
|
33375
33393
|
depthBiasClamp: .01
|
|
33376
33394
|
};
|
|
33377
|
-
/**
|
|
33378
|
-
const SURFACE_PARAMS_FLOATS =
|
|
33379
|
-
function packSurfaceParams(data, out, offset) {
|
|
33395
|
+
/** Shared model uniforms: PBR, emissive, and three art-direction vec4s. */
|
|
33396
|
+
const SURFACE_PARAMS_FLOATS = 20;
|
|
33397
|
+
function packSurfaceParams(data, out, offset, modelShade) {
|
|
33380
33398
|
out[offset] = data.roughness ?? -1;
|
|
33381
33399
|
out[offset + 1] = data.metallic ?? 0;
|
|
33382
33400
|
out[offset + 2] = 0;
|
|
33383
33401
|
out[offset + 3] = 0;
|
|
33402
|
+
const shadow = data.toon?.shadowColor ? parseColor(data.toon.shadowColor) : null;
|
|
33403
|
+
out.set(shadow ? [
|
|
33404
|
+
shadow.r,
|
|
33405
|
+
shadow.g,
|
|
33406
|
+
shadow.b
|
|
33407
|
+
] : modelShade ?? [
|
|
33408
|
+
.5,
|
|
33409
|
+
.5,
|
|
33410
|
+
.55
|
|
33411
|
+
], offset + 8);
|
|
33412
|
+
out[offset + 11] = data.toon?.diffuse ?? 0;
|
|
33413
|
+
const light = parseColor(data.toon?.lightColor ?? "#ffffff");
|
|
33414
|
+
out.set([
|
|
33415
|
+
light.r,
|
|
33416
|
+
light.g,
|
|
33417
|
+
light.b,
|
|
33418
|
+
data.toon?.threshold ?? .075
|
|
33419
|
+
], offset + 12);
|
|
33420
|
+
out.set([
|
|
33421
|
+
data.toon?.softness ?? .25,
|
|
33422
|
+
data.outline === false ? 0 : 1,
|
|
33423
|
+
0,
|
|
33424
|
+
0
|
|
33425
|
+
], offset + 16);
|
|
33384
33426
|
const e = data.emissive;
|
|
33385
33427
|
if (e === void 0 || e === null) {
|
|
33386
33428
|
out.fill(0, offset + 4, offset + 8);
|
|
@@ -33449,7 +33491,7 @@ function packMaterialParams(data) {
|
|
|
33449
33491
|
data.roughness !== void 0 ? Math.max(1, (1 - data.roughness) * 128) : data.shininess ?? 32,
|
|
33450
33492
|
data.metallic !== void 0 ? data.metallic : data.specularIntensity ?? .5,
|
|
33451
33493
|
data.ambientIntensity ?? 1,
|
|
33452
|
-
data.material === "unlit" ? 0 : 1
|
|
33494
|
+
data.material === "unlit" ? 0 : data.material === "toon" ? 2 : 1
|
|
33453
33495
|
];
|
|
33454
33496
|
}
|
|
33455
33497
|
var Quad3DPipeline = class {
|
|
@@ -34179,12 +34221,13 @@ var Mesh3DPipeline = class {
|
|
|
34179
34221
|
this.modelData[45] = shade[1];
|
|
34180
34222
|
this.modelData[46] = shade[2];
|
|
34181
34223
|
this.modelData[47] = data.alphaCutoff ?? 0;
|
|
34182
|
-
packSurfaceParams(data, this.modelData, 48);
|
|
34224
|
+
packSurfaceParams(data, this.modelData, 48, data.shadeColor);
|
|
34183
34225
|
const maps = data.maps;
|
|
34184
|
-
|
|
34185
|
-
this.modelData[
|
|
34186
|
-
this.modelData[
|
|
34187
|
-
this.modelData[
|
|
34226
|
+
const mapsOffset = 48 + SURFACE_PARAMS_FLOATS;
|
|
34227
|
+
this.modelData[mapsOffset] = maps?.normal ? maps.normalScale ?? 1 : 0;
|
|
34228
|
+
this.modelData[mapsOffset + 1] = maps?.occlusion ? maps.occlusionStrength ?? 1 : 0;
|
|
34229
|
+
this.modelData[mapsOffset + 2] = maps?.metallicRoughness ? 1 : 0;
|
|
34230
|
+
this.modelData[mapsOffset + 3] = maps?.emissive ? 1 : 0;
|
|
34188
34231
|
const glass = data.glass;
|
|
34189
34232
|
if (glass) {
|
|
34190
34233
|
this.modelData[44] = glass.dispersion;
|
|
@@ -37963,6 +38006,309 @@ fn fs_dof(in: VSOut) -> @location(0) vec4<f32> {
|
|
|
37963
38006
|
return accumColor / totalWeight;
|
|
37964
38007
|
}
|
|
37965
38008
|
`;
|
|
38009
|
+
function outlineShader(sampleCount) {
|
|
38010
|
+
const multisampled = sampleCount > 1;
|
|
38011
|
+
const textureType = multisampled ? "texture_multisampled_2d<f32>" : "texture_2d<f32>";
|
|
38012
|
+
return `
|
|
38013
|
+
struct Uniforms {
|
|
38014
|
+
params : vec4<f32>, // width, cosine(crease angle), relative depth threshold, opacity
|
|
38015
|
+
ink : vec4<f32>,
|
|
38016
|
+
fog : vec4<f32>,
|
|
38017
|
+
fogRange : vec4<f32>,
|
|
38018
|
+
projection : vec4<f32>, // inverse projection x/y scale, far depth
|
|
38019
|
+
};
|
|
38020
|
+
@group(0) @binding(0) var<uniform> u : Uniforms;
|
|
38021
|
+
@group(0) @binding(1) var colorTex : ${textureType};
|
|
38022
|
+
@group(0) @binding(2) var geometryTex : ${textureType};
|
|
38023
|
+
|
|
38024
|
+
@vertex fn vs(@builtin(vertex_index) i : u32) -> @builtin(position) vec4<f32> {
|
|
38025
|
+
let p = vec2<f32>(f32((i << 1u) & 2u), f32(i & 2u));
|
|
38026
|
+
return vec4<f32>(p * 2.0 - 1.0, 0.0, 1.0);
|
|
38027
|
+
}
|
|
38028
|
+
|
|
38029
|
+
fn geometry(p : vec2<i32>, sample : i32) -> vec4<f32> {
|
|
38030
|
+
let size = vec2<i32>(textureDimensions(geometryTex));
|
|
38031
|
+
// Beyond the viewport is the same surface: never ink the canvas border.
|
|
38032
|
+
return textureLoad(geometryTex, clamp(p, vec2<i32>(0), size - 1), sample);
|
|
38033
|
+
}
|
|
38034
|
+
|
|
38035
|
+
fn normal(oct : vec2<f32>) -> vec3<f32> {
|
|
38036
|
+
let p = oct * 2.0 - 1.0;
|
|
38037
|
+
var n = vec3<f32>(p, 1.0 - abs(p.x) - abs(p.y));
|
|
38038
|
+
let t = max(-n.z, 0.0);
|
|
38039
|
+
n = vec3<f32>(n.xy + select(vec2<f32>(t), vec2<f32>(-t), n.xy >= vec2<f32>(0.0)), n.z);
|
|
38040
|
+
return normalize(n);
|
|
38041
|
+
}
|
|
38042
|
+
|
|
38043
|
+
fn srgbToLinear(c : vec3<f32>) -> vec3<f32> {
|
|
38044
|
+
return select(pow((max(c, vec3<f32>(0.0)) + 0.055) / 1.055, vec3<f32>(2.4)), c / 12.92, c <= vec3<f32>(0.04045));
|
|
38045
|
+
}
|
|
38046
|
+
fn linearToSrgb(c : vec3<f32>) -> vec3<f32> {
|
|
38047
|
+
let x = max(c, vec3<f32>(0.0));
|
|
38048
|
+
return select(1.055 * pow(x, vec3<f32>(1.0 / 2.4)) - 0.055, x * 12.92, x <= vec3<f32>(0.0031308));
|
|
38049
|
+
}
|
|
38050
|
+
|
|
38051
|
+
fn edge(center : vec4<f32>, next : vec4<f32>, previous : vec4<f32>) -> f32 {
|
|
38052
|
+
let z = 1.0 / max(center.r, 0.0001);
|
|
38053
|
+
let a = 1.0 / max(next.r, 0.0001);
|
|
38054
|
+
let b = 1.0 / max(previous.r, 0.0001);
|
|
38055
|
+
// Inverse depth is affine on a perspective-projected plane. Its signed
|
|
38056
|
+
// second difference suppresses grazing surfaces and inks only the near
|
|
38057
|
+
// side of an occlusion, including thin geometry with background both sides.
|
|
38058
|
+
let curvature = (2.0 * z - a - b) / z;
|
|
38059
|
+
let depthEdge = smoothstep(u.params.z, u.params.z * 2.0, curvature);
|
|
38060
|
+
let sameDepth = abs(center.r - next.r) / max(center.r, 0.0001) < 0.03;
|
|
38061
|
+
let crease = select(0.0, 1.0, next.a > 0.5 && sameDepth && dot(normal(center.gb), normal(next.gb)) < u.params.y);
|
|
38062
|
+
return max(depthEdge, crease);
|
|
38063
|
+
}
|
|
38064
|
+
|
|
38065
|
+
@fragment fn fs(@builtin(position) pos : vec4<f32>${multisampled ? ", @builtin(sample_index) sampleIndex : u32" : ""}) -> @location(0) vec4<f32> {
|
|
38066
|
+
let sample = ${multisampled ? "i32(sampleIndex)" : "0"};
|
|
38067
|
+
let pixel = vec2<i32>(pos.xy);
|
|
38068
|
+
let source = textureLoad(colorTex, pixel, sample);
|
|
38069
|
+
let c = geometry(pixel, sample);
|
|
38070
|
+
if (c.a <= 0.0 || u.params.x <= 0.0 || u.params.w <= 0.0) { return source; }
|
|
38071
|
+
var coverage = 0.0;
|
|
38072
|
+
let directions = array<vec2<f32>, 8>(
|
|
38073
|
+
vec2<f32>(1.0, 0.0), vec2<f32>(-1.0, 0.0), vec2<f32>(0.0, 1.0), vec2<f32>(0.0, -1.0),
|
|
38074
|
+
vec2<f32>(0.707107, 0.707107), vec2<f32>(-0.707107, 0.707107), vec2<f32>(0.707107, -0.707107), vec2<f32>(-0.707107, -0.707107));
|
|
38075
|
+
for (var r = 1; r <= i32(ceil(u.params.x)); r++) {
|
|
38076
|
+
let weight = clamp(u.params.x - f32(r) + 1.0, 0.0, 1.0);
|
|
38077
|
+
for (var d = 0; d < 8; d++) {
|
|
38078
|
+
let offset = vec2<i32>(round(directions[d] * f32(r)));
|
|
38079
|
+
coverage = max(coverage, edge(c, geometry(pixel + offset, sample), geometry(pixel - offset, sample)) * weight);
|
|
38080
|
+
}
|
|
38081
|
+
}
|
|
38082
|
+
var ink = u.ink.rgb;
|
|
38083
|
+
if (u.fog.w > 0.5) {
|
|
38084
|
+
let uv = pos.xy / vec2<f32>(textureDimensions(colorTex));
|
|
38085
|
+
let ray = vec3<f32>((uv * 2.0 - 1.0) * u.projection.xy, 1.0);
|
|
38086
|
+
let distance = c.r * length(ray);
|
|
38087
|
+
let fog = smoothstep(u.fogRange.x, max(u.fogRange.y, u.fogRange.x + 1.0), distance) * u.fogRange.z;
|
|
38088
|
+
// Match surface fog's linear-light blend; display-space interpolation
|
|
38089
|
+
// would darken outlines halfway into a light-colored atmosphere.
|
|
38090
|
+
ink = linearToSrgb(mix(srgbToLinear(ink), srgbToLinear(u.fog.rgb), fog));
|
|
38091
|
+
}
|
|
38092
|
+
let visibleCoverage = min(c.a / max(source.a, 0.0001), 1.0);
|
|
38093
|
+
return vec4<f32>(mix(source.rgb, ink * source.a, coverage * visibleCoverage * u.params.w * u.ink.a), source.a);
|
|
38094
|
+
}
|
|
38095
|
+
`;
|
|
38096
|
+
}
|
|
38097
|
+
/** Ink shades original color/depth/normal samples, then resolves color with MSAA. */
|
|
38098
|
+
var GeometryOutlinePipeline = class {
|
|
38099
|
+
layout;
|
|
38100
|
+
pipeline;
|
|
38101
|
+
multisampledOutput = null;
|
|
38102
|
+
pool = new BufferPool(80, GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST);
|
|
38103
|
+
constructor(device, format, sampleCount = 1) {
|
|
38104
|
+
this.device = device;
|
|
38105
|
+
this.format = format;
|
|
38106
|
+
this.sampleCount = sampleCount;
|
|
38107
|
+
this.layout = device.createBindGroupLayout({
|
|
38108
|
+
label: "GeometryOutlineLayout",
|
|
38109
|
+
entries: [{
|
|
38110
|
+
binding: 0,
|
|
38111
|
+
visibility: GPUShaderStage.FRAGMENT,
|
|
38112
|
+
buffer: { type: "uniform" }
|
|
38113
|
+
}, ...[1, 2].map((binding) => ({
|
|
38114
|
+
binding,
|
|
38115
|
+
visibility: GPUShaderStage.FRAGMENT,
|
|
38116
|
+
texture: {
|
|
38117
|
+
sampleType: "unfilterable-float",
|
|
38118
|
+
multisampled: sampleCount > 1
|
|
38119
|
+
}
|
|
38120
|
+
}))]
|
|
38121
|
+
});
|
|
38122
|
+
const module$1 = device.createShaderModule({
|
|
38123
|
+
label: "geometry-outlines.wgsl",
|
|
38124
|
+
code: outlineShader(sampleCount)
|
|
38125
|
+
});
|
|
38126
|
+
this.pipeline = device.createRenderPipeline({
|
|
38127
|
+
label: "GeometryOutlines",
|
|
38128
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [this.layout] }),
|
|
38129
|
+
vertex: {
|
|
38130
|
+
module: module$1,
|
|
38131
|
+
entryPoint: "vs"
|
|
38132
|
+
},
|
|
38133
|
+
fragment: {
|
|
38134
|
+
module: module$1,
|
|
38135
|
+
entryPoint: "fs",
|
|
38136
|
+
targets: [{ format }]
|
|
38137
|
+
},
|
|
38138
|
+
primitive: { topology: "triangle-list" },
|
|
38139
|
+
multisample: { count: sampleCount }
|
|
38140
|
+
});
|
|
38141
|
+
}
|
|
38142
|
+
reset() {
|
|
38143
|
+
this.pool.reset();
|
|
38144
|
+
}
|
|
38145
|
+
destroy() {
|
|
38146
|
+
this.pool.destroy();
|
|
38147
|
+
this.multisampledOutput?.destroy();
|
|
38148
|
+
}
|
|
38149
|
+
attachment(source, dest) {
|
|
38150
|
+
if (this.sampleCount <= 1) return {
|
|
38151
|
+
view: dest,
|
|
38152
|
+
loadOp: "clear",
|
|
38153
|
+
storeOp: "store"
|
|
38154
|
+
};
|
|
38155
|
+
if (!this.multisampledOutput || this.multisampledOutput.width !== source.width || this.multisampledOutput.height !== source.height) {
|
|
38156
|
+
this.multisampledOutput?.destroy();
|
|
38157
|
+
this.multisampledOutput = this.device.createTexture({
|
|
38158
|
+
label: "GeometryOutlineMsaaOutput",
|
|
38159
|
+
size: {
|
|
38160
|
+
width: source.width,
|
|
38161
|
+
height: source.height
|
|
38162
|
+
},
|
|
38163
|
+
format: this.format,
|
|
38164
|
+
sampleCount: this.sampleCount,
|
|
38165
|
+
usage: GPUTextureUsage.RENDER_ATTACHMENT
|
|
38166
|
+
});
|
|
38167
|
+
}
|
|
38168
|
+
return {
|
|
38169
|
+
view: this.multisampledOutput.createView(),
|
|
38170
|
+
resolveTarget: dest,
|
|
38171
|
+
loadOp: "clear",
|
|
38172
|
+
storeOp: "discard"
|
|
38173
|
+
};
|
|
38174
|
+
}
|
|
38175
|
+
render(encoder, source, geometry, dest, camera, options, fog) {
|
|
38176
|
+
const data = new Float32Array(20);
|
|
38177
|
+
data.set([
|
|
38178
|
+
(options.width ?? 1.5) * source.height / (options.referenceHeight ?? 1080),
|
|
38179
|
+
Math.cos((options.creaseAngle ?? 45) * Math.PI / 180),
|
|
38180
|
+
options.depthThreshold ?? .01,
|
|
38181
|
+
options.opacity ?? 1
|
|
38182
|
+
]);
|
|
38183
|
+
const color = parseColor(options.color ?? "#16131c");
|
|
38184
|
+
data.set([
|
|
38185
|
+
color.r,
|
|
38186
|
+
color.g,
|
|
38187
|
+
color.b,
|
|
38188
|
+
color.a
|
|
38189
|
+
], 4);
|
|
38190
|
+
if (fog) {
|
|
38191
|
+
const tint = parseColor(fog.color);
|
|
38192
|
+
data.set([
|
|
38193
|
+
tint.r,
|
|
38194
|
+
tint.g,
|
|
38195
|
+
tint.b,
|
|
38196
|
+
1
|
|
38197
|
+
], 8);
|
|
38198
|
+
data.set([
|
|
38199
|
+
fog.start,
|
|
38200
|
+
fog.end,
|
|
38201
|
+
fog.opacity ?? 1,
|
|
38202
|
+
0
|
|
38203
|
+
], 12);
|
|
38204
|
+
}
|
|
38205
|
+
const projection = Camera3D.computeProjectionMatrix(camera);
|
|
38206
|
+
data.set([
|
|
38207
|
+
1 / projection[0],
|
|
38208
|
+
1 / projection[5],
|
|
38209
|
+
camera.far,
|
|
38210
|
+
0
|
|
38211
|
+
], 16);
|
|
38212
|
+
const bindGroup = this.device.createBindGroup({
|
|
38213
|
+
layout: this.layout,
|
|
38214
|
+
entries: [
|
|
38215
|
+
{
|
|
38216
|
+
binding: 0,
|
|
38217
|
+
resource: { buffer: this.pool.getBuffer(this.device, data) }
|
|
38218
|
+
},
|
|
38219
|
+
{
|
|
38220
|
+
binding: 1,
|
|
38221
|
+
resource: source.createView()
|
|
38222
|
+
},
|
|
38223
|
+
{
|
|
38224
|
+
binding: 2,
|
|
38225
|
+
resource: geometry.createView()
|
|
38226
|
+
}
|
|
38227
|
+
]
|
|
38228
|
+
});
|
|
38229
|
+
const pass = encoder.beginRenderPass({ colorAttachments: [this.attachment(source, dest)] });
|
|
38230
|
+
pass.setPipeline(this.pipeline);
|
|
38231
|
+
pass.setBindGroup(0, bindGroup);
|
|
38232
|
+
pass.draw(3);
|
|
38233
|
+
pass.end();
|
|
38234
|
+
}
|
|
38235
|
+
};
|
|
38236
|
+
/**
|
|
38237
|
+
* Color MSAA resolves average samples. Depth and octahedral normals cannot
|
|
38238
|
+
* be averaged across silhouettes: that invents a distant surface and a
|
|
38239
|
+
* normal that belongs to neither object. Keep the nearest visible sample
|
|
38240
|
+
* and carry outline coverage separately, without re-rendering geometry.
|
|
38241
|
+
*/
|
|
38242
|
+
const shader = `
|
|
38243
|
+
@group(0) @binding(0) var geometry : texture_multisampled_2d<f32>;
|
|
38244
|
+
@vertex fn vs(@builtin(vertex_index) i : u32) -> @builtin(position) vec4<f32> {
|
|
38245
|
+
let p = vec2<f32>(f32((i << 1u) & 2u), f32(i & 2u));
|
|
38246
|
+
return vec4<f32>(p * 2.0 - 1.0, 0.0, 1.0);
|
|
38247
|
+
}
|
|
38248
|
+
@fragment fn fs(@builtin(position) pos : vec4<f32>) -> @location(0) vec4<f32> {
|
|
38249
|
+
let pixel = vec2<i32>(pos.xy);
|
|
38250
|
+
let samples = i32(textureNumSamples(geometry));
|
|
38251
|
+
var nearest = textureLoad(geometry, pixel, 0);
|
|
38252
|
+
var coverage = 0.0;
|
|
38253
|
+
for (var i = 0; i < samples; i++) {
|
|
38254
|
+
let s = textureLoad(geometry, pixel, i);
|
|
38255
|
+
if (s.r < nearest.r) { nearest = s; }
|
|
38256
|
+
coverage += s.a;
|
|
38257
|
+
}
|
|
38258
|
+
return vec4<f32>(nearest.rgb, nearest.a * coverage / f32(samples));
|
|
38259
|
+
}
|
|
38260
|
+
`;
|
|
38261
|
+
var GeometryResolvePipeline = class {
|
|
38262
|
+
layout;
|
|
38263
|
+
pipeline;
|
|
38264
|
+
constructor(device) {
|
|
38265
|
+
this.device = device;
|
|
38266
|
+
this.layout = device.createBindGroupLayout({ entries: [{
|
|
38267
|
+
binding: 0,
|
|
38268
|
+
visibility: GPUShaderStage.FRAGMENT,
|
|
38269
|
+
texture: {
|
|
38270
|
+
sampleType: "unfilterable-float",
|
|
38271
|
+
multisampled: true
|
|
38272
|
+
}
|
|
38273
|
+
}] });
|
|
38274
|
+
const module$1 = device.createShaderModule({
|
|
38275
|
+
label: "geometry-resolve.wgsl",
|
|
38276
|
+
code: shader
|
|
38277
|
+
});
|
|
38278
|
+
this.pipeline = device.createRenderPipeline({
|
|
38279
|
+
label: "GeometryResolve",
|
|
38280
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [this.layout] }),
|
|
38281
|
+
vertex: {
|
|
38282
|
+
module: module$1,
|
|
38283
|
+
entryPoint: "vs"
|
|
38284
|
+
},
|
|
38285
|
+
fragment: {
|
|
38286
|
+
module: module$1,
|
|
38287
|
+
entryPoint: "fs",
|
|
38288
|
+
targets: [{ format: "rgba16float" }]
|
|
38289
|
+
},
|
|
38290
|
+
primitive: { topology: "triangle-list" }
|
|
38291
|
+
});
|
|
38292
|
+
}
|
|
38293
|
+
render(encoder, source, dest) {
|
|
38294
|
+
const bindGroup = this.device.createBindGroup({
|
|
38295
|
+
layout: this.layout,
|
|
38296
|
+
entries: [{
|
|
38297
|
+
binding: 0,
|
|
38298
|
+
resource: source.createView()
|
|
38299
|
+
}]
|
|
38300
|
+
});
|
|
38301
|
+
const pass = encoder.beginRenderPass({ colorAttachments: [{
|
|
38302
|
+
view: dest,
|
|
38303
|
+
loadOp: "clear",
|
|
38304
|
+
storeOp: "store"
|
|
38305
|
+
}] });
|
|
38306
|
+
pass.setPipeline(this.pipeline);
|
|
38307
|
+
pass.setBindGroup(0, bindGroup);
|
|
38308
|
+
pass.draw(3);
|
|
38309
|
+
pass.end();
|
|
38310
|
+
}
|
|
38311
|
+
};
|
|
37966
38312
|
function isKtx2(bytes) {
|
|
37967
38313
|
return bytes.length >= KTX2_IDENTIFIER.length && KTX2_IDENTIFIER.every((byte, i) => bytes[i] === byte);
|
|
37968
38314
|
}
|
|
@@ -38327,6 +38673,9 @@ struct TextModelUniforms {
|
|
|
38327
38673
|
materialParams : vec4<f32>, // x = shininess, y = specularIntensity, z = ambientIntensity, w = materialMode (0=unlit, 1=lit)
|
|
38328
38674
|
pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
|
|
38329
38675
|
emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
|
|
38676
|
+
toonShadow : vec4<f32>, // rgb shadow-side multiplier, w diffuse modelling
|
|
38677
|
+
toonLight : vec4<f32>, // rgb lit-side multiplier, w terminator threshold
|
|
38678
|
+
toonParams : vec4<f32>, // x terminator softness, y outline participation
|
|
38330
38679
|
};
|
|
38331
38680
|
|
|
38332
38681
|
@group(0) @binding(0) var<uniform> cam : CameraUniforms;
|
|
@@ -38459,7 +38808,7 @@ fn shadeText(in : VSOut, fw : vec2<f32>) -> TextFragment {
|
|
|
38459
38808
|
if (shaded.a < 0.0001) {
|
|
38460
38809
|
return out;
|
|
38461
38810
|
}
|
|
38462
|
-
let lit = shadeSurfaceFull(in.worldPos, in.worldNormal, shaded.rgb / shaded.a, model.materialParams, model.pbr, model.emissive);
|
|
38811
|
+
let lit = shadeSurfaceFull(in.worldPos, in.worldNormal, shaded.rgb / shaded.a, model.materialParams, model.pbr, model.emissive, model.toonShadow, model.toonLight, model.toonParams);
|
|
38463
38812
|
out.color = vec4<f32>(lit.display * shaded.a, shaded.a);
|
|
38464
38813
|
out.hdr = vec4<f32>(lit.hdr * shaded.a, shaded.a);
|
|
38465
38814
|
return out;
|
|
@@ -38500,7 +38849,7 @@ struct MrtBloomOutput {
|
|
|
38500
38849
|
@fragment fn fs_mrt(in : VSOut) -> MrtOutput {
|
|
38501
38850
|
var out : MrtOutput;
|
|
38502
38851
|
out.color = textFragment(in).color;
|
|
38503
|
-
out.depth =
|
|
38852
|
+
out.depth = geometryPixel(in.linearDepth, in.worldNormal, model.toonParams.y);
|
|
38504
38853
|
return out;
|
|
38505
38854
|
}
|
|
38506
38855
|
|
|
@@ -38516,7 +38865,7 @@ struct MrtBloomOutput {
|
|
|
38516
38865
|
let f = textFragment(in);
|
|
38517
38866
|
var out : MrtBloomOutput;
|
|
38518
38867
|
out.color = f.color;
|
|
38519
|
-
out.depth =
|
|
38868
|
+
out.depth = geometryPixel(in.linearDepth, in.worldNormal, model.toonParams.y);
|
|
38520
38869
|
out.hdr = f.hdr;
|
|
38521
38870
|
return out;
|
|
38522
38871
|
}
|
|
@@ -39580,6 +39929,8 @@ var Renderer3D = class {
|
|
|
39580
39929
|
shadowSampler = null;
|
|
39581
39930
|
meshBounds = /* @__PURE__ */ new WeakMap();
|
|
39582
39931
|
bloomPipeline = null;
|
|
39932
|
+
outlinePipeline = null;
|
|
39933
|
+
geometryResolvePipeline = null;
|
|
39583
39934
|
lastCameraBuffer = null;
|
|
39584
39935
|
/**
|
|
39585
39936
|
* Samples per pixel in the 3D pass. Mesh silhouettes (extruded text,
|
|
@@ -39646,7 +39997,39 @@ var Renderer3D = class {
|
|
|
39646
39997
|
primitive: { topology: "triangle-list" }
|
|
39647
39998
|
});
|
|
39648
39999
|
}
|
|
40000
|
+
/**
|
|
40001
|
+
* Size-dependent render targets, by label, size, samples and usage. One
|
|
40002
|
+
* frame (one command buffer) can render 3D scenes of different sizes, so
|
|
40003
|
+
* a target is never destroyed while the frame may use it: targets the last
|
|
40004
|
+
* frame did not use are destroyed at the next `resetPools`.
|
|
40005
|
+
*/
|
|
40006
|
+
attachments = /* @__PURE__ */ new Map();
|
|
40007
|
+
attachmentsUsed = /* @__PURE__ */ new Set();
|
|
40008
|
+
attachment(label, width, height, desc) {
|
|
40009
|
+
const key = `${label}:${width}x${height}:${desc.sampleCount ?? 1}:${desc.usage}`;
|
|
40010
|
+
this.attachmentsUsed.add(key);
|
|
40011
|
+
let texture = this.attachments.get(key);
|
|
40012
|
+
if (!texture) {
|
|
40013
|
+
texture = this.device.createTexture({
|
|
40014
|
+
label,
|
|
40015
|
+
size: {
|
|
40016
|
+
width,
|
|
40017
|
+
height
|
|
40018
|
+
},
|
|
40019
|
+
...desc
|
|
40020
|
+
});
|
|
40021
|
+
this.attachments.set(key, texture);
|
|
40022
|
+
}
|
|
40023
|
+
return texture;
|
|
40024
|
+
}
|
|
39649
40025
|
resetPools() {
|
|
40026
|
+
for (const [key, texture] of this.attachments) {
|
|
40027
|
+
if (this.attachmentsUsed.has(key)) continue;
|
|
40028
|
+
texture.destroy();
|
|
40029
|
+
this.attachments.delete(key);
|
|
40030
|
+
}
|
|
40031
|
+
this.attachmentsUsed.clear();
|
|
40032
|
+
this.outlinePipeline?.reset();
|
|
39650
40033
|
this.bloomPipeline?.resetPools();
|
|
39651
40034
|
this.cameraPool.reset();
|
|
39652
40035
|
this.lastCameraPose = null;
|
|
@@ -39661,33 +40044,18 @@ var Renderer3D = class {
|
|
|
39661
40044
|
this.morphPipeline.resetPools();
|
|
39662
40045
|
}
|
|
39663
40046
|
getOrCreateDepthTexture(width, height) {
|
|
39664
|
-
|
|
39665
|
-
|
|
39666
|
-
|
|
39667
|
-
|
|
39668
|
-
|
|
39669
|
-
width,
|
|
39670
|
-
height
|
|
39671
|
-
},
|
|
39672
|
-
format: "depth24plus",
|
|
39673
|
-
sampleCount: this.sampleCount,
|
|
39674
|
-
usage: GPUTextureUsage.RENDER_ATTACHMENT
|
|
39675
|
-
});
|
|
39676
|
-
}
|
|
40047
|
+
this.depthTexture = this.attachment("Renderer3DDepthTexture", width, height, {
|
|
40048
|
+
format: "depth24plus",
|
|
40049
|
+
sampleCount: this.sampleCount,
|
|
40050
|
+
usage: GPUTextureUsage.RENDER_ATTACHMENT
|
|
40051
|
+
});
|
|
39677
40052
|
return this.depthTexture;
|
|
39678
40053
|
}
|
|
39679
|
-
getOrCreateMsaaTexture(
|
|
39680
|
-
|
|
39681
|
-
current?.destroy();
|
|
39682
|
-
return this.device.createTexture({
|
|
39683
|
-
label,
|
|
39684
|
-
size: {
|
|
39685
|
-
width,
|
|
39686
|
-
height
|
|
39687
|
-
},
|
|
40054
|
+
getOrCreateMsaaTexture(_current, label, format, width, height, sampled = false) {
|
|
40055
|
+
return this.attachment(label, width, height, {
|
|
39688
40056
|
format,
|
|
39689
40057
|
sampleCount: this.sampleCount,
|
|
39690
|
-
usage: GPUTextureUsage.RENDER_ATTACHMENT
|
|
40058
|
+
usage: GPUTextureUsage.RENDER_ATTACHMENT | (sampled ? GPUTextureUsage.TEXTURE_BINDING : 0)
|
|
39691
40059
|
});
|
|
39692
40060
|
}
|
|
39693
40061
|
/** The HDR radiance target the last `beginPass(…, writeHdr)` drew into. */
|
|
@@ -39695,110 +40063,54 @@ var Renderer3D = class {
|
|
|
39695
40063
|
return this.hdrTexture;
|
|
39696
40064
|
}
|
|
39697
40065
|
getOrCreateHdrTexture(width, height) {
|
|
39698
|
-
|
|
39699
|
-
|
|
39700
|
-
|
|
39701
|
-
|
|
39702
|
-
size: {
|
|
39703
|
-
width,
|
|
39704
|
-
height
|
|
39705
|
-
},
|
|
39706
|
-
format: "rgba16float",
|
|
39707
|
-
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
|
|
39708
|
-
});
|
|
39709
|
-
}
|
|
40066
|
+
this.hdrTexture = this.attachment("Renderer3DHdrRadiance", width, height, {
|
|
40067
|
+
format: "rgba16float",
|
|
40068
|
+
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
|
|
40069
|
+
});
|
|
39710
40070
|
return this.hdrTexture;
|
|
39711
40071
|
}
|
|
39712
40072
|
getOrCreateLinearDepthTexture(width, height) {
|
|
39713
|
-
|
|
39714
|
-
|
|
39715
|
-
|
|
39716
|
-
|
|
39717
|
-
size: {
|
|
39718
|
-
width,
|
|
39719
|
-
height
|
|
39720
|
-
},
|
|
39721
|
-
format: "rgba16float",
|
|
39722
|
-
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
|
|
39723
|
-
});
|
|
39724
|
-
}
|
|
40073
|
+
this.linearDepthTexture = this.attachment("Renderer3DLinearDepthTexture", width, height, {
|
|
40074
|
+
format: "rgba16float",
|
|
40075
|
+
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
|
|
40076
|
+
});
|
|
39725
40077
|
return this.linearDepthTexture;
|
|
39726
40078
|
}
|
|
39727
40079
|
getOrCreateReflectionTexture(width, height) {
|
|
39728
|
-
|
|
39729
|
-
this.
|
|
39730
|
-
|
|
39731
|
-
|
|
39732
|
-
size: {
|
|
39733
|
-
width,
|
|
39734
|
-
height
|
|
39735
|
-
},
|
|
39736
|
-
format: this.format,
|
|
39737
|
-
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
|
|
39738
|
-
});
|
|
39739
|
-
}
|
|
40080
|
+
this.reflectionColorTexture = this.attachment("Renderer3DReflectionColor", width, height, {
|
|
40081
|
+
format: this.format,
|
|
40082
|
+
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
|
|
40083
|
+
});
|
|
39740
40084
|
return this.reflectionColorTexture;
|
|
39741
40085
|
}
|
|
39742
40086
|
getOrCreateReflectionMsaaTexture(width, height) {
|
|
39743
|
-
|
|
39744
|
-
this.
|
|
39745
|
-
|
|
39746
|
-
|
|
39747
|
-
|
|
39748
|
-
width,
|
|
39749
|
-
height
|
|
39750
|
-
},
|
|
39751
|
-
format: this.format,
|
|
39752
|
-
sampleCount: this.sampleCount,
|
|
39753
|
-
usage: GPUTextureUsage.RENDER_ATTACHMENT
|
|
39754
|
-
});
|
|
39755
|
-
}
|
|
40087
|
+
this.reflectionMsaaColorTexture = this.attachment("Renderer3DReflectionMsaaColor", width, height, {
|
|
40088
|
+
format: this.format,
|
|
40089
|
+
sampleCount: this.sampleCount,
|
|
40090
|
+
usage: GPUTextureUsage.RENDER_ATTACHMENT
|
|
40091
|
+
});
|
|
39756
40092
|
return this.reflectionMsaaColorTexture;
|
|
39757
40093
|
}
|
|
39758
40094
|
getOrCreateReflectionDepthTexture(width, height) {
|
|
39759
|
-
|
|
39760
|
-
|
|
39761
|
-
|
|
39762
|
-
|
|
39763
|
-
|
|
39764
|
-
width,
|
|
39765
|
-
height
|
|
39766
|
-
},
|
|
39767
|
-
format: "depth24plus",
|
|
39768
|
-
sampleCount: this.sampleCount,
|
|
39769
|
-
usage: GPUTextureUsage.RENDER_ATTACHMENT
|
|
39770
|
-
});
|
|
39771
|
-
}
|
|
40095
|
+
this.reflectionDepthTexture = this.attachment("Renderer3DReflectionDepth", width, height, {
|
|
40096
|
+
format: "depth24plus",
|
|
40097
|
+
sampleCount: this.sampleCount,
|
|
40098
|
+
usage: GPUTextureUsage.RENDER_ATTACHMENT
|
|
40099
|
+
});
|
|
39772
40100
|
return this.reflectionDepthTexture;
|
|
39773
40101
|
}
|
|
39774
40102
|
getOrCreateReflectionTempTexture(width, height) {
|
|
39775
|
-
|
|
39776
|
-
this.
|
|
39777
|
-
|
|
39778
|
-
|
|
39779
|
-
size: {
|
|
39780
|
-
width,
|
|
39781
|
-
height
|
|
39782
|
-
},
|
|
39783
|
-
format: this.format,
|
|
39784
|
-
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
|
|
39785
|
-
});
|
|
39786
|
-
}
|
|
40103
|
+
this.reflectionTempTexture = this.attachment("Renderer3DReflectionTemp", width, height, {
|
|
40104
|
+
format: this.format,
|
|
40105
|
+
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
|
|
40106
|
+
});
|
|
39787
40107
|
return this.reflectionTempTexture;
|
|
39788
40108
|
}
|
|
39789
40109
|
getOrCreateReflectionBlurredTexture(width, height) {
|
|
39790
|
-
|
|
39791
|
-
this.
|
|
39792
|
-
|
|
39793
|
-
|
|
39794
|
-
size: {
|
|
39795
|
-
width,
|
|
39796
|
-
height
|
|
39797
|
-
},
|
|
39798
|
-
format: this.format,
|
|
39799
|
-
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
|
|
39800
|
-
});
|
|
39801
|
-
}
|
|
40110
|
+
this.reflectionBlurredTexture = this.attachment("Renderer3DReflectionBlurred", width, height, {
|
|
40111
|
+
format: this.format,
|
|
40112
|
+
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
|
|
40113
|
+
});
|
|
39802
40114
|
return this.reflectionBlurredTexture;
|
|
39803
40115
|
}
|
|
39804
40116
|
packCameraUniforms(camera, surfaceWidth, surfaceHeight, time$2 = 0) {
|
|
@@ -40080,16 +40392,22 @@ var Renderer3D = class {
|
|
|
40080
40392
|
storeOp: "store",
|
|
40081
40393
|
clearValue
|
|
40082
40394
|
};
|
|
40083
|
-
if (msaa) this.msaaColorTexture = this.getOrCreateMsaaTexture(this.msaaColorTexture, "Renderer3DMsaaColor", this.format, surfaceWidth, surfaceHeight);
|
|
40395
|
+
if (msaa) this.msaaColorTexture = this.getOrCreateMsaaTexture(this.msaaColorTexture, "Renderer3DMsaaColor", this.format, surfaceWidth, surfaceHeight, Boolean(world?.environment?.outlines));
|
|
40084
40396
|
const colorAttachments = [attach(colorTargetView, msaa ? this.msaaColorTexture : null, clearColor, loadOp)];
|
|
40397
|
+
if (msaa && world?.environment?.outlines) colorAttachments[0].storeOp = "store";
|
|
40085
40398
|
if (linearDepthTargetView) {
|
|
40086
|
-
if (msaa) this.msaaLinearDepthTexture = this.getOrCreateMsaaTexture(this.msaaLinearDepthTexture, "Renderer3DMsaaLinearDepth", "rgba16float", surfaceWidth, surfaceHeight);
|
|
40087
|
-
|
|
40088
|
-
r: camera.far,
|
|
40089
|
-
g:
|
|
40090
|
-
b:
|
|
40091
|
-
a:
|
|
40092
|
-
}, "clear")
|
|
40399
|
+
if (msaa) this.msaaLinearDepthTexture = this.getOrCreateMsaaTexture(this.msaaLinearDepthTexture, "Renderer3DMsaaLinearDepth", "rgba16float", surfaceWidth, surfaceHeight, true);
|
|
40400
|
+
const geometryAttachment = attach(linearDepthTargetView, msaa ? this.msaaLinearDepthTexture : null, {
|
|
40401
|
+
r: Math.min(camera.far, 65504),
|
|
40402
|
+
g: .5,
|
|
40403
|
+
b: .5,
|
|
40404
|
+
a: 0
|
|
40405
|
+
}, "clear");
|
|
40406
|
+
if (msaa && world?.environment?.outlines) {
|
|
40407
|
+
geometryAttachment.resolveTarget = void 0;
|
|
40408
|
+
geometryAttachment.storeOp = "store";
|
|
40409
|
+
}
|
|
40410
|
+
colorAttachments.push(geometryAttachment);
|
|
40093
40411
|
}
|
|
40094
40412
|
this.passWritesHdr = writeHdr;
|
|
40095
40413
|
if (writeHdr) {
|
|
@@ -40180,8 +40498,9 @@ var Renderer3D = class {
|
|
|
40180
40498
|
this.floorReflectionPipeline.draw(pass, cameraBindGroup, lightsBindGroup, reflectionTexture, floor, useMrt, useBloom);
|
|
40181
40499
|
}
|
|
40182
40500
|
/**
|
|
40183
|
-
* A
|
|
40184
|
-
*
|
|
40501
|
+
* A centered unit quad in world space. Translate to the authored pivot,
|
|
40502
|
+
* rotate and scale, then offset the unit quad back from that pivot.
|
|
40503
|
+
* Shared with children in preserve-3d containers.
|
|
40185
40504
|
*/
|
|
40186
40505
|
quadModelMatrix(opts) {
|
|
40187
40506
|
if (opts.modelMatrix) return opts.modelMatrix;
|
|
@@ -40195,7 +40514,7 @@ var Renderer3D = class {
|
|
|
40195
40514
|
1
|
|
40196
40515
|
], anchor = [.5, .5] } = opts;
|
|
40197
40516
|
let m = Matrix4Math.identity();
|
|
40198
|
-
m = Matrix4Math.multiply(m, Matrix4Math.translate(position[0], position[1], position[2]));
|
|
40517
|
+
m = Matrix4Math.multiply(m, Matrix4Math.translate(position[0] + (anchor[0] - .5) * width, position[1] + (anchor[1] - .5) * height, position[2]));
|
|
40199
40518
|
const rxRad = rotation[0] * Math.PI / 180;
|
|
40200
40519
|
const ryRad = rotation[1] * Math.PI / 180;
|
|
40201
40520
|
const rzRad = rotation[2] * Math.PI / 180;
|
|
@@ -40260,6 +40579,8 @@ var Renderer3D = class {
|
|
|
40260
40579
|
metallic: opts.metallic,
|
|
40261
40580
|
emissive: opts.emissive,
|
|
40262
40581
|
emissiveIntensity: opts.emissiveIntensity,
|
|
40582
|
+
toon: opts.toon,
|
|
40583
|
+
outline: opts.outline,
|
|
40263
40584
|
matte: opts.matte
|
|
40264
40585
|
}, useMrt, this.passWritesHdr);
|
|
40265
40586
|
}
|
|
@@ -40305,6 +40626,8 @@ var Renderer3D = class {
|
|
|
40305
40626
|
metallic,
|
|
40306
40627
|
emissive: opts.emissive,
|
|
40307
40628
|
emissiveIntensity: opts.emissiveIntensity,
|
|
40629
|
+
toon: opts.toon,
|
|
40630
|
+
outline: opts.outline,
|
|
40308
40631
|
matte: opts.matte,
|
|
40309
40632
|
relief: opts.relief
|
|
40310
40633
|
}, useMrt, this.passWritesHdr);
|
|
@@ -40548,6 +40871,8 @@ var Renderer3D = class {
|
|
|
40548
40871
|
metallic,
|
|
40549
40872
|
emissive: opts.emissive,
|
|
40550
40873
|
emissiveIntensity: opts.emissiveIntensity,
|
|
40874
|
+
toon: opts.toon,
|
|
40875
|
+
outline: opts.outline,
|
|
40551
40876
|
matte: opts.matte,
|
|
40552
40877
|
maps: opts.maps,
|
|
40553
40878
|
isInstanced: Boolean(opts.instanceBuffer || opts.instanceCount && opts.instanceCount > 1),
|
|
@@ -40702,6 +41027,23 @@ var Renderer3D = class {
|
|
|
40702
41027
|
this.bloomPipeline ??= new BloomPipeline(this.device);
|
|
40703
41028
|
this.bloomPipeline.apply(encoder, source, dest, options, hdrSource ?? void 0);
|
|
40704
41029
|
}
|
|
41030
|
+
/** Geometry ink is applied before lens blur, independently of material shading. */
|
|
41031
|
+
resolveGeometry(encoder, geometry) {
|
|
41032
|
+
if (this.sampleCount <= 1 || !this.msaaLinearDepthTexture) return;
|
|
41033
|
+
this.geometryResolvePipeline ??= new GeometryResolvePipeline(this.device);
|
|
41034
|
+
this.geometryResolvePipeline.render(encoder, this.msaaLinearDepthTexture, geometry.createView());
|
|
41035
|
+
}
|
|
41036
|
+
applyOutlines(encoder, source, geometry, dest, camera, options, fog) {
|
|
41037
|
+
let colorSource = source;
|
|
41038
|
+
let geometrySource = geometry;
|
|
41039
|
+
if (this.sampleCount > 1) {
|
|
41040
|
+
if (!this.msaaColorTexture || !this.msaaLinearDepthTexture) throw new Error("Geometry outlines require the scene's retained MSAA color and geometry samples");
|
|
41041
|
+
colorSource = this.msaaColorTexture;
|
|
41042
|
+
geometrySource = this.msaaLinearDepthTexture;
|
|
41043
|
+
}
|
|
41044
|
+
this.outlinePipeline ??= new GeometryOutlinePipeline(this.device, this.format, this.sampleCount);
|
|
41045
|
+
this.outlinePipeline.render(encoder, colorSource, geometrySource, dest, camera, options, fog);
|
|
41046
|
+
}
|
|
40705
41047
|
applyDepthOfField(encoder, sourceColorTex, depthTex, destView, cameraBuffer) {
|
|
40706
41048
|
const sampler = this.samplerCache.getSampler(this.device);
|
|
40707
41049
|
const bindGroup = this.device.createBindGroup({
|
|
@@ -40754,7 +41096,10 @@ var Renderer3D = class {
|
|
|
40754
41096
|
}, useMrt);
|
|
40755
41097
|
}
|
|
40756
41098
|
destroy() {
|
|
41099
|
+
for (const texture of this.attachments.values()) texture.destroy();
|
|
41100
|
+
this.attachments.clear();
|
|
40757
41101
|
this.bloomPipeline?.destroy();
|
|
41102
|
+
this.outlinePipeline?.destroy();
|
|
40758
41103
|
this.depthTexture?.destroy();
|
|
40759
41104
|
for (const texture of this.shadowTextures.values()) texture.destroy();
|
|
40760
41105
|
this.shadowTextures.clear();
|
|
@@ -41786,4 +42131,4 @@ if (typeof globalThis !== "undefined") globalThis.__GATEWAI_DELAYS__ = globalThi
|
|
|
41786
42131
|
|
|
41787
42132
|
//#endregion
|
|
41788
42133
|
export { poseNodes as $, TextAnchorConfigSchema as $t, emojiGraphemes as A, evaluateSkewMatrix as An, AnimatableGlyphPropsSchema as At, jointMatrices as B, sampleCurveGeometry as Bn, GlyphAnchorPointSchema as Bt, drawGifNode as C, distanceToCurveParameter as Cn, parseColorToRgb as Ct, drawSignalNode as D, evaluateExpressionSelector as Dn, AdvancedTextAnimatorSchema as Dt, drawParagraphNode as E, evaluateCubicBezierDerivative as En, AdvancedTextAnimatorBuilder as Et, getPrimitiveGeometry as F, generatePathSegments as Fn, DynamicStrokePropertiesSchema as Ft, measureMaxCaptionHeight as G, SelectorBasedOnSchema as Gt, loadModel3D as H, signalRegistry as Hn, LineSpacingDynamicsSchema as Ht, getRegisteredFontSource as I, getScramblePool as In, EnhancedTextNodeSchema as It, parseDashArray as J, SelectorUnitsSchema as Jt, mediaDecoderCache as K, SelectorModeSchema as Kt, getRenderer2D as L, getShuffledOrder as Ln, ExpressionSelectorSchema as Lt, fitSpansToText as M, evaluateTypewriterState as Mn, AudioSpectrumTypographySchema as Mt, generateExtrudedTextGeometry as N, evaluateVolumetricFormation as Nn, ChromaticGlitchConfigSchema as Nt, drawSvgNode as O, evaluateMarqueeOffset as On, AnchorGroupingSchema as Ot, getHeadlessFontPath as P, generateArcLengthLUT as Pn, CubicBezierSegmentSchema as Pt, parseSvgPathToSegments as Q, SpringPhysicsSchema as Qt, initHeadlessWebGPU as R, parseSvgPathToCubicBeziers as Rn, ExtendedGlyphPropertiesSchema as Rt, drawCaptionNode as S, deterministicWigglyNoise as Sn, linearRgb as St, drawLottieNode as T, evaluateCubicBezier as Tn, AETextAnimatorSchema as Tt, loadOBJ as U, waveToCubicBeziers as Un, LongShadowConfigSchema as Ut, loadFBX as V, samplePathChainGeometry as Vn, KineticMarqueeConfigSchema as Vt, lutStore as W, ParticleDissolveConfigSchema as Wt, parseMTL as X, SkewPropertiesSchema as Xt, parseFBX as Y, SignalRegistry as Yt, parseOBJ as Z, Spatial3DPropertiesSchema as Zt, buildShapeSvgPath as _, buildPathLUT as _n, Light3D as _t, GlassPipeline as a, TextPathSourceSchema as an, setRegisteredFontSource as at, colorMatrixWgsl as b, computeLineLeadingDisplacement as bn, Path3D as bt, Renderer2D as c, TextSelectorSchema as cn, srtLoader as ct, ScreenSpaceRelightPipeline as d, TypewriterAnimatorSchema as dn, transformScale as dt, TextAnimatorBuilder as en, probeVideoSize as et, ShadowPipeline as f, TypingCadenceSchema as fn, GetFontAssetUrl as ft, WebGPUAudioProcessor as g, VolumetricFormationModeSchema as gn, LIGHT_UNIFORM_SIZE_BYTES as gt, SlugPipeline as h, VolumetricFormationConfigSchema as hn, ENVIRONMENT_PRESETS as ht, EffectPipeline as i, TextPathOptionsSchema as in, sampleMorphWeights as it, ensureDevice as j, evaluateSpringProgress as jn, AudioSignalComputePipeline as jt, drawVideoNode as k, evaluateSelectorCombination as kn, AnchorPresetSchema as kt, Renderer3D as l, TextSignalSelectorSchema as ln, textureCache as lt, SlugGeometry as m, Vec2Schema as mn, Camera3D as mt, AudioLatentTrackCache as n, TextCursorStyleSchema as nn, resolveInputUrl as nt, MotionBlurPipeline as o, TextRangeSelectorSchema as on, shaderStore as ot, SlugFontCache as p, VariableFontAxesSchema as pn, resolveMediaSourceUrl as pt, parseColor as q, SelectorShapeSchema as qt, AudioMeshDeformPipeline as r, TextPathBuilder as rn, resolveTextSpans as rt, NodeSurfaceProvider as s, TextScrambleConfigSchema as sn, spansText as st, AudioLatentEngine as t, TextCursorConfigSchema as tn, registerHeadlessFont as tt, SSAOPipeline as u, TextWigglySelectorSchema as un, trackAudioPitch as ut, clearAllVideoCache as v, buildWGSLSignalFn as vn, MAX_LIGHTS as vt, drawImageNode as w, ellipseToCubicBeziers as wn, resolveEnvironment as wt, describeGpu as x, computeRangeSelectorWeight as xn, Vector3Math as xt, clearHeadlessFonts as y, computeAnchorPivotOffset as yn, Matrix4Math as yt, inputStore as z, sampleAudioSpectrumScale as zn, GlyphAnchorGroupingSchema as zt };
|
|
41789
|
-
//# sourceMappingURL=dist
|
|
42134
|
+
//# sourceMappingURL=dist--Uu5bQ_6.mjs.map
|