framefields 2.2.0-beta.4 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -2
- package/dist/audio/index.d.mts +4 -4
- package/dist/audio/index.mjs +10 -10
- package/dist/{audio-BvYmTu5T.d.mts → audio-BNnEclHU.d.mts} +3 -3
- package/dist/{audio-BvYmTu5T.d.mts.map → audio-BNnEclHU.d.mts.map} +1 -1
- package/dist/{audio-DMUr01vS.mjs → audio-ChRqnFwB.mjs} +3 -3
- package/dist/{audio-DMUr01vS.mjs.map → audio-ChRqnFwB.mjs.map} +1 -1
- package/dist/{dist-cjxDXQdx.mjs → dist-PwT_Vmax.mjs} +102 -6
- package/dist/{dist-cjxDXQdx.mjs.map → dist-PwT_Vmax.mjs.map} +1 -1
- package/dist/{dist-CT___nEU.mjs → dist-t-NLlnhM.mjs} +7 -5
- package/dist/dist-t-NLlnhM.mjs.map +1 -0
- package/dist/effects/index.d.mts +5 -5
- package/dist/effects/index.mjs +36 -36
- package/dist/{effects-C06-AOge.mjs → effects-Duoqc_Oa.mjs} +532 -4
- package/dist/effects-Duoqc_Oa.mjs.map +1 -0
- package/dist/fonts/index.d.mts +1 -1
- package/dist/fonts/index.mjs +2 -2
- package/dist/{fonts-C0UuLQvr.mjs → fonts-CgNmeFXh.mjs} +2 -2
- package/dist/{fonts-C0UuLQvr.mjs.map → fonts-CgNmeFXh.mjs.map} +1 -1
- package/dist/{gpu-Du7GpVFW.mjs → gpu-1ZpAuQOR.mjs} +2 -2
- package/dist/{gpu-Du7GpVFW.mjs.map → gpu-1ZpAuQOR.mjs.map} +1 -1
- package/dist/{index-B-oUlLoO.d.mts → index-AdrZIWT0.d.mts} +27 -2
- package/dist/index-AdrZIWT0.d.mts.map +1 -0
- package/dist/{index-BcA8rep0.d.mts → index-B-55dXDu.d.mts} +1 -1
- package/dist/{index-BcA8rep0.d.mts.map → index-B-55dXDu.d.mts.map} +1 -1
- package/dist/{index-D-Iek5sq.d.mts → index-B3BwLHa6.d.mts} +3 -3
- package/dist/{index-D-Iek5sq.d.mts.map → index-B3BwLHa6.d.mts.map} +1 -1
- package/dist/{index-CwbszPDG.d.mts → index-BU51pxZO.d.mts} +956 -9
- package/dist/index-BU51pxZO.d.mts.map +1 -0
- package/dist/{index-XdQPNJnq.d.mts → index-CeRv1KC0.d.mts} +3 -3
- package/dist/{index-XdQPNJnq.d.mts.map → index-CeRv1KC0.d.mts.map} +1 -1
- package/dist/{index-DXfp_T-3.d.mts → index-Cg2ptXcs.d.mts} +2 -2
- package/dist/{index-DXfp_T-3.d.mts.map → index-Cg2ptXcs.d.mts.map} +1 -1
- package/dist/{index-CdyE1tst.d.mts → index-QmkcUL3W.d.mts} +2 -2
- package/dist/{index-CdyE1tst.d.mts.map → index-QmkcUL3W.d.mts.map} +1 -1
- package/dist/index.d.mts +1438 -66
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +3122 -83
- package/dist/index.mjs.map +1 -1
- package/dist/preview/index.d.mts +2 -2
- package/dist/preview/index.mjs +10 -10
- package/dist/{preview-M0TsUzC6.mjs → preview-CArsjmkd.mjs} +2 -2
- package/dist/{preview-M0TsUzC6.mjs.map → preview-CArsjmkd.mjs.map} +1 -1
- package/dist/preview-engine/audio.mjs +1 -1
- package/dist/preview-engine/chunk-2JKXYG6J.mjs +127 -0
- package/dist/preview-engine/chunk-7I7PKKDL.mjs +214 -0
- package/dist/preview-engine/chunk-BQY4BUMN.mjs +1 -0
- package/dist/preview-engine/{chunk-RSMO7NPN.mjs → chunk-BSOJR4JU.mjs} +1 -1
- package/dist/preview-engine/chunk-BVA5NGSH.mjs +1 -0
- package/dist/preview-engine/chunk-DLAHSLNX.mjs +1522 -0
- package/dist/preview-engine/{chunk-ZTHWCQ2A.mjs → chunk-FNE22WGA.mjs} +1 -1
- package/dist/preview-engine/chunk-KERW7QJ4.mjs +174 -0
- package/dist/preview-engine/{chunk-7B5S5D4N.mjs → chunk-TPAEN6VV.mjs} +1 -1
- package/dist/preview-engine/chunk-YQRKT47I.mjs +1 -0
- package/dist/preview-engine/crypto-W5UAWSNT.mjs +1 -0
- package/dist/preview-engine/effects.mjs +1 -1
- package/dist/preview-engine/framefields.mjs +26 -26
- package/dist/preview-engine/player.mjs +5 -5
- package/dist/preview-engine/rapier-AHBIGHEL.mjs +1 -0
- package/dist/preview-engine/rapier-JD7KNQRV.mjs +1 -0
- package/dist/preview-engine/renderers-527ONFIA.mjs +228 -0
- package/dist/preview-engine/renderers-6ODPWZ2R.mjs +96 -0
- package/dist/preview-engine/renderers-7NCG6BYS.mjs +94 -0
- package/dist/preview-engine/renderers-BGGRPAVV.mjs +363 -0
- package/dist/preview-engine/renderers-DN2GF3I7.mjs +82 -0
- package/dist/preview-engine/renderers-FGHOLJJK.mjs +44 -0
- package/dist/preview-engine/renderers-FK72LKQC.mjs +275 -0
- package/dist/preview-engine/renderers-FQWWAETX.mjs +203 -0
- package/dist/preview-engine/renderers-HMR2NAD7.mjs +81 -0
- package/dist/preview-engine/renderers-HUW2ZMS3.mjs +1 -0
- package/dist/preview-engine/renderers-JLFGBYN4.mjs +78 -0
- package/dist/preview-engine/renderers-LLUEOW5T.mjs +77 -0
- package/dist/preview-engine/renderers-NC64EQDE.mjs +1 -0
- package/dist/preview-engine/renderers-PVYP2ONH.mjs +76 -0
- package/dist/preview-engine/renderers-TPBPNXWH.mjs +26 -0
- package/dist/preview-engine/renderers-UJ4YVJZT.mjs +80 -0
- package/dist/preview-engine/renderers-WHBDHTRI.mjs +78 -0
- package/dist/preview-engine/renderers-WP67KK5K.mjs +89 -0
- package/dist/preview-engine/renderers-YNFKFM7D.mjs +67 -0
- package/dist/preview-engine/renderers-ZSENYGIY.mjs +84 -0
- package/dist/preview-engine/signals.mjs +1 -1
- package/dist/{program-DzknMiY0.mjs → program-Dd9tJFkY.mjs} +346 -13
- package/dist/program-Dd9tJFkY.mjs.map +1 -0
- package/dist/renderer/index.d.mts +2 -2
- package/dist/renderer/index.mjs +2 -2
- package/dist/{renderer-C8uKdelk.mjs → renderer-0L9MEb3A.mjs} +2 -2
- package/dist/{renderer-C8uKdelk.mjs.map → renderer-0L9MEb3A.mjs.map} +1 -1
- package/dist/renderer-0lp9ClNc.mjs +5 -0
- package/dist/{renderer-BbdZ0YHR.mjs → renderer-257LxOyx.mjs} +3 -3
- package/dist/{renderer-BbdZ0YHR.mjs.map → renderer-257LxOyx.mjs.map} +1 -1
- package/dist/renderer-2BnBo6CX.mjs +219 -0
- package/dist/renderer-2BnBo6CX.mjs.map +1 -0
- package/dist/renderer-4g_BfiKp.mjs +5 -0
- package/dist/renderer-72A4SvOE.mjs +220 -0
- package/dist/renderer-72A4SvOE.mjs.map +1 -0
- package/dist/renderer-7Aw6AHqW.mjs +5 -0
- package/dist/{renderer-PKQNH21k.mjs → renderer-7OvgLE8w.mjs} +2 -2
- package/dist/{renderer-BerD3T-X.mjs → renderer-94byj7Mk.mjs} +2 -2
- package/dist/{renderer-BerD3T-X.mjs.map → renderer-94byj7Mk.mjs.map} +1 -1
- package/dist/{renderer-D-vRKssW.mjs → renderer-B2aXfdW_.mjs} +2 -2
- package/dist/{renderer-D-vRKssW.mjs.map → renderer-B2aXfdW_.mjs.map} +1 -1
- package/dist/{renderer-DD8napek.mjs → renderer-B3c-j-e5.mjs} +2 -2
- package/dist/{renderer-DD8napek.mjs.map → renderer-B3c-j-e5.mjs.map} +1 -1
- package/dist/renderer-B3ypX3MH.mjs +308 -0
- package/dist/renderer-B3ypX3MH.mjs.map +1 -0
- package/dist/renderer-B82v8PyC.mjs +5 -0
- package/dist/renderer-B8BDMJNz.mjs +5 -0
- package/dist/renderer-BARst3ZD.mjs +3 -0
- package/dist/renderer-BCPRrhP8.mjs +5 -0
- package/dist/{renderer-CMT4QcpV.mjs → renderer-BEdc-7JW.mjs} +3 -3
- package/dist/{renderer-CMT4QcpV.mjs.map → renderer-BEdc-7JW.mjs.map} +1 -1
- package/dist/renderer-BEpANdcO.mjs +204 -0
- package/dist/renderer-BEpANdcO.mjs.map +1 -0
- package/dist/renderer-BFhzO6En.mjs +5 -0
- package/dist/renderer-BH0KF-y-.mjs +6 -0
- package/dist/renderer-BHrqEgIA.mjs +541 -0
- package/dist/renderer-BHrqEgIA.mjs.map +1 -0
- package/dist/{renderer-DpW_LxLO.mjs → renderer-BId5hBLb.mjs} +3 -3
- package/dist/{renderer-DpW_LxLO.mjs.map → renderer-BId5hBLb.mjs.map} +1 -1
- package/dist/renderer-BK32cV7E.mjs +203 -0
- package/dist/renderer-BK32cV7E.mjs.map +1 -0
- package/dist/renderer-BTI5ybyH.mjs +5 -0
- package/dist/{renderer-0gY4IQhM.mjs → renderer-BVR0mEIT.mjs} +2 -2
- package/dist/{renderer-0gY4IQhM.mjs.map → renderer-BVR0mEIT.mjs.map} +1 -1
- package/dist/{renderer-CebB0v1y.mjs → renderer-BY08hHFS.mjs} +2 -2
- package/dist/{renderer-CebB0v1y.mjs.map → renderer-BY08hHFS.mjs.map} +1 -1
- package/dist/renderer-Ba7LH8U2.mjs +5 -0
- package/dist/renderer-BcQBlfhC.mjs +5 -0
- package/dist/renderer-BdMJzCTz.mjs +5 -0
- package/dist/{renderer-D1Cm21eq.mjs → renderer-BmQbSQHf.mjs} +2 -2
- package/dist/{renderer-D1Cm21eq.mjs.map → renderer-BmQbSQHf.mjs.map} +1 -1
- package/dist/{renderer-DqdhsSwS.mjs → renderer-BmTDXIUI.mjs} +2 -2
- package/dist/{renderer-DqdhsSwS.mjs.map → renderer-BmTDXIUI.mjs.map} +1 -1
- package/dist/renderer-BpdzhZE7.mjs +224 -0
- package/dist/renderer-BpdzhZE7.mjs.map +1 -0
- package/dist/renderer-Bxi2j-tG.mjs +5 -0
- package/dist/{renderer-D8thCpS7.mjs → renderer-C-Qj0BnT.mjs} +3 -3
- package/dist/{renderer-D8thCpS7.mjs.map → renderer-C-Qj0BnT.mjs.map} +1 -1
- package/dist/{renderer-BiwIh_w4.mjs → renderer-C4tUATd_.mjs} +3 -3
- package/dist/{renderer-BiwIh_w4.mjs.map → renderer-C4tUATd_.mjs.map} +1 -1
- package/dist/{renderer-1vhaKMeg.mjs → renderer-CC72sZ8l.mjs} +141 -56
- package/dist/renderer-CC72sZ8l.mjs.map +1 -0
- package/dist/renderer-CCn5ISVM.mjs +5 -0
- package/dist/renderer-CDRsdhg9.mjs +5 -0
- package/dist/{renderer-BC8XOVl5.mjs → renderer-CI9Pq77W.mjs} +3 -3
- package/dist/{renderer-BC8XOVl5.mjs.map → renderer-CI9Pq77W.mjs.map} +1 -1
- package/dist/{renderer-CrABA3lB.mjs → renderer-CIMI33Yd.mjs} +2 -2
- package/dist/{renderer-CrABA3lB.mjs.map → renderer-CIMI33Yd.mjs.map} +1 -1
- package/dist/renderer-CKSdl0Xf.mjs +331 -0
- package/dist/renderer-CKSdl0Xf.mjs.map +1 -0
- package/dist/{renderer-Cce2fgpX.mjs → renderer-CKpwEo1w.mjs} +3 -3
- package/dist/{renderer-Cce2fgpX.mjs.map → renderer-CKpwEo1w.mjs.map} +1 -1
- package/dist/{renderer-CursFKUf.mjs → renderer-CLUyYFqS.mjs} +2 -2
- package/dist/{renderer-CursFKUf.mjs.map → renderer-CLUyYFqS.mjs.map} +1 -1
- package/dist/{renderer-Br6KyRO_.mjs → renderer-CS-goRD3.mjs} +3 -3
- package/dist/{renderer-Br6KyRO_.mjs.map → renderer-CS-goRD3.mjs.map} +1 -1
- package/dist/{renderer-DtgMsjyL.mjs → renderer-CSPpKLi3.mjs} +2 -2
- package/dist/{renderer-DtgMsjyL.mjs.map → renderer-CSPpKLi3.mjs.map} +1 -1
- package/dist/{renderer-CuVPo-wP.mjs → renderer-CWQ-Bct7.mjs} +2 -2
- package/dist/{renderer-CuVPo-wP.mjs.map → renderer-CWQ-Bct7.mjs.map} +1 -1
- package/dist/{renderer-DHGTzype.mjs → renderer-ChoYV7Ko.mjs} +2 -2
- package/dist/{renderer-DHGTzype.mjs.map → renderer-ChoYV7Ko.mjs.map} +1 -1
- package/dist/renderer-CiCK8ZG_.mjs +5 -0
- package/dist/{renderer-CJB9nU1x.mjs → renderer-Ck2pRec0.mjs} +3 -3
- package/dist/{renderer-CJB9nU1x.mjs.map → renderer-Ck2pRec0.mjs.map} +1 -1
- package/dist/{renderer-BzDjy1_x.mjs → renderer-CrUudSLP.mjs} +2 -2
- package/dist/{renderer-BzDjy1_x.mjs.map → renderer-CrUudSLP.mjs.map} +1 -1
- package/dist/{renderer-DupsdRIw.mjs → renderer-CraudZUC.mjs} +3 -3
- package/dist/{renderer-DupsdRIw.mjs.map → renderer-CraudZUC.mjs.map} +1 -1
- package/dist/renderer-CsEk9TFz.mjs +5 -0
- package/dist/renderer-CvOzuDX3.mjs +215 -0
- package/dist/renderer-CvOzuDX3.mjs.map +1 -0
- package/dist/{renderer-DJfFc-XW.mjs → renderer-Cvysm2Jg.mjs} +3 -3
- package/dist/{renderer-DJfFc-XW.mjs.map → renderer-Cvysm2Jg.mjs.map} +1 -1
- package/dist/{renderer-Bn2eQE-t.mjs → renderer-CwwmwM7J.mjs} +3 -3
- package/dist/{renderer-Bn2eQE-t.mjs.map → renderer-CwwmwM7J.mjs.map} +1 -1
- package/dist/{renderer-KnCcN_Nz.mjs → renderer-CxP2e6Ov.mjs} +2 -2
- package/dist/{renderer-KnCcN_Nz.mjs.map → renderer-CxP2e6Ov.mjs.map} +1 -1
- package/dist/{renderer-BteUC_7n.mjs → renderer-D-yNHLG7.mjs} +3 -3
- package/dist/{renderer-BteUC_7n.mjs.map → renderer-D-yNHLG7.mjs.map} +1 -1
- package/dist/renderer-D0xLIq1r.mjs +203 -0
- package/dist/renderer-D0xLIq1r.mjs.map +1 -0
- package/dist/{renderer-id8TbKBY.mjs → renderer-D1MOTlWS.mjs} +2 -2
- package/dist/{renderer-id8TbKBY.mjs.map → renderer-D1MOTlWS.mjs.map} +1 -1
- package/dist/renderer-D1T7A3NF.mjs +233 -0
- package/dist/renderer-D1T7A3NF.mjs.map +1 -0
- package/dist/renderer-D1gx_-hi.mjs +5 -0
- package/dist/renderer-D5MCGNAF.mjs +5 -0
- package/dist/{renderer-Db3JIF1K.mjs → renderer-D6YcQTLI.mjs} +3 -3
- package/dist/{renderer-Db3JIF1K.mjs.map → renderer-D6YcQTLI.mjs.map} +1 -1
- package/dist/{renderer-BNqwn0gZ.mjs → renderer-D8_UYdDb.mjs} +2 -2
- package/dist/{renderer-BNqwn0gZ.mjs.map → renderer-D8_UYdDb.mjs.map} +1 -1
- package/dist/renderer-DD_MzvM-.mjs +5 -0
- package/dist/{renderer-BHskWZNG.mjs → renderer-DIqwz7dV.mjs} +2 -2
- package/dist/{renderer-57ATc_mQ.mjs → renderer-DJQD7tai.mjs} +2 -2
- package/dist/{renderer-57ATc_mQ.mjs.map → renderer-DJQD7tai.mjs.map} +1 -1
- package/dist/{renderer-CWBHVCvA.mjs → renderer-DKXK5hDm.mjs} +2 -2
- package/dist/{renderer-CWBHVCvA.mjs.map → renderer-DKXK5hDm.mjs.map} +1 -1
- package/dist/{renderer-p_C_T9Kn.mjs → renderer-DNYSf2Fl.mjs} +2 -2
- package/dist/{renderer-p_C_T9Kn.mjs.map → renderer-DNYSf2Fl.mjs.map} +1 -1
- package/dist/{renderer-DXqIslFk.mjs → renderer-DNaHFctD.mjs} +2 -2
- package/dist/{renderer-DXqIslFk.mjs.map → renderer-DNaHFctD.mjs.map} +1 -1
- package/dist/renderer-DO5r7ZV-.mjs +658 -0
- package/dist/renderer-DO5r7ZV-.mjs.map +1 -0
- package/dist/renderer-DP7YoZ0K.mjs +5 -0
- package/dist/{renderer-CE7fwGgw.mjs → renderer-DQtk282o.mjs} +29 -8
- package/dist/renderer-DQtk282o.mjs.map +1 -0
- package/dist/{renderer-u8ynJtAC.mjs → renderer-DWcbrx2M.mjs} +2 -2
- package/dist/{renderer-u8ynJtAC.mjs.map → renderer-DWcbrx2M.mjs.map} +1 -1
- package/dist/renderer-DXiWvKij.mjs +5 -0
- package/dist/renderer-DZnUiiBp.mjs +222 -0
- package/dist/renderer-DZnUiiBp.mjs.map +1 -0
- package/dist/renderer-Dc6fW-o1.mjs +5 -0
- package/dist/renderer-DiurlsNT.mjs +5 -0
- package/dist/{renderer-BmGPTWwV.mjs → renderer-Dju3SEAJ.mjs} +3 -3
- package/dist/{renderer-BmGPTWwV.mjs.map → renderer-Dju3SEAJ.mjs.map} +1 -1
- package/dist/{renderer-BT-_EoXw.d.mts → renderer-DlESyfg7.d.mts} +2 -2
- package/dist/{renderer-BT-_EoXw.d.mts.map → renderer-DlESyfg7.d.mts.map} +1 -1
- package/dist/{renderer-aArb4RwJ.mjs → renderer-DpQaiH6C.mjs} +2 -2
- package/dist/{renderer-aArb4RwJ.mjs.map → renderer-DpQaiH6C.mjs.map} +1 -1
- package/dist/{renderer-CeyAgJnw.mjs → renderer-DuxzqfoE.mjs} +2 -2
- package/dist/renderer-DvCUdgVz.mjs +5 -0
- package/dist/{renderer-AF884a7T.mjs → renderer-Dvg5nbgU.mjs} +3 -3
- package/dist/{renderer-AF884a7T.mjs.map → renderer-Dvg5nbgU.mjs.map} +1 -1
- package/dist/{renderer-DvFaC_-7.mjs → renderer-Dvq11SEA.mjs} +2 -2
- package/dist/{renderer-DvFaC_-7.mjs.map → renderer-Dvq11SEA.mjs.map} +1 -1
- package/dist/renderer-DyPgVl1l.mjs +223 -0
- package/dist/renderer-DyPgVl1l.mjs.map +1 -0
- package/dist/{renderer-DEuIwr-t.mjs → renderer-DzOzVxNS.mjs} +2 -2
- package/dist/{renderer-DEuIwr-t.mjs.map → renderer-DzOzVxNS.mjs.map} +1 -1
- package/dist/renderer-EhCkD11e.mjs +208 -0
- package/dist/renderer-EhCkD11e.mjs.map +1 -0
- package/dist/renderer-IiwAh9-K.mjs +5 -0
- package/dist/{renderer-jqByPgkD.mjs → renderer-JiEpssIz.mjs} +2 -2
- package/dist/{renderer-jqByPgkD.mjs.map → renderer-JiEpssIz.mjs.map} +1 -1
- package/dist/renderer-JlGXqH0E.mjs +5 -0
- package/dist/{renderer-Beg7FLt2.mjs → renderer-OxafT7Xm.mjs} +75 -27
- package/dist/renderer-OxafT7Xm.mjs.map +1 -0
- package/dist/renderer-TZFKKgL1.mjs +5 -0
- package/dist/renderer-UT0CcmMZ.mjs +191 -0
- package/dist/renderer-UT0CcmMZ.mjs.map +1 -0
- package/dist/{renderer-YbaCzPcG.mjs → renderer-YyEBKPcE.mjs} +2 -2
- package/dist/{renderer-jYxN4mHn.mjs → renderer-_AuL8mAi.mjs} +3 -3
- package/dist/{renderer-jYxN4mHn.mjs.map → renderer-_AuL8mAi.mjs.map} +1 -1
- package/dist/{renderer-C6md3msE.mjs → renderer-aCDIEYb3.mjs} +2 -2
- package/dist/{renderer-C6md3msE.mjs.map → renderer-aCDIEYb3.mjs.map} +1 -1
- package/dist/renderer-aEecoNPX.mjs +5 -0
- package/dist/{renderer-BeIUgp1r.mjs → renderer-aN60v8jR.mjs} +2 -2
- package/dist/{renderer-BeIUgp1r.mjs.map → renderer-aN60v8jR.mjs.map} +1 -1
- package/dist/renderer-ewhliYYP.mjs +5 -0
- package/dist/renderer-hQc6GgTi.mjs +5 -0
- package/dist/renderer-iuX0RZIi.mjs +5 -0
- package/dist/renderer-j4vkTzHa.mjs +5 -0
- package/dist/{renderer-EemDpvv3.mjs → renderer-mpInX4Iy.mjs} +3 -3
- package/dist/{renderer-EemDpvv3.mjs.map → renderer-mpInX4Iy.mjs.map} +1 -1
- package/dist/renderer-msPjwx_9.mjs +5 -0
- package/dist/renderer-pI2ndu-b.mjs +5 -0
- package/dist/renderer-x1OGMhsC.mjs +5 -0
- package/dist/{renderer-DZXbgVMK.mjs → renderer-xezE7IZX.mjs} +3 -3
- package/dist/{renderer-DZXbgVMK.mjs.map → renderer-xezE7IZX.mjs.map} +1 -1
- package/dist/renderer-yGAk7J9P.mjs +222 -0
- package/dist/renderer-yGAk7J9P.mjs.map +1 -0
- package/dist/{renderer-Bvx56GR6.mjs → renderer-zQIB2VZZ.mjs} +2 -2
- package/dist/{renderer-Bvx56GR6.mjs.map → renderer-zQIB2VZZ.mjs.map} +1 -1
- package/dist/{renderers-CP8CFWDs-BA-4l6By.mjs → renderers-CP8CFWDs-i6u_rhCX.mjs} +2 -2
- package/dist/{renderers-CP8CFWDs-BA-4l6By.mjs.map → renderers-CP8CFWDs-i6u_rhCX.mjs.map} +1 -1
- package/dist/signals/index.d.mts +5 -5
- package/dist/signals/index.mjs +4 -4
- package/package.json +58 -55
- package/dist/dist-CT___nEU.mjs.map +0 -1
- package/dist/effects-C06-AOge.mjs.map +0 -1
- package/dist/index-B-oUlLoO.d.mts.map +0 -1
- package/dist/index-CwbszPDG.d.mts.map +0 -1
- package/dist/preview-engine/chunk-G4K6TLNA.mjs +0 -1
- package/dist/preview-engine/chunk-HVCAOHNI.mjs +0 -1
- package/dist/preview-engine/chunk-KBO6EX3M.mjs +0 -1448
- package/dist/preview-engine/chunk-N4LHIPHZ.mjs +0 -340
- package/dist/preview-engine/chunk-NECOKNHA.mjs +0 -174
- package/dist/preview-engine/renderers-T4JMJXWL.mjs +0 -1
- package/dist/preview-engine/renderers-VFV5QWO3.mjs +0 -1
- package/dist/preview-engine/renderers-VUL4HBX3.mjs +0 -228
- package/dist/program-DzknMiY0.mjs.map +0 -1
- package/dist/renderer--IDyGdqT.mjs +0 -5
- package/dist/renderer-17K4tjid.mjs +0 -5
- package/dist/renderer-1vhaKMeg.mjs.map +0 -1
- package/dist/renderer-Ab9Ttn_m.mjs +0 -5
- package/dist/renderer-B-roDBBo.mjs +0 -5
- package/dist/renderer-B03uwoUX.mjs +0 -5
- package/dist/renderer-B3BI_7YJ.mjs +0 -5
- package/dist/renderer-BGD4lQ74.mjs +0 -5
- package/dist/renderer-BHXhYfeC.mjs +0 -5
- package/dist/renderer-BRsTIMFa.mjs +0 -5
- package/dist/renderer-Beg7FLt2.mjs.map +0 -1
- package/dist/renderer-BjMTtYZw.mjs +0 -5
- package/dist/renderer-BoCh3Yts.mjs +0 -5
- package/dist/renderer-BqPbR8c4.mjs +0 -5
- package/dist/renderer-Bxa4SDm9.mjs +0 -3
- package/dist/renderer-C4Da2I1-.mjs +0 -5
- package/dist/renderer-C93X6dgl.mjs +0 -5
- package/dist/renderer-CE7fwGgw.mjs.map +0 -1
- package/dist/renderer-CMAwFfGx.mjs +0 -6
- package/dist/renderer-CRXeSuX2.mjs +0 -5
- package/dist/renderer-CSp6WYBN.mjs +0 -5
- package/dist/renderer-CUXX7HTL.mjs +0 -5
- package/dist/renderer-CUgThpka.mjs +0 -5
- package/dist/renderer-CeVtufiT.mjs +0 -5
- package/dist/renderer-CespkZUk.mjs +0 -5
- package/dist/renderer-D1l47xhL.mjs +0 -5
- package/dist/renderer-DDuG18J8.mjs +0 -5
- package/dist/renderer-DFhrFSMn.mjs +0 -5
- package/dist/renderer-DO48vQ7Y.mjs +0 -5
- package/dist/renderer-DTC39B_n.mjs +0 -5
- package/dist/renderer-DbyU3hNF.mjs +0 -5
- package/dist/renderer-DftVpmfu.mjs +0 -5
- package/dist/renderer-Dj5jm63K.mjs +0 -5
- package/dist/renderer-Dju57ZaF.mjs +0 -5
- package/dist/renderer-Dn8TQCw7.mjs +0 -5
- package/dist/renderer-ETF46K0D.mjs +0 -5
- package/dist/renderer-azYzWGC3.mjs +0 -5
- package/dist/renderer-dxNoRW59.mjs +0 -5
- package/dist/renderer-fdfelx_I.mjs +0 -5
- package/dist/renderer-snwEKwMw.mjs +0 -5
|
@@ -0,0 +1,1522 @@
|
|
|
1
|
+
import{a as Mi}from"./chunk-OCX5AD23.mjs";import{o as tt,r as qn}from"./chunk-RQLMW6MA.mjs";import{b as Ot}from"./chunk-2SJ4BBMT.mjs";import{h as Jn,l as On}from"./chunk-24P6DAB3.mjs";import{d as Yn}from"./chunk-6YJP57MZ.mjs";import{e as te,q as Wn,r as zn,s as GA,t as Xn,u as Zn}from"./chunk-LQENNFBA.mjs";import{r as fA}from"./chunk-MTJHQATU.mjs";import{a as et}from"./chunk-IQC2I5A5.mjs";import{c as Kn,e as Vn}from"./chunk-IQKIHFNZ.mjs";import{o as TA}from"./chunk-YAQFFQPG.mjs";import{a as xi,c as Tn,e as L}from"./chunk-BVF64D6H.mjs";var rr=xi((es,nr)=>{L();var ot=()=>new Proxy(function(){},{get:(A,e)=>e==="__esModule"?!0:e===Symbol.toPrimitive?()=>"":ot(),apply:()=>ot(),construct:()=>ot()});nr.exports=ot()});L();var jn=new Float32Array(2048);for(let A=0;A<2048;A++)jn[A]=.5*(1-Math.cos(2*Math.PI*A/2047));var $n=new Uint16Array(2048);for(let A=0;A<2048;A++){let e=0,t=A;for(let n=0;n<11;n++)e=e<<1|t&1,t>>=1;$n[A]=e}var Ar=new Float32Array(2048/2),er=new Float32Array(2048/2);for(let A=0;A<2048/2;A++){let e=-2*Math.PI*A/2048;Ar[A]=Math.cos(e),er[A]=Math.sin(e)}function Gi(A,e){for(let t=0;t<2048;t++){let n=$n[t]??0;if(n>t){let r=A[t]??0;A[t]=A[n]??0,A[n]=r;let i=e[t]??0;e[t]=e[n]??0,e[n]=i}}for(let t=2;t<=2048;t<<=1){let n=t>>1,r=2048/t;for(let i=0;i<2048;i+=t)for(let o=0;o<n;o++){let a=o*r,s=Ar[a]??1,g=er[a]??0,l=A[i+o]??0,u=e[i+o]??0,c=A[i+o+n]??0,B=e[i+o+n]??0,Q=c*s-B*g,f=c*g+B*s;A[i+o]=l+Q,e[i+o]=u+f,A[i+o+n]=l-Q,e[i+o+n]=u-f}}}var nt=class A{tempReal=new Float32Array(2048);tempImag=new Float32Array(2048);previousBins=new Float32Array(1024);extractAtTime(e,t,n){let r=e.length,i=r>0?e[0]?.length??0:0,a=Math.round(n*t)-1024;for(let G=0;G<2048;G++){let M=a+G,D=0;M>=0&&M<i&&(r===1?D=e[0]?.[M]??0:r>=2&&(D=((e[0]?.[M]??0)+(e[1]?.[M]??0))*.5)),this.tempReal[G]=D*(jn[G]??1),this.tempImag[G]=0}Gi(this.tempReal,this.tempImag);let s=new Float32Array(1024),g=2/2048;for(let G=0;G<1024;G++){let M=this.tempReal[G]??0,D=this.tempImag[G]??0;s[G]=Math.sqrt(M*M+D*D)*g*2}let l=t/2048,u=Math.max(1,Math.round(20/l)),c=Math.max(u+1,Math.round(150/l)),B=0;for(let G=u;G<=c&&G<1024;G++)B+=(s[G]??0)*(s[G]??0);let Q=Math.min(1,Math.sqrt(B/(c-u+1))*4),f=0;for(let G=0;G<1024;G++){let M=(s[G]??0)-(this.previousBins[G]??0);M>0&&(f+=M),this.previousBins[G]=s[G]??0}let h=Math.min(1,f*.15),m=Math.round(300/l),d=Math.min(1023,Math.round(3400/l)),x=0;for(let G=m;G<=d;G++)x+=(s[G]??0)*(s[G]??0);let y=Math.min(1,Math.sqrt(x/(d-m+1))*3.5);return{fftBins:s,bassEnergy:Q,drumTransient:h,vocalEnergy:y,timeMs:n*1e3}}static packBufferData(e){let t=new Float32Array(1028);return t.set(e.fftBins,0),t[1024]=e.bassEnergy,t[1025]=e.drumTransient,t[1026]=e.vocalEnergy,t[1027]=e.timeMs,t}static createGpuBuffer(e,t){let n=t?A.packBufferData(t):new Float32Array(1028),r=e.createBuffer({label:"AudioLatentBuffer",size:4112,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});return new Float32Array(r.getMappedRange()).set(n),r.unmap(),r}static updateGpuBuffer(e,t,n){let r=A.packBufferData(n);e.queue.writeBuffer(t,0,r)}},_n=class{constructor(e,t,n,r){this.channels=e;this.sampleRate=t;this.fps=n;this.totalFrames=r;let i=new nt,o=t||48e3,a=n||30,s=e[0]?.length??0,g=Math.max(10,Math.ceil(s/o*a)+10),l=typeof r=="number"&&Number.isFinite(r)&&r>0?Math.round(r):g;this.frames=new Array(l);for(let u=0;u<l;u++){let c=u/a;this.frames[u]=i.extractAtTime(e,o,c)}}channels;sampleRate;fps;totalFrames;frames=[];gpuBuffers=new WeakMap;getFrameData(e){let t=Math.max(0,Math.min(this.totalFrames-1,Math.round(e)));return this.frames[t]??{fftBins:new Float32Array(1024),bassEnergy:0,drumTransient:0,vocalEnergy:0,timeMs:t/this.fps*1e3}}getGpuBuffer(e,t){let n=this.gpuBuffers.get(e);n||(n=new Map,this.gpuBuffers.set(e,n));let r=Math.max(0,Math.min(this.totalFrames-1,Math.round(t))),i=n.get(r);if(!i){let o=this.getFrameData(r);i=nt.createGpuBuffer(e,o),n.set(r,i)}return i}};L();var k={create(A=0,e=0,t=0){return[A,e,t]},copy(A){return[A[0],A[1],A[2]]},set(A,e,t,n){return A[0]=e,A[1]=t,A[2]=n,A},add(A,e){return[A[0]+e[0],A[1]+e[1],A[2]+e[2]]},subtract(A,e){return[A[0]-e[0],A[1]-e[1],A[2]-e[2]]},multiplyScalar(A,e){return[A[0]*e,A[1]*e,A[2]*e]},dot(A,e){return A[0]*e[0]+A[1]*e[1]+A[2]*e[2]},cross(A,e){return[A[1]*e[2]-A[2]*e[1],A[2]*e[0]-A[0]*e[2],A[0]*e[1]-A[1]*e[0]]},lengthSq(A){return A[0]*A[0]+A[1]*A[1]+A[2]*A[2]},length(A){return Math.hypot(A[0],A[1],A[2])},distance(A,e){return Math.hypot(A[0]-e[0],A[1]-e[1],A[2]-e[2])},normalize(A){let e=Math.hypot(A[0],A[1],A[2]);if(e===0)return[0,0,0];let t=1/e;return[A[0]*t,A[1]*t,A[2]*t]},lerp(A,e,t){return[A[0]+(e[0]-A[0])*t,A[1]+(e[1]-A[1])*t,A[2]+(e[2]-A[2])*t]},equals(A,e,t=1e-6){return Math.abs(A[0]-e[0])<=t&&Math.abs(A[1]-e[1])<=t&&Math.abs(A[2]-e[2])<=t}};L();var $={identity(){return[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},copy(A){return[...A]},multiply(A,e){let t=new Array(16);for(let n=0;n<4;n++)for(let r=0;r<4;r++)t[r*4+n]=A[0+n]*e[r*4+0]+A[4+n]*e[r*4+1]+A[8+n]*e[r*4+2]+A[12+n]*e[r*4+3];return t},translate(A,e,t=0){return[1,0,0,0,0,1,0,0,0,0,1,0,A,e,t,1]},scale(A,e,t=1){return[A,0,0,0,0,e,0,0,0,0,t,0,0,0,0,1]},rotateX(A){let e=Math.cos(A),t=Math.sin(A);return[1,0,0,0,0,e,t,0,0,-t,e,0,0,0,0,1]},rotateY(A){let e=Math.cos(A),t=Math.sin(A);return[e,0,-t,0,0,1,0,0,t,0,e,0,0,0,0,1]},rotateZ(A){let e=Math.cos(A),t=Math.sin(A);return[e,t,0,0,-t,e,0,0,0,0,1,0,0,0,0,1]},rotateAxis(A,e){let t=k.normalize(A),n=t[0],r=t[1],i=t[2],o=Math.cos(e),a=Math.sin(e),s=1-o;return[s*n*n+o,s*n*r+a*i,s*n*i-a*r,0,s*n*r-a*i,s*r*r+o,s*r*i+a*n,0,s*n*i+a*r,s*r*i-a*n,s*i*i+o,0,0,0,0,1]},lookAt(A,e,t=[0,-1,0]){let n=k.subtract(e,A);k.lengthSq(n)===0?n=[0,0,1]:n=k.normalize(n);let r=k.cross(n,t);k.lengthSq(r)===0?r=[1,0,0]:r=k.normalize(r);let i=k.cross(r,n);return[r[0],i[0],n[0],0,r[1],i[1],n[1],0,r[2],i[2],n[2],0,-k.dot(r,A),-k.dot(i,A),-k.dot(n,A),1]},perspective(A,e,t,n){let r=1/Math.tan(A/2),i=1/(n-t);return[r/e,0,0,0,0,r,0,0,0,0,n*i,1,0,0,-t*n*i,0]},orthographic(A,e,t,n,r,i){let o=1/(e-A),a=1/(n-t),s=1/(i-r);return[2*o,0,0,0,0,2*a,0,0,0,0,s,0,-(e+A)*o,-(n+t)*a,-r*s,1]},invert(A){let e=new Array(16);e[0]=A[5]*A[10]*A[15]-A[5]*A[11]*A[14]-A[9]*A[6]*A[15]+A[9]*A[7]*A[14]+A[13]*A[6]*A[11]-A[13]*A[7]*A[10],e[4]=-A[4]*A[10]*A[15]+A[4]*A[11]*A[14]+A[8]*A[6]*A[15]-A[8]*A[7]*A[14]-A[12]*A[6]*A[11]+A[12]*A[7]*A[10],e[8]=A[4]*A[9]*A[15]-A[4]*A[11]*A[13]-A[8]*A[5]*A[15]+A[8]*A[7]*A[13]+A[12]*A[5]*A[11]-A[12]*A[7]*A[9],e[12]=-A[4]*A[9]*A[14]+A[4]*A[10]*A[13]+A[8]*A[5]*A[14]-A[8]*A[6]*A[13]-A[12]*A[5]*A[10]+A[12]*A[6]*A[9],e[1]=-A[1]*A[10]*A[15]+A[1]*A[11]*A[14]+A[9]*A[2]*A[15]-A[9]*A[3]*A[14]-A[13]*A[2]*A[11]+A[13]*A[3]*A[10],e[5]=A[0]*A[10]*A[15]-A[0]*A[11]*A[14]-A[8]*A[2]*A[15]+A[8]*A[3]*A[14]+A[12]*A[2]*A[11]-A[12]*A[3]*A[10],e[9]=-A[0]*A[9]*A[15]+A[0]*A[11]*A[13]+A[8]*A[1]*A[15]-A[8]*A[3]*A[13]-A[12]*A[1]*A[11]+A[12]*A[3]*A[9],e[13]=A[0]*A[9]*A[14]-A[0]*A[10]*A[13]-A[8]*A[1]*A[14]+A[8]*A[2]*A[13]+A[12]*A[1]*A[10]-A[12]*A[2]*A[9],e[2]=A[1]*A[6]*A[15]-A[1]*A[7]*A[14]-A[5]*A[2]*A[15]+A[5]*A[3]*A[14]+A[13]*A[2]*A[7]-A[13]*A[3]*A[6],e[6]=-A[0]*A[6]*A[15]+A[0]*A[7]*A[14]+A[4]*A[2]*A[15]-A[4]*A[3]*A[14]-A[12]*A[2]*A[7]+A[12]*A[3]*A[6],e[10]=A[0]*A[5]*A[15]-A[0]*A[7]*A[13]-A[4]*A[1]*A[15]+A[4]*A[3]*A[13]+A[12]*A[1]*A[7]-A[12]*A[3]*A[5],e[14]=-A[0]*A[5]*A[14]+A[0]*A[6]*A[13]+A[4]*A[1]*A[14]-A[4]*A[2]*A[13]-A[12]*A[1]*A[6]+A[12]*A[2]*A[5],e[3]=-A[1]*A[6]*A[11]+A[1]*A[7]*A[10]+A[5]*A[2]*A[11]-A[5]*A[3]*A[10]-A[9]*A[2]*A[7]+A[9]*A[3]*A[6],e[7]=A[0]*A[6]*A[11]-A[0]*A[7]*A[10]-A[4]*A[2]*A[11]+A[4]*A[3]*A[10]+A[8]*A[2]*A[7]-A[8]*A[3]*A[6],e[11]=-A[0]*A[5]*A[11]+A[0]*A[7]*A[9]+A[4]*A[1]*A[11]-A[4]*A[3]*A[9]-A[8]*A[1]*A[7]+A[8]*A[3]*A[5],e[15]=A[0]*A[5]*A[10]-A[0]*A[6]*A[9]-A[4]*A[1]*A[10]+A[4]*A[2]*A[9]+A[8]*A[1]*A[6]-A[8]*A[2]*A[5];let t=A[0]*e[0]+A[1]*e[4]+A[2]*e[8]+A[3]*e[12];if(Math.abs(t)<1e-12)return null;t=1/t;for(let n=0;n<16;n++)e[n]*=t;return e},transpose(A){return[A[0],A[4],A[8],A[12],A[1],A[5],A[9],A[13],A[2],A[6],A[10],A[14],A[3],A[7],A[11],A[15]]},projectPoint(A,e){let t=e[0],n=e[1],r=e[2],i=A[0]*t+A[4]*n+A[8]*r+A[12],o=A[1]*t+A[5]*n+A[9]*r+A[13],a=A[2]*t+A[6]*n+A[10]*r+A[14],s=A[3]*t+A[7]*n+A[11]*r+A[15],g=Math.abs(s)>1e-6?1/s:1;return[i*g,o*g,a*g]},projectRectangle(A,e,t){return[$.projectPoint(A,[0,0,0]),$.projectPoint(A,[e,0,0]),$.projectPoint(A,[e,t,0]),$.projectPoint(A,[0,t,0])]},toFloat32Array(A){return new Float32Array(A)}};L();function Me(A,e,t=3){let n=0,r=1,i=1,o=0;for(let a=0;a<t;a++){let s=Math.sin(A*r*2*Math.PI+e+a*1.7),g=Math.cos(A*r*1.414*Math.PI+e*2.1+a*.9);n+=(s*.6+g*.4)*i,o+=i,r*=2,i*=.5}return o>0?n/o:0}var ce={createDefaultCamera(A,e,t=50){let n=t*Math.PI/180,r=e/2/Math.tan(n/2);return{eye:[A/2,e/2,-r],target:[A/2,e/2,0],up:[0,-1,0],fov:t,aspect:Math.max(1e-4,A/e),near:1,far:5e4,zoom:1,focusDistance:r,fStop:2.8,maxBlurRadius:32}},computeViewMatrix(A){return $.lookAt(A.eye,A.target,A.up)},computeProjectionMatrix(A){let e=A.fov*Math.PI/180,t=$.perspective(e,A.aspect,A.near,A.far);return A.zoom!==1&&A.zoom>0&&(t[0]*=A.zoom,t[5]*=A.zoom),t},computeViewProjectionMatrix(A){let e=ce.computeViewMatrix(A),t=ce.computeProjectionMatrix(A);return $.multiply(t,e)},dolly(A,e,t){let n=k.normalize(k.subtract(e,A)),r=k.multiplyScalar(n,t);return{eye:k.add(A,r),target:e}},truckPedestal(A,e,t,n,r){let i=k.normalize(k.subtract(e,A)),o=k.normalize(k.cross(i,t)),a=k.cross(o,i),s=k.multiplyScalar(o,n),g=k.multiplyScalar(a,r),l=k.add(s,g);return{eye:k.add(A,l),target:k.add(e,l)}},orbit(A,e,t,n){let r=t*Math.PI/180,i=n*Math.PI/180,o=Math.cos(i),a=Math.sin(i),s=Math.cos(r),g=Math.sin(r),l=A[0]+e*o*g,u=A[1]-e*a,c=A[2]-e*o*s;return[l,u,c]},applyOrientation(A,e,t,n){if(e===0&&t===0&&n===0)return A;let r=k.normalize(k.subtract(A.target,A.eye)),i=k.normalize(k.cross(r,A.up)),o=k.cross(i,r),a=k.distance(A.eye,A.target),s=r,g=o;if(t!==0){let c=t*Math.PI/180,B=Math.cos(c),Q=Math.sin(c);s=k.normalize(k.subtract(k.multiplyScalar(s,B),k.multiplyScalar(i,Q)))}let l=k.normalize(k.cross(s,g));if(e!==0){let c=e*Math.PI/180,B=Math.cos(c),Q=Math.sin(c);s=k.normalize(k.add(k.multiplyScalar(s,B),k.multiplyScalar(g,Q))),g=k.normalize(k.cross(l,s))}if(n!==0){let c=n*Math.PI/180,B=Math.cos(c),Q=Math.sin(c);g=k.normalize(k.add(k.multiplyScalar(g,B),k.multiplyScalar(l,Q)))}let u=k.add(A.eye,k.multiplyScalar(s,a));return{...A,target:u,up:g}},applyCameraShake(A,e,t){let{translationAmplitude:n,rotationAmplitude:r,frequency:i=2.5,octaves:o=3,seed:a=42}=t;if(n<=0&&r<=0)return A;let s=e*i,g=Me(s,a,o)*n,l=Me(s,a+101.5,o)*n,u=Me(s,a+203.7,o)*(n*.5),c=Me(s,a+307.1,o)*r,B=Me(s,a+409.3,o)*r,Q=k.normalize(k.subtract(A.target,A.eye)),f=k.normalize(k.cross(Q,A.up)),h=k.cross(f,Q),m=k.add(k.multiplyScalar(f,g),k.add(k.multiplyScalar(h,l),k.multiplyScalar(Q,u))),d=k.add(A.eye,m),x=k.add(A.target,k.add(k.multiplyScalar(f,B*10),k.multiplyScalar(h,c*10)));return{...A,eye:d,target:x}},computeCircleOfConfusion(A,e,t,n,r=32){if(e<=0||n<=0||A<=0)return 0;let i=Math.abs(A-e),o=t/n,a=i/A*o*.5;return Math.min(r,Math.max(0,a))},computeCameraFrustumPlanes(A){let e=t=>{let n=Math.hypot(t[0],t[1],t[2]);return n===0?t:[t[0]/n,t[1]/n,t[2]/n,t[3]/n]};return{left:e([A[3]+A[0],A[7]+A[4],A[11]+A[8],A[15]+A[12]]),right:e([A[3]-A[0],A[7]-A[4],A[11]-A[8],A[15]-A[12]]),bottom:e([A[3]+A[1],A[7]+A[5],A[11]+A[9],A[15]+A[13]]),top:e([A[3]-A[1],A[7]-A[5],A[11]-A[9],A[15]-A[13]]),near:e([A[2],A[6],A[10],A[14]]),far:e([A[3]-A[2],A[7]-A[6],A[11]-A[10],A[15]-A[14]])}},isBoxInFrustum(A,e,t){let n=[t.left,t.right,t.bottom,t.top,t.near,t.far];for(let r of n){let i=r[0]>0?e[0]:A[0],o=r[1]>0?e[1]:A[1],a=r[2]>0?e[2]:A[2];if(r[0]*i+r[1]*o+r[2]*a+r[3]<0)return!1}return!0}};L();var Ni={studio:{top:"#9da3ad",horizon:"#5d626b",bottom:"#202226",softboxes:3.5},soft:{top:"#f1efea",horizon:"#cfcac1",bottom:"#77726a",softboxes:1.2},sunset:{top:"#4d63a3",horizon:"#ff9a5c",bottom:"#3b2a28",softboxes:1},night:{top:"#121a3a",horizon:"#1f2950",bottom:"#05060b",softboxes:.5},neutral:{top:"#9a9a9a",horizon:"#808080",bottom:"#5c5c5c",softboxes:0}},Fi={none:0,aces:1,agx:2,neutral:3};function rt(A){let e=Kn(A)??[0,0,0,1],t=n=>n<=.04045?n/12.92:((n+.055)/1.055)**2.4;return[t(e[0]),t(e[1]),t(e[2])]}function tr(A){let e=Ni[A.preset??"studio"],t=A.intensity??1,n=r=>[r[0]*t,r[1]*t,r[2]*t];return{top:n(rt(A.top??e.top)),horizon:n(rt(A.horizon??e.horizon)),bottom:n(rt(A.bottom??e.bottom)),softboxes:(A.softboxes??e.softboxes)*t,rotationRad:(A.rotation??0)*Math.PI/180,exposureMultiplier:2**(A.exposure??0),toneMapping:Fi[A.toneMapping??"neutral"],fog:A.fog?{color:rt(A.fog.color),start:A.fog.start,end:A.fog.end,opacity:Math.max(0,Math.min(1,A.fog.opacity??1))}:void 0}}L();var it=8,Vt=736;function Kt(A){if(!A)return[1,1,1];if(Array.isArray(A)){let r=A[0]??1,i=A[1]??1,o=A[2]??1;return[r>1?r/255:r,i>1?i/255:i,o>1?o/255:o]}if(typeof A=="object"&&A!==null){let r=A.r??1,i=A.g??1,o=A.b??1;return[r>1?r/255:r,i>1?i/255:i,o>1?o/255:o]}if(typeof A!="string")return[1,1,1];let e=A.trim().toLowerCase();if(e.startsWith("#")){let r=e.slice(1);if(r.length===3){let i=Number.parseInt(r[0]+r[0],16)/255,o=Number.parseInt(r[1]+r[1],16)/255,a=Number.parseInt(r[2]+r[2],16)/255;return[i,o,a]}if(r.length>=6){let i=Number.parseInt(r.slice(0,2),16)/255,o=Number.parseInt(r.slice(2,4),16)/255,a=Number.parseInt(r.slice(4,6),16)/255;return[i,o,a]}}let t=e.match(/rgba?\s*\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)/);if(t){let r=Number.parseFloat(t[1])/255,i=Number.parseFloat(t[2])/255,o=Number.parseFloat(t[3])/255;return[Math.max(0,Math.min(1,r)),Math.max(0,Math.min(1,i)),Math.max(0,Math.min(1,o))]}let n=e.match(/hsla?\s*\(\s*([\d.]+)\s*,\s*([\d.]+)%?\s*,\s*([\d.]+)%?/);if(n){let r=Number.parseFloat(n[1])/360,i=Number.parseFloat(n[2])/100,o=Number.parseFloat(n[3])/100;return Si(r,i,o)}return[1,1,1]}function Si(A,e,t){if(e===0)return[t,t,t];let n=(o,a,s)=>{let g=s;return g<0&&(g+=1),g>1&&(g-=1),g<1/6?o+(a-o)*6*g:g<1/2?a:g<2/3?o+(a-o)*(2/3-g)*6:o},r=t<.5?t*(1+e):t+e-t*e,i=2*t-r;return[n(i,r,A+1/3),n(i,r,A),n(i,r,A-1/3)]}var qA={computeNormalMatrix(A){let e=$.invert(A);return e?[e[0],e[4],e[8],0,e[1],e[5],e[9],0,e[2],e[6],e[10],0,0,0,0,1]:$.identity()},processLight(A){let e=Kt(A.color),t=A.intensity??1,n=A.position?A.position[0]:A.x??0,r=A.position?A.position[1]:A.y??0,i=A.position?A.position[2]:A.z??0,o=A.lightType??A.type??"directional",a=1;o==="ambient"?a=0:o==="directional"?a=1:o==="point"?a=2:o==="spot"&&(a=3);let s=[0,0,-1];if(A.direction)s=k.normalize(A.direction);else if(A.target||A.targetX!==void 0||A.targetY!==void 0||A.targetZ!==void 0){let m=A.target?A.target[0]:A.targetX??n,d=A.target?A.target[1]:A.targetY??r,x=A.target?A.target[2]:A.targetZ??i,y=[m,d,x],G=k.subtract(y,[n,r,i]);k.length(G)>1e-4&&(s=k.normalize(G))}let g=Math.max(1,A.radius??1e3),l=A.decay??2,u=Math.max(.1,Math.min(180,A.angle??45)),c=Math.max(0,Math.min(1,A.penumbra??.2)),B=u*Math.PI/180,Q=B*(1-c),f=Math.cos(B),h=Math.cos(Q);return{posType:[n,r,i,a],dirRadius:[s[0],s[1],s[2],g],colorIntensity:[e[0],e[1],e[2],t],spotParams:[f,h,l,0]}},packLightsUniforms(A,e,t){let n=new Float32Array(Vt/4);if(qA.packPhysicalBlock(n,A??[],e,t),(!A||A.length===0)&&!e)return n[4]=0,n[5]=0,n;let r=0,i=0,o=0,a=[];for(let g of A)if((g.lightType??g.type)==="ambient"){let u=Kt(g.color),c=g.intensity??1;r+=u[0]*c,i+=u[1]*c,o+=u[2]*c}else a.length<it&&a.push(qA.processLight(g));n[0]=r,n[1]=i,n[2]=o,n[3]=1,n[4]=a.length,n[5]=1;let s=8;for(let g=0;g<it;g++){if(g<a.length){let l=a[g];n[s+0]=l.posType[0],n[s+1]=l.posType[1],n[s+2]=l.posType[2],n[s+3]=l.posType[3],n[s+4]=l.dirRadius[0],n[s+5]=l.dirRadius[1],n[s+6]=l.dirRadius[2],n[s+7]=l.dirRadius[3],n[s+8]=l.colorIntensity[0],n[s+9]=l.colorIntensity[1],n[s+10]=l.colorIntensity[2],n[s+11]=l.colorIntensity[3],n[s+12]=l.spotParams[0],n[s+13]=l.spotParams[1],n[s+14]=l.spotParams[2],n[s+15]=l.spotParams[3]}else for(let l=0;l<16;l++)n[s+l]=0;s+=16}return n},shadowCasterIndex(A){let e=0;for(let t of A){let n=t.lightType??t.type;if(n!=="ambient"){if(e>=it)break;if(t.castShadow&&(n==="directional"||n==="spot"))return e;e++}}return-1},packPhysicalBlock(A,e,t,n){let r=8+it*16,i=0,o=0,a=0;for(let s of e){if((s.lightType??s.type)!=="ambient")continue;let[g,l,u]=Kt(s.color),c=s.intensity??1,B=Q=>Q<=.04045?Q/12.92:((Q+.055)/1.055)**2.4;i+=B(g)*c,o+=B(l)*c,a+=B(u)*c}if(A[r+0]=i,A[r+1]=o,A[r+2]=a,A[r+3]=1,t){let s=tr(t);A[6]=1,A[7]=s.toneMapping,A[r+3]=s.exposureMultiplier,A.set([...s.top,s.rotationRad],r+4),A.set([...s.horizon,s.softboxes],r+8),A.set([...s.bottom,1],r+12),s.fog&&(A.set([...s.fog.color,1],r+16),A.set([s.fog.start,s.fog.end,s.fog.opacity,0],r+20))}if(n&&n.lightIndex>=0){A.set([1,n.lightIndex,n.softness,n.mapSize],r+24),A.set([n.bias,n.normalOffset,n.darkness,0],r+28);for(let s=0;s<16;s++)A[r+32+s]=n.matrix[s]??0}}};L();var Ge=class A{static parse(e,t,n){let r=typeof t=="object"&&t!==null?t:n??{},i=typeof t=="string"?t:r.mtlText,o=[],a=[],s=[],g=[],l={materialName:"default",faces:[]};g.push(l);let u={};i&&Object.assign(u,A.parseMtl(i));let c=e.split(/\r?\n/);for(let H=0;H<c.length;H++){let rA=c[H]?.trim();if(!rA||rA.startsWith("#"))continue;let j=rA.split(/\s+/),sA=j[0]?.toLowerCase();if(sA==="mtllib"){let BA=j.slice(1).join(" ").trim();if(r.basePath&&typeof fA<"u"&&fA.existsSync)try{let O=TA.resolve(r.basePath,BA);if(fA.existsSync(O)){let oA=fA.readFileSync(O,"utf-8");Object.assign(u,A.parseMtl(oA))}}catch{}}else if(sA==="v"){let BA=Number.parseFloat(j[1]??"0"),O=Number.parseFloat(j[2]??"0"),oA=Number.parseFloat(j[3]??"0");o.push([BA,O,oA])}else if(sA==="vn"){let BA=Number.parseFloat(j[1]??"0"),O=Number.parseFloat(j[2]??"0"),oA=Number.parseFloat(j[3]??"0");a.push([BA,O,oA])}else if(sA==="vt"){let BA=Number.parseFloat(j[1]??"0"),O=j[2]!==void 0?Number.parseFloat(j[2]):0;s.push([BA,O])}else if(sA==="usemtl"){let BA=j[1]??"default";l.faces.length>0?(l={materialName:BA,faces:[]},g.push(l)):l.materialName=BA}else if(sA==="f"){let BA=[];for(let O=1;O<j.length;O++){let oA=j[O];if(!oA)continue;let aA=oA.split("/"),IA=Number.parseInt(aA[0]??"0",10),QA=aA[1]&&aA[1].length>0?Number.parseInt(aA[1],10):0,cA=aA[2]&&aA[2].length>0?Number.parseInt(aA[2],10):0;IA<0&&(IA=o.length+IA+1),QA<0&&(QA=s.length+QA+1),cA<0&&(cA=a.length+cA+1),BA.push({v:IA-1,vt:QA-1,vn:cA-1})}if(BA.length>=3)for(let O=1;O<BA.length-1;O++){let oA=BA[0],aA=BA[O],IA=BA[O+1];oA&&aA&&IA&&l.faces.push([oA,aA,IA])}}}let B=1/0,Q=1/0,f=1/0,h=-1/0,m=-1/0,d=-1/0;for(let H of o){let[rA,j,sA]=H;rA===void 0||j===void 0||sA===void 0||(rA<B&&(B=rA),j<Q&&(Q=j),sA<f&&(f=sA),rA>h&&(h=rA),j>m&&(m=j),sA>d&&(d=sA))}Number.isFinite(B)||(B=-1,Q=-1,f=-1,h=1,m=1,d=1);let x=(B+h)*.5,y=(Q+m)*.5,G=(f+d)*.5,M=Math.max(1e-4,h-B),D=Math.max(1e-4,m-Q),b=Math.max(1e-4,d-f),N=Math.max(M,D,b),S=1;r.normalizeSize&&r.normalizeSize>0&&(S=r.normalizeSize/N),typeof r.scale=="number"&&(S*=r.scale);let v=r.center??!1,F=v?x:0,P=v?y:0,V=v?G:0,R=[];for(let H=0;H<g.length;H++){let rA=g[H];if(!rA||rA.faces.length===0)continue;let j=new Map,sA=[],BA=[],O=[],oA=[],aA=!1;for(let cA of rA.faces)for(let gA of cA){let DA=`${gA.v}_${gA.vt}_${gA.vn}`,bA=j.get(DA);if(bA===void 0){bA=sA.length/3,j.set(DA,bA);let hA=o[gA.v]??[0,0,0],pA=((hA[0]??0)-F)*S,SA=((hA[1]??0)-P)*S,UA=((hA[2]??0)-V)*S;if(sA.push(pA,SA,UA),gA.vt>=0&&s[gA.vt]){let LA=s[gA.vt];O.push(LA[0]??0,1-(LA[1]??0))}else O.push(0,0);if(gA.vn>=0&&a[gA.vn]){aA=!0;let LA=a[gA.vn];BA.push(LA[0]??0,LA[1]??0,LA[2]??0)}else BA.push(0,0,0)}oA.push(bA)}if(!aA||r.smoothNormals){let cA=new Float32Array(sA.length);for(let gA=0;gA<oA.length;gA+=3){let DA=oA[gA],bA=oA[gA+1],hA=oA[gA+2],pA=[sA[DA*3],sA[DA*3+1],sA[DA*3+2]],SA=[sA[bA*3],sA[bA*3+1],sA[bA*3+2]],UA=[sA[hA*3],sA[hA*3+1],sA[hA*3+2]],LA=k.subtract(SA,pA),Ft=k.subtract(UA,pA),vA=k.cross(LA,Ft);cA[DA*3]+=vA[0],cA[DA*3+1]+=vA[1],cA[DA*3+2]+=vA[2],cA[bA*3]+=vA[0],cA[bA*3+1]+=vA[1],cA[bA*3+2]+=vA[2],cA[hA*3]+=vA[0],cA[hA*3+1]+=vA[1],cA[hA*3+2]+=vA[2]}for(let gA=0;gA<sA.length/3;gA++){let DA=cA[gA*3],bA=cA[gA*3+1],hA=cA[gA*3+2],pA=Math.hypot(DA,bA,hA)||1;BA[gA*3]=DA/pA,BA[gA*3+1]=bA/pA,BA[gA*3+2]=hA/pA}}let QA=sA.length/3>65535?new Uint32Array(oA):new Uint16Array(oA);R.push({id:`mesh_${H}`,name:rA.materialName,positions:new Float32Array(sA),normals:new Float32Array(BA),uvs:new Float32Array(O),indices:QA,materialName:rA.materialName})}let X=(B-F)*S,_=(Q-P)*S,AA=(f-V)*S,CA=(h-F)*S,Z=(m-P)*S,W=(d-V)*S,q=CA-X,mA=Z-_,eA=W-AA,lA=(X+CA)*.5,uA=(_+Z)*.5,yA=(AA+W)*.5,tA=Math.hypot(q,mA,eA)*.5;return{meshes:R,materials:u,animations:[],bounds:{min:[X,_,AA],max:[CA,Z,W],center:[lA,uA,yA],size:[q,mA,eA],boundingSphereRadius:tA}}}static parseMtl(e){let t={},n=null,r=e.split(/\r?\n/);for(let i of r){let o=i.trim();if(!o||o.startsWith("#"))continue;let a=o.split(/\s+/),s=a[0]?.toLowerCase();if(s==="newmtl"){let g=a[1]??"default";n={name:g,diffuseColor:[1,1,1,1],specularColor:[1,1,1],ambientColor:[.2,.2,.2],shininess:32,opacity:1},t[g]=n}else if(n)if(s==="kd"){let g=Number.parseFloat(a[1]??"1"),l=Number.parseFloat(a[2]??"1"),u=Number.parseFloat(a[3]??"1");n.diffuseColor=[g,l,u,n.diffuseColor?.[3]??1]}else if(s==="ks"){let g=Number.parseFloat(a[1]??"1"),l=Number.parseFloat(a[2]??"1"),u=Number.parseFloat(a[3]??"1");n.specularColor=[g,l,u],n.specularIntensity=(g+l+u)/3}else if(s==="ka"){let g=Number.parseFloat(a[1]??"0.2"),l=Number.parseFloat(a[2]??"0.2"),u=Number.parseFloat(a[3]??"0.2");n.ambientColor=[g,l,u]}else if(s==="ns")n.shininess=Number.parseFloat(a[1]??"32");else if(s==="d"||s==="tr"){let g=Number.parseFloat(a[1]??"1");n.opacity=s==="d"?g:1-g,n.diffuseColor&&(n.diffuseColor[3]=n.opacity)}else s==="map_kd"?n.diffuseTexture=a.slice(1).join(" "):(s==="map_bump"||s==="bump")&&(n.normalTexture=a.slice(1).join(" "))}return t}};function _a(A,e,t={}){return Ge.parse(A,e,t)}function ja(A){return Ge.parseMtl(A)}function Ne(A,e,t={}){let n;if(typeof A!="string")n=new TextDecoder().decode(A);else{let r=A.trim();if(!(r.startsWith("v ")||r.startsWith("#")||r.includes(`
|
|
2
|
+
v `)||r.includes("\rv "))&&typeof fA<"u"&&fA.existsSync)try{let o=A.startsWith("file://")?A.slice(7):A;try{o=decodeURIComponent(o)}catch{}fA.existsSync(o)?(n=fA.readFileSync(o,"utf-8"),t={basePath:t.basePath??TA.dirname(o),...t}):n=A}catch{n=A}else n=A}return Ge.parse(n,e,t)}L();var or=Tn(rr(),1);var re=class A{static FBX_KTIME=46186158e3;static parse(e,t={}){let n=typeof e=="string"?A.parseAscii(e):A.isBinary(e)?A.parseBinary(e):A.parseAscii(new TextDecoder().decode(e));return A.buildModelFromTree(n,t)}static isBinary(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);if(t.length<27)return!1;let n="Kaydara FBX Binary \0\0";for(let r=0;r<n.length;r++)if(t[r]!==n.charCodeAt(r))return!1;return!0}static parseBinary(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=new DataView(t.buffer,t.byteOffset,t.byteLength),i=n.getUint32(23,!0)>=7500,o=27,a={name:"Root",props:[],children:[]},s=()=>{if(o>=t.byteLength)return null;let g,l,u;if(i){if(o+25>t.byteLength)return null;g=Number(n.getBigUint64(o,!0)),l=Number(n.getBigUint64(o+8,!0)),u=n.getUint8(o+24),o+=25}else{if(o+13>t.byteLength)return null;g=n.getUint32(o,!0),l=n.getUint32(o+4,!0),u=n.getUint8(o+12),o+=13}if(g===0)return null;let c=new TextDecoder().decode(t.subarray(o,o+u));o+=u;let B=[];for(let f=0;f<l;f++){let h=String.fromCharCode(t[o]);switch(o+=1,h){case"Y":{B.push(n.getInt16(o,!0)),o+=2;break}case"C":case"B":{B.push(n.getUint8(o)!==0),o+=1;break}case"I":{B.push(n.getInt32(o,!0)),o+=4;break}case"F":{B.push(n.getFloat32(o,!0)),o+=4;break}case"D":{B.push(n.getFloat64(o,!0)),o+=8;break}case"L":{B.push(Number(n.getBigInt64(o,!0))),o+=8;break}case"S":{let m=n.getUint32(o,!0);o+=4;let d=new TextDecoder().decode(t.subarray(o,o+m));B.push(d),o+=m;break}case"R":{let m=n.getUint32(o,!0);o+=4;let d=t.subarray(o,o+m);B.push(d),o+=m;break}case"f":case"d":case"i":case"l":case"b":case"c":{let m=n.getUint32(o,!0),d=n.getUint32(o+4,!0),x=n.getUint32(o+8,!0);o+=12;let y;if(d===1){let M=t.subarray(o,o+x);y=(0,or.inflateSync)(M),o+=x}else{let D=m*(h==="d"||h==="l"?8:h==="f"||h==="i"?4:1);y=t.subarray(o,o+D),o+=D}let G=new DataView(y.buffer,y.byteOffset,y.byteLength);if(h==="f"){let M=new Float32Array(m);for(let D=0;D<m;D++)M[D]=G.getFloat32(D*4,!0);B.push(M)}else if(h==="d"){let M=new Float64Array(m);for(let D=0;D<m;D++)M[D]=G.getFloat64(D*8,!0);B.push(M)}else if(h==="i"){let M=new Int32Array(m);for(let D=0;D<m;D++)M[D]=G.getInt32(D*4,!0);B.push(M)}else if(h==="l"){let M=new Float64Array(m);for(let D=0;D<m;D++)M[D]=Number(G.getBigInt64(D*8,!0));B.push(M)}else if(h==="b"){let M=new Uint8Array(m);for(let D=0;D<m;D++)M[D]=G.getUint8(D);B.push(M)}else B.push(y);break}default:break}}let Q=[];for(;o<g;){let f=s();if(f)Q.push(f);else break}return o=g,{name:c,props:B,children:Q}};for(;o<t.byteLength-(i?25:13);){let g=s();if(g)a.children.push(g);else break}return a}static parseAscii(e){let t={name:"Root",props:[],children:[]},n=[t],r=e.split(/\r?\n/);for(let i=0;i<r.length;i++){let o=r[i]?.trim();if(!o||o.startsWith(";"))continue;if(o==="}"){n.length>1&&n.pop();continue}let a=o.indexOf(":");if(a===-1)continue;let s=o.substring(0,a).trim(),g=o.substring(a+1).trim(),l=g.endsWith("{"),u=l?g.slice(0,-1).trim():g,c=[];if(u){let f=u.split(",").map(h=>h.trim());for(let h of f)h.startsWith('"')&&h.endsWith('"')?c.push(h.slice(1,-1)):Number.isNaN(Number(h))?c.push(h):c.push(Number(h))}let B={name:s,props:c,children:[]},Q=n[n.length-1];Q&&Q.children.push(B),l&&n.push(B)}return t}static buildModelFromTree(e,t={}){let n=e.children.find(b=>b.name==="Objects"),r=e.children.find(b=>b.name==="Connections"),i=new Map;if(n)for(let b of n.children){let N=b.props[0]??0,v=String(b.props[1]??"").split("::"),F=v.length>1?v[1]:v[0],P=String(b.props[2]??b.name);i.set(N,{id:N,name:F,type:P,node:b})}let o=[];if(r){for(let b of r.children)if(b.name==="C"||b.name==="Connect"){let N=String(b.props[0]),S=b.props[1]??0,v=b.props[2]??0,F=N==="OP"?String(b.props[3]):void 0;o.push({childId:S,parentId:v,propName:F})}}let a=[],s={};function g(b){if(!b)return[];if(b.props[0]instanceof Float32Array||b.props[0]instanceof Float64Array||b.props[0]instanceof Int32Array||Array.isArray(b.props[0]))return b.props[0];let N=b.children.find(S=>S.name==="a");return N&&N.props.length>0?N.props:Array.isArray(b.props)&&b.props.length>0&&typeof b.props[0]=="number"?b.props:[]}for(let[b,N]of i)if(N.node.name==="Geometry"&&(N.type==="Mesh"||N.node.props[2]==="Mesh"||N.type==="")){let S=N.node,v=S.children.find(O=>O.name==="Vertices"),F=S.children.find(O=>O.name==="PolygonVertexIndex"),P=S.children.find(O=>O.name==="LayerElementNormal"),V=S.children.find(O=>O.name==="LayerElementUV");if(!v||!F)continue;let R=g(v),X=g(F),_=P?.children.find(O=>O.name==="Normals"),AA=g(_),CA=V?.children.find(O=>O.name==="UV"),Z=V?.children.find(O=>O.name==="UVIndex"),W=g(CA),q=g(Z),mA=[],eA=[],lA=[];for(let O=0;O<X.length;O++){let oA=X[O];if(oA<0){if(lA.push(-(oA+1)),eA.push(O),lA.length>=3)for(let aA=1;aA<lA.length-1;aA++)mA.push([lA[0],lA[aA],lA[aA+1]]);lA=[]}else lA.push(oA),eA.push(O)}let uA=[],yA=[],tA=[],H=[];for(let O=0;O<mA.length;O++){let oA=mA[O];for(let aA=0;aA<3;aA++){let IA=oA[aA],QA=uA.length/3,cA=R[IA*3]??0,gA=R[IA*3+1]??0,DA=R[IA*3+2]??0;if(uA.push(cA,gA,DA),AA.length>0){let bA=AA[IA*3]??0,hA=AA[IA*3+1]??0,pA=AA[IA*3+2]??0;yA.push(bA,hA,pA)}else yA.push(0,0,1);if(W.length>0){let bA=IA;q.length>0&&(bA=q[IA]??IA);let hA=W[bA*2]??0,pA=W[bA*2+1]??0;tA.push(hA,1-pA)}else tA.push(0,0);H.push(QA)}}if(AA.length===0||t.smoothNormals){let O=new Float32Array(uA.length);for(let oA=0;oA<H.length;oA+=3){let aA=H[oA],IA=H[oA+1],QA=H[oA+2],cA=[uA[aA*3],uA[aA*3+1],uA[aA*3+2]],gA=[uA[IA*3],uA[IA*3+1],uA[IA*3+2]],DA=[uA[QA*3],uA[QA*3+1],uA[QA*3+2]],bA=k.subtract(gA,cA),hA=k.subtract(DA,cA),pA=k.cross(bA,hA);O[aA*3]+=pA[0],O[aA*3+1]+=pA[1],O[aA*3+2]+=pA[2],O[IA*3]+=pA[0],O[IA*3+1]+=pA[1],O[IA*3+2]+=pA[2],O[QA*3]+=pA[0],O[QA*3+1]+=pA[1],O[QA*3+2]+=pA[2]}for(let oA=0;oA<uA.length/3;oA++){let aA=O[oA*3],IA=O[oA*3+1],QA=O[oA*3+2],cA=Math.hypot(aA,IA,QA)||1;yA[oA*3]=aA/cA,yA[oA*3+1]=IA/cA,yA[oA*3+2]=QA/cA}}let rA=o.find(O=>O.parentId===b&&i.get(O.childId)?.type==="Deformer"&&i.get(O.childId)?.node.props[2]==="Skin"),j,sA;if(rA){let O=uA.length/3;j=new Float32Array(O*4),sA=new Float32Array(O*4),o.filter(aA=>aA.parentId===rA.childId&&i.get(aA.childId)?.type==="Deformer"&&i.get(aA.childId)?.node.props[2]==="Cluster").forEach((aA,IA)=>{let QA=i.get(aA.childId)?.node,cA=QA?.children.find(DA=>DA.name==="Indexes"),gA=QA?.children.find(DA=>DA.name==="Weights");if(cA&&gA){let DA=g(cA),bA=g(gA);for(let hA=0;hA<DA.length;hA++){let pA=bA[hA]??0;for(let SA=0;SA<O;SA++)for(let UA=0;UA<4;UA++)if(sA[SA*4+UA]===0){j[SA*4+UA]=IA,sA[SA*4+UA]=pA;break}}}})}let BA=uA.length/3>65535;a.push({id:`fbx_mesh_${b}`,name:N.name,positions:new Float32Array(uA),normals:new Float32Array(yA),uvs:new Float32Array(tA),indices:BA?new Uint32Array(H):new Uint16Array(H),jointIndices:j,jointWeights:sA,materialName:N.name})}for(let[,b]of i)if(b.node.name==="Material"){let S=b.node.children.find(V=>V.name==="Properties70"),v=[1,1,1,1],F=32,P=1;if(S){for(let V of S.children)if(V.name==="P"){let R=String(V.props[0]);if(R==="DiffuseColor"||R==="Color"){let X=Number(V.props[4]??1),_=Number(V.props[5]??1),AA=Number(V.props[6]??1);v=[X,_,AA,1]}else R==="Shininess"||R==="ShininessExponent"?F=Number(V.props[4]??32):R==="Opacity"&&(P=Number(V.props[4]??1),v[3]=P)}}s[b.name]={name:b.name,diffuseColor:v,shininess:F,opacity:P}}let l=[];for(let[b,N]of i)if(N.node.name==="AnimationStack"){let S=N.name||"Take 001",v=[],F=o.find(V=>V.parentId===b&&i.get(V.childId)?.node.name==="AnimationLayer");if(F){let V=o.filter(X=>X.parentId===F.childId&&i.get(X.childId)?.node.name==="AnimationCurveNode"),R=new Map;for(let X of V){let _=i.get(X.childId);if(!_)continue;let AA=o.find(eA=>eA.childId===_.id&&i.get(eA.parentId)?.node.name==="Model"),CA=AA?i.get(AA.parentId):void 0,Z=ir(AA?.propName)??ir(_.name);if(!Z)continue;let W=`${CA?.id??_.id}|${Z}`,q=R.get(W);if(!q){let eA=CA?.node;q={nodeName:CA?.name??_.name,model:eA,kind:Z,defaults:vi(eA,_.node,Z),channels:[void 0,void 0,void 0]},R.set(W,q)}o.filter(eA=>eA.parentId===_.id&&i.get(eA.childId)?.node.name==="AnimationCurve").forEach((eA,lA)=>{let uA=Ui(eA.propName)??lA;if(uA>2)return;let yA=i.get(eA.childId)?.node,tA=g(yA?.children.find(j=>j.name==="KeyTime")),H=g(yA?.children.find(j=>j.name==="KeyValueFloat")),rA=Math.min(tA.length,H.length);rA!==0&&(q.channels[uA]={times:Array.from(tA.slice(0,rA),j=>Number(j)),values:Array.from(H.slice(0,rA),j=>Number(j))})})}for(let X of R.values()){let _=Hi(X);_&&v.push(_)}}let P=1;for(let V of v)if(V.times.length>0){let R=V.times[V.times.length-1]??0;R>P&&(P=R)}l.push({name:S,duration:P,fps:30,tracks:v})}let u=1/0,c=1/0,B=1/0,Q=-1/0,f=-1/0,h=-1/0;for(let b of a)for(let N=0;N<b.positions.length;N+=3){let S=b.positions[N],v=b.positions[N+1],F=b.positions[N+2];S<u&&(u=S),v<c&&(c=v),F<B&&(B=F),S>Q&&(Q=S),v>f&&(f=v),F>h&&(h=F)}Number.isFinite(u)||(u=-1,c=-1,B=-1,Q=1,f=1,h=1);let m=Q-u,d=f-c,x=h-B,y=(u+Q)*.5,G=(c+f)*.5,M=(B+h)*.5,D=Math.hypot(m,d,x)*.5;return{meshes:a,materials:s,animations:l,bounds:{min:[u,c,B],max:[Q,f,h],center:[y,G,M],size:[m,d,x],boundingSphereRadius:D}}}};function ir(A){switch(A){case"Lcl Translation":case"T":return"T";case"Lcl Rotation":case"R":return"R";case"Lcl Scaling":case"S":return"S";default:return}}function Ui(A){switch(A){case"d|X":return 0;case"d|Y":return 1;case"d|Z":return 2;default:return}}function Yt(A,e){let n=A?.children.find(r=>r.name==="Properties70")?.children.find(r=>r.name==="P"&&r.props[0]===e);if(n)return n.props.slice(4).map(r=>Number(r))}function vi(A,e,t){let n=t==="S"?1:0,r=Yt(A,t==="T"?"Lcl Translation":t==="R"?"Lcl Rotation":"Lcl Scaling"),i=[n,n,n];for(let o=0;o<3;o++){let a=r?.[o],s=Yt(e,`d|${"XYZ"[o]}`)?.[0],g=a??s;g!==void 0&&Number.isFinite(g)&&(i[o]=g)}return i}var Ri=["XYZ","XZY","YZX","YXZ","ZXY","ZYX"];function Li(A){let e=Yt(A,"RotationOrder")?.[0]??0;return Ri[e]??"XYZ"}function ki(A,e="XYZ"){let t=[0,0,0,1];for(let n of e){let r="XYZ".indexOf(n),i=(A[r]??0)*Math.PI/360,o=Math.sin(i),a=[0,0,0,Math.cos(i)];a[r]=o,t=[a[3]*t[0]+a[0]*t[3]+a[1]*t[2]-a[2]*t[1],a[3]*t[1]-a[0]*t[2]+a[1]*t[3]+a[2]*t[0],a[3]*t[2]+a[0]*t[1]-a[1]*t[0]+a[2]*t[3],a[3]*t[3]-a[0]*t[0]-a[1]*t[1]-a[2]*t[2]]}return t}function Pi(A,e){let{times:t,values:n}=A,r=t.length-1;if(e<=t[0])return n[0];if(e>=t[r])return n[r];let i=0;for(;i<r-1&&t[i+1]<=e;)i++;let o=t[i],a=t[i+1],s=a>o?(e-o)/(a-o):0;return n[i]+(n[i+1]-n[i])*s}function Hi(A){let e=new Set;for(let s of A.channels)for(let g of s?.times??[])e.add(g);if(e.size===0)return;let t=[...e].sort((s,g)=>s-g),n=new Float32Array(t.length),r=A.kind==="R",i=new Float32Array(t.length*(r?4:3)),o=r?Li(A.model):"XYZ",a;return t.forEach((s,g)=>{n[g]=s/re.FBX_KTIME;let l=[0,1,2].map(c=>{let B=A.channels[c];return B?Pi(B,s):A.defaults[c]});if(!r){i.set(l,g*3);return}let u=ki(l,o);if(a&&a[0]*u[0]+a[1]*u[1]+a[2]*u[2]+a[3]*u[3]<0)for(let c=0;c<4;c++)u[c]=-u[c];a=u,i.set(u,g*4)}),{nodeName:A.nodeName,times:n,translations:A.kind==="T"?i:void 0,rotations:r?i:void 0,scales:A.kind==="S"?i:void 0}}function is(A,e={}){return re.parse(A,e)}function Fe(A,e={}){let t=A;if(typeof A=="string"){let n=A.trim();if(!(n.includes("FBXHeaderExtension")||n.includes("Kaydara FBX"))&&typeof fA<"u"&&fA.existsSync)try{let i=A.startsWith("file://")?A.slice(7):A;try{i=decodeURIComponent(i)}catch{}if(fA.existsSync(i)){let o=fA.readFileSync(i);t=new Uint8Array(o.buffer,o.byteOffset,o.byteLength)}}catch{}}return re.parse(t,e)}L();L();var ar=`
|
|
3
|
+
struct AudioLatentBuffer {
|
|
4
|
+
fftBins : array<f32, 1024>,
|
|
5
|
+
bassEnergy : f32,
|
|
6
|
+
drumTransient : f32,
|
|
7
|
+
vocalEnergy : f32,
|
|
8
|
+
timeMs : f32,
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
struct DeformParams {
|
|
12
|
+
mode : u32, // 0 = normal_extrusion, 1 = radial_pulse, 2 = harmonic_wave, 3 = twist, 4 = ripple
|
|
13
|
+
freqMinBin : u32,
|
|
14
|
+
freqMaxBin : u32,
|
|
15
|
+
vertexCount : u32,
|
|
16
|
+
amplitudeMultiplier : f32,
|
|
17
|
+
damping : f32,
|
|
18
|
+
timeMs : f32,
|
|
19
|
+
pad : f32,
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
struct VertexData {
|
|
23
|
+
// 16 floats = 64 bytes per vertex
|
|
24
|
+
f : array<f32, 16>,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
@group(0) @binding(0) var<storage, read> audio : AudioLatentBuffer;
|
|
28
|
+
@group(0) @binding(1) var<uniform> params : DeformParams;
|
|
29
|
+
@group(0) @binding(2) var<storage, read> srcVertices : array<VertexData>;
|
|
30
|
+
@group(0) @binding(3) var<storage, read_write> dstVertices : array<VertexData>;
|
|
31
|
+
|
|
32
|
+
@compute @workgroup_size(256)
|
|
33
|
+
fn cs_displace(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
34
|
+
let idx = gid.x;
|
|
35
|
+
if (idx >= params.vertexCount) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
let src = srcVertices[idx];
|
|
40
|
+
var outV = src;
|
|
41
|
+
|
|
42
|
+
// Extract attributes
|
|
43
|
+
let pos = vec3<f32>(src.f[0], src.f[1], src.f[2]);
|
|
44
|
+
let uv = vec2<f32>(src.f[3], src.f[4]);
|
|
45
|
+
var norm = vec3<f32>(src.f[5], src.f[6], src.f[7]);
|
|
46
|
+
|
|
47
|
+
let normLen = length(norm);
|
|
48
|
+
if (normLen > 0.0001) {
|
|
49
|
+
norm = norm / normLen;
|
|
50
|
+
} else {
|
|
51
|
+
norm = vec3<f32>(0.0, 1.0, 0.0);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Determine frequency bin
|
|
55
|
+
let minBin = max(0u, params.freqMinBin);
|
|
56
|
+
let maxBin = min(1023u, max(minBin, params.freqMaxBin));
|
|
57
|
+
let freqNorm = clamp(uv.x, 0.0, 1.0);
|
|
58
|
+
let binIdx = u32(clamp(f32(minBin) + freqNorm * f32(maxBin - minBin), 0.0, 1023.0));
|
|
59
|
+
let freqAmplitude = audio.fftBins[binIdx];
|
|
60
|
+
|
|
61
|
+
var displacedPos = pos;
|
|
62
|
+
var displacedNorm = norm;
|
|
63
|
+
|
|
64
|
+
if (params.mode == 0u) {
|
|
65
|
+
// Mode 0: normal_extrusion
|
|
66
|
+
let bassOsc = sin(params.timeMs * 0.01 + pos.y * 0.5);
|
|
67
|
+
let displacementMag = (freqAmplitude * 45.0 + audio.bassEnergy * 20.0 * bassOsc) * params.amplitudeMultiplier;
|
|
68
|
+
displacedPos = pos + norm * displacementMag;
|
|
69
|
+
|
|
70
|
+
// Dynamic normal perturbation based on spatial gradient
|
|
71
|
+
let tangentDelta = cos(params.timeMs * 0.01 + pos.y * 0.5) * 0.5 * audio.bassEnergy * params.amplitudeMultiplier;
|
|
72
|
+
var perturbed = norm + vec3<f32>(0.0, -tangentDelta * 0.05, 0.0);
|
|
73
|
+
let pLen = length(perturbed);
|
|
74
|
+
if (pLen > 0.0001) {
|
|
75
|
+
displacedNorm = perturbed / pLen;
|
|
76
|
+
}
|
|
77
|
+
} else if (params.mode == 1u) {
|
|
78
|
+
// Mode 1: radial_pulse
|
|
79
|
+
let rLen = length(pos);
|
|
80
|
+
var dir = norm;
|
|
81
|
+
if (rLen > 0.0001) {
|
|
82
|
+
dir = pos / rLen;
|
|
83
|
+
}
|
|
84
|
+
let pulse = (audio.bassEnergy * 35.0 + audio.drumTransient * 45.0) * params.amplitudeMultiplier;
|
|
85
|
+
let dampingFactor = exp(-max(0.0, params.damping) * rLen * 0.01);
|
|
86
|
+
displacedPos = pos + dir * (pulse * dampingFactor);
|
|
87
|
+
displacedNorm = norm;
|
|
88
|
+
} else if (params.mode == 3u) {
|
|
89
|
+
// Mode 3: twist. Each slice turns about Y by its height times the
|
|
90
|
+
// twist rate; a resting twist plus the bass, so it winds on the drop.
|
|
91
|
+
let rate = (0.35 + audio.bassEnergy) * 0.004 * params.amplitudeMultiplier;
|
|
92
|
+
let a = pos.y * rate;
|
|
93
|
+
let c = cos(a);
|
|
94
|
+
let s = sin(a);
|
|
95
|
+
displacedPos = vec3<f32>(c * pos.x - s * pos.z, pos.y, s * pos.x + c * pos.z);
|
|
96
|
+
displacedNorm = vec3<f32>(c * norm.x - s * norm.z, norm.y, s * norm.x + c * norm.z);
|
|
97
|
+
} else if (params.mode == 4u) {
|
|
98
|
+
// Mode 4: ripple. Concentric waves travel out across XY from the
|
|
99
|
+
// origin, struck harder by the drums and fading with distance.
|
|
100
|
+
let r = length(pos.xy);
|
|
101
|
+
let phase = r * 0.05 - params.timeMs * 0.015;
|
|
102
|
+
let height = (6.0 + audio.drumTransient * 28.0 + audio.bassEnergy * 10.0) * params.amplitudeMultiplier;
|
|
103
|
+
let fade = exp(-max(0.0, params.damping) * r * 0.002);
|
|
104
|
+
displacedPos = pos + norm * (sin(phase) * height * fade);
|
|
105
|
+
// The wave's slope tilts the normal toward the travel direction.
|
|
106
|
+
var radial = vec3<f32>(0.0, 0.0, 0.0);
|
|
107
|
+
if (r > 0.0001) {
|
|
108
|
+
radial = vec3<f32>(pos.x / r, pos.y / r, 0.0);
|
|
109
|
+
}
|
|
110
|
+
let slope = cos(phase) * 0.05 * height * fade;
|
|
111
|
+
var perturbed = norm - radial * slope;
|
|
112
|
+
let pLen = length(perturbed);
|
|
113
|
+
if (pLen > 0.0001) {
|
|
114
|
+
displacedNorm = perturbed / pLen;
|
|
115
|
+
}
|
|
116
|
+
} else {
|
|
117
|
+
// Mode 2: harmonic_wave
|
|
118
|
+
let wavePhase = params.timeMs * 0.005 + pos.y * 0.2;
|
|
119
|
+
let wave = (sin(wavePhase) * audio.bassEnergy * 25.0 + cos(wavePhase * 2.0 + pos.x * 0.1) * freqAmplitude * 20.0) * params.amplitudeMultiplier;
|
|
120
|
+
displacedPos = pos + norm * wave;
|
|
121
|
+
|
|
122
|
+
let dWaveDy = cos(wavePhase) * 0.2 * audio.bassEnergy * 25.0 * params.amplitudeMultiplier;
|
|
123
|
+
var perturbed = norm - vec3<f32>(0.0, dWaveDy * 0.03, 0.0);
|
|
124
|
+
let pLen = length(perturbed);
|
|
125
|
+
if (pLen > 0.0001) {
|
|
126
|
+
displacedNorm = perturbed / pLen;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Write deformed position and normal
|
|
131
|
+
outV.f[0] = displacedPos.x;
|
|
132
|
+
outV.f[1] = displacedPos.y;
|
|
133
|
+
outV.f[2] = displacedPos.z;
|
|
134
|
+
|
|
135
|
+
outV.f[5] = displacedNorm.x;
|
|
136
|
+
outV.f[6] = displacedNorm.y;
|
|
137
|
+
outV.f[7] = displacedNorm.z;
|
|
138
|
+
|
|
139
|
+
dstVertices[idx] = outV;
|
|
140
|
+
}
|
|
141
|
+
`;var Ti={normal_extrusion:0,radial_pulse:1,harmonic_wave:2,twist:3,ripple:4},at=class{device;pipeline;bindGroupLayout;uniformPool;deformedBuffers=new WeakMap;uniformData=new ArrayBuffer(32);uniformUint32=new Uint32Array(this.uniformData);uniformFloat32=new Float32Array(this.uniformData);constructor(e){this.device=e,this.uniformPool=new GA(32,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.bindGroupLayout=e.createBindGroupLayout({label:"AudioMeshDeformBindGroupLayout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});let t=e.createShaderModule({label:"audioMeshDisplace.wgsl",code:ar}),n=e.createPipelineLayout({label:"AudioMeshDeformPipelineLayout",bindGroupLayouts:[this.bindGroupLayout]});this.pipeline=e.createComputePipeline({label:"AudioMeshDeformComputePipeline",layout:n,compute:{module:t,entryPoint:"cs_displace"}})}getOrCreateDeformedBuffer(e,t){let n=this.deformedBuffers.get(e);return(!n||n.size<t)&&(n?.destroy(),n=this.device.createBuffer({label:"DeformedMeshVertexBuffer",size:Math.max(64,Math.ceil(t/4)*4),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC}),this.deformedBuffers.set(e,n)),n}execute(e,t,n){let{config:r,audioLatentBuffer:i,vertexCount:o,timeMs:a=0,sampleRate:s=48e3}=n,g=o*64,l=this.getOrCreateDeformedBuffer(t,g),u=Ti[r.mode]??0,c=s/2048,B=r.frequencyRange?r.frequencyRange[0]:20,Q=r.frequencyRange?r.frequencyRange[1]:120,f=Math.max(0,Math.min(1023,Math.round(B/c))),h=Math.max(f,Math.min(1023,Math.round(Q/c))),m=typeof r.amplitudeMultiplier=="number"?r.amplitudeMultiplier:typeof r.amplitudeMultiplier?.value=="number"?r.amplitudeMultiplier.value:1,d=r.damping??0;this.uniformUint32[0]=u,this.uniformUint32[1]=f,this.uniformUint32[2]=h,this.uniformUint32[3]=o,this.uniformFloat32[4]=m,this.uniformFloat32[5]=d,this.uniformFloat32[6]=a,this.uniformFloat32[7]=0;let x=this.uniformPool.getBuffer(this.device,new Uint8Array(this.uniformData)),y=this.device.createBindGroup({layout:this.bindGroupLayout,entries:[{binding:0,resource:{buffer:i}},{binding:1,resource:{buffer:x}},{binding:2,resource:{buffer:t}},{binding:3,resource:{buffer:l}}]}),G=e.beginComputePass({label:"AudioMeshDeformComputePass"});G.setPipeline(this.pipeline),G.setBindGroup(0,y);let M=Math.ceil(o/256);return G.dispatchWorkgroups(M),G.end(),l}resetPools(){this.uniformPool.reset()}destroy(){this.uniformPool.destroy()}};L();L();L();function Be(A,e,t){let n=r=>[A[r*3],A[r*3+1],A[r*3+2]];for(let r=0;r<e.length;r+=3){let i=e[r],o=e[r+1],a=e[r+2],s=n(i),g=k.cross(k.subtract(n(o),s),k.subtract(n(a),s));for(let l of[i,o,a])t[l*3]+=g[0],t[l*3+1]+=g[1],t[l*3+2]+=g[2]}for(let r=0;r<t.length;r+=3){let i=t[r],o=t[r+1],a=t[r+2],s=Math.hypot(i,o,a)||1;t[r]=i/s,t[r+1]=o/s,t[r+2]=a/s}}function JA(...A){let e=1/0,t=1/0,n=1/0,r=-1/0,i=-1/0,o=-1/0;for(let a of A)for(let s=0;s<a.length;s+=3){let g=a[s],l=a[s+1],u=a[s+2];g<e&&(e=g),g>r&&(r=g),l<t&&(t=l),l>i&&(i=l),u<n&&(n=u),u>o&&(o=u)}return Number.isFinite(e)||(e=t=n=0,r=i=o=0),{min:[e,t,n],max:[r,i,o],center:[(e+r)*.5,(t+i)*.5,(n+o)*.5],size:[r-e,i-t,o-n]}}function OA(A,e){let t=Math.max(...A.size,1e-4),n=1;e.normalizeSize&&e.normalizeSize>0&&(n=e.normalizeSize/t);let r=[n,n,n];return typeof e.scale=="number"?(r[0]*=e.scale,r[1]*=e.scale,r[2]*=e.scale):Array.isArray(e.scale)&&(r[0]*=e.scale[0],r[1]*=e.scale[1],r[2]*=e.scale[2]),{offset:e.center?A.center:[0,0,0],scale:r}}function KA(A,{offset:e,scale:t}){let n=new Float32Array(A.length);for(let r=0;r<A.length;r+=3)n[r]=(A[r]-e[0])*t[0],n[r+1]=(A[r+1]-e[1])*t[1],n[r+2]=(A[r+2]-e[2])*t[2];return n}function VA(A,e){return e>65535?new Uint32Array(A):new Uint16Array(A)}function YA(A,{offset:e,scale:t}){let n=[(A.min[0]-e[0])*t[0],(A.min[1]-e[1])*t[1],(A.min[2]-e[2])*t[2]],r=[(A.max[0]-e[0])*t[0],(A.max[1]-e[1])*t[1],(A.max[2]-e[2])*t[2]];return{min:n,max:r,center:[(n[0]+r[0])*.5,(n[1]+r[1])*.5,(n[2]+r[2])*.5],size:[r[0]-n[0],r[1]-n[1],r[2]-n[2]],boundingSphereRadius:Math.hypot(r[0]-n[0],r[1]-n[1],r[2]-n[2])*.5}}var Se=class A{static isBinary(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);if(t.length<84)return!1;let r=new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(80,!0),i=84+r*50;if(t.length===i)return!0;let o=Math.min(t.length,512);for(let s=0;s<o;s++){let g=t[s];if(g>127||g<32&&g!==9&&g!==10&&g!==13)return!0}let a=new TextDecoder("utf-8").decode(t.subarray(0,80)).trim();return a.startsWith("solid")&&!a.includes(`
|
|
142
|
+
`)?t.length>=84+r*50:!a.startsWith("solid")}static parse(e,t={}){if(typeof e=="string")return A.parseAscii(e,t);let n=e instanceof Uint8Array?e:new Uint8Array(e);if(A.isBinary(n))return A.parseBinary(n,t);let r=new TextDecoder("utf-8").decode(n);return A.parseAscii(r,t)}static parseBinary(e,t={}){let n=new DataView(e.buffer,e.byteOffset,e.byteLength),r=n.getUint32(80,!0),i=[],o=[],a=[],s=84;for(let g=0;g<r&&!(s+50>e.byteLength);g++){let l=n.getFloat32(s,!0),u=n.getFloat32(s+4,!0),c=n.getFloat32(s+8,!0);s+=12;let B=n.getFloat32(s,!0),Q=n.getFloat32(s+4,!0),f=n.getFloat32(s+8,!0);s+=12;let h=n.getFloat32(s,!0),m=n.getFloat32(s+4,!0),d=n.getFloat32(s+8,!0);s+=12;let x=n.getFloat32(s,!0),y=n.getFloat32(s+4,!0),G=n.getFloat32(s+8,!0);s+=12,s+=2;let M=l,D=u,b=c;if(M===0&&D===0&&b===0){let S=k.subtract([h,m,d],[B,Q,f]),v=k.subtract([x,y,G],[B,Q,f]),F=k.normalize(k.cross(S,v));M=F[0],D=F[1],b=F[2]}let N=i.length/3;i.push(B,Q,f,h,m,d,x,y,G),o.push(M,D,b,M,D,b,M,D,b),a.push(N,N+1,N+2)}return A.finalizeModel(i,o,a,t)}static parseAscii(e,t={}){let n=[],r=[],i=[],o=e.split(/\r?\n/),a=[0,0,1],s=[];for(let g of o){let l=g.trim();if(l){if(l.startsWith("facet normal")){let u=l.split(/\s+/),c=Number.parseFloat(u[2]??"0")||0,B=Number.parseFloat(u[3]??"0")||0,Q=Number.parseFloat(u[4]??"0")||0;a=[c,B,Q],s=[]}else if(l.startsWith("vertex")){let u=l.split(/\s+/),c=Number.parseFloat(u[1]??"0")||0,B=Number.parseFloat(u[2]??"0")||0,Q=Number.parseFloat(u[3]??"0")||0;s.push([c,B,Q])}else if(l.startsWith("endfacet")){if(s.length>=3){let u=s[0],c=s[1],B=s[2],Q=a;if(Q[0]===0&&Q[1]===0&&Q[2]===0){let f=k.subtract(c,u),h=k.subtract(B,u);Q=k.normalize(k.cross(f,h))}for(let f=1;f<s.length-1;f++){let h=s[f],m=s[f+1],d=n.length/3;n.push(u[0],u[1],u[2],h[0],h[1],h[2],m[0],m[1],m[2]),r.push(Q[0],Q[1],Q[2],Q[0],Q[1],Q[2],Q[0],Q[1],Q[2]),i.push(d,d+1,d+2)}}s=[]}}}return A.finalizeModel(n,r,i,t)}static finalizeModel(e,t,n,r={}){let i=JA(e),o=OA(i,r),a=KA(e,o),[s,g]=i.min,[l,u]=i.size,c=new Float32Array(e.length/3*2);for(let h=0;h<e.length;h+=3){let m=h/3*2;c[m]=l>0?(e[h]-s)/l:0,c[m+1]=u>0?(e[h+1]-g)/u:0}let B=VA(n,a.length/3),Q={name:"stl_default",diffuseColor:[.8,.8,.85,1],shininess:32,specularIntensity:.5,...r.defaultMaterial};return{name:"STL_Model",meshes:[{id:"stl_mesh_0",name:"stl_geometry",positions:a,normals:new Float32Array(t),uvs:c,indices:B,materialName:"stl_default"}],materials:{stl_default:Q},animations:[],bounds:YA(i,o)}}static load(e,t={}){if(typeof e!="string")return A.parse(e,t);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("file://")){let n=e.startsWith("file://")?e.replace("file://",""):e,r=fA.readFileSync(n);return A.parse(r,t)}return A.parse(e,t)}};function Ue(A,e={}){return Se.load(A,e)}L();var Wt=class A{static parse(e,t={}){let n=typeof e=="string"?new TextEncoder().encode(e):e instanceof Uint8Array?e:new Uint8Array(e),r=A.extractHeader(n),i=A.parseHeader(r.text);if(i.format==="ascii"){let a=new TextDecoder("utf-8").decode(n.subarray(r.endOffset));return A.parseAsciiBody(i,a,t)}let o=i.format==="binary_little_endian";return A.parseBinaryBody(i,n.subarray(r.endOffset),o,t)}static extractHeader(e){let t=Math.min(e.length,1e4),n=e.subarray(0,t),r=new TextDecoder("utf-8").decode(n),i=r.indexOf("end_header");if(i===-1)throw new Error("Invalid PLY file: 'end_header' marker not found");let o=r.indexOf(`
|
|
143
|
+
`,i);return o===-1?o=i+10:o+=1,{text:r.substring(0,o),endOffset:o}}static parseHeader(e){let t=e.split(/\r?\n/),n="ascii",r="1.0",i=[],o=null;for(let a of t){let s=a.trim();if(!s||s.startsWith("comment"))continue;let g=s.split(/\s+/),l=g[0]?.toLowerCase();if(l!=="ply"){if(l==="format"){let u=g[1]?.toLowerCase();u==="binary_little_endian"?n="binary_little_endian":u==="binary_big_endian"?n="binary_big_endian":n="ascii",r=g[2]??"1.0"}else if(l==="element"){let u=g[1]??"",c=Number.parseInt(g[2]??"0",10);o={name:u,count:c,properties:[]},i.push(o)}else if(l==="property"&&o)g[1]?.toLowerCase()==="list"?o.properties.push({name:g[4]??"",type:"list",isList:!0,countType:g[2]??"uchar",itemType:g[3]??"int"}):o.properties.push({name:g[2]??"",type:g[1]?.toLowerCase()??"float"});else if(l==="end_header")break}}return{format:n,version:r,elements:i}}static parseAsciiBody(e,t,n){let r=e.elements.find(R=>R.name==="vertex"),i=e.elements.find(R=>R.name==="face"),o=r?.count??0,a=i?.count??0,s=[],g=[],l=[],u=[],c=[],B=r?.properties??[],Q=B.findIndex(R=>R.name==="x"),f=B.findIndex(R=>R.name==="y"),h=B.findIndex(R=>R.name==="z"),m=B.findIndex(R=>R.name==="nx"),d=B.findIndex(R=>R.name==="ny"),x=B.findIndex(R=>R.name==="nz"),y=B.findIndex(R=>R.name==="u"||R.name==="s"||R.name==="texture_u"),G=B.findIndex(R=>R.name==="v"||R.name==="t"||R.name==="texture_v"),M=B.findIndex(R=>R.name==="red"||R.name==="r"),D=B.findIndex(R=>R.name==="green"||R.name==="g"),b=B.findIndex(R=>R.name==="blue"||R.name==="b"),N=B.findIndex(R=>R.name==="alpha"||R.name==="a"),S=m!==-1&&d!==-1&&x!==-1,v=M!==-1&&D!==-1&&b!==-1,F=y!==-1&&G!==-1,P=t.trim().split(/\r?\n/),V=0;for(let R=0;R<o&&!(V>=P.length);R++){let X=P[V++]?.trim();if(!X)continue;let _=X.split(/\s+/),AA=Number.parseFloat(_[Q]??"0")||0,CA=Number.parseFloat(_[f]??"0")||0,Z=Number.parseFloat(_[h]??"0")||0;if(s.push(AA,CA,Z),S){let W=Number.parseFloat(_[m]??"0")||0,q=Number.parseFloat(_[d]??"0")||0,mA=Number.parseFloat(_[x]??"0")||0;g.push(W,q,mA)}else g.push(0,0,0);if(F){let W=Number.parseFloat(_[y]??"0")||0,q=Number.parseFloat(_[G]??"0")||0;l.push(W,1-q)}else l.push(0,0);if(v){let W=(Number.parseFloat(_[M]??"255")||0)/255,q=(Number.parseFloat(_[D]??"255")||0)/255,mA=(Number.parseFloat(_[b]??"255")||0)/255,eA=N!==-1?(Number.parseFloat(_[N]??"255")||0)/255:1;u.push(W,q,mA,eA)}}for(let R=0;R<a&&!(V>=P.length);R++){let X=P[V++]?.trim();if(!X)continue;let _=X.split(/\s+/),AA=Number.parseInt(_[0]??"0",10);if(AA>=3){let CA=Number.parseInt(_[1]??"0",10);for(let Z=1;Z<AA-1;Z++){let W=Number.parseInt(_[Z+1]??"0",10),q=Number.parseInt(_[Z+2]??"0",10);c.push(CA,W,q)}}}return A.finalizeModel(s,g,l,v?u:void 0,c,S,n)}static parseBinaryBody(e,t,n,r){let i=new DataView(t.buffer,t.byteOffset,t.byteLength),o=0,a=e.elements.find(M=>M.name==="vertex"),s=e.elements.find(M=>M.name==="face"),g=a?.count??0,l=s?.count??0,u=[],c=[],B=[],Q=[],f=[],h=a?.properties??[],m=h.some(M=>M.name==="nx"),d=h.some(M=>M.name==="red"||M.name==="r"),x=M=>{let D=0;switch(M.toLowerCase()){case"char":case"int8":D=i.getInt8(o),o+=1;break;case"uchar":case"uint8":D=i.getUint8(o),o+=1;break;case"short":case"int16":D=i.getInt16(o,n),o+=2;break;case"ushort":case"uint16":D=i.getUint16(o,n),o+=2;break;case"int":case"int32":D=i.getInt32(o,n),o+=4;break;case"uint":case"uint32":D=i.getUint32(o,n),o+=4;break;case"float":case"float32":D=i.getFloat32(o,n),o+=4;break;case"double":case"float64":D=i.getFloat64(o,n),o+=8;break;default:D=i.getFloat32(o,n),o+=4;break}return D};for(let M=0;M<g;M++){let D=0,b=0,N=0,S=0,v=0,F=0,P=0,V=0,R=1,X=1,_=1,AA=1;for(let CA of h){let Z=x(CA.type),W=CA.name.toLowerCase();W==="x"?D=Z:W==="y"?b=Z:W==="z"?N=Z:W==="nx"?S=Z:W==="ny"?v=Z:W==="nz"?F=Z:W==="u"||W==="s"?P=Z:W==="v"||W==="t"?V=Z:W==="red"||W==="r"?R=CA.type.includes("int")?Z/255:Z:W==="green"||W==="g"?X=CA.type.includes("int")?Z/255:Z:W==="blue"||W==="b"?_=CA.type.includes("int")?Z/255:Z:(W==="alpha"||W==="a")&&(AA=CA.type.includes("int")?Z/255:Z)}u.push(D,b,N),c.push(S,v,F),B.push(P,1-V),d&&Q.push(R,X,_,AA)}let G=(s?.properties??[]).find(M=>M.isList);for(let M=0;M<l&&!(o>=t.byteLength);M++)if(G){let D=x(G.countType??"uchar"),b=[];for(let N=0;N<D;N++)b.push(x(G.itemType??"int"));if(b.length>=3){let N=b[0];for(let S=1;S<b.length-1;S++)f.push(N,b[S],b[S+1])}}return A.finalizeModel(u,c,B,d?Q:void 0,f,m,r)}static finalizeModel(e,t,n,r,i,o,a){(!o||a.smoothNormals)&&Be(e,i,t);let s=JA(e),g=OA(s,a),l=KA(e,g),u=VA(i,l.length/3),c={name:"ply_default",diffuseColor:[.8,.8,.85,1],shininess:32,specularIntensity:.5,...a.defaultMaterial};return{name:"PLY_Model",meshes:[{id:"ply_mesh_0",name:"ply_geometry",positions:l,normals:new Float32Array(t),uvs:new Float32Array(n),colors:r?new Float32Array(r):void 0,indices:u,materialName:"ply_default"}],materials:{ply_default:c},animations:[],bounds:YA(s,g)}}static load(e,t={}){if(typeof e!="string")return A.parse(e,t);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("file://")){let n=e.startsWith("file://")?e.replace("file://",""):e,r=fA.readFileSync(n);return A.parse(r,t)}return A.parse(e,t)}};function ve(A,e={}){return Wt.load(A,e)}L();L();var Re=128;function Ji(A,e,t){let[n,r,i,o]=e,a=n*n,s=r*r,g=i*i,l=n*r,u=n*i,c=r*i,B=o*n,Q=o*r,f=o*i;return[(1-2*(s+g))*t[0],2*(l+f)*t[0],2*(u-Q)*t[0],0,2*(l-f)*t[1],(1-2*(a+g))*t[1],2*(c+B)*t[1],0,2*(u+Q)*t[2],2*(c-B)*t[2],(1-2*(a+s))*t[2],0,A[0],A[1],A[2],1]}function sr(A){let e=Math.hypot(A[0],A[1],A[2],A[3])||1;return[A[0]/e,A[1]/e,A[2]/e,A[3]/e]}function Oi(A,e,t){let n=A[0]*e[0]+A[1]*e[1]+A[2]*e[2]+A[3]*e[3],r=n<0?-1:1;if(n*=r,n>.9995)return sr([A[0]+(r*e[0]-A[0])*t,A[1]+(r*e[1]-A[1])*t,A[2]+(r*e[2]-A[2])*t,A[3]+(r*e[3]-A[3])*t]);let i=Math.acos(n),o=Math.sin(i),a=Math.sin((1-t)*i)/o,s=r*Math.sin(t*i)/o;return[A[0]*a+e[0]*s,A[1]*a+e[1]*s,A[2]*a+e[2]*s,A[3]*a+e[3]*s]}function Ki(A,e){let t=0,n=A.length-1;for(;t<n;){let r=t+n+1>>1;(A[r]??0)<=e?t=r:n=r-1}return t}function ie(A,e,t,n,r=1){let i=n?(e*3+r)*t:e*t;return Array.from(A.subarray(i,i+t))}function zt(A,e,t,n){let{times:r}=A,i=A.interpolation==="cubic",o=r.length-1;if(n<=(r[0]??0))return ie(e,0,t,i);if(n>=(r[o]??0))return ie(e,o,t,i);let a=Ki(r,n);if(A.interpolation==="step")return ie(e,a,t,i);let s=r[a]??0,g=(r[a+1]??s)-s,l=g>0?(n-s)/g:0,u=ie(e,a,t,i),c=ie(e,a+1,t,i);if(i){let B=ie(e,a,t,!0,2),Q=ie(e,a+1,t,!0,0),f=l*l,h=f*l,m=u.map((d,x)=>(2*h-3*f+1)*d+(h-2*f+l)*g*(B[x]??0)+(-2*h+3*f)*(c[x]??0)+(h-f)*g*(Q[x]??0));return t===4?sr(m):m}return t===4?Oi(u,c,l):u.map((B,Q)=>B+((c[Q]??B)-B)*l)}function Vi(A,e,t){let n=A.map(a=>[...a.translation]),r=A.map(a=>[...a.rotation]),i=A.map(a=>[...a.scale]),o=new Map(A.map((a,s)=>[a.name,s]));for(let a of e?.tracks??[]){let s=a.node??o.get(a.nodeName);s===void 0||!a.times.length||(a.translations&&(n[s]=zt(a,a.translations,3,t)),a.rotations&&(r[s]=zt(a,a.rotations,4,t)),a.scales&&(i[s]=zt(a,a.scales,3,t)))}return A.map((a,s)=>a.matrix??Ji(n[s],r[s],i[s]))}function gr(A,e,t){let n=A.nodes??[],r=Vi(n,e,t),i=new Array(n.length),o=a=>{let s=i[a];if(s)return s;let g=n[a].parent,l=g<0?r[a]:$.multiply(o(g),r[a]);return i[a]=l,l};return n.map((a,s)=>o(s))}function xs(A,e,t){let n=A.skins?.[e];if(!n)throw new Error(`model has no skin ${e}`);let r=new Float32Array(Re*16);for(let i=0;i<Re;i++){let o=n.joints[i];if(o===void 0){r.set($.identity(),i*16);continue}let a=Array.from(n.inverseBindMatrices.subarray(i*16,i*16+16));r.set($.multiply(t[o],a),i*16)}return r}var Yi={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16},Wi={5120:1,5121:1,5122:2,5123:2,5125:4,5126:4};function zi(A,e=!1){switch(A){case 5120:return e?(t,n)=>Math.max(t.getInt8(n)/127,-1):(t,n)=>t.getInt8(n);case 5121:return e?(t,n)=>t.getUint8(n)/255:(t,n)=>t.getUint8(n);case 5122:return e?(t,n)=>Math.max(t.getInt16(n,!0)/32767,-1):(t,n)=>t.getInt16(n,!0);case 5123:return e?(t,n)=>t.getUint16(n,!0)/65535:(t,n)=>t.getUint16(n,!0);case 5125:return(t,n)=>t.getUint32(n,!0);default:return(t,n)=>t.getFloat32(n,!0)}}var lr=1179937895,Xi=1313821514,Zi=5130562,Ee=class A{static isGlb(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);return t.length<12?!1:new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(0,!0)===lr}static parse(e,t={},n){let r,i=[];if(typeof e=="string")try{r=JSON.parse(e)}catch(o){throw new Error(`Failed to parse glTF JSON: ${String(o)}`)}else{let o=e instanceof Uint8Array?e:new Uint8Array(e);if(A.isGlb(o)){let a=A.unpackGlb(o);r=a.doc,a.binBuffer&&i.push(a.binBuffer)}else{let a=new TextDecoder("utf-8").decode(o);r=JSON.parse(a)}}if(r.buffers)for(let o=0;o<r.buffers.length;o++){if(o===0&&i.length>0)continue;let a=r.buffers[o];if(a.uri){if(a.uri.startsWith("data:")){let s=a.uri.indexOf("base64,");if(s!==-1){let g=a.uri.substring(s+7),l=Buffer.from(g,"base64");i[o]=new Uint8Array(l.buffer,l.byteOffset,l.byteLength)}}else if(n){let s=TA.isAbsolute(a.uri)?a.uri:TA.join(n,a.uri);if(fA.existsSync(s)){let g=fA.readFileSync(s);i[o]=new Uint8Array(g.buffer,g.byteOffset,g.byteLength)}}}}return A.buildModel(r,i,t,n)}static unpackGlb(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=t.getUint32(0,!0),r=t.getUint32(8,!0);if(n!==lr)throw new Error("Invalid GLB header: magic mismatch");let i=12,o=null,a;for(;i<r&&i<e.byteLength;){let s=t.getUint32(i,!0),g=t.getUint32(i+4,!0);i+=8;let l=e.subarray(i,i+s);if(i+=s,g===Xi){let u=new TextDecoder("utf-8").decode(l);o=JSON.parse(u)}else g===Zi&&(a=l)}if(!o)throw new Error("Invalid GLB: JSON chunk not found");return{doc:o,binBuffer:a}}static readFloats(e,t,n){let r=e.accessors?.[n];if(!r)throw new Error(`Accessor ${n} not found`);let i=Yi[r.type]??1,o=new Float32Array(r.count*i);if(r.bufferView===void 0)return{data:o,itemSize:i,count:r.count};let a=e.bufferViews?.[r.bufferView];if(!a)throw new Error(`BufferView ${r.bufferView} not found`);let s=t[a.buffer];if(!s)throw new Error(`Binary buffer ${a.buffer} not loaded`);let g=Wi[r.componentType]??4,l=a.byteStride??g*i,u=new DataView(s.buffer,s.byteOffset,s.byteLength),c=(a.byteOffset??0)+(r.byteOffset??0),B=zi(r.componentType,r.normalized);for(let Q=0;Q<r.count;Q++)for(let f=0;f<i;f++)o[Q*i+f]=B(u,c+Q*l+f*g);return{data:o,itemSize:i,count:r.count}}static readIndices(e,t,n){let{data:r}=A.readFloats(e,t,n);return r.reduce((o,a)=>a>o?a:o,0)>65535?Uint32Array.from(r):Uint16Array.from(r)}static imageBytes(e,t,n,r){let i=e.images?.[n];if(!i)return;if(i.bufferView!==void 0){let s=e.bufferViews?.[i.bufferView],g=s?t[s.buffer]:void 0;if(!s||!g)return;let l=s.byteOffset??0;return{bytes:g.subarray(l,l+s.byteLength),mime:i.mimeType??"image/png"}}if(!i.uri)return;if(i.uri.startsWith("data:")){let s=i.uri.indexOf(","),g=i.uri.slice(5,i.uri.indexOf(";"));return{bytes:new Uint8Array(Buffer.from(i.uri.slice(s+1),"base64")),mime:g}}if(!r)return;let o=TA.isAbsolute(i.uri)?i.uri:TA.join(r,decodeURIComponent(i.uri));if(!fA.existsSync(o))return;let a=TA.extname(o).toLowerCase();return{bytes:new Uint8Array(fA.readFileSync(o)),mime:i.mimeType??(a===".png"?"image/png":"image/jpeg")}}static buildMaterial(e,t,n,r,i){let o=n.pbrMetallicRoughness,a=o?.baseColorFactor??[1,1,1,1],s={name:r,diffuseColor:a,roughness:o?.roughnessFactor??.5,metallic:o?.metallicFactor??0,shininess:32*(1-(o?.roughnessFactor??.5)),opacity:a[3]??1,twoSided:n.doubleSided??!0,alphaMode:n.alphaMode==="MASK"?"mask":n.alphaMode==="BLEND"?"blend":"opaque",alphaCutoff:n.alphaMode==="MASK"?n.alphaCutoff??.5:0},g=n.emissiveFactor;g&&(g[0]>0||g[1]>0||g[2]>0)&&(s.emissive=[g[0],g[1],g[2]],s.emissiveStrength=n.extensions?.KHR_materials_emissive_strength?.emissiveStrength??1);let l=n.extensions?.VRMC_materials_mtoon;l?(s.shading="toon",s.shadeColor=l.shadeColorFactor??[1,1,1]):n.extensions?.KHR_materials_unlit&&(s.shading="unlit");let u=o?.baseColorTexture,c=u?e.textures?.[u.index]:void 0;if(c?.source!==void 0){let d=A.imageBytes(e,t,c.source,i);if(d){s.diffuseTextureBuffer=d.bytes,s.diffuseTextureMime=d.mime;let x=c.sampler!==void 0?e.samplers?.[c.sampler]?.wrapS:void 0;s.textureWrap=x===33071?"clamp":x===33648?"mirror":"repeat"}}let B=d=>{let x=d?e.textures?.[d.index]:void 0;return x?.source!==void 0?A.imageBytes(e,t,x.source,i)?.bytes:void 0},Q=B(n.normalTexture);Q&&(s.normalTextureBuffer=Q,s.normalScale=n.normalTexture?.scale??1);let f=B(o?.metallicRoughnessTexture);f&&(s.metallicRoughnessTextureBuffer=f,s.roughness=o?.roughnessFactor??1,s.metallic=o?.metallicFactor??1);let h=B(n.occlusionTexture);h&&(s.occlusionTextureBuffer=h,s.occlusionStrength=n.occlusionTexture?.strength??1);let m=s.emissive&&B(n.emissiveTexture);return m&&(s.emissiveTextureBuffer=m),s}static buildNodes(e){let t=(e.nodes??[]).map((n,r)=>({name:n.name??`node_${r}`,parent:-1,translation:n.translation??[0,0,0],rotation:n.rotation??[0,0,0,1],scale:n.scale??[1,1,1],matrix:n.matrix?n.matrix:void 0}));return(e.nodes??[]).forEach((n,r)=>{for(let i of n.children??[]){let o=t[i];o&&(o.parent=r)}}),t}static buildAnimations(e,t,n){return(e.animations??[]).map((r,i)=>{let o=[],a=0;for(let s of r.channels){let g=r.samplers[s.sampler],l=s.target.node;if(!g||l===void 0||s.target.path==="weights")continue;let u=A.readFloats(e,t,g.input).data,c=A.readFloats(e,t,g.output).data;a=Math.max(a,u[u.length-1]??0);let B={nodeName:n[l]?.name??`node_${l}`,node:l,times:u,interpolation:g.interpolation==="STEP"?"step":g.interpolation==="CUBICSPLINE"?"cubic":"linear"};s.target.path==="translation"?B.translations=c:s.target.path==="rotation"?B.rotations=c:B.scales=c,o.push(B)}return{name:r.name??`Animation_${i}`,duration:a>0?a:1,fps:30,tracks:o}})}static buildModel(e,t,n,r){let i=(e.materials??[]).map((F,P,V)=>{let R=F.name??`material_${P}`;return V.findIndex((X,_)=>(X.name??`material_${_}`)===R)===P?R:`${R}#${P}`}),o={};(e.materials??[]).forEach((F,P)=>{let V=i[P];o[V]=A.buildMaterial(e,t,F,V,r)});let a=A.buildNodes(e),s=(e.skins??[]).map(F=>({joints:F.joints,inverseBindMatrices:F.inverseBindMatrices!==void 0?A.readFloats(e,t,F.inverseBindMatrices).data:Float32Array.from(F.joints.flatMap(()=>$.identity()))})),g=A.buildAnimations(e,t,a),l=(e.nodes??[]).flatMap((F,P)=>F.mesh!==void 0?[{mesh:F.mesh,node:P,skin:F.skin}]:[]),u=l.length>0?l:(e.meshes??[]).map((F,P)=>({mesh:P})),c={name:"glTF_Model",meshes:[],materials:o,nodes:a,skins:s,animations:g,bounds:{min:[0,0,0],max:[0,0,0],center:[0,0,0],size:[0,0,0],boundingSphereRadius:0}},B=gr(c,void 0,0),Q=1/0,f=1/0,h=1/0,m=-1/0,d=-1/0,x=-1/0,y=(F,P,V)=>{F<Q&&(Q=F),F>m&&(m=F),P<f&&(f=P),P>d&&(d=P),V<h&&(h=V),V>x&&(x=V)};for(let F of u){let P=e.meshes?.[F.mesh];P&&P.primitives.forEach((V,R)=>{if(V.attributes.POSITION===void 0||V.mode!==void 0&&V.mode!==4)return;let X=eA=>eA===void 0?void 0:A.readFloats(e,t,eA),_=X(V.attributes.POSITION),AA=_.count,CA=X(V.attributes.COLOR_0),Z;if(CA){Z=new Float32Array(AA*4).fill(1);for(let eA=0;eA<AA;eA++)for(let lA=0;lA<CA.itemSize;lA++)Z[eA*4+lA]=CA.data[eA*CA.itemSize+lA]??1}let W;if(V.indices!==void 0)W=A.readIndices(e,t,V.indices);else{W=AA>65535?new Uint32Array(AA):new Uint16Array(AA);for(let eA=0;eA<AA;eA++)W[eA]=eA}let q=F.skin!==void 0&&V.attributes.JOINTS_0!==void 0,mA=!q&&F.node!==void 0?B[F.node]:void 0;for(let eA=0;eA<AA;eA++){let lA=_.data[eA*3],uA=_.data[eA*3+1],yA=_.data[eA*3+2];if(mA){let tA=$.projectPoint(mA,[lA,uA,yA]);y(tA[0],tA[1],tA[2])}else y(lA,uA,yA)}c.meshes.push({id:`gltf_mesh_${F.mesh}_${R}${F.node!==void 0?`_n${F.node}`:""}`,name:P.name??`Mesh_${F.mesh}`,positions:_.data,normals:X(V.attributes.NORMAL)?.data??new Float32Array(AA*3),uvs:X(V.attributes.TEXCOORD_0)?.data??new Float32Array(AA*2),colors:Z,jointIndices:q?X(V.attributes.JOINTS_0)?.data:void 0,jointWeights:q?X(V.attributes.WEIGHTS_0)?.data:void 0,indices:W,materialName:V.material!==void 0?i[V.material]:void 0,node:F.node,skin:q?F.skin:void 0})})}for(let F of s)if(F.joints.length>Re)throw new Error(`glTF skin has ${F.joints.length} joints; the mesh shader holds ${Re}`);Number.isFinite(Q)||(Q=f=h=0,m=d=x=0);let G=Math.max(m-Q,d-f,x-h,1e-4),M=n.normalizeSize&&n.normalizeSize>0?n.normalizeSize/G:1,D=typeof n.scale=="number"?[n.scale,n.scale,n.scale]:n.scale??[1,1,1],b=[M*D[0],M*D[1],M*D[2]],N=n.center?[(Q+m)*.5,(f+d)*.5,(h+x)*.5]:[0,0,0];c.rootTransform=$.multiply($.scale(b[0],b[1],b[2]),$.translate(-N[0],-N[1],-N[2]));let S=[(Q-N[0])*b[0],(f-N[1])*b[1],(h-N[2])*b[2]],v=[(m-N[0])*b[0],(d-N[1])*b[1],(x-N[2])*b[2]];return c.bounds={min:S,max:v,center:[(S[0]+v[0])*.5,(S[1]+v[1])*.5,(S[2]+v[2])*.5],size:[v[0]-S[0],v[1]-S[1],v[2]-S[2]],boundingSphereRadius:Math.hypot(v[0]-S[0],v[1]-S[1],v[2]-S[2])*.5},c}static load(e,t={}){if(typeof e!="string")return A.parse(e,t);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("file://")){let n=e.startsWith("file://")?e.replace("file://",""):e,r=fA.readFileSync(n),i=TA.dirname(n);return A.parse(r,t,i)}return A.parse(e,t)}};function st(A,e={}){return Ee.load(A,e)}function ur(A,e={}){return Ee.load(A,e)}L();var qi=[[0,0,0,0],...Array.from({length:255},(A,e)=>{let t=(e+1)/256;return[t,t,t,1]})],Le=class A{static isVox(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);return t.length<8?!1:new TextDecoder("ascii").decode(t.subarray(0,4))==="VOX "}static parse(e,t={}){let n=e instanceof Uint8Array?e:new Uint8Array(e),r=new DataView(n.buffer,n.byteOffset,n.byteLength);if(new TextDecoder("ascii").decode(n.subarray(0,4))!=="VOX ")throw new Error("Invalid VOX file: magic mismatch");let o=8,a=16,s=16,g=16,l=[],u=[...qi];for(;o+12<=n.byteLength;){let c=new TextDecoder("ascii").decode(n.subarray(o,o+4)),B=r.getUint32(o+4,!0);o+=12;let Q=o;if(c==="SIZE")a=r.getUint32(Q,!0),s=r.getUint32(Q+4,!0),g=r.getUint32(Q+8,!0);else if(c==="XYZI"){let f=r.getUint32(Q,!0),h=Q+4;for(let m=0;m<f&&!(h+4>n.byteLength);m++){let d=r.getUint8(h),x=r.getUint8(h+1),y=r.getUint8(h+2),G=r.getUint8(h+3);h+=4,l.push({x:d,y:x,z:y,colorIndex:G})}}else if(c==="RGBA")for(let f=0;f<256;f++){let h=Q+f*4;if(h+4>n.byteLength)break;let m=r.getUint8(h)/255,d=r.getUint8(h+1)/255,x=r.getUint8(h+2)/255,y=r.getUint8(h+3)/255,G=f===255?0:f+1;u[G]=[m,d,x,y]}o+=B}return A.buildModel(l,u,a,s,g,t)}static buildModel(e,t,n,r,i,o){let a=new Set;e.forEach(y=>a.add(`${y.x},${y.y},${y.z}`));let s=[],g=[],l=[],u=[],c=[],B=(y,G,M,D,b,N)=>{let S=s.length/3;s.push(...y,...G,...M,...D),g.push(...b,...b,...b,...b),l.push(...N,...N,...N,...N),u.push(0,0,1,0,1,1,0,1),c.push(S,S+1,S+2,S,S+2,S+3)};for(let y of e){let{x:G,y:M,z:D,colorIndex:b}=y,N=t[b]??[.8,.8,.8,1],S=G,v=-D,F=M;a.has(`${G+1},${M},${D}`)||B([S+1,v,F],[S+1,v-1,F],[S+1,v-1,F+1],[S+1,v,F+1],[1,0,0],N),a.has(`${G-1},${M},${D}`)||B([S,v,F+1],[S,v-1,F+1],[S,v-1,F],[S,v,F],[-1,0,0],N),a.has(`${G},${M},${D+1}`)||B([S,v-1,F],[S+1,v-1,F],[S+1,v-1,F+1],[S,v-1,F+1],[0,-1,0],N),a.has(`${G},${M},${D-1}`)||B([S,v,F+1],[S+1,v,F+1],[S+1,v,F],[S,v,F],[0,1,0],N),a.has(`${G},${M+1},${D}`)||B([S+1,v,F+1],[S+1,v-1,F+1],[S,v-1,F+1],[S,v,F+1],[0,0,1],N),a.has(`${G},${M-1},${D}`)||B([S,v,F],[S,v-1,F],[S+1,v-1,F],[S+1,v,F],[0,0,-1],N)}let Q=JA(s),f=OA(Q,o),h=KA(s,f),m=VA(c,h.length/3),d={name:"vox_default",diffuseColor:[1,1,1,1],shininess:32,specularIntensity:.4,...o.defaultMaterial};return{name:"VOX_Model",meshes:[{id:"vox_mesh_0",name:"vox_geometry",positions:h,normals:new Float32Array(g),uvs:new Float32Array(u),colors:new Float32Array(l),indices:m,materialName:"vox_default"}],materials:{vox_default:d},animations:[],bounds:YA(Q,f)}}static load(e,t={}){if(typeof e!="string")return A.parse(e,t);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("file://")){let n=e.startsWith("file://")?e.replace("file://",""):e,r=fA.readFileSync(n);return A.parse(r,t)}throw new Error("VOX files must be binary buffers or local file paths")}};function gt(A,e={}){return Le.load(A,e)}L();var Xt=19789,_i=15677,ji=16384,$i=16640,Ao=16656,eo=16672,to=16704,no=45055,ro=40960,io=40992,oo=16,ao=17,ke=class A{static is3DS(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);return t.length<6?!1:new DataView(t.buffer,t.byteOffset,t.byteLength).getUint16(0,!0)===Xt}static parse(e,t={}){let n=e instanceof Uint8Array?e:new Uint8Array(e),r=new DataView(n.buffer,n.byteOffset,n.byteLength);if(r.getUint16(0,!0)!==Xt)throw new Error("Invalid 3DS file: 0x4D4D magic mismatch");let o=[],a={};return A.readChunk(r,0,n.byteLength,o,a),A.buildModel(o,a,t)}static readChunk(e,t,n,r,i,o="Object"){let a=t;for(;a+6<=n&&a+6<=e.byteLength;){let s=e.getUint16(a,!0),g=e.getUint32(a+2,!0);if(g<6)break;let l=a+g,u=a+6,c=Math.min(l,n,e.byteLength);switch(s){case Xt:case _i:A.readChunk(e,u,c,r,i,o);break;case ji:{let B=u;for(;B<c&&e.getUint8(B)!==0;)B++;let Q=new Uint8Array(e.buffer,e.byteOffset+u,B-u),f=new TextDecoder("ascii").decode(Q)||"Object";A.readChunk(e,B+1,c,r,i,f);break}case $i:{let B={name:o,positions:[],indices:[],uvs:[]};A.readTriMesh(e,u,c,B,i),B.positions.length>0&&B.indices.length>0&&r.push(B);break}case no:A.readMaterial(e,u,c,i);break;default:break}a=l}}static readTriMesh(e,t,n,r,i){let o=t;for(;o+6<=n;){let a=e.getUint16(o,!0),s=e.getUint32(o+2,!0);if(s<6)break;let g=o+s,l=o+6;if(a===Ao){let u=e.getUint16(l,!0),c=l+2;for(let B=0;B<u&&!(c+12>n);B++){let Q=e.getFloat32(c,!0),f=e.getFloat32(c+4,!0),h=e.getFloat32(c+8,!0);r.positions.push(Q,f,h),c+=12}}else if(a===eo){let u=e.getUint16(l,!0),c=l+2;for(let B=0;B<u&&!(c+8>n);B++){let Q=e.getUint16(c,!0),f=e.getUint16(c+2,!0),h=e.getUint16(c+4,!0);r.indices.push(Q,f,h),c+=8}}else if(a===to){let u=e.getUint16(l,!0),c=l+2;for(let B=0;B<u&&!(c+8>n);B++){let Q=e.getFloat32(c,!0),f=e.getFloat32(c+4,!0);r.uvs.push(Q,1-f),c+=8}}o=g}}static readMaterial(e,t,n,r){let i=t,o="Material",a=[.8,.8,.8,1];for(;i+6<=n;){let s=e.getUint16(i,!0),g=e.getUint32(i+2,!0);if(g<6)break;let l=i+g,u=i+6;if(s===ro){let c=u;for(;c<l&&e.getUint8(c)!==0;)c++;let B=new Uint8Array(e.buffer,e.byteOffset+u,c-u);o=new TextDecoder("ascii").decode(B)||o}else if(s===io&&u+6<=l){let c=e.getUint16(u,!0);if(c===oo&&u+18<=l){let B=e.getFloat32(u+6,!0),Q=e.getFloat32(u+10,!0),f=e.getFloat32(u+14,!0);a=[B,Q,f,1]}else if(c===ao&&u+9<=l){let B=e.getUint8(u+6)/255,Q=e.getUint8(u+7)/255,f=e.getUint8(u+8)/255;a=[B,Q,f,1]}}i=l}r[o]={name:o,diffuseColor:a,shininess:32,specularIntensity:.5}}static buildModel(e,t,n){let r=JA(...e.map(a=>a.positions)),i=OA(r,n);return{name:"3DS_Model",meshes:e.map((a,s)=>{let g=KA(a.positions,i),l=new Float32Array(a.positions.length);Be(g,a.indices,l);let u=a.uvs.length===a.positions.length/3*2?new Float32Array(a.uvs):new Float32Array(a.positions.length/3*2),c=VA(a.indices,g.length/3);return{id:`3ds_mesh_${s}`,name:a.name,positions:g,normals:l,uvs:u,indices:c,materialName:a.materialName}}),materials:t,animations:[],bounds:YA(r,i)}}static load(e,t={}){if(typeof e!="string")return A.parse(e,t);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("file://")){let n=e.startsWith("file://")?e.replace("file://",""):e,r=fA.readFileSync(n);return A.parse(r,t)}throw new Error("3DS files must be binary buffers or local file paths")}};function lt(A,e={}){return ke.load(A,e)}L();var Zt=class A{static parse(e,t={}){let r=(typeof e=="string"?e:new TextDecoder("utf-8").decode(e instanceof Uint8Array?e:new Uint8Array(e))).split(/\r?\n/),i=0;for(;i<r.length&&(!r[i].trim()||r[i].trim().startsWith("#"));)i++;if(i>=r.length)throw new Error("Empty OFF file");let o=r[i++].trim(),a=!1,s=!1;if(o.startsWith("NOFF")||o.startsWith("STOFF"))a=!0;else if(o.startsWith("COFF"))s=!0;else if(!o.startsWith("OFF"))throw new Error("Invalid OFF header: missing 'OFF'");o=o.replace(/^(?:ST|CO|NO|C|N)?OFF\s*/i,"").trim();let g=0,l=0;if(o.length>0){let b=o.split(/\s+/);g=Number.parseInt(b[0]??"0",10),l=Number.parseInt(b[1]??"0",10)}else for(;i<r.length;){let b=r[i++].trim();if(!b||b.startsWith("#"))continue;let N=b.split(/\s+/);g=Number.parseInt(N[0]??"0",10),l=Number.parseInt(N[1]??"0",10);break}let u=[],c=[],B=[],Q=[],f=[],h=0;for(;i<r.length&&h<g;){let b=r[i++].trim();if(!b||b.startsWith("#"))continue;let N=b.split(/\s+/),S=Number.parseFloat(N[0]??"0")||0,v=Number.parseFloat(N[1]??"0")||0,F=Number.parseFloat(N[2]??"0")||0;u.push(S,v,F);let P=3;if(a){let V=Number.parseFloat(N[P]??"0")||0,R=Number.parseFloat(N[P+1]??"0")||0,X=Number.parseFloat(N[P+2]??"0")||0;c.push(V,R,X),P+=3}else c.push(0,0,0);if(s&&N.length>P){let V=(Number.parseFloat(N[P]??"255")||0)/(Number.parseFloat(N[P]??"255")>1?255:1),R=(Number.parseFloat(N[P+1]??"255")||0)/(Number.parseFloat(N[P+1]??"255")>1?255:1),X=(Number.parseFloat(N[P+2]??"255")||0)/(Number.parseFloat(N[P+2]??"255")>1?255:1),_=N.length>P+3&&Number.parseFloat(N[P+3]??"1")||1;B.push(V,R,X,_)}Q.push(0,0),h++}let m=0;for(;i<r.length&&m<l;){let b=r[i++].trim();if(!b||b.startsWith("#"))continue;let N=b.split(/\s+/),S=Number.parseInt(N[0]??"0",10);if(S>=3){let v=Number.parseInt(N[1]??"0",10);for(let F=1;F<S-1;F++){let P=Number.parseInt(N[F+1]??"0",10),V=Number.parseInt(N[F+2]??"0",10);f.push(v,P,V)}}m++}(!a||t.smoothNormals)&&Be(u,f,c);let d=JA(u),x=OA(d,t),y=KA(u,x),G=VA(f,y.length/3),M={name:"off_default",diffuseColor:[.8,.8,.85,1],shininess:32,specularIntensity:.5,...t.defaultMaterial};return{name:"OFF_Model",meshes:[{id:"off_mesh_0",name:"off_geometry",positions:y,normals:new Float32Array(c),uvs:new Float32Array(Q),colors:s?new Float32Array(B):void 0,indices:G,materialName:"off_default"}],materials:{off_default:M},animations:[],bounds:YA(d,x)}}static load(e,t={}){if(typeof e!="string")return A.parse(e,t);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("file://")){let n=e.startsWith("file://")?e.replace("file://",""):e,r=fA.readFileSync(n,"utf-8");return A.parse(r,t)}return A.parse(e,t)}};function ut(A,e={}){return Zt.load(A,e)}L();var Ir=`
|
|
144
|
+
struct CameraUniforms {
|
|
145
|
+
viewMatrix : mat4x4<f32>,
|
|
146
|
+
projMatrix : mat4x4<f32>,
|
|
147
|
+
viewProjMatrix : mat4x4<f32>,
|
|
148
|
+
invViewProjMatrix : mat4x4<f32>,
|
|
149
|
+
cameraPos : vec4<f32>, // xyz = eye, w = near
|
|
150
|
+
cameraDir : vec4<f32>, // xyz = forward, w = far
|
|
151
|
+
dofParams : vec4<f32>, // x = focusDistance, y = fStop, z = maxBlurRadius, w = dofEnabled
|
|
152
|
+
screenParams : vec4<f32>, // x = surfaceWidth, y = surfaceHeight, z = time, w = unused
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
@group(0) @binding(0) var<uniform> cam : CameraUniforms;
|
|
156
|
+
@group(0) @binding(1) var samp : sampler;
|
|
157
|
+
@group(0) @binding(2) var colorTex : texture_2d<f32>;
|
|
158
|
+
@group(0) @binding(3) var depthTex : texture_2d<f32>;
|
|
159
|
+
|
|
160
|
+
struct VSOut {
|
|
161
|
+
@builtin(position) pos : vec4<f32>,
|
|
162
|
+
@location(0) uv : vec2<f32>,
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
@vertex
|
|
166
|
+
fn vs_fullscreen(@builtin(vertex_index) vid : u32) -> VSOut {
|
|
167
|
+
var out: VSOut;
|
|
168
|
+
// Fullscreen triangle covering [-1, 1] NDC
|
|
169
|
+
var coord = vec2<f32>(-1.0, -1.0);
|
|
170
|
+
if (vid == 1u) {
|
|
171
|
+
coord = vec2<f32>(3.0, -1.0);
|
|
172
|
+
} else if (vid == 2u) {
|
|
173
|
+
coord = vec2<f32>(-1.0, 3.0);
|
|
174
|
+
}
|
|
175
|
+
out.pos = vec4<f32>(coord, 0.0, 1.0);
|
|
176
|
+
out.uv = coord * 0.5 + 0.5;
|
|
177
|
+
out.uv.y = 1.0 - out.uv.y; // Flip Y for texture coordinates
|
|
178
|
+
return out;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
fn computeCoC(depth: f32) -> f32 {
|
|
182
|
+
let focusDist = cam.dofParams.x;
|
|
183
|
+
let maxBlur = cam.dofParams.z;
|
|
184
|
+
if (focusDist <= 0.0 || maxBlur <= 0.0) {
|
|
185
|
+
return 0.0;
|
|
186
|
+
}
|
|
187
|
+
let delta = abs(depth - focusDist);
|
|
188
|
+
// Smooth non-linear ramp around focus plane
|
|
189
|
+
return clamp((delta / (focusDist * 0.5 + 1.0)) * maxBlur, 0.0, maxBlur);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
@fragment
|
|
193
|
+
fn fs_dof(in: VSOut) -> @location(0) vec4<f32> {
|
|
194
|
+
let centerColor = textureSampleLevel(colorTex, samp, in.uv, 0.0);
|
|
195
|
+
let centerDepth = textureSampleLevel(depthTex, samp, in.uv, 0.0).r;
|
|
196
|
+
let coc = computeCoC(centerDepth);
|
|
197
|
+
|
|
198
|
+
// Skip if DoF is disabled or blur is negligible
|
|
199
|
+
if (cam.dofParams.w < 0.5 || coc < 0.5) {
|
|
200
|
+
return centerColor;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
var accumColor = centerColor;
|
|
204
|
+
var totalWeight = 1.0;
|
|
205
|
+
|
|
206
|
+
let NUM_SAMPLES = 24;
|
|
207
|
+
let GOLDEN_ANGLE = 2.39996323;
|
|
208
|
+
let texelSize = 1.0 / cam.screenParams.xy;
|
|
209
|
+
|
|
210
|
+
for (var i = 1; i <= NUM_SAMPLES; i = i + 1) {
|
|
211
|
+
let theta = f32(i) * GOLDEN_ANGLE;
|
|
212
|
+
let r = sqrt(f32(i) / f32(NUM_SAMPLES)) * coc;
|
|
213
|
+
let offset = vec2<f32>(cos(theta), sin(theta)) * r * texelSize;
|
|
214
|
+
|
|
215
|
+
let sampleUV = in.uv + offset;
|
|
216
|
+
let sampleColor = textureSampleLevel(colorTex, samp, sampleUV, 0.0);
|
|
217
|
+
let sampleDepth = textureSampleLevel(depthTex, samp, sampleUV, 0.0).r;
|
|
218
|
+
let sampleCoC = computeCoC(sampleDepth);
|
|
219
|
+
|
|
220
|
+
// Depth-aware bilateral rejection: prevent background bleed onto sharp foreground
|
|
221
|
+
let depthDiff = sampleDepth - centerDepth;
|
|
222
|
+
let weight = select(
|
|
223
|
+
smoothstep(-10.0, 0.0, depthDiff) * clamp(sampleCoC / coc, 0.2, 1.0),
|
|
224
|
+
1.0,
|
|
225
|
+
depthDiff >= 0.0
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
accumColor = accumColor + sampleColor * weight;
|
|
229
|
+
totalWeight = totalWeight + weight;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
return accumColor / totalWeight;
|
|
233
|
+
}
|
|
234
|
+
`;L();var so=`
|
|
235
|
+
struct BloomUniforms {
|
|
236
|
+
texel : vec2<f32>, // 1 / source size
|
|
237
|
+
threshold : f32,
|
|
238
|
+
knee : f32,
|
|
239
|
+
intensity : f32,
|
|
240
|
+
mode : f32,
|
|
241
|
+
_pad : vec2<f32>,
|
|
242
|
+
tint : vec4<f32>,
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
@group(0) @binding(0) var<uniform> u : BloomUniforms;
|
|
246
|
+
@group(0) @binding(1) var samp : sampler;
|
|
247
|
+
@group(0) @binding(2) var src : texture_2d<f32>;
|
|
248
|
+
@group(0) @binding(3) var base : texture_2d<f32>;
|
|
249
|
+
|
|
250
|
+
struct VsOut {
|
|
251
|
+
@builtin(position) pos : vec4<f32>,
|
|
252
|
+
@location(0) uv : vec2<f32>,
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
@vertex
|
|
256
|
+
fn vs(@builtin(vertex_index) i : u32) -> VsOut {
|
|
257
|
+
let p = vec2<f32>(f32((i << 1u) & 2u), f32(i & 2u));
|
|
258
|
+
var o : VsOut;
|
|
259
|
+
o.pos = vec4<f32>(p * 2.0 - 1.0, 0.0, 1.0);
|
|
260
|
+
o.uv = vec2<f32>(p.x, 1.0 - p.y);
|
|
261
|
+
return o;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
fn s(uv : vec2<f32>) -> vec3<f32> {
|
|
265
|
+
return textureSampleLevel(src, samp, uv, 0.0).rgb;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Jimenez's 13-tap downsample (Call of Duty: AW): stable, no fireflies.
|
|
269
|
+
fn down13(uv : vec2<f32>) -> vec3<f32> {
|
|
270
|
+
let t = u.texel;
|
|
271
|
+
let a = s(uv + t * vec2<f32>(-2.0, -2.0));
|
|
272
|
+
let b = s(uv + t * vec2<f32>(0.0, -2.0));
|
|
273
|
+
let c = s(uv + t * vec2<f32>(2.0, -2.0));
|
|
274
|
+
let d = s(uv + t * vec2<f32>(-2.0, 0.0));
|
|
275
|
+
let e = s(uv);
|
|
276
|
+
let f = s(uv + t * vec2<f32>(2.0, 0.0));
|
|
277
|
+
let g = s(uv + t * vec2<f32>(-2.0, 2.0));
|
|
278
|
+
let h = s(uv + t * vec2<f32>(0.0, 2.0));
|
|
279
|
+
let i = s(uv + t * vec2<f32>(2.0, 2.0));
|
|
280
|
+
let j = s(uv + t * vec2<f32>(-1.0, -1.0));
|
|
281
|
+
let k = s(uv + t * vec2<f32>(1.0, -1.0));
|
|
282
|
+
let l = s(uv + t * vec2<f32>(-1.0, 1.0));
|
|
283
|
+
let m = s(uv + t * vec2<f32>(1.0, 1.0));
|
|
284
|
+
return e * 0.125 + (a + c + g + i) * 0.03125 + (b + d + f + h) * 0.0625 + (j + k + l + m) * 0.125;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Soft-knee threshold (keeps hue, fades in below the threshold).
|
|
288
|
+
fn prefilter(c : vec3<f32>) -> vec3<f32> {
|
|
289
|
+
let br = max(c.r, max(c.g, c.b));
|
|
290
|
+
let kneeW = u.threshold * u.knee + 1e-4;
|
|
291
|
+
var soft = clamp(br - u.threshold + kneeW, 0.0, 2.0 * kneeW);
|
|
292
|
+
soft = soft * soft / (4.0 * kneeW);
|
|
293
|
+
let w = max(soft, br - u.threshold) / max(br, 1e-4);
|
|
294
|
+
return c * max(w, 0.0);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
fn srgbToLinear(c : vec3<f32>) -> vec3<f32> {
|
|
298
|
+
let lo = c / 12.92;
|
|
299
|
+
let hi = pow((max(c, vec3<f32>(0.0)) + 0.055) / 1.055, vec3<f32>(2.4));
|
|
300
|
+
return select(hi, lo, c <= vec3<f32>(0.04045));
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
fn linearToSrgb(c : vec3<f32>) -> vec3<f32> {
|
|
304
|
+
let x = clamp(c, vec3<f32>(0.0), vec3<f32>(1.0));
|
|
305
|
+
let lo = x * 12.92;
|
|
306
|
+
let hi = 1.055 * pow(x, vec3<f32>(1.0 / 2.4)) - 0.055;
|
|
307
|
+
return select(hi, lo, x <= vec3<f32>(0.0031308));
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// mode 0: the source is linear scene radiance; mode 1: display-encoded color.
|
|
311
|
+
@fragment
|
|
312
|
+
fn fs_prefilter(in : VsOut) -> @location(0) vec4<f32> {
|
|
313
|
+
var c = down13(in.uv);
|
|
314
|
+
if (u.mode > 0.5) {
|
|
315
|
+
c = srgbToLinear(c);
|
|
316
|
+
}
|
|
317
|
+
return vec4<f32>(prefilter(c), 1.0);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
@fragment
|
|
321
|
+
fn fs_down(in : VsOut) -> @location(0) vec4<f32> {
|
|
322
|
+
return vec4<f32>(down13(in.uv), 1.0);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// 3x3 tent upsample; added onto the next-larger level by the blend state.
|
|
326
|
+
@fragment
|
|
327
|
+
fn fs_up(in : VsOut) -> @location(0) vec4<f32> {
|
|
328
|
+
let t = u.texel;
|
|
329
|
+
var c = s(in.uv) * 4.0;
|
|
330
|
+
c += (s(in.uv + vec2<f32>(-t.x, 0.0)) + s(in.uv + vec2<f32>(t.x, 0.0)) + s(in.uv + vec2<f32>(0.0, -t.y)) + s(in.uv + vec2<f32>(0.0, t.y))) * 2.0;
|
|
331
|
+
c += s(in.uv + vec2<f32>(-t.x, -t.y)) + s(in.uv + vec2<f32>(t.x, -t.y)) + s(in.uv + vec2<f32>(-t.x, t.y)) + s(in.uv + vec2<f32>(t.x, t.y));
|
|
332
|
+
return vec4<f32>(c / 16.0, 1.0);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// Adds the glow in linear light over the premultiplied display image.
|
|
336
|
+
@fragment
|
|
337
|
+
fn fs_composite(in : VsOut) -> @location(0) vec4<f32> {
|
|
338
|
+
let orig = textureSampleLevel(base, samp, in.uv, 0.0);
|
|
339
|
+
let glow = max(textureSampleLevel(src, samp, in.uv, 0.0).rgb * u.intensity * u.tint.rgb, vec3<f32>(0.0));
|
|
340
|
+
var lin = vec3<f32>(0.0);
|
|
341
|
+
if (orig.a > 0.0001) {
|
|
342
|
+
lin = srgbToLinear(orig.rgb / orig.a) * orig.a;
|
|
343
|
+
}
|
|
344
|
+
let sum = lin + glow;
|
|
345
|
+
let a = clamp(max(orig.a, max(glow.r, max(glow.g, glow.b))), 0.0, 1.0);
|
|
346
|
+
if (a <= 0.0001) {
|
|
347
|
+
return vec4<f32>(0.0);
|
|
348
|
+
}
|
|
349
|
+
return vec4<f32>(linearToSrgb(sum / a) * a, a);
|
|
350
|
+
}
|
|
351
|
+
`,qt="rgba16float",It=class{device;layout;prefilterPipe;downPipe;upPipe;compositePipes=new Map;module;pipelineLayout;sampler;mips=[];mipKey="";placeholder;uniformPool=new GA(48,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);constructor(e){this.device=e,this.module=e.createShaderModule({label:"bloom.wgsl",code:so}),this.layout=e.createBindGroupLayout({label:"BloomLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:3,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}]}),this.pipelineLayout=e.createPipelineLayout({bindGroupLayouts:[this.layout]});let t=(n,r)=>e.createRenderPipeline({label:`Bloom:${n}`,layout:this.pipelineLayout,vertex:{module:this.module,entryPoint:"vs"},fragment:{module:this.module,entryPoint:n,targets:[{format:qt,...r&&{blend:{color:{srcFactor:"one",dstFactor:"one",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one",operation:"add"}}}}]},primitive:{topology:"triangle-list"}});this.prefilterPipe=t("fs_prefilter",!1),this.downPipe=t("fs_down",!1),this.upPipe=t("fs_up",!0),this.sampler=e.createSampler({label:"BloomSampler",magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}),this.placeholder=e.createTexture({size:{width:1,height:1},format:qt,usage:GPUTextureUsage.TEXTURE_BINDING})}compositePipe(e){let t=this.compositePipes.get(e);return t||(t=this.device.createRenderPipeline({label:"Bloom:composite",layout:this.pipelineLayout,vertex:{module:this.module,entryPoint:"vs"},fragment:{module:this.module,entryPoint:"fs_composite",targets:[{format:e}]},primitive:{topology:"triangle-list"}}),this.compositePipes.set(e,t)),t}ensureMips(e,t,n){let r=`${e}x${t}x${n}`;if(r===this.mipKey)return;for(let a of this.mips)a.destroy();this.mips=[];let i=e,o=t;for(let a=0;a<n&&(i=Math.max(1,Math.floor(i/2)),o=Math.max(1,Math.floor(o/2)),this.mips.push(this.device.createTexture({label:`BloomMip${a}`,size:{width:i,height:o},format:qt,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING})),!(i===1&&o===1));a++);this.mipKey=r}uniforms(e,t,n){let r=new Float32Array([e,t,n.threshold,n.knee,n.intensity,n.mode,0,0,n.tint[0],n.tint[1],n.tint[2],1]);return this.uniformPool.getBuffer(this.device,r)}pass(e,t,n,r,i,o,a){let s=this.device.createBindGroup({layout:this.layout,entries:[{binding:0,resource:{buffer:o}},{binding:1,resource:this.sampler},{binding:2,resource:r.createView()},{binding:3,resource:i.createView()}]}),g=e.beginRenderPass({colorAttachments:[{view:n,loadOp:a,storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]});g.setPipeline(t),g.setBindGroup(0,s),g.draw(3),g.end()}apply(e,t,n,r={},i){let o=!i,a=Q=>Q<=.04045?Q/12.92:((Q+.055)/1.055)**2.4,s=r.threshold??(o?.85:2.5),g={intensity:r.intensity??.2,threshold:o?a(s):s,knee:r.knee??.4,tint:r.tint??[1,1,1],mode:o?1:0},l=Math.max(1,Math.min(8,Math.round(r.radius??6)));this.ensureMips(t.width,t.height,l);let u=this.mips,c=(Q,f)=>this.uniforms(1/Q,1/f,g),B=i??t;this.pass(e,this.prefilterPipe,u[0].createView(),B,this.placeholder,c(B.width,B.height),"clear");for(let Q=1;Q<u.length;Q++){let f=u[Q-1];this.pass(e,this.downPipe,u[Q].createView(),f,this.placeholder,c(f.width,f.height),"clear")}for(let Q=u.length-1;Q>0;Q--){let f=u[Q];this.pass(e,this.upPipe,u[Q-1].createView(),f,this.placeholder,c(f.width,f.height),"load")}this.pass(e,this.compositePipe(n.format),n.createView(),u[0],t,c(u[0].width,u[0].height),"clear")}resetPools(){this.uniformPool.reset()}destroy(){for(let e of this.mips)e.destroy();this.placeholder.destroy(),this.uniformPool.destroy()}};L();L();L();var Qe=`
|
|
352
|
+
struct CameraUniforms {
|
|
353
|
+
viewMatrix : mat4x4<f32>,
|
|
354
|
+
projMatrix : mat4x4<f32>,
|
|
355
|
+
viewProjMatrix : mat4x4<f32>,
|
|
356
|
+
invViewProjMatrix : mat4x4<f32>,
|
|
357
|
+
cameraPos : vec4<f32>, // xyz = eye, w = near
|
|
358
|
+
cameraDir : vec4<f32>, // xyz = forward, w = far
|
|
359
|
+
dofParams : vec4<f32>, // x = focusDistance, y = fStop, z = maxBlurRadius, w = dofEnabled
|
|
360
|
+
screenParams : vec4<f32>, // x = surfaceWidth, y = surfaceHeight, z = time, w = unused
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
struct GPULight {
|
|
364
|
+
posType : vec4<f32>, // xyz = position, w = type (0=ambient, 1=directional, 2=point, 3=spot)
|
|
365
|
+
dirRadius : vec4<f32>, // xyz = normalized direction, w = radius / range
|
|
366
|
+
colorIntensity : vec4<f32>, // rgb = sRGB color, w = intensity
|
|
367
|
+
spotParams : vec4<f32>, // x = cos(outer), y = cos(inner), z = decay, w = unused
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
struct LightsUniforms {
|
|
371
|
+
ambientColor : vec4<f32>, // rgb = ambient color * intensity (sRGB), w = unused
|
|
372
|
+
params : vec4<f32>, // x = numLights, y = hasLights, z = physical (1), w = tone mapping (0 none, 1 ACES, 2 AgX, 3 PBR Neutral)
|
|
373
|
+
lights : array<GPULight, 8>,
|
|
374
|
+
// Appended after the original layout so older readers of the prefix still line up.
|
|
375
|
+
ambientLinear : vec4<f32>, // rgb = ambient irradiance (linear), w = exposure multiplier
|
|
376
|
+
envTop : vec4<f32>, // rgb = sky radiance (linear), w = environment rotation (rad)
|
|
377
|
+
envHorizon : vec4<f32>, // rgb = horizon radiance, w = softbox strength
|
|
378
|
+
envBottom : vec4<f32>, // rgb = ground radiance, w = environment enabled
|
|
379
|
+
fog : vec4<f32>, // rgb = fog color (display linear), w = enabled
|
|
380
|
+
fogRange : vec4<f32>, // x = start distance, y = full distance, z = max opacity, w = unused
|
|
381
|
+
shadowParams : vec4<f32>, // x = enabled, y = shadowed light index, z = softness (texels), w = map size
|
|
382
|
+
shadowBias : vec4<f32>, // x = depth bias, y = normal offset (world px), z = darkness 0..1, w = unused
|
|
383
|
+
shadowMatrix : mat4x4<f32>,
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
const PI = 3.14159265359;
|
|
387
|
+
|
|
388
|
+
fn srgbToLinear(c: vec3<f32>) -> vec3<f32> {
|
|
389
|
+
let lo = c / 12.92;
|
|
390
|
+
let hi = pow((max(c, vec3<f32>(0.0)) + 0.055) / 1.055, vec3<f32>(2.4));
|
|
391
|
+
return select(hi, lo, c <= vec3<f32>(0.04045));
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
fn linearToSrgb(c: vec3<f32>) -> vec3<f32> {
|
|
395
|
+
let x = clamp(c, vec3<f32>(0.0), vec3<f32>(1.0));
|
|
396
|
+
let lo = x * 12.92;
|
|
397
|
+
let hi = 1.055 * pow(x, vec3<f32>(1.0 / 2.4)) - 0.055;
|
|
398
|
+
return select(hi, lo, x <= vec3<f32>(0.0031308));
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// \u2500\u2500 Tone mapping (linear scene \u2192 linear display, 0..1) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
402
|
+
|
|
403
|
+
fn rrtAndOdtFit(v: vec3<f32>) -> vec3<f32> {
|
|
404
|
+
let a = v * (v + 0.0245786) - 0.000090537;
|
|
405
|
+
let b = v * (0.983729 * v + 0.4329510) + 0.238081;
|
|
406
|
+
return a / b;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// Stephen Hill's fitted ACES (RRT + sRGB ODT).
|
|
410
|
+
fn toneMapAces(c: vec3<f32>) -> vec3<f32> {
|
|
411
|
+
let x = c / 0.6;
|
|
412
|
+
var v = vec3<f32>(
|
|
413
|
+
dot(vec3<f32>(0.59719, 0.35458, 0.04823), x),
|
|
414
|
+
dot(vec3<f32>(0.07600, 0.90834, 0.01566), x),
|
|
415
|
+
dot(vec3<f32>(0.02840, 0.13383, 0.83777), x),
|
|
416
|
+
);
|
|
417
|
+
v = rrtAndOdtFit(v);
|
|
418
|
+
v = vec3<f32>(
|
|
419
|
+
dot(vec3<f32>(1.60475, -0.53108, -0.07367), v),
|
|
420
|
+
dot(vec3<f32>(-0.10208, 1.10813, -0.00605), v),
|
|
421
|
+
dot(vec3<f32>(-0.00327, -0.07276, 1.07602), v),
|
|
422
|
+
);
|
|
423
|
+
return clamp(v, vec3<f32>(0.0), vec3<f32>(1.0));
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
fn agxContrast(x: vec3<f32>) -> vec3<f32> {
|
|
427
|
+
let x2 = x * x;
|
|
428
|
+
let x4 = x2 * x2;
|
|
429
|
+
return 15.5 * x4 * x2 - 40.14 * x4 * x + 31.96 * x4 - 6.868 * x2 * x
|
|
430
|
+
+ 0.4298 * x2 + 0.1191 * x - 0.00232;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// AgX (Troy Sobotka), base look: graceful highlight roll-off that keeps
|
|
434
|
+
// saturated emissives from clipping to flat primaries.
|
|
435
|
+
fn toneMapAgx(c: vec3<f32>) -> vec3<f32> {
|
|
436
|
+
let inset = mat3x3<f32>(
|
|
437
|
+
0.842479062253094, 0.0423282422610123, 0.0423756549057051,
|
|
438
|
+
0.0784335999999992, 0.878468636469772, 0.0784336,
|
|
439
|
+
0.0792237451477643, 0.0791661274605434, 0.879142973793104,
|
|
440
|
+
);
|
|
441
|
+
let outset = mat3x3<f32>(
|
|
442
|
+
1.19687900512017, -0.0528968517574562, -0.0529716355144438,
|
|
443
|
+
-0.0980208811401368, 1.15190312990417, -0.0980434501171241,
|
|
444
|
+
-0.0990297440797205, -0.0989611768448433, 1.15107367264116,
|
|
445
|
+
);
|
|
446
|
+
let minEv = -12.47393;
|
|
447
|
+
let maxEv = 4.026069;
|
|
448
|
+
var v = inset * max(c, vec3<f32>(0.0));
|
|
449
|
+
v = clamp(log2(max(v, vec3<f32>(1e-10))), vec3<f32>(minEv), vec3<f32>(maxEv));
|
|
450
|
+
v = (v - minEv) / (maxEv - minEv);
|
|
451
|
+
v = agxContrast(v);
|
|
452
|
+
v = outset * v;
|
|
453
|
+
return clamp(pow(max(v, vec3<f32>(0.0)), vec3<f32>(2.2)), vec3<f32>(0.0), vec3<f32>(1.0));
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
// Khronos PBR Neutral: base colors come out as authored (hue and
|
|
457
|
+
// saturation kept) up to near-white; only highlights are compressed.
|
|
458
|
+
fn toneMapNeutral(cIn: vec3<f32>) -> vec3<f32> {
|
|
459
|
+
let startCompression = 0.8 - 0.04;
|
|
460
|
+
let desaturation = 0.15;
|
|
461
|
+
var c = max(cIn, vec3<f32>(0.0));
|
|
462
|
+
let x = min(c.r, min(c.g, c.b));
|
|
463
|
+
let offset = select(0.04, x - 6.25 * x * x, x < 0.08);
|
|
464
|
+
c = c - offset;
|
|
465
|
+
let peak = max(c.r, max(c.g, c.b));
|
|
466
|
+
if (peak < startCompression) {
|
|
467
|
+
return c;
|
|
468
|
+
}
|
|
469
|
+
let d = 1.0 - startCompression;
|
|
470
|
+
let newPeak = 1.0 - d * d / (peak + d - startCompression);
|
|
471
|
+
c = c * (newPeak / peak);
|
|
472
|
+
let g = 1.0 - 1.0 / (desaturation * (peak - newPeak) + 1.0);
|
|
473
|
+
return mix(c, vec3<f32>(newPeak), g);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
fn toneMap(c: vec3<f32>) -> vec3<f32> {
|
|
477
|
+
let exposed = c * lights.ambientLinear.w;
|
|
478
|
+
let mode = lights.params.w;
|
|
479
|
+
if (mode > 2.5) {
|
|
480
|
+
return toneMapNeutral(exposed);
|
|
481
|
+
}
|
|
482
|
+
if (mode > 1.5) {
|
|
483
|
+
return toneMapAgx(exposed);
|
|
484
|
+
}
|
|
485
|
+
if (mode > 0.5) {
|
|
486
|
+
return toneMapAces(exposed);
|
|
487
|
+
}
|
|
488
|
+
return clamp(exposed, vec3<f32>(0.0), vec3<f32>(1.0));
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
// \u2500\u2500 Procedural studio environment (image-based light) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
492
|
+
|
|
493
|
+
// A rectangular-ish softbox seen from the scene: bright inside its angular
|
|
494
|
+
// radius, blurring out with roughness while keeping roughly the same energy.
|
|
495
|
+
fn softbox(d: vec3<f32>, axis: vec3<f32>, radius: f32, rough: f32) -> f32 {
|
|
496
|
+
let cosA = dot(d, axis);
|
|
497
|
+
let edge = cos(radius + rough * 0.9);
|
|
498
|
+
let width = 0.004 + rough * rough * 0.5;
|
|
499
|
+
let lobe = smoothstep(edge - width, edge + width * 0.25, cosA);
|
|
500
|
+
return lobe / (1.0 + rough * rough * 6.0);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/// Radiance arriving from direction d (world space; y points down), as a
|
|
504
|
+
/// surface of the given roughness sees it.
|
|
505
|
+
fn envRadiance(dirIn: vec3<f32>, rough: f32) -> vec3<f32> {
|
|
506
|
+
if (lights.envBottom.w < 0.5) {
|
|
507
|
+
return vec3<f32>(0.0);
|
|
508
|
+
}
|
|
509
|
+
let rot = lights.envTop.w;
|
|
510
|
+
let c = cos(rot);
|
|
511
|
+
let s = sin(rot);
|
|
512
|
+
let d = normalize(vec3<f32>(c * dirIn.x + s * dirIn.z, dirIn.y, -s * dirIn.x + c * dirIn.z));
|
|
513
|
+
let up = -d.y;
|
|
514
|
+
let spread = 0.35 + rough * 0.9;
|
|
515
|
+
let tUp = smoothstep(-0.05, spread, up);
|
|
516
|
+
let tDown = smoothstep(-0.05, spread, -up);
|
|
517
|
+
var col = mix(lights.envHorizon.rgb, lights.envTop.rgb, tUp);
|
|
518
|
+
col = mix(col, lights.envBottom.rgb, tDown);
|
|
519
|
+
let k = lights.envHorizon.w;
|
|
520
|
+
if (k > 0.0) {
|
|
521
|
+
// Key softbox overhead-front-left, a rim strip behind-right, a fill strip left.
|
|
522
|
+
let key = softbox(d, normalize(vec3<f32>(-0.35, -0.85, -0.4)), 0.32, rough);
|
|
523
|
+
let rim = softbox(d, normalize(vec3<f32>(0.75, -0.35, 0.55)), 0.2, rough);
|
|
524
|
+
let fill = softbox(d, normalize(vec3<f32>(-0.92, -0.15, -0.2)), 0.16, rough);
|
|
525
|
+
col += vec3<f32>(k * (key * 1.0 + rim * 0.7 + fill * 0.35));
|
|
526
|
+
}
|
|
527
|
+
return col;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
// Karis' analytic approximation of the split-sum environment BRDF.
|
|
531
|
+
fn envBrdfApprox(f0: vec3<f32>, rough: f32, nDotV: f32) -> vec3<f32> {
|
|
532
|
+
let c0 = vec4<f32>(-1.0, -0.0275, -0.572, 0.022);
|
|
533
|
+
let c1 = vec4<f32>(1.0, 0.0425, 1.04, -0.04);
|
|
534
|
+
let r = rough * c0 + c1;
|
|
535
|
+
let a004 = min(r.x * r.x, exp2(-9.28 * nDotV)) * r.x + r.y;
|
|
536
|
+
let ab = vec2<f32>(-1.04, 1.04) * a004 + r.zw;
|
|
537
|
+
return f0 * ab.x + ab.y;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
// \u2500\u2500 Shadows \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
541
|
+
|
|
542
|
+
var<private> POISSON : array<vec2<f32>, 12> = array<vec2<f32>, 12>(
|
|
543
|
+
vec2<f32>(-0.326, -0.406), vec2<f32>(-0.840, -0.074), vec2<f32>(-0.696, 0.457),
|
|
544
|
+
vec2<f32>(-0.203, 0.621), vec2<f32>(0.962, -0.195), vec2<f32>(0.473, -0.480),
|
|
545
|
+
vec2<f32>(0.519, 0.767), vec2<f32>(0.185, -0.893), vec2<f32>(0.507, 0.064),
|
|
546
|
+
vec2<f32>(0.896, 0.412), vec2<f32>(-0.322, -0.933), vec2<f32>(-0.792, -0.598),
|
|
547
|
+
);
|
|
548
|
+
|
|
549
|
+
/// 1 = fully lit, 0 = fully shadowed, for light index i.
|
|
550
|
+
fn shadowFactor(worldPos: vec3<f32>, N: vec3<f32>, i: i32) -> f32 {
|
|
551
|
+
if (lights.shadowParams.x < 0.5 || i32(lights.shadowParams.y) != i) {
|
|
552
|
+
return 1.0;
|
|
553
|
+
}
|
|
554
|
+
let p = worldPos + N * lights.shadowBias.y;
|
|
555
|
+
let lp = lights.shadowMatrix * vec4<f32>(p, 1.0);
|
|
556
|
+
let ndc = lp.xyz / lp.w;
|
|
557
|
+
let uv = vec2<f32>(ndc.x * 0.5 + 0.5, 0.5 - ndc.y * 0.5);
|
|
558
|
+
if (lp.w <= 0.0 || uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0 || ndc.z > 1.0) {
|
|
559
|
+
return 1.0;
|
|
560
|
+
}
|
|
561
|
+
let texel = 1.0 / max(lights.shadowParams.w, 1.0);
|
|
562
|
+
let radius = lights.shadowParams.z * texel;
|
|
563
|
+
let depthRef = ndc.z - lights.shadowBias.x;
|
|
564
|
+
var lit = 0.0;
|
|
565
|
+
for (var k = 0; k < 12; k++) {
|
|
566
|
+
lit += textureSampleCompareLevel(shadowMap, shadowSampler, uv + POISSON[k] * radius, depthRef);
|
|
567
|
+
}
|
|
568
|
+
lit = lit / 12.0;
|
|
569
|
+
return mix(1.0, lit, lights.shadowBias.z);
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
// \u2500\u2500 Lights \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
573
|
+
|
|
574
|
+
struct LightSample {
|
|
575
|
+
L : vec3<f32>,
|
|
576
|
+
attenuation : f32,
|
|
577
|
+
valid : bool,
|
|
578
|
+
};
|
|
579
|
+
|
|
580
|
+
fn sampleLight(i: i32, worldPos: vec3<f32>) -> LightSample {
|
|
581
|
+
var out = LightSample(vec3<f32>(0.0, 0.0, 1.0), 1.0, false);
|
|
582
|
+
let light = lights.lights[i];
|
|
583
|
+
let lightType = light.posType.w;
|
|
584
|
+
if (lightType > 0.5 && lightType < 1.5) {
|
|
585
|
+
out.L = normalize(-light.dirRadius.xyz);
|
|
586
|
+
out.valid = true;
|
|
587
|
+
return out;
|
|
588
|
+
}
|
|
589
|
+
if (lightType < 1.5) {
|
|
590
|
+
return out;
|
|
591
|
+
}
|
|
592
|
+
let toLight = light.posType.xyz - worldPos;
|
|
593
|
+
let dist = length(toLight);
|
|
594
|
+
let radius = max(1.0, light.dirRadius.w);
|
|
595
|
+
if (dist > radius) {
|
|
596
|
+
return out;
|
|
597
|
+
}
|
|
598
|
+
out.L = normalize(toLight);
|
|
599
|
+
let dNorm = clamp(dist / radius, 0.0, 1.0);
|
|
600
|
+
let decay = max(0.5, light.spotParams.z);
|
|
601
|
+
out.attenuation = pow(clamp(1.0 - dNorm, 0.0, 1.0), decay);
|
|
602
|
+
if (lightType > 2.5) {
|
|
603
|
+
let spotDir = normalize(light.dirRadius.xyz);
|
|
604
|
+
let cosAngle = dot(-out.L, spotDir);
|
|
605
|
+
if (cosAngle < light.spotParams.x) {
|
|
606
|
+
return out;
|
|
607
|
+
}
|
|
608
|
+
out.attenuation *= smoothstep(light.spotParams.x, light.spotParams.y, cosAngle);
|
|
609
|
+
}
|
|
610
|
+
out.valid = true;
|
|
611
|
+
return out;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
// Blinn-Phong in display space: the original look, plus shadows when a
|
|
615
|
+
// light casts them.
|
|
616
|
+
fn applyLighting3D(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3<f32>, material: vec4<f32>) -> vec3<f32> {
|
|
617
|
+
if (lights.params.y < 0.5 || material.w < 0.5) {
|
|
618
|
+
return baseColor;
|
|
619
|
+
}
|
|
620
|
+
var N = normalize(worldNormal);
|
|
621
|
+
let V = normalize(cam.cameraPos.xyz - worldPos);
|
|
622
|
+
if (dot(N, V) < 0.0) {
|
|
623
|
+
N = -N;
|
|
624
|
+
}
|
|
625
|
+
let shininess = max(1.0, material.x);
|
|
626
|
+
let specularInt = material.y;
|
|
627
|
+
let ambientInt = material.z;
|
|
628
|
+
|
|
629
|
+
var totalIllumination = baseColor * (lights.ambientColor.rgb * ambientInt);
|
|
630
|
+
let numLights = i32(lights.params.x);
|
|
631
|
+
for (var i = 0; i < 8; i++) {
|
|
632
|
+
if (i >= numLights) {
|
|
633
|
+
break;
|
|
634
|
+
}
|
|
635
|
+
let ls = sampleLight(i, worldPos);
|
|
636
|
+
if (!ls.valid) {
|
|
637
|
+
continue;
|
|
638
|
+
}
|
|
639
|
+
let light = lights.lights[i];
|
|
640
|
+
let lightColor = light.colorIntensity.rgb;
|
|
641
|
+
let intensity = light.colorIntensity.w;
|
|
642
|
+
let NdotL = max(dot(N, ls.L), 0.0);
|
|
643
|
+
let diffuse = baseColor * lightColor * (NdotL * intensity * ls.attenuation);
|
|
644
|
+
var specular = vec3<f32>(0.0);
|
|
645
|
+
if (NdotL > 0.0 && specularInt > 0.001) {
|
|
646
|
+
let H = normalize(ls.L + V);
|
|
647
|
+
let NdotH = max(dot(N, H), 0.0);
|
|
648
|
+
specular = lightColor * (pow(NdotH, shininess) * specularInt * intensity * ls.attenuation);
|
|
649
|
+
}
|
|
650
|
+
totalIllumination += (diffuse + specular) * shadowFactor(worldPos, N, i);
|
|
651
|
+
}
|
|
652
|
+
return totalIllumination;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
// GGX / Smith-correlated / Schlick, image-based light from envRadiance.
|
|
656
|
+
// Returns linear scene radiance (unbounded).
|
|
657
|
+
fn shadePhysical(worldPos: vec3<f32>, worldNormal: vec3<f32>, albedo: vec3<f32>, rough: f32, metal: f32, ambientInt: f32) -> vec3<f32> {
|
|
658
|
+
var N = normalize(worldNormal);
|
|
659
|
+
let V = normalize(cam.cameraPos.xyz - worldPos);
|
|
660
|
+
if (dot(N, V) < 0.0) {
|
|
661
|
+
N = -N;
|
|
662
|
+
}
|
|
663
|
+
let nDotV = max(dot(N, V), 1e-4);
|
|
664
|
+
let r = clamp(rough, 0.03, 1.0);
|
|
665
|
+
let a = r * r;
|
|
666
|
+
let a2 = a * a;
|
|
667
|
+
let f0 = mix(vec3<f32>(0.04), albedo, metal);
|
|
668
|
+
let diffuseColor = albedo * (1.0 - metal);
|
|
669
|
+
|
|
670
|
+
var lo = vec3<f32>(0.0);
|
|
671
|
+
let numLights = i32(lights.params.x);
|
|
672
|
+
for (var i = 0; i < 8; i++) {
|
|
673
|
+
if (i >= numLights) {
|
|
674
|
+
break;
|
|
675
|
+
}
|
|
676
|
+
let ls = sampleLight(i, worldPos);
|
|
677
|
+
if (!ls.valid) {
|
|
678
|
+
continue;
|
|
679
|
+
}
|
|
680
|
+
let light = lights.lights[i];
|
|
681
|
+
let nDotL = max(dot(N, ls.L), 0.0);
|
|
682
|
+
if (nDotL <= 0.0) {
|
|
683
|
+
continue;
|
|
684
|
+
}
|
|
685
|
+
let H = normalize(ls.L + V);
|
|
686
|
+
let nDotH = max(dot(N, H), 0.0);
|
|
687
|
+
let vDotH = max(dot(V, H), 0.0);
|
|
688
|
+
let dDen = nDotH * nDotH * (a2 - 1.0) + 1.0;
|
|
689
|
+
let D = a2 / (PI * dDen * dDen);
|
|
690
|
+
let gv = nDotL * sqrt(nDotV * nDotV * (1.0 - a2) + a2);
|
|
691
|
+
let gl = nDotV * sqrt(nDotL * nDotL * (1.0 - a2) + a2);
|
|
692
|
+
let Vis = 0.5 / max(gv + gl, 1e-5);
|
|
693
|
+
let F = f0 + (vec3<f32>(1.0) - f0) * pow(1.0 - vDotH, 5.0);
|
|
694
|
+
let spec = D * Vis * F;
|
|
695
|
+
let diff = (vec3<f32>(1.0) - F) * diffuseColor / PI;
|
|
696
|
+
// x PI so a white light of intensity 1 lights a white wall about as
|
|
697
|
+
// brightly as the legacy shading does.
|
|
698
|
+
let radiance = srgbToLinear(light.colorIntensity.rgb) * light.colorIntensity.w * ls.attenuation * PI;
|
|
699
|
+
lo += (diff + spec) * radiance * nDotL * shadowFactor(worldPos, N, i);
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
let R = reflect(-V, N);
|
|
703
|
+
let irradiance = envRadiance(N, 1.0) + lights.ambientLinear.rgb;
|
|
704
|
+
let specEnv = envRadiance(R, r) * envBrdfApprox(f0, r, nDotV);
|
|
705
|
+
lo += (diffuseColor * irradiance + specEnv) * ambientInt;
|
|
706
|
+
return lo;
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
struct Shaded {
|
|
710
|
+
/** Display-encoded (sRGB) color for the color target. */
|
|
711
|
+
display : vec3<f32>,
|
|
712
|
+
/** Unclamped scene-referred linear radiance, for the bloom target. */
|
|
713
|
+
hdr : vec3<f32>,
|
|
714
|
+
};
|
|
715
|
+
|
|
716
|
+
/// Shades a surface for the scene's mode.
|
|
717
|
+
/// material: x shininess, y specularIntensity, z ambientIntensity, w mode (0 unlit).
|
|
718
|
+
/// pbr: x roughness (<0 = default), y metallic, z/w unused.
|
|
719
|
+
/// emissive: rgb sRGB color, w strength.
|
|
720
|
+
fn shadeSurfaceFull(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3<f32>, material: vec4<f32>, pbr: vec4<f32>, emissive: vec4<f32>) -> Shaded {
|
|
721
|
+
var out: Shaded;
|
|
722
|
+
if (lights.params.z < 0.5) {
|
|
723
|
+
var c = baseColor;
|
|
724
|
+
if (material.w >= 0.5) {
|
|
725
|
+
c = applyLighting3D(worldPos, worldNormal, baseColor, material);
|
|
726
|
+
}
|
|
727
|
+
c += emissive.rgb * emissive.w;
|
|
728
|
+
out.display = c;
|
|
729
|
+
out.hdr = srgbToLinear(clamp(c, vec3<f32>(0.0), vec3<f32>(1.0))) * max(max(c.r, max(c.g, c.b)), 1.0);
|
|
730
|
+
return out;
|
|
731
|
+
}
|
|
732
|
+
var radiance: vec3<f32>;
|
|
733
|
+
if (material.w < 0.5) {
|
|
734
|
+
radiance = srgbToLinear(baseColor);
|
|
735
|
+
} else {
|
|
736
|
+
let rough = select(pbr.x, 0.5, pbr.x < 0.0);
|
|
737
|
+
radiance = shadePhysical(worldPos, worldNormal, srgbToLinear(baseColor), rough, clamp(pbr.y, 0.0, 1.0), material.z);
|
|
738
|
+
}
|
|
739
|
+
radiance += srgbToLinear(emissive.rgb) * emissive.w;
|
|
740
|
+
var display: vec3<f32>;
|
|
741
|
+
if (material.w < 0.5) {
|
|
742
|
+
// Unlit layers keep their exact authored colors.
|
|
743
|
+
display = clamp(radiance, vec3<f32>(0.0), vec3<f32>(1.0));
|
|
744
|
+
} else {
|
|
745
|
+
display = toneMap(radiance);
|
|
746
|
+
}
|
|
747
|
+
var hdr = radiance * lights.ambientLinear.w;
|
|
748
|
+
if (lights.fog.w > 0.5) {
|
|
749
|
+
let dist = distance(worldPos, cam.cameraPos.xyz);
|
|
750
|
+
let f = smoothstep(lights.fogRange.x, max(lights.fogRange.y, lights.fogRange.x + 1.0), dist) * lights.fogRange.z;
|
|
751
|
+
display = mix(display, lights.fog.rgb, f);
|
|
752
|
+
hdr = hdr * (1.0 - f);
|
|
753
|
+
}
|
|
754
|
+
out.display = linearToSrgb(display);
|
|
755
|
+
out.hdr = hdr;
|
|
756
|
+
return out;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
fn shadeSurface(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3<f32>, material: vec4<f32>, pbr: vec4<f32>, emissive: vec4<f32>) -> vec3<f32> {
|
|
760
|
+
return shadeSurfaceFull(worldPos, worldNormal, baseColor, material, pbr, emissive).display;
|
|
761
|
+
}
|
|
762
|
+
`,fe=`
|
|
763
|
+
@group(3) @binding(0) var<uniform> lights : LightsUniforms;
|
|
764
|
+
@group(3) @binding(1) var shadowMap : texture_depth_2d;
|
|
765
|
+
@group(3) @binding(2) var shadowSampler : sampler_comparison;
|
|
766
|
+
`;L();function Ce(A,e){return`
|
|
767
|
+
@group(${A}) @binding(${e}) var matteTex : texture_2d<f32>;
|
|
768
|
+
|
|
769
|
+
fn matteCoverage(fragPos : vec2<f32>) -> f32 {
|
|
770
|
+
let dims = vec2<f32>(textureDimensions(matteTex));
|
|
771
|
+
let p = floor(fragPos * dims / max(cam.screenParams.xy, vec2<f32>(1.0)));
|
|
772
|
+
return textureLoad(matteTex, vec2<i32>(clamp(p, vec2<f32>(0.0), dims - 1.0)), 0).a;
|
|
773
|
+
}
|
|
774
|
+
`}var cr=`
|
|
775
|
+
${Qe}
|
|
776
|
+
|
|
777
|
+
struct ModelUniforms {
|
|
778
|
+
modelMatrix : mat4x4<f32>,
|
|
779
|
+
normalMatrix : mat4x4<f32>,
|
|
780
|
+
colorTint : vec4<f32>,
|
|
781
|
+
params : vec4<f32>, // x = opacity, y = twoSided (1.0 = yes), z = isSkinned (1.0 = yes), w = wireframe
|
|
782
|
+
materialParams : vec4<f32>, // x = shininess, y = specularIntensity, z = ambientIntensity, w = materialMode (0=unlit, 1=lit, 2=toon)
|
|
783
|
+
shade : vec4<f32>, // rgb = toon shadow-side color multiplier, a = alpha cutoff (0 = none)
|
|
784
|
+
pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
|
|
785
|
+
emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
|
|
786
|
+
maps : vec4<f32>, // x = normal scale (0 = no map), y = occlusion strength, z = has metallic-roughness map, w = has emissive map
|
|
787
|
+
};
|
|
788
|
+
|
|
789
|
+
struct SkinningUniforms {
|
|
790
|
+
jointMatrices : array<mat4x4<f32>, 128>,
|
|
791
|
+
};
|
|
792
|
+
|
|
793
|
+
@group(0) @binding(0) var<uniform> cam : CameraUniforms;
|
|
794
|
+
@group(1) @binding(0) var<uniform> model : ModelUniforms;
|
|
795
|
+
@group(1) @binding(1) var<uniform> skinning : SkinningUniforms;
|
|
796
|
+
${Ce(1,2)}@group(1) @binding(3) var backdropTex : texture_2d<f32>;
|
|
797
|
+
@group(2) @binding(0) var texSampler : sampler;
|
|
798
|
+
@group(2) @binding(1) var mainTex : texture_2d<f32>;
|
|
799
|
+
@group(2) @binding(2) var normalTex : texture_2d<f32>;
|
|
800
|
+
@group(2) @binding(3) var metalRoughTex : texture_2d<f32>;
|
|
801
|
+
@group(2) @binding(4) var occlusionTex : texture_2d<f32>;
|
|
802
|
+
@group(2) @binding(5) var emissiveTex : texture_2d<f32>;
|
|
803
|
+
${fe}
|
|
804
|
+
|
|
805
|
+
struct VertexInput {
|
|
806
|
+
@location(0) position : vec3<f32>,
|
|
807
|
+
@location(1) uv : vec2<f32>,
|
|
808
|
+
@location(2) normal : vec3<f32>,
|
|
809
|
+
@location(3) joints : vec4<f32>,
|
|
810
|
+
@location(4) weights : vec4<f32>,
|
|
811
|
+
};
|
|
812
|
+
|
|
813
|
+
struct VertexOutput {
|
|
814
|
+
@builtin(position) clipPos : vec4<f32>,
|
|
815
|
+
@location(0) uv : vec2<f32>,
|
|
816
|
+
@location(1) worldPos : vec3<f32>,
|
|
817
|
+
@location(2) worldNormal : vec3<f32>,
|
|
818
|
+
@location(3) linearDepth : f32,
|
|
819
|
+
};
|
|
820
|
+
|
|
821
|
+
@vertex
|
|
822
|
+
fn vs_main(in: VertexInput) -> VertexOutput {
|
|
823
|
+
var out: VertexOutput;
|
|
824
|
+
|
|
825
|
+
var localPos = in.position;
|
|
826
|
+
var localNorm = in.normal;
|
|
827
|
+
|
|
828
|
+
// Linear Blend Skinning (LBS) on GPU
|
|
829
|
+
if (model.params.z > 0.5) {
|
|
830
|
+
let j0 = i32(in.joints.x);
|
|
831
|
+
let j1 = i32(in.joints.y);
|
|
832
|
+
let j2 = i32(in.joints.z);
|
|
833
|
+
let j3 = i32(in.joints.w);
|
|
834
|
+
|
|
835
|
+
let w0 = in.weights.x;
|
|
836
|
+
let w1 = in.weights.y;
|
|
837
|
+
let w2 = in.weights.z;
|
|
838
|
+
let w3 = in.weights.w;
|
|
839
|
+
|
|
840
|
+
let totalWeight = w0 + w1 + w2 + w3;
|
|
841
|
+
if (totalWeight > 0.001) {
|
|
842
|
+
let skinMat = skinning.jointMatrices[j0] * w0 +
|
|
843
|
+
skinning.jointMatrices[j1] * w1 +
|
|
844
|
+
skinning.jointMatrices[j2] * w2 +
|
|
845
|
+
skinning.jointMatrices[j3] * w3;
|
|
846
|
+
|
|
847
|
+
let pos4 = skinMat * vec4<f32>(in.position, 1.0);
|
|
848
|
+
localPos = pos4.xyz;
|
|
849
|
+
|
|
850
|
+
let norm4 = skinMat * vec4<f32>(in.normal, 0.0);
|
|
851
|
+
localNorm = normalize(norm4.xyz);
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
let worldPos4 = model.modelMatrix * vec4<f32>(localPos, 1.0);
|
|
856
|
+
out.worldPos = worldPos4.xyz;
|
|
857
|
+
|
|
858
|
+
let norm4 = model.normalMatrix * vec4<f32>(localNorm, 0.0);
|
|
859
|
+
out.worldNormal = normalize(norm4.xyz);
|
|
860
|
+
|
|
861
|
+
out.clipPos = cam.viewProjMatrix * worldPos4;
|
|
862
|
+
out.uv = in.uv;
|
|
863
|
+
|
|
864
|
+
out.linearDepth = dot(worldPos4.xyz - cam.cameraPos.xyz, cam.cameraDir.xyz);
|
|
865
|
+
return out;
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
// Toon (MToon-style): the base color as authored where the light reaches,
|
|
869
|
+
// the shade color past a soft terminator. Highlights stay out: the texture
|
|
870
|
+
// already paints them.
|
|
871
|
+
fn toonLighting(in: VertexOutput, baseColor: vec3<f32>) -> vec3<f32> {
|
|
872
|
+
var N = normalize(in.worldNormal);
|
|
873
|
+
let V = normalize(cam.cameraPos.xyz - in.worldPos);
|
|
874
|
+
if (dot(N, V) < 0.0) {
|
|
875
|
+
N = -N;
|
|
876
|
+
}
|
|
877
|
+
var lit = 0.0;
|
|
878
|
+
let numLights = i32(lights.params.x);
|
|
879
|
+
for (var i = 0; i < 8; i++) {
|
|
880
|
+
if (i >= numLights) {
|
|
881
|
+
break;
|
|
882
|
+
}
|
|
883
|
+
let light = lights.lights[i];
|
|
884
|
+
let lightType = light.posType.w;
|
|
885
|
+
var L = vec3<f32>(0.0, 0.0, 1.0);
|
|
886
|
+
if (lightType > 0.5 && lightType < 1.5) {
|
|
887
|
+
L = normalize(-light.dirRadius.xyz);
|
|
888
|
+
} else if (lightType >= 1.5) {
|
|
889
|
+
L = normalize(light.posType.xyz - in.worldPos);
|
|
890
|
+
} else {
|
|
891
|
+
continue;
|
|
892
|
+
}
|
|
893
|
+
let terminator = smoothstep(-0.05, 0.2, dot(N, L));
|
|
894
|
+
lit = max(lit, terminator * min(light.colorIntensity.w, 1.0));
|
|
895
|
+
}
|
|
896
|
+
return baseColor * mix(model.shade.rgb, vec3<f32>(1.0), lit);
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
struct MeshFragment {
|
|
900
|
+
color : vec4<f32>, // premultiplied display color
|
|
901
|
+
hdr : vec4<f32>, // premultiplied scene radiance (bloom source)
|
|
902
|
+
};
|
|
903
|
+
|
|
904
|
+
// Normal mapping without tangents: a cotangent frame from screen-space
|
|
905
|
+
// derivatives (Sch\xFCler, "Followup: Normal Mapping Without Precomputed Tangents").
|
|
906
|
+
fn perturbNormal(N: vec3<f32>, p: vec3<f32>, uv: vec2<f32>, tn: vec3<f32>, dp1: vec3<f32>, dp2: vec3<f32>, duv1: vec2<f32>, duv2: vec2<f32>) -> vec3<f32> {
|
|
907
|
+
let dp2perp = cross(dp2, N);
|
|
908
|
+
let dp1perp = cross(N, dp1);
|
|
909
|
+
// The derivation assumes cross(dp1, dp2) points along N; with this
|
|
910
|
+
// engine's y-down view basis it can point away, mirroring the frame.
|
|
911
|
+
let handed = select(1.0, -1.0, dot(cross(dp1, dp2), N) < 0.0);
|
|
912
|
+
let T = (dp2perp * duv1.x + dp1perp * duv2.x) * handed;
|
|
913
|
+
let B = (dp2perp * duv1.y + dp1perp * duv2.y) * handed;
|
|
914
|
+
let invmax = inverseSqrt(max(max(dot(T, T), dot(B, B)), 1e-20));
|
|
915
|
+
// glTF maps are +Y up while v grows down the image: green points along -B.
|
|
916
|
+
return normalize(T * (tn.x * invmax) - B * (tn.y * invmax) + N * tn.z);
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
// Glass: what is behind the 3D batch on screen (backdrop), bent by
|
|
920
|
+
// refraction along the surface normal with a red/blue split, frosted by a
|
|
921
|
+
// disc blur, tinted by the color, under Fresnel-weighted reflections.
|
|
922
|
+
// shade.rgb = (dispersion, thickness px, frost), pbr.w = ior.
|
|
923
|
+
fn backdropAt(uv: vec2<f32>) -> vec3<f32> {
|
|
924
|
+
return textureSampleLevel(backdropTex, texSampler, clamp(uv, vec2<f32>(0.001), vec2<f32>(0.999)), 0.0).rgb;
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
// rimWidth: how much 1 - N\xB7V changes across this pixel (fwidth, taken in
|
|
928
|
+
// uniform control flow by the caller). Rim effects narrower than a pixel are
|
|
929
|
+
// faded out, or per-pixel shading turns them into stair-stepped lines that
|
|
930
|
+
// MSAA (coverage only) cannot smooth.
|
|
931
|
+
fn shadeGlass(in: VertexOutput, Nin: vec3<f32>, tint: vec3<f32>, alpha: f32, rimWidth: f32) -> MeshFragment {
|
|
932
|
+
let V = normalize(cam.cameraPos.xyz - in.worldPos);
|
|
933
|
+
var N = Nin;
|
|
934
|
+
if (dot(N, V) < 0.0) { N = -N; }
|
|
935
|
+
let NdotV = clamp(dot(N, V), 0.0, 1.0);
|
|
936
|
+
// Also fade toward edge-on: a face seen at a grazing angle is a sliver
|
|
937
|
+
// under a pixel tall (a slab's bottom), which would alias the same way.
|
|
938
|
+
let rimAA = clamp(1.0 - rimWidth * 2.5, 0.0, 1.0) * smoothstep(0.03, 0.22, NdotV);
|
|
939
|
+
let rim = (1.0 - NdotV) * rimAA;
|
|
940
|
+
let ior = max(model.pbr.w, 1.0001);
|
|
941
|
+
let screen = max(cam.screenParams.xy, vec2<f32>(1.0));
|
|
942
|
+
let uv = in.clipPos.xy / screen;
|
|
943
|
+
// Screen-space bend: the normal's in-plane part, stronger toward the rim.
|
|
944
|
+
let bend = N.xy * model.shade.g * (1.0 - 1.0 / ior) * (0.6 + rim) * rimAA / screen;
|
|
945
|
+
let disp = model.shade.r;
|
|
946
|
+
let frost = model.shade.b * 22.0 / screen;
|
|
947
|
+
var col = vec3<f32>(0.0);
|
|
948
|
+
let taps = select(1, 8, model.shade.b > 0.001);
|
|
949
|
+
for (var i = 0; i < taps; i++) {
|
|
950
|
+
let a = f32(i) * 2.399963;
|
|
951
|
+
let r = sqrt((f32(i) + 0.5) / f32(taps));
|
|
952
|
+
let o = select(vec2<f32>(0.0), vec2<f32>(cos(a), sin(a)) * r * frost, taps > 1);
|
|
953
|
+
col += vec3<f32>(
|
|
954
|
+
backdropAt(uv - bend * (1.0 + disp * 6.0) + o).r,
|
|
955
|
+
backdropAt(uv - bend + o).g,
|
|
956
|
+
backdropAt(uv - bend * (1.0 - disp * 6.0) + o).b,
|
|
957
|
+
);
|
|
958
|
+
}
|
|
959
|
+
col /= f32(taps);
|
|
960
|
+
// Light travels further through the glass toward the rim: the tint
|
|
961
|
+
// deepens and the body darkens there, which is what outlines glass.
|
|
962
|
+
let depthTint = mix(vec3<f32>(1.0), tint, 0.55 + 0.45 * rim);
|
|
963
|
+
let transmitted = col * depthTint * (1.0 - 0.45 * rim * rim);
|
|
964
|
+
let f0 = pow((ior - 1.0) / (ior + 1.0), 2.0);
|
|
965
|
+
let F = f0 + (1.0 - f0) * pow(rim, 5.0);
|
|
966
|
+
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));
|
|
967
|
+
// Grazing faces mirror the room; keep that faint so dark scenes stay dark
|
|
968
|
+
// and the studio highlights below carry the shape.
|
|
969
|
+
let sheen = vec3<f32>(0.9, 0.94, 1.0) * F * 0.22 + tint * 0.05 * (0.4 + rim);
|
|
970
|
+
// A studio in the reflection: a sharp key and two strip softboxes, which
|
|
971
|
+
// is most of what makes glass read as glass.
|
|
972
|
+
let R = reflect(-V, N);
|
|
973
|
+
// Tight: a flat face only flashes as it turns through the light.
|
|
974
|
+
let key = pow(max(dot(R, normalize(vec3<f32>(-0.45, -0.75, -0.5))), 0.0), 600.0) * 1.8;
|
|
975
|
+
// Two tall softboxes: narrow bands in the reflection, brightest above.
|
|
976
|
+
let strips = (1.0 - smoothstep(0.03, 0.07, abs(R.x + 0.45))) * smoothstep(0.3, -0.5, R.y) * 1.1
|
|
977
|
+
+ (1.0 - smoothstep(0.02, 0.05, abs(R.x - 0.6))) * smoothstep(0.4, -0.3, R.y) * 0.7;
|
|
978
|
+
let studio = vec3<f32>(1.0, 0.98, 0.95) * (key + strips * (0.25 + F));
|
|
979
|
+
// A thin bright line where the surface turns away: glass silhouettes.
|
|
980
|
+
let edge = vec3<f32>(1.0, 0.99, 0.97) * smoothstep(0.8, 0.97, rim) * 0.55;
|
|
981
|
+
let rgb = transmitted * (1.0 - F) + lit.display + sheen + studio + edge;
|
|
982
|
+
var out: MeshFragment;
|
|
983
|
+
out.color = vec4<f32>(rgb * alpha, alpha);
|
|
984
|
+
out.hdr = vec4<f32>(srgbToLinear(transmitted * (1.0 - F)) * alpha + lit.hdr * alpha + srgbToLinear(sheen + studio + edge) * alpha, alpha);
|
|
985
|
+
return out;
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
fn shadeMesh(in: VertexOutput, isFront: bool) -> MeshFragment {
|
|
989
|
+
// Every sample and derivative up front, in uniform control flow.
|
|
990
|
+
var texColor = textureSample(mainTex, texSampler, in.uv);
|
|
991
|
+
let normalSample = textureSample(normalTex, texSampler, in.uv).xyz;
|
|
992
|
+
let mrSample = textureSample(metalRoughTex, texSampler, in.uv);
|
|
993
|
+
let aoSample = textureSample(occlusionTex, texSampler, in.uv).r;
|
|
994
|
+
let emissiveSample = textureSample(emissiveTex, texSampler, in.uv).rgb;
|
|
995
|
+
let dp1 = dpdx(in.worldPos);
|
|
996
|
+
let dp2 = dpdy(in.worldPos);
|
|
997
|
+
let duv1 = dpdx(in.uv);
|
|
998
|
+
let duv2 = dpdy(in.uv);
|
|
999
|
+
let rimWidth = fwidth(1.0 - abs(dot(normalize(in.worldNormal), normalize(cam.cameraPos.xyz - in.worldPos))));
|
|
1000
|
+
|
|
1001
|
+
if (!isFront && model.params.y < 0.5) {
|
|
1002
|
+
discard;
|
|
1003
|
+
}
|
|
1004
|
+
if (texColor.a < model.shade.a) {
|
|
1005
|
+
discard;
|
|
1006
|
+
}
|
|
1007
|
+
let alpha = texColor.a * model.params.x * model.colorTint.a * matteCoverage(in.clipPos.xy);
|
|
1008
|
+
if (alpha <= 0.001) {
|
|
1009
|
+
discard;
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
let baseRgb = texColor.rgb * model.colorTint.rgb;
|
|
1013
|
+
var out: MeshFragment;
|
|
1014
|
+
if (model.materialParams.w > 1.5) {
|
|
1015
|
+
var toon = baseRgb;
|
|
1016
|
+
if (lights.params.y >= 0.5) {
|
|
1017
|
+
toon = toonLighting(in, baseRgb);
|
|
1018
|
+
}
|
|
1019
|
+
out.color = vec4<f32>(toon * alpha, alpha);
|
|
1020
|
+
out.hdr = vec4<f32>(srgbToLinear(toon) * alpha, alpha);
|
|
1021
|
+
return out;
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
var N = normalize(in.worldNormal);
|
|
1025
|
+
if (model.maps.x > 0.0) {
|
|
1026
|
+
var tn = normalSample * 2.0 - 1.0;
|
|
1027
|
+
tn = vec3<f32>(tn.xy * model.maps.x, tn.z);
|
|
1028
|
+
// The frame follows the surface side the camera sees.
|
|
1029
|
+
var Nf = N;
|
|
1030
|
+
if (dot(Nf, cam.cameraPos.xyz - in.worldPos) < 0.0) {
|
|
1031
|
+
Nf = -Nf;
|
|
1032
|
+
}
|
|
1033
|
+
N = perturbNormal(Nf, in.worldPos, in.uv, tn, dp1, dp2, duv1, duv2);
|
|
1034
|
+
}
|
|
1035
|
+
var pbr = model.pbr;
|
|
1036
|
+
if (model.maps.z > 0.5) {
|
|
1037
|
+
pbr.x = select(pbr.x, 1.0, pbr.x < 0.0) * mrSample.g;
|
|
1038
|
+
pbr.y = pbr.y * mrSample.b;
|
|
1039
|
+
}
|
|
1040
|
+
if (model.pbr.z > 0.5) {
|
|
1041
|
+
return shadeGlass(in, N, baseRgb, alpha, rimWidth);
|
|
1042
|
+
}
|
|
1043
|
+
var material = model.materialParams;
|
|
1044
|
+
material.z = material.z * mix(1.0, aoSample, clamp(model.maps.y, 0.0, 1.0));
|
|
1045
|
+
var emissive = model.emissive;
|
|
1046
|
+
if (model.maps.w > 0.5) {
|
|
1047
|
+
// Linear multiply in display space is close enough for an 8-bit map.
|
|
1048
|
+
emissive = vec4<f32>(emissive.rgb * emissiveSample, emissive.w);
|
|
1049
|
+
}
|
|
1050
|
+
let shaded = shadeSurfaceFull(in.worldPos, N, baseRgb, material, pbr, emissive);
|
|
1051
|
+
out.color = vec4<f32>(shaded.display * alpha, alpha);
|
|
1052
|
+
out.hdr = vec4<f32>(shaded.hdr * alpha, alpha);
|
|
1053
|
+
return out;
|
|
1054
|
+
}
|
|
1055
|
+
|
|
1056
|
+
struct MrtOutput {
|
|
1057
|
+
@location(0) color : vec4<f32>,
|
|
1058
|
+
@location(1) depth : vec4<f32>,
|
|
1059
|
+
};
|
|
1060
|
+
|
|
1061
|
+
struct BloomOutput {
|
|
1062
|
+
@location(0) color : vec4<f32>,
|
|
1063
|
+
@location(1) hdr : vec4<f32>,
|
|
1064
|
+
};
|
|
1065
|
+
|
|
1066
|
+
struct MrtBloomOutput {
|
|
1067
|
+
@location(0) color : vec4<f32>,
|
|
1068
|
+
@location(1) depth : vec4<f32>,
|
|
1069
|
+
@location(2) hdr : vec4<f32>,
|
|
1070
|
+
};
|
|
1071
|
+
|
|
1072
|
+
@fragment
|
|
1073
|
+
fn fs_single(in: VertexOutput, @builtin(front_facing) isFront: bool) -> @location(0) vec4<f32> {
|
|
1074
|
+
return shadeMesh(in, isFront).color;
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
@fragment
|
|
1078
|
+
fn fs_mrt(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtOutput {
|
|
1079
|
+
var out: MrtOutput;
|
|
1080
|
+
out.color = shadeMesh(in, isFront).color;
|
|
1081
|
+
out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
|
|
1082
|
+
return out;
|
|
1083
|
+
}
|
|
1084
|
+
|
|
1085
|
+
@fragment
|
|
1086
|
+
fn fs_single_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> BloomOutput {
|
|
1087
|
+
let f = shadeMesh(in, isFront);
|
|
1088
|
+
var out: BloomOutput;
|
|
1089
|
+
out.color = f.color;
|
|
1090
|
+
out.hdr = f.hdr;
|
|
1091
|
+
return out;
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
@fragment
|
|
1095
|
+
fn fs_mrt_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtBloomOutput {
|
|
1096
|
+
let f = shadeMesh(in, isFront);
|
|
1097
|
+
var out: MrtBloomOutput;
|
|
1098
|
+
out.color = f.color;
|
|
1099
|
+
out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
|
|
1100
|
+
out.hdr = f.hdr;
|
|
1101
|
+
return out;
|
|
1102
|
+
}
|
|
1103
|
+
`;L();function oe(A){return{binding:A,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}}var Br=new WeakMap;function ae(A){let e=Br.get(A);if(!e){let t=A.createTexture({label:"Matte3DFullCoverage",size:[1,1],format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST});A.queue.writeTexture({texture:t},new Uint8Array([255,255,255,255]),{bytesPerRow:4},[1,1]),e=t.createView(),Br.set(A,e)}return e}L();var Er="rgba16float",go="rgba16float";function de(A,e){let t=n=>A.createRenderPipeline({label:`${e.label}${n?"Mrt":"Single"}`,layout:e.layout,vertex:e.vertex,fragment:{module:e.module,entryPoint:n?"fs_mrt":"fs_single",targets:[{format:e.format,blend:tt},...n?[{format:Er}]:[]]},depthStencil:e.depthStencil,primitive:e.primitive,multisample:e.multisample});return{single:t(!1),mrt:t(!0)}}var ne=class{constructor(e,t){this.device=e;this.base=t}device;base;cache=new Map;get(e){let t=this.cache.get(e);if(!t){let n=this.base;t=this.device.createRenderPipeline({label:`${n.label}${e?"MrtBloom":"Bloom"}`,layout:n.layout,vertex:n.vertex,fragment:{module:n.module,entryPoint:e?"fs_mrt_bloom":"fs_single_bloom",targets:[{format:n.format,blend:tt},...e?[{format:Er}]:[],{format:go,blend:tt}]},depthStencil:n.depthStencil,primitive:n.primitive,multisample:n.multisample}),this.cache.set(e,t)}return t}};function ct(A,e,t,n){let r=t??e,i=n??[1,1,1,1];for(let o=0;o<16;o++)A[o]=e[o]??0,A[16+o]=r[o]??0;A[32]=i[0],A[33]=i[1],A[34]=i[2],A[35]=i[3]}L();L();var Qr=`
|
|
1104
|
+
${Qe}
|
|
1105
|
+
struct ModelUniforms {
|
|
1106
|
+
modelMatrix : mat4x4<f32>,
|
|
1107
|
+
normalMatrix : mat4x4<f32>,
|
|
1108
|
+
colorTint : vec4<f32>,
|
|
1109
|
+
borderColor : vec4<f32>,
|
|
1110
|
+
params : vec4<f32>, // x = opacity, y = borderRadius, z = twoSided (1.0 = yes), w = borderWidth
|
|
1111
|
+
dimensions : vec4<f32>, // x = width, y = height, zw = texture extent the layer covers (0 = whole texture)
|
|
1112
|
+
materialParams : vec4<f32>, // x = shininess, y = specularIntensity, z = ambientIntensity, w = materialMode (0=unlit, 1=lit)
|
|
1113
|
+
pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
|
|
1114
|
+
emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
|
|
1115
|
+
};
|
|
1116
|
+
|
|
1117
|
+
@group(0) @binding(0) var<uniform> cam : CameraUniforms;
|
|
1118
|
+
@group(1) @binding(0) var<uniform> model : ModelUniforms;
|
|
1119
|
+
${Ce(1,1)}@group(2) @binding(0) var texSampler : sampler;
|
|
1120
|
+
@group(2) @binding(1) var mainTex : texture_2d<f32>;
|
|
1121
|
+
${fe}
|
|
1122
|
+
|
|
1123
|
+
struct VertexInput {
|
|
1124
|
+
@location(0) position : vec3<f32>,
|
|
1125
|
+
@location(1) uv : vec2<f32>,
|
|
1126
|
+
@location(2) normal : vec3<f32>,
|
|
1127
|
+
};
|
|
1128
|
+
|
|
1129
|
+
struct VertexOutput {
|
|
1130
|
+
@builtin(position) clipPos : vec4<f32>,
|
|
1131
|
+
@location(0) uv : vec2<f32>,
|
|
1132
|
+
@location(1) worldPos : vec3<f32>,
|
|
1133
|
+
@location(2) worldNormal : vec3<f32>,
|
|
1134
|
+
@location(3) linearDepth : f32,
|
|
1135
|
+
@location(4) localPos : vec2<f32>,
|
|
1136
|
+
};
|
|
1137
|
+
|
|
1138
|
+
@vertex
|
|
1139
|
+
fn vs_main(in: VertexInput) -> VertexOutput {
|
|
1140
|
+
var out: VertexOutput;
|
|
1141
|
+
|
|
1142
|
+
let hasDimensions = model.dimensions.x > 0.0 && model.dimensions.y > 0.0;
|
|
1143
|
+
var pad = 0.0;
|
|
1144
|
+
if (hasDimensions) {
|
|
1145
|
+
let viewPos = cam.viewMatrix * model.modelMatrix * vec4<f32>(0.0, 0.0, 0.0, 1.0);
|
|
1146
|
+
let viewDepth = max(abs(viewPos.z), 0.1);
|
|
1147
|
+
let projScale = max(cam.projMatrix[1][1], 0.001);
|
|
1148
|
+
let worldPx = (2.0 * viewDepth) / max(cam.screenParams.y * projScale, 0.001);
|
|
1149
|
+
pad = max(4.0 * worldPx, 4.0);
|
|
1150
|
+
}
|
|
1151
|
+
let scalePad = select(vec2<f32>(1.0), 1.0 + vec2<f32>(2.0 * pad) / model.dimensions.xy, hasDimensions);
|
|
1152
|
+
|
|
1153
|
+
let paddedPos = vec3<f32>(in.position.xy * scalePad, in.position.z);
|
|
1154
|
+
let worldPos4 = model.modelMatrix * vec4<f32>(paddedPos, 1.0);
|
|
1155
|
+
out.worldPos = worldPos4.xyz;
|
|
1156
|
+
|
|
1157
|
+
// Normal transformed by 3x3 normal matrix
|
|
1158
|
+
let norm4 = model.normalMatrix * vec4<f32>(in.normal, 0.0);
|
|
1159
|
+
out.worldNormal = normalize(norm4.xyz);
|
|
1160
|
+
|
|
1161
|
+
out.clipPos = cam.viewProjMatrix * worldPos4;
|
|
1162
|
+
|
|
1163
|
+
out.localPos = in.position.xy * (model.dimensions.xy + vec2<f32>(2.0 * pad));
|
|
1164
|
+
// A layer of fractional size renders into a texture rounded up to whole
|
|
1165
|
+
// pixels: map the quad onto the part it covers, not the whole texture,
|
|
1166
|
+
// or the content is stretched by up to a pixel and resampled off-grid.
|
|
1167
|
+
let uvExtent = select(model.dimensions.zw, vec2<f32>(1.0), model.dimensions.zw <= vec2<f32>(0.0));
|
|
1168
|
+
out.uv = select(in.uv, (out.localPos / model.dimensions.xy + vec2<f32>(0.5)) * uvExtent, hasDimensions);
|
|
1169
|
+
|
|
1170
|
+
// Linear camera depth along optical viewing axis
|
|
1171
|
+
out.linearDepth = dot(worldPos4.xyz - cam.cameraPos.xyz, cam.cameraDir.xyz);
|
|
1172
|
+
return out;
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
fn sdRoundedRectWithNormal(p: vec2<f32>, b: vec2<f32>, r: f32) -> vec3<f32> {
|
|
1176
|
+
let q = abs(p) - b + vec2<f32>(r);
|
|
1177
|
+
let sx = select(1.0, -1.0, p.x < 0.0);
|
|
1178
|
+
let sy = select(1.0, -1.0, p.y < 0.0);
|
|
1179
|
+
let s = vec2<f32>(sx, sy);
|
|
1180
|
+
|
|
1181
|
+
// Outside corner arc region
|
|
1182
|
+
if (q.x > 0.0 && q.y > 0.0) {
|
|
1183
|
+
let l = length(q);
|
|
1184
|
+
let n = select(vec2<f32>(0.0, 1.0), q / l, l > 0.0001);
|
|
1185
|
+
return vec3<f32>(l - r, s * n);
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
// Straight edges or interior
|
|
1189
|
+
if (q.x > q.y) {
|
|
1190
|
+
let dist = q.x - r;
|
|
1191
|
+
return vec3<f32>(dist, s.x, 0.0);
|
|
1192
|
+
} else {
|
|
1193
|
+
let dist = q.y - r;
|
|
1194
|
+
return vec3<f32>(dist, 0.0, s.y);
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
struct QuadFragment {
|
|
1199
|
+
color : vec4<f32>, // premultiplied display color
|
|
1200
|
+
hdr : vec4<f32>, // premultiplied scene radiance (bloom source)
|
|
1201
|
+
};
|
|
1202
|
+
|
|
1203
|
+
fn shadeQuad(in: VertexOutput, isFront: bool) -> QuadFragment {
|
|
1204
|
+
// One-sided quads cull against their declared normal, not the hardware
|
|
1205
|
+
// winding: the Y-down view basis mirrors winding, so front_facing reads
|
|
1206
|
+
// camera-facing quads as back faces.
|
|
1207
|
+
if (model.params.z < 0.5 && dot(in.worldNormal, cam.cameraPos.xyz - in.worldPos) < 0.0) {
|
|
1208
|
+
discard;
|
|
1209
|
+
}
|
|
1210
|
+
|
|
1211
|
+
var outerAlpha = 1.0;
|
|
1212
|
+
var borderFactor = 0.0;
|
|
1213
|
+
let br = model.params.y;
|
|
1214
|
+
let borderWidth = model.params.w;
|
|
1215
|
+
let hasDimensions = model.dimensions.x > 0.0 && model.dimensions.y > 0.0;
|
|
1216
|
+
|
|
1217
|
+
if (hasDimensions) {
|
|
1218
|
+
let halfSize = model.dimensions.xy * 0.5;
|
|
1219
|
+
let normData = sdRoundedRectWithNormal(in.localPos, halfSize, br);
|
|
1220
|
+
|
|
1221
|
+
let uvDx = dpdx(in.localPos);
|
|
1222
|
+
let uvDy = dpdy(in.localPos);
|
|
1223
|
+
|
|
1224
|
+
let dPdx = normData.y * uvDx.x + normData.z * uvDx.y;
|
|
1225
|
+
let dPdy = normData.y * uvDy.x + normData.z * uvDy.y;
|
|
1226
|
+
let gradLen = max(sqrt(dPdx * dPdx + dPdy * dPdy), 0.001);
|
|
1227
|
+
|
|
1228
|
+
let distPixel = normData.x / gradLen;
|
|
1229
|
+
outerAlpha = clamp(0.5 - distPixel, 0.0, 1.0);
|
|
1230
|
+
if (outerAlpha <= 0.001) {
|
|
1231
|
+
discard;
|
|
1232
|
+
}
|
|
1233
|
+
|
|
1234
|
+
if (borderWidth > 0.0 && model.borderColor.a > 0.0) {
|
|
1235
|
+
let borderWidthPixel = max(borderWidth / gradLen, 0.0);
|
|
1236
|
+
let innerAlpha = clamp(0.5 - (distPixel + borderWidthPixel), 0.0, 1.0);
|
|
1237
|
+
borderFactor = clamp(outerAlpha - innerAlpha, 0.0, 1.0) * model.borderColor.a;
|
|
1238
|
+
}
|
|
1239
|
+
}
|
|
1240
|
+
|
|
1241
|
+
let clampedUv = clamp(in.uv, vec2<f32>(0.0), vec2<f32>(1.0));
|
|
1242
|
+
let dxUV = dpdx(in.uv);
|
|
1243
|
+
let dyUV = dpdy(in.uv);
|
|
1244
|
+
var texColor = textureSampleGrad(mainTex, texSampler, clampedUv, dxUV, dyUV);
|
|
1245
|
+
let texAlpha = texColor.a;
|
|
1246
|
+
|
|
1247
|
+
let unmultipliedRgb = select(texColor.rgb / texAlpha, texColor.rgb, texAlpha < 0.001);
|
|
1248
|
+
let baseRgb = mix(unmultipliedRgb * model.colorTint.rgb, model.borderColor.rgb, borderFactor);
|
|
1249
|
+
let alpha = mix(texAlpha, 1.0, borderFactor) * model.params.x * model.colorTint.a * outerAlpha * matteCoverage(in.clipPos.xy);
|
|
1250
|
+
if (alpha <= 0.001) {
|
|
1251
|
+
discard;
|
|
1252
|
+
}
|
|
1253
|
+
|
|
1254
|
+
let shaded = shadeSurfaceFull(in.worldPos, in.worldNormal, baseRgb, model.materialParams, model.pbr, model.emissive);
|
|
1255
|
+
var out: QuadFragment;
|
|
1256
|
+
out.color = vec4<f32>(shaded.display * alpha, alpha);
|
|
1257
|
+
out.hdr = vec4<f32>(shaded.hdr * alpha, alpha);
|
|
1258
|
+
return out;
|
|
1259
|
+
}
|
|
1260
|
+
|
|
1261
|
+
struct MrtOutput {
|
|
1262
|
+
@location(0) color : vec4<f32>,
|
|
1263
|
+
@location(1) depth : vec4<f32>,
|
|
1264
|
+
};
|
|
1265
|
+
|
|
1266
|
+
struct BloomOutput {
|
|
1267
|
+
@location(0) color : vec4<f32>,
|
|
1268
|
+
@location(1) hdr : vec4<f32>,
|
|
1269
|
+
};
|
|
1270
|
+
|
|
1271
|
+
struct MrtBloomOutput {
|
|
1272
|
+
@location(0) color : vec4<f32>,
|
|
1273
|
+
@location(1) depth : vec4<f32>,
|
|
1274
|
+
@location(2) hdr : vec4<f32>,
|
|
1275
|
+
};
|
|
1276
|
+
|
|
1277
|
+
@fragment
|
|
1278
|
+
fn fs_single(in: VertexOutput, @builtin(front_facing) isFront: bool) -> @location(0) vec4<f32> {
|
|
1279
|
+
return shadeQuad(in, isFront).color;
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
@fragment
|
|
1283
|
+
fn fs_mrt(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtOutput {
|
|
1284
|
+
var out: MrtOutput;
|
|
1285
|
+
out.color = shadeQuad(in, isFront).color;
|
|
1286
|
+
out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
|
|
1287
|
+
return out;
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
@fragment
|
|
1291
|
+
fn fs_single_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> BloomOutput {
|
|
1292
|
+
let f = shadeQuad(in, isFront);
|
|
1293
|
+
var out: BloomOutput;
|
|
1294
|
+
out.color = f.color;
|
|
1295
|
+
out.hdr = f.hdr;
|
|
1296
|
+
return out;
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1299
|
+
@fragment
|
|
1300
|
+
fn fs_mrt_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtBloomOutput {
|
|
1301
|
+
let f = shadeQuad(in, isFront);
|
|
1302
|
+
var out: MrtBloomOutput;
|
|
1303
|
+
out.color = f.color;
|
|
1304
|
+
out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
|
|
1305
|
+
out.hdr = f.hdr;
|
|
1306
|
+
return out;
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
// Shadow-map pass: depth only, alpha-tested so a cut-out casts its shape.
|
|
1310
|
+
@fragment
|
|
1311
|
+
fn fs_shadow(in: VertexOutput) {
|
|
1312
|
+
let clampedUv = clamp(in.uv, vec2<f32>(0.0), vec2<f32>(1.0));
|
|
1313
|
+
let a = textureSampleLevel(mainTex, texSampler, clampedUv, 0.0).a * model.params.x * model.colorTint.a;
|
|
1314
|
+
if (a < 0.5) {
|
|
1315
|
+
discard;
|
|
1316
|
+
}
|
|
1317
|
+
}
|
|
1318
|
+
`;L();var Bt="depth32float",Et={format:Bt,depthWriteEnabled:!0,depthCompare:"less-equal",depthBias:2,depthBiasSlopeScale:2.5,depthBiasClamp:.01};L();var _A=8;function me(A,e,t){e[t]=A.roughness??-1,e[t+1]=A.metallic??0,e[t+2]=0,e[t+3]=0;let n=A.emissive;if(n==null){e.fill(0,t+4,t+8);return}let r;if(Array.isArray(n))r=[n[0],n[1],n[2]];else{let i=et(n);r=[i.r*i.a,i.g*i.a,i.b*i.a]}e[t+4]=r[0],e[t+5]=r[1],e[t+6]=r[2],e[t+7]=A.emissiveIntensity??1}function _t(A,e="Lights3DLayout"){return A.createBindGroupLayout({label:e,entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"depth"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"comparison"}}]})}function jt(A){let e=A.roughness!==void 0?Math.max(1,(1-A.roughness)*128):A.shininess??32,t=A.metallic!==void 0?A.metallic:A.specularIntensity??.5,n=A.ambientIntensity??1,r=A.material==="unlit"?0:1;return[e,t,n,r]}var Qt=class{device;pipelineSingle;pipelineMrt;bloomVariants;pipelineShadow;cameraLayout;modelLayout;textureLayout;lightsLayout;modelPool;vertexBuffer;indexBuffer;modelData=new Float32Array(52+_A);constructor(e,t,n="depth24plus",r=1){this.device=e,this.modelPool=new GA((52+_A)*4,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);let i=e.createShaderModule({label:"quad3d.wgsl",code:Qr});this.cameraLayout=e.createBindGroupLayout({label:"Quad3DCameraLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.modelLayout=e.createBindGroupLayout({label:"Quad3DModelLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},oe(1)]}),this.textureLayout=e.createBindGroupLayout({label:"Quad3DTextureLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}]}),this.lightsLayout=_t(e,"Quad3DLightsLayout");let o=e.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout,this.textureLayout,this.lightsLayout]}),a={module:i,entryPoint:"vs_main",buffers:[{arrayStride:32,attributes:[{shaderLocation:0,offset:0,format:"float32x3"},{shaderLocation:1,offset:12,format:"float32x2"},{shaderLocation:2,offset:20,format:"float32x3"}]}]},s={label:"Quad3DPipeline",layout:o,vertex:a,module:i,format:t,depthStencil:{format:n,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:r}},{single:g,mrt:l}=de(e,s);this.pipelineSingle=g,this.pipelineMrt=l,this.bloomVariants=new ne(e,s),this.pipelineShadow=e.createRenderPipeline({label:"Quad3DPipelineShadow",layout:e.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout,this.textureLayout]}),vertex:a,fragment:{module:i,entryPoint:"fs_shadow",targets:[]},depthStencil:Et,primitive:{topology:"triangle-list",cullMode:"none"}});let u=new Float32Array([-.5,-.5,0,0,0,0,0,-1,.5,-.5,0,1,0,0,0,-1,.5,.5,0,1,1,0,0,-1,-.5,.5,0,0,1,0,0,-1]),c=new Uint16Array([0,1,2,0,2,3]);this.vertexBuffer=e.createBuffer({size:u.byteLength,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),new Float32Array(this.vertexBuffer.getMappedRange()).set(u),this.vertexBuffer.unmap(),this.indexBuffer=e.createBuffer({size:c.byteLength,usage:GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),new Uint16Array(this.indexBuffer.getMappedRange()).set(c),this.indexBuffer.unmap()}resetPools(){this.modelPool.reset()}packModel(e){ct(this.modelData,e.modelMatrix,e.normalMatrix,e.colorTint);let t=e.borderColor??[0,0,0,0];this.modelData[36]=t[0],this.modelData[37]=t[1],this.modelData[38]=t[2],this.modelData[39]=t[3],this.modelData[40]=e.opacity??1,this.modelData[41]=e.borderRadius??0,this.modelData[42]=e.twoSided?1:0,this.modelData[43]=e.borderWidth??0,this.modelData[44]=e.width??0,this.modelData[45]=e.height??0,this.modelData[46]=e.textureExtent?.[0]??0,this.modelData[47]=e.textureExtent?.[1]??0,this.modelData.set(jt(e),48),me(e,this.modelData,52);let n=this.modelPool.getBuffer(this.device,this.modelData);return this.device.createBindGroup({layout:this.modelLayout,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:e.matte?.createView()??ae(this.device)}]})}textureBindGroup(e,t){return this.device.createBindGroup({layout:this.textureLayout,entries:[{binding:0,resource:t},{binding:1,resource:e.createView()}]})}draw(e,t,n,r,i,o,a=!1,s=!1){let g=this.packModel(o),l=this.textureBindGroup(r,i);e.setPipeline(s?this.bloomVariants.get(a):a?this.pipelineMrt:this.pipelineSingle),e.setBindGroup(0,t),e.setBindGroup(1,g),e.setBindGroup(2,l),e.setBindGroup(3,n),e.setVertexBuffer(0,this.vertexBuffer),e.setIndexBuffer(this.indexBuffer,"uint16"),e.drawIndexed(6)}drawShadow(e,t,n,r,i){e.setPipeline(this.pipelineShadow),e.setBindGroup(0,t),e.setBindGroup(1,this.packModel(i)),e.setBindGroup(2,this.textureBindGroup(n,r)),e.setVertexBuffer(0,this.vertexBuffer),e.setIndexBuffer(this.indexBuffer,"uint16"),e.drawIndexed(6)}destroy(){this.modelPool.destroy(),this.vertexBuffer.destroy(),this.indexBuffer.destroy()}};var ft=class{device;pipelineSingle;pipelineMrt;bloomVariants;pipelineShadow;cameraLayout;modelLayout;textureLayout;lightsLayout;modelPool;skinningPool;defaultWhiteTexture;flatNormalTexture;defaultSkinningBuffer;modelData=new Float32Array(52+_A);constructor(e,t,n="depth24plus",r,i,o=1){this.device=e,this.modelPool=new GA((52+_A)*4,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.skinningPool=new GA(8192,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);let a=e.createShaderModule({label:"mesh3d.wgsl",code:cr});this.cameraLayout=r??e.createBindGroupLayout({label:"Mesh3DCameraLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.modelLayout=e.createBindGroupLayout({label:"Mesh3DModelLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}},oe(2),oe(3)]}),this.textureLayout=e.createBindGroupLayout({label:"Mesh3DTextureLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},...[1,2,3,4,5].map(Q=>({binding:Q,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}))]}),this.lightsLayout=i??_t(e,"Mesh3DLightsLayout");let s=e.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout,this.textureLayout,this.lightsLayout]}),g={module:a,entryPoint:"vs_main",buffers:[{arrayStride:64,attributes:[{shaderLocation:0,offset:0,format:"float32x3"},{shaderLocation:1,offset:12,format:"float32x2"},{shaderLocation:2,offset:20,format:"float32x3"},{shaderLocation:3,offset:32,format:"float32x4"},{shaderLocation:4,offset:48,format:"float32x4"}]}]},l={label:"Mesh3DPipeline",layout:s,vertex:g,module:a,format:t,depthStencil:{format:n,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:o}},{single:u,mrt:c}=de(e,l);this.pipelineSingle=u,this.pipelineMrt=c,this.bloomVariants=new ne(e,l),this.pipelineShadow=e.createRenderPipeline({label:"Mesh3DPipelineShadow",layout:e.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout]}),vertex:g,depthStencil:Et,primitive:{topology:"triangle-list",cullMode:"none"}}),this.defaultWhiteTexture=e.createTexture({label:"Mesh3DDefaultWhiteTexture",size:{width:1,height:1},format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST}),e.queue.writeTexture({texture:this.defaultWhiteTexture},new Uint8Array([255,255,255,255]),{bytesPerRow:4,rowsPerImage:1},{width:1,height:1}),this.flatNormalTexture=e.createTexture({label:"Mesh3DFlatNormalTexture",size:{width:1,height:1},format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST}),e.queue.writeTexture({texture:this.flatNormalTexture},new Uint8Array([128,128,255,255]),{bytesPerRow:4,rowsPerImage:1},{width:1,height:1});let B=new Float32Array(2048);for(let Q=0;Q<128;Q++)B[Q*16]=1,B[Q*16+5]=1,B[Q*16+10]=1,B[Q*16+15]=1;this.defaultSkinningBuffer=e.createBuffer({size:8192,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),new Float32Array(this.defaultSkinningBuffer.getMappedRange()).set(B),this.defaultSkinningBuffer.unmap()}resetPools(){this.modelPool.reset(),this.skinningPool.reset()}packModel(e){ct(this.modelData,e.modelMatrix,e.normalMatrix,e.colorTint),this.modelData[36]=e.opacity??1,this.modelData[37]=e.twoSided?1:0,this.modelData[38]=e.isSkinned?1:0,this.modelData[39]=e.wireframe?1:0;let t=e.roughness!==void 0?Math.max(1,(1-e.roughness)*128):e.shininess??32,n=e.metallic!==void 0?e.metallic:e.specularIntensity??.5,r=e.ambientIntensity??1,i=e.material==="unlit"?0:e.material==="toon"?2:1;this.modelData[40]=t,this.modelData[41]=n,this.modelData[42]=r,this.modelData[43]=i;let o=e.shadeColor??[1,1,1];this.modelData[44]=o[0],this.modelData[45]=o[1],this.modelData[46]=o[2],this.modelData[47]=e.alphaCutoff??0,me(e,this.modelData,48);let a=e.maps;this.modelData[56]=a?.normal?a.normalScale??1:0,this.modelData[57]=a?.occlusion?a.occlusionStrength??1:0,this.modelData[58]=a?.metallicRoughness?1:0,this.modelData[59]=a?.emissive?1:0;let s=e.glass;s&&(this.modelData[44]=s.dispersion,this.modelData[45]=s.thickness,this.modelData[46]=s.frost,this.modelData[50]=1,this.modelData[51]=s.ior);let g=this.modelPool.getBuffer(this.device,this.modelData),l=e.isSkinned&&e.skinningMatrices?this.skinningPool.getBuffer(this.device,e.skinningMatrices):this.defaultSkinningBuffer;return this.device.createBindGroup({layout:this.modelLayout,entries:[{binding:0,resource:{buffer:g}},{binding:1,resource:{buffer:l}},{binding:2,resource:e.matte?.createView()??ae(this.device)},{binding:3,resource:e.glass&&e.backdrop?.createView()||ae(this.device)}]})}draw(e,t,n,r,i,o,a,s=!1,g=!1){let l=this.packModel(a),u=this.defaultWhiteTexture,c=a.maps,B=this.device.createBindGroup({layout:this.textureLayout,entries:[{binding:0,resource:o},{binding:1,resource:(i??u).createView()},{binding:2,resource:(c?.normal??this.flatNormalTexture).createView()},{binding:3,resource:(c?.metallicRoughness??u).createView()},{binding:4,resource:(c?.occlusion??u).createView()},{binding:5,resource:(c?.emissive??u).createView()}]});e.setPipeline(g?this.bloomVariants.get(s):s?this.pipelineMrt:this.pipelineSingle),e.setBindGroup(0,t),e.setBindGroup(1,l),e.setBindGroup(2,B),e.setBindGroup(3,n),e.setVertexBuffer(0,r.vertexBuffer),e.setIndexBuffer(r.indexBuffer,r.indexFormat),e.drawIndexed(r.indexCount)}drawShadow(e,t,n,r){e.setPipeline(this.pipelineShadow),e.setBindGroup(0,t),e.setBindGroup(1,this.packModel(r)),e.setVertexBuffer(0,n.vertexBuffer),e.setIndexBuffer(n.indexBuffer,n.indexFormat),e.drawIndexed(n.indexCount)}destroy(){this.modelPool.destroy(),this.skinningPool.destroy(),this.defaultWhiteTexture.destroy(),this.flatNormalTexture.destroy(),this.defaultSkinningBuffer.destroy()}};L();function $t(A){let{min:e,max:t}=A;return[[e[0],e[1],e[2]],[t[0],e[1],e[2]],[e[0],t[1],e[2]],[t[0],t[1],e[2]],[e[0],e[1],t[2]],[t[0],e[1],t[2]],[e[0],t[1],t[2]],[t[0],t[1],t[2]]]}function An(A,e){let t=[1/0,1/0,1/0],n=[-1/0,-1/0,-1/0];for(let[r,i,o]of $t(A)){let a=[e[0]*r+e[4]*i+e[8]*o+e[12],e[1]*r+e[5]*i+e[9]*o+e[13],e[2]*r+e[6]*i+e[10]*o+e[14]];for(let s=0;s<3;s++)a[s]<t[s]&&(t[s]=a[s]),a[s]>n[s]&&(n[s]=a[s])}return{min:t,max:n}}function Ct(A,e){return[A[0]*e[0]+A[4]*e[1]+A[8]*e[2]+A[12],A[1]*e[0]+A[5]*e[1]+A[9]*e[2]+A[13],A[2]*e[0]+A[6]*e[1]+A[10]*e[2]+A[14]]}function fr(A){return Math.abs(A[1])>.98?[0,0,1]:[0,-1,0]}function Cr(A,e,t,n){if(e.length===0)return null;let r=k.normalize(A.direction),i=e.flatMap($t),o=[...i,...t.flatMap($t)];if(A.type==="directional"){let Q=[0,0,0];for(let F of i)Q[0]+=F[0]/i.length,Q[1]+=F[1]/i.length,Q[2]+=F[2]/i.length;let f=k.subtract(Q,k.multiplyScalar(r,1)),h=$.lookAt(f,Q,fr(r)),m=1/0,d=-1/0,x=1/0,y=-1/0;for(let F of i){let P=Ct(h,F);m=Math.min(m,P[0]),d=Math.max(d,P[0]),x=Math.min(x,P[1]),y=Math.max(y,P[1])}let G=1/0,M=-1/0;for(let F of o){let P=Ct(h,F)[2];G=Math.min(G,P),M=Math.max(M,P)}let D=Math.max(d-m,y-x)*.5*1.08+4,b=(m+d)/2,N=(x+y)/2,S=Math.max(10,(M-G)*.02),v=$.orthographic(b-D,b+D,N-D,N+D,G-S,M+S);return{viewProj:$.multiply(v,h),texelWorldSize:2*D/n}}let a=A.position,s=$.lookAt(a,k.add(a,r),fr(r)),g=1/0,l=0,u=0;for(let Q of o){let f=Ct(s,Q)[2];f>0&&(g=Math.min(g,f),l=Math.max(l,f))}for(let Q of i)u=Math.max(u,Ct(s,Q)[2]);if(!Number.isFinite(g)||l<=0)return null;g=Math.max(1,g*.9),l=l*1.05+1;let c=Math.min(170,2*(A.angle??45)+4)*Math.PI/180,B=$.perspective(c,1,g,l);return{viewProj:$.multiply(B,s),texelWorldSize:2*Math.tan(c/2)*Math.max(u,g)/n}}L();L();var dr=`
|
|
1319
|
+
${Qe}
|
|
1320
|
+
|
|
1321
|
+
struct TextModelUniforms {
|
|
1322
|
+
modelMatrix : mat4x4<f32>, // paragraph px -> world
|
|
1323
|
+
normalMatrix : mat4x4<f32>,
|
|
1324
|
+
params : vec4<f32>, // x = opacity, y = slant, z = twoSided (1.0 = yes), w = pull toward the eye
|
|
1325
|
+
materialParams : vec4<f32>, // x = shininess, y = specularIntensity, z = ambientIntensity, w = materialMode (0=unlit, 1=lit)
|
|
1326
|
+
pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
|
|
1327
|
+
emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
|
|
1328
|
+
};
|
|
1329
|
+
|
|
1330
|
+
@group(0) @binding(0) var<uniform> cam : CameraUniforms;
|
|
1331
|
+
@group(1) @binding(0) var<uniform> model : TextModelUniforms;
|
|
1332
|
+
${Ce(1,1)}@group(2) @binding(0) var curvesTex : texture_2d<f32>;
|
|
1333
|
+
@group(2) @binding(1) var bandsTex : texture_2d<u32>;
|
|
1334
|
+
${fe}
|
|
1335
|
+
|
|
1336
|
+
${Zn}
|
|
1337
|
+
|
|
1338
|
+
struct VSOut {
|
|
1339
|
+
@builtin(position) pos : vec4<f32>,
|
|
1340
|
+
@location(0) uv : vec2<f32>,
|
|
1341
|
+
@location(1) @interpolate(flat) glyphScale : vec2<f32>,
|
|
1342
|
+
@location(2) @interpolate(flat) bandScale : vec2<f32>,
|
|
1343
|
+
@location(3) @interpolate(flat) bandMax : vec2<u32>,
|
|
1344
|
+
@location(4) @interpolate(flat) bandsTexCoords : vec2<u32>,
|
|
1345
|
+
@location(5) color : vec4<f32>,
|
|
1346
|
+
@location(6) @interpolate(flat) fx : vec4<f32>, // x = blur, y = chromatic shift, z = dissolve, w = vfx
|
|
1347
|
+
@location(7) worldPos : vec3<f32>,
|
|
1348
|
+
@location(8) @interpolate(flat) worldNormal : vec3<f32>,
|
|
1349
|
+
@location(9) linearDepth : f32,
|
|
1350
|
+
};
|
|
1351
|
+
|
|
1352
|
+
var<private> pos : array<vec2<f32>, 6> = array<vec2<f32>, 6>(
|
|
1353
|
+
vec2<f32>(-1.0, -1.0),
|
|
1354
|
+
vec2<f32>(1.0, 1.0),
|
|
1355
|
+
vec2<f32>(-1.0, 1.0),
|
|
1356
|
+
vec2<f32>(-1.0, -1.0),
|
|
1357
|
+
vec2<f32>(1.0, -1.0),
|
|
1358
|
+
vec2<f32>(1.0, 1.0)
|
|
1359
|
+
);
|
|
1360
|
+
|
|
1361
|
+
// Screen pixels moved per paragraph unit along the axis whose clip-space step
|
|
1362
|
+
// is dc, at clip position c: the derivative of the perspective divide.
|
|
1363
|
+
fn pixelsPerUnitAlong(c: vec4<f32>, dc: vec4<f32>) -> vec2<f32> {
|
|
1364
|
+
let w = max(c.w, 1e-4);
|
|
1365
|
+
return (dc.xy * w - c.xy * dc.w) / (w * w) * 0.5 * cam.screenParams.xy;
|
|
1366
|
+
}
|
|
1367
|
+
|
|
1368
|
+
@vertex fn vs(
|
|
1369
|
+
@builtin(vertex_index) vertex_index : u32,
|
|
1370
|
+
@location(0) aScaleBias : vec4<f32>,
|
|
1371
|
+
@location(1) aGlyphBandScale : vec4<f32>,
|
|
1372
|
+
@location(2) aBandMaxTexCoords : vec4<f32>,
|
|
1373
|
+
@location(3) aAnim : vec4<f32>, // x = rotation, y = scale_mult, zw = translation
|
|
1374
|
+
@location(4) aColor : vec4<f32>,
|
|
1375
|
+
@location(5) aExtraParams : vec4<f32>,
|
|
1376
|
+
) -> VSOut {
|
|
1377
|
+
let quad_pos = pos[vertex_index];
|
|
1378
|
+
let angle = aAnim.x;
|
|
1379
|
+
let scale_mult = aAnim.y;
|
|
1380
|
+
let origin = aScaleBias.zw + aAnim.zw;
|
|
1381
|
+
let slant = model.params.y;
|
|
1382
|
+
let rot = mat2x2<f32>(cos(angle), sin(angle), -sin(angle), cos(angle));
|
|
1383
|
+
let shear = mat2x2<f32>(1.0, 0.0, -slant, 1.0);
|
|
1384
|
+
let glyphToParagraph = rot * shear;
|
|
1385
|
+
|
|
1386
|
+
let clipFromParagraph = cam.viewProjMatrix * model.modelMatrix;
|
|
1387
|
+
|
|
1388
|
+
// Slug's dynamic dilation, under perspective: grow the quad by one screen
|
|
1389
|
+
// pixel so edge pixels whose centres fall just outside the outline's box
|
|
1390
|
+
// are still shaded. The pixel is measured at this corner through the
|
|
1391
|
+
// projection's Jacobian, along the paragraph direction that gets the fewest
|
|
1392
|
+
// pixels (its smallest singular value), so foreshortened sides are covered.
|
|
1393
|
+
let corner = origin + glyphToParagraph * (quad_pos * aScaleBias.xy * scale_mult);
|
|
1394
|
+
let cornerClip = clipFromParagraph * vec4<f32>(corner, 0.0, 1.0);
|
|
1395
|
+
let jx = pixelsPerUnitAlong(cornerClip, clipFromParagraph[0]);
|
|
1396
|
+
let jy = pixelsPerUnitAlong(cornerClip, clipFromParagraph[1]);
|
|
1397
|
+
let e = dot(jx, jx) + dot(jy, jy);
|
|
1398
|
+
let det = jx.x * jy.y - jx.y * jy.x;
|
|
1399
|
+
let minPixelsPerUnit = sqrt(max(0.5 * (e - sqrt(max(e * e - 4.0 * det * det, 0.0))), 0.0));
|
|
1400
|
+
let halfSize = max(abs(aScaleBias.xy * scale_mult), vec2<f32>(1e-4));
|
|
1401
|
+
// Bounded at three times the glyph: seen nearly edge-on a pixel spans
|
|
1402
|
+
// most of the paragraph, and the glyph is a sliver either way.
|
|
1403
|
+
let dilation = min(vec2<f32>(1.0 / max(minPixelsPerUnit, 1e-6)), halfSize * 2.0);
|
|
1404
|
+
let grow = vec2<f32>(1.0) + dilation / halfSize;
|
|
1405
|
+
|
|
1406
|
+
let paragraphPos = origin + glyphToParagraph * (quad_pos * aScaleBias.xy * scale_mult * grow);
|
|
1407
|
+
let world4 = model.modelMatrix * vec4<f32>(paragraphPos, 0.0, 1.0);
|
|
1408
|
+
// Slide toward the eye along the view ray: the same pixel, a nearer depth.
|
|
1409
|
+
// Passes stacked on one plane (shadow, stroke, fill, a backdrop) resolve
|
|
1410
|
+
// by draw order instead of z-fighting.
|
|
1411
|
+
let world = world4.xyz + (cam.cameraPos.xyz - world4.xyz) * model.params.w;
|
|
1412
|
+
|
|
1413
|
+
var out : VSOut;
|
|
1414
|
+
out.pos = cam.viewProjMatrix * vec4<f32>(world, 1.0);
|
|
1415
|
+
out.uv = vec2<f32>(
|
|
1416
|
+
quad_pos.x * grow.x * 0.5 + 0.5,
|
|
1417
|
+
1.0 - (quad_pos.y * grow.y * 0.5 + 0.5),
|
|
1418
|
+
);
|
|
1419
|
+
out.glyphScale = aGlyphBandScale.xy;
|
|
1420
|
+
out.bandScale = aGlyphBandScale.zw;
|
|
1421
|
+
out.bandMax = vec2<u32>(aBandMaxTexCoords.xy);
|
|
1422
|
+
out.bandsTexCoords = vec2<u32>(aBandMaxTexCoords.zw);
|
|
1423
|
+
out.color = aColor;
|
|
1424
|
+
out.fx = aExtraParams;
|
|
1425
|
+
out.worldPos = world4.xyz;
|
|
1426
|
+
out.worldNormal = normalize((model.normalMatrix * vec4<f32>(0.0, 0.0, -1.0, 0.0)).xyz);
|
|
1427
|
+
out.linearDepth = dot(world4.xyz - cam.cameraPos.xyz, cam.cameraDir.xyz);
|
|
1428
|
+
return out;
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
struct TextFragment {
|
|
1432
|
+
color : vec4<f32>, // premultiplied display color; alpha 0 = discard
|
|
1433
|
+
hdr : vec4<f32>, // premultiplied scene radiance (bloom source)
|
|
1434
|
+
};
|
|
1435
|
+
|
|
1436
|
+
fn shadeText(in : VSOut, fw : vec2<f32>) -> TextFragment {
|
|
1437
|
+
var out : TextFragment;
|
|
1438
|
+
out.color = vec4<f32>(0.0);
|
|
1439
|
+
out.hdr = vec4<f32>(0.0);
|
|
1440
|
+
// One-sided text culls against its plane's normal, as one-sided quads do.
|
|
1441
|
+
if (model.params.z < 0.5 && dot(in.worldNormal, cam.cameraPos.xyz - in.worldPos) < 0.0) {
|
|
1442
|
+
return out;
|
|
1443
|
+
}
|
|
1444
|
+
let glyph = SlugGlyph(in.glyphScale, in.bandScale, in.bandMax, in.bandsTexCoords);
|
|
1445
|
+
let shaded = shadeSlugGlyph(
|
|
1446
|
+
in.uv,
|
|
1447
|
+
fw,
|
|
1448
|
+
in.pos.xy,
|
|
1449
|
+
glyph,
|
|
1450
|
+
in.color,
|
|
1451
|
+
model.params.x,
|
|
1452
|
+
in.fx.x,
|
|
1453
|
+
in.fx.y,
|
|
1454
|
+
in.fx.z,
|
|
1455
|
+
);
|
|
1456
|
+
if (shaded.a < 0.0001) {
|
|
1457
|
+
return out;
|
|
1458
|
+
}
|
|
1459
|
+
let lit = shadeSurfaceFull(in.worldPos, in.worldNormal, shaded.rgb / shaded.a, model.materialParams, model.pbr, model.emissive);
|
|
1460
|
+
out.color = vec4<f32>(lit.display * shaded.a, shaded.a);
|
|
1461
|
+
out.hdr = vec4<f32>(lit.hdr * shaded.a, shaded.a);
|
|
1462
|
+
return out;
|
|
1463
|
+
}
|
|
1464
|
+
|
|
1465
|
+
fn textFragment(in : VSOut) -> TextFragment {
|
|
1466
|
+
let fw = max(abs(dpdx(in.uv)) + abs(dpdy(in.uv)), vec2<f32>(0.000001));
|
|
1467
|
+
let m = matteCoverage(in.pos.xy);
|
|
1468
|
+
var f = shadeText(in, fw);
|
|
1469
|
+
f.color *= m;
|
|
1470
|
+
f.hdr *= m;
|
|
1471
|
+
if (f.color.a < 0.0001) {
|
|
1472
|
+
discard;
|
|
1473
|
+
}
|
|
1474
|
+
return f;
|
|
1475
|
+
}
|
|
1476
|
+
|
|
1477
|
+
@fragment fn fs_single(in : VSOut) -> @location(0) vec4<f32> {
|
|
1478
|
+
return textFragment(in).color;
|
|
1479
|
+
}
|
|
1480
|
+
|
|
1481
|
+
struct MrtOutput {
|
|
1482
|
+
@location(0) color : vec4<f32>,
|
|
1483
|
+
@location(1) depth : vec4<f32>,
|
|
1484
|
+
};
|
|
1485
|
+
|
|
1486
|
+
struct BloomOutput {
|
|
1487
|
+
@location(0) color : vec4<f32>,
|
|
1488
|
+
@location(1) hdr : vec4<f32>,
|
|
1489
|
+
};
|
|
1490
|
+
|
|
1491
|
+
struct MrtBloomOutput {
|
|
1492
|
+
@location(0) color : vec4<f32>,
|
|
1493
|
+
@location(1) depth : vec4<f32>,
|
|
1494
|
+
@location(2) hdr : vec4<f32>,
|
|
1495
|
+
};
|
|
1496
|
+
|
|
1497
|
+
@fragment fn fs_mrt(in : VSOut) -> MrtOutput {
|
|
1498
|
+
var out : MrtOutput;
|
|
1499
|
+
out.color = textFragment(in).color;
|
|
1500
|
+
out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
|
|
1501
|
+
return out;
|
|
1502
|
+
}
|
|
1503
|
+
|
|
1504
|
+
@fragment fn fs_single_bloom(in : VSOut) -> BloomOutput {
|
|
1505
|
+
let f = textFragment(in);
|
|
1506
|
+
var out : BloomOutput;
|
|
1507
|
+
out.color = f.color;
|
|
1508
|
+
out.hdr = f.hdr;
|
|
1509
|
+
return out;
|
|
1510
|
+
}
|
|
1511
|
+
|
|
1512
|
+
@fragment fn fs_mrt_bloom(in : VSOut) -> MrtBloomOutput {
|
|
1513
|
+
let f = textFragment(in);
|
|
1514
|
+
var out : MrtBloomOutput;
|
|
1515
|
+
out.color = f.color;
|
|
1516
|
+
out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
|
|
1517
|
+
out.hdr = f.hdr;
|
|
1518
|
+
return out;
|
|
1519
|
+
}
|
|
1520
|
+
`;var mr=24,dt=class{device;pipelineSingle;pipelineMrt;bloomVariants;modelLayout;fontLayout;modelPool;instancePool;fontBindGroups=new WeakMap;modelData=new Float32Array(40+_A);constructor(e,t,n,r,i,o=1){this.device=e,this.modelPool=new GA((40+_A)*4,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.instancePool=new GA(65536,GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST);let a=e.createShaderModule({label:"slug3d.wgsl",code:dr});this.modelLayout=e.createBindGroupLayout({label:"Slug3DModelLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},oe(1)]}),this.fontLayout=e.createBindGroupLayout({label:"Slug3DFontLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"unfilterable-float"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"uint"}}]});let s=e.createPipelineLayout({bindGroupLayouts:[r,this.modelLayout,this.fontLayout,i]}),g={module:a,entryPoint:"vs",buffers:[{arrayStride:mr*4,stepMode:"instance",attributes:[{shaderLocation:0,offset:0,format:"float32x4"},{shaderLocation:1,offset:16,format:"float32x4"},{shaderLocation:2,offset:32,format:"float32x4"},{shaderLocation:3,offset:48,format:"float32x4"},{shaderLocation:4,offset:64,format:"float32x4"},{shaderLocation:5,offset:80,format:"float32x4"}]}]},B={label:"Slug3DPipeline",layout:s,vertex:g,module:a,format:t,depthStencil:{format:n,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:o}},{single:Q,mrt:f}=de(e,B);this.pipelineSingle=Q,this.pipelineMrt=f,this.bloomVariants=new ne(e,B)}resetPools(){this.modelPool.reset(),this.instancePool.reset()}draw(e,t,n,r,i,o,a,s=!1,g=!1){if(o===0||!r.curvesTex||!r.bandsTex)return;this.modelData.set(a.modelMatrix,0),this.modelData.set(a.normalMatrix,16),this.modelData[32]=a.opacity,this.modelData[33]=a.slant,this.modelData[34]=a.twoSided?1:0,this.modelData[35]=a.depthPull,this.modelData.set(jt(a),36),me(a,this.modelData,40);let l=this.modelPool.getBuffer(this.device,this.modelData),u=this.device.createBindGroup({layout:this.modelLayout,entries:[{binding:0,resource:{buffer:l}},{binding:1,resource:a.matte?.createView()??ae(this.device)}]}),c=this.instancePool.getBuffer(this.device,i.subarray(0,o*mr));e.setPipeline(g?this.bloomVariants.get(s):s?this.pipelineMrt:this.pipelineSingle),e.setBindGroup(0,t),e.setBindGroup(1,u),e.setBindGroup(2,this.fontBindGroup(r.curvesTex,r.bandsTex)),e.setBindGroup(3,n),e.setVertexBuffer(0,c),e.draw(6,o)}fontBindGroup(e,t){let n=this.fontBindGroups.get(e);return n||(n=this.device.createBindGroup({layout:this.fontLayout,entries:[{binding:0,resource:e.createView()},{binding:1,resource:t.createView()}]}),this.fontBindGroups.set(e,n)),n}destroy(){this.modelPool.destroy(),this.instancePool.destroy()}};var lo={repeat:"repeat",clamp:"clamp-to-edge",mirror:"mirror-repeat"},uo=5e-4,hr=class{device;format;quad3dPipeline;slug3dPipeline;mesh3dPipeline;audioMeshDeformPipeline;dofPipeline;dofBindGroupLayout;cameraPool;lightsPool;cameraUniformBindGroupCache=new Xn;samplerCache=new qn;depthTexture=null;linearDepthTexture=null;msaaColorTexture=null;msaaLinearDepthTexture=null;msaaHdrTexture=null;hdrTexture=null;passWritesHdr=!1;cameraUniformData=new Float32Array(80);meshBuffersCache=new WeakMap;materialTextures=new WeakMap;materialMapCache=new WeakMap;modelCache=new Map;lastCameraPose=null;shadowTexture=null;placeholderShadowTexture=null;shadowSampler=null;meshBounds=new WeakMap;bloomPipeline=null;lastCameraBuffer=null;sampleCount;constructor(e,t,n=4){this.device=e,this.format=t,this.sampleCount=n,this.quad3dPipeline=new Qt(e,t,"depth24plus",n),this.slug3dPipeline=new dt(e,t,"depth24plus",this.quad3dPipeline.cameraLayout,this.quad3dPipeline.lightsLayout,n),this.mesh3dPipeline=new ft(e,t,"depth24plus",this.quad3dPipeline.cameraLayout,this.quad3dPipeline.lightsLayout,n),this.audioMeshDeformPipeline=new at(e),this.cameraPool=new GA(320,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.lightsPool=new GA(Vt,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);let r=e.createShaderModule({label:"dof-bokeh.wgsl",code:Ir});this.dofBindGroupLayout=e.createBindGroupLayout({label:"DoFBindGroupLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:3,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}]}),this.dofPipeline=e.createRenderPipeline({label:"DoFBokehPipeline",layout:e.createPipelineLayout({bindGroupLayouts:[this.dofBindGroupLayout]}),vertex:{module:r,entryPoint:"vs_fullscreen"},fragment:{module:r,entryPoint:"fs_dof",targets:[{format:t}]},primitive:{topology:"triangle-list"}})}resetPools(){this.bloomPipeline?.resetPools(),this.cameraPool.reset(),this.lastCameraPose=null,this.lastCameraBuffer=null,this.lightsPool.reset(),this.quad3dPipeline.resetPools(),this.slug3dPipeline.resetPools(),this.mesh3dPipeline.resetPools(),this.audioMeshDeformPipeline.resetPools()}getOrCreateDepthTexture(e,t){return(!this.depthTexture||this.depthTexture.width!==e||this.depthTexture.height!==t)&&(this.depthTexture?.destroy(),this.depthTexture=this.device.createTexture({label:"Renderer3DDepthTexture",size:{width:e,height:t},format:"depth24plus",sampleCount:this.sampleCount,usage:GPUTextureUsage.RENDER_ATTACHMENT})),this.depthTexture}getOrCreateMsaaTexture(e,t,n,r,i){return e&&e.width===r&&e.height===i?e:(e?.destroy(),this.device.createTexture({label:t,size:{width:r,height:i},format:n,sampleCount:this.sampleCount,usage:GPUTextureUsage.RENDER_ATTACHMENT}))}hdrSource(){return this.hdrTexture}getOrCreateHdrTexture(e,t){return(!this.hdrTexture||this.hdrTexture.width!==e||this.hdrTexture.height!==t)&&(this.hdrTexture?.destroy(),this.hdrTexture=this.device.createTexture({label:"Renderer3DHdrRadiance",size:{width:e,height:t},format:"rgba16float",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING})),this.hdrTexture}getOrCreateLinearDepthTexture(e,t){return(!this.linearDepthTexture||this.linearDepthTexture.width!==e||this.linearDepthTexture.height!==t)&&(this.linearDepthTexture?.destroy(),this.linearDepthTexture=this.device.createTexture({label:"Renderer3DLinearDepthTexture",size:{width:e,height:t},format:"rgba16float",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING})),this.linearDepthTexture}packCameraUniforms(e,t,n,r=0){if(this.lastCameraPose&&this.lastCameraBuffer&&this.lastCameraPose.eye[0]===e.eye[0]&&this.lastCameraPose.eye[1]===e.eye[1]&&this.lastCameraPose.eye[2]===e.eye[2]&&this.lastCameraPose.target[0]===e.target[0]&&this.lastCameraPose.target[1]===e.target[1]&&this.lastCameraPose.target[2]===e.target[2]&&this.lastCameraPose.up[0]===e.up[0]&&this.lastCameraPose.up[1]===e.up[1]&&this.lastCameraPose.up[2]===e.up[2]&&this.lastCameraPose.fov===e.fov&&this.lastCameraPose.near===e.near&&this.lastCameraPose.far===e.far)return this.lastCameraBuffer;let i=ce.computeViewMatrix(e),o=ce.computeProjectionMatrix(e),a=ce.computeViewProjectionMatrix(e),s=$.invert(a)??$.identity();this.cameraUniformData.set(i,0),this.cameraUniformData.set(o,16),this.cameraUniformData.set(a,32),this.cameraUniformData.set(s,48),this.cameraUniformData[64]=e.eye[0],this.cameraUniformData[65]=e.eye[1],this.cameraUniformData[66]=e.eye[2],this.cameraUniformData[67]=e.near;let g=k.normalize(k.subtract(e.target,e.eye));this.cameraUniformData[68]=g[0],this.cameraUniformData[69]=g[1],this.cameraUniformData[70]=g[2],this.cameraUniformData[71]=e.far,this.cameraUniformData[72]=e.focusDistance??1e3,this.cameraUniformData[73]=e.fStop??2.8,this.cameraUniformData[74]=e.maxBlurRadius??32,this.cameraUniformData[75]=e.focusDistance!==void 0?1:0,this.cameraUniformData[76]=t,this.cameraUniformData[77]=n,this.cameraUniformData[78]=r,this.cameraUniformData[79]=0;let l=this.cameraPool.getBuffer(this.device,this.cameraUniformData);return this.lastCameraPose=e,this.lastCameraBuffer=l,l}createCameraBindGroup(e){return this.cameraUniformBindGroupCache.getBindGroup(this.device,this.quad3dPipeline.cameraLayout,e)}getOrCreateLightsBuffer(e,t){let n=qA.packLightsUniforms(e??[],t?.environment,t?.shadow);return this.lightsPool.getBuffer(this.device,n)}createLightsBindGroup(e,t){this.shadowSampler??=this.device.createSampler({label:"ShadowComparisonSampler",compare:"less-equal",magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}),this.placeholderShadowTexture??=this.device.createTexture({label:"ShadowMapPlaceholder",size:{width:1,height:1},format:Bt,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT});let n=t&&this.shadowTexture?this.shadowTexture:this.placeholderShadowTexture;return this.device.createBindGroup({label:"Lights3DBindGroup",layout:this.quad3dPipeline.lightsLayout,entries:[{binding:0,resource:{buffer:e}},{binding:1,resource:n.createView()},{binding:2,resource:this.shadowSampler}]})}meshAabb(e){let t=this.meshBounds.get(e);if(!t){let n=[1/0,1/0,1/0],r=[-1/0,-1/0,-1/0],i=e.positions;for(let o=0;o+2<i.length;o+=3)for(let a=0;a<3;a++){let s=i[o+a];s<n[a]&&(n[a]=s),s>r[a]&&(r[a]=s)}t=Number.isFinite(n[0])?{min:n,max:r}:{min:[0,0,0],max:[0,0,0]},this.meshBounds.set(e,t)}return t}worldBounds(e){return e.kind==="mesh"?An(this.meshAabb(e.mesh),this.meshModelMatrix(e.opts)):An({min:[-.5,-.5,0],max:[.5,.5,0]},this.quadModelMatrix(e.opts))}renderShadowMap(e,t,n,r,i,o={}){let a=t.lightType??t.type;if(a!=="directional"&&a!=="spot")return null;let s=qA.processLight(t),g=[s.posType[0],s.posType[1],s.posType[2]],l=[s.dirRadius[0],s.dirRadius[1],s.dirRadius[2]],u=o.mapSize??2048,c=r.map(d=>this.worldBounds(d)),B=Cr({type:a,position:g,direction:l,angle:t.angle},c,i,u);if(!B)return null;(!this.shadowTexture||this.shadowTexture.width!==u)&&(this.shadowTexture?.destroy(),this.shadowTexture=this.device.createTexture({label:"ShadowMap",size:{width:u,height:u},format:Bt,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}));let Q=new Float32Array(80);Q.set(B.viewProj,32),Q.set(B.viewProj,0),Q[5]=1,Q.set(B.viewProj,16),Q[64]=g[0],Q[65]=g[1],Q[66]=g[2],Q[68]=l[0],Q[69]=l[1],Q[70]=l[2],Q[76]=u,Q[77]=u;let f=this.createCameraBindGroup(this.cameraPool.getBuffer(this.device,Q)),h=e.beginRenderPass({label:"ShadowMapPass",colorAttachments:[],depthStencilAttachment:{view:this.shadowTexture.createView(),depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store"}}),m=this.samplerCache.getSampler(this.device);for(let d of r)if(d.kind==="mesh"){let x=this.meshModelMatrix(d.opts);this.mesh3dPipeline.drawShadow(h,f,d.buffers??this.getOrCreateMeshBuffers(d.mesh),{modelMatrix:x,normalMatrix:d.opts.normalMatrix??qA.computeNormalMatrix(x),isSkinned:d.opts.isSkinned,skinningMatrices:d.opts.skinningMatrices})}else{let x=this.quadModelMatrix(d.opts);this.quad3dPipeline.drawShadow(h,f,d.texture,m,{modelMatrix:x,normalMatrix:x,width:d.opts.width,height:d.opts.height,textureExtent:d.opts.textureExtent,opacity:d.opts.opacity,colorTint:d.opts.colorTint})}return h.end(),{matrix:B.viewProj,lightIndex:n,mapSize:u,softness:o.softness??t.shadowSoftness??2.5,bias:a==="directional"?6e-4:8e-5,normalOffset:B.texelWorldSize*1.5,darkness:o.darkness??t.shadowDarkness??1}}beginPass(e,t,n,r,i,o="clear",a={r:0,g:0,b:0,a:0},s,g,l,u=!1){let c=this.getOrCreateDepthTexture(n,r),B=this.packCameraUniforms(i,n,r),Q=this.createCameraBindGroup(B),f=this.getOrCreateLightsBuffer(g,l),h=this.createLightsBindGroup(f,!!l?.shadow),m=this.sampleCount>1;if(m&&o==="load")throw new Error("Renderer3D.beginPass: loadOp 'load' needs a Renderer3D built with sampleCount 1");let d=(G,M,D,b)=>M?{view:M.createView(),resolveTarget:G,loadOp:"clear",storeOp:"discard",clearValue:D}:{view:G,loadOp:b,storeOp:"store",clearValue:D};m&&(this.msaaColorTexture=this.getOrCreateMsaaTexture(this.msaaColorTexture,"Renderer3DMsaaColor",this.format,n,r));let x=[d(t,m?this.msaaColorTexture:null,a,o)];return s&&(m&&(this.msaaLinearDepthTexture=this.getOrCreateMsaaTexture(this.msaaLinearDepthTexture,"Renderer3DMsaaLinearDepth","rgba16float",n,r)),x.push(d(s,m?this.msaaLinearDepthTexture:null,{r:i.far,g:0,b:0,a:1},"clear"))),this.passWritesHdr=u,u&&(this.hdrTexture=this.getOrCreateHdrTexture(n,r),m&&(this.msaaHdrTexture=this.getOrCreateMsaaTexture(this.msaaHdrTexture,"Renderer3DMsaaHdr","rgba16float",n,r)),x.push(d(this.hdrTexture.createView(),m?this.msaaHdrTexture:null,{r:0,g:0,b:0,a:0},"clear"))),{pass:e.beginRenderPass({colorAttachments:x,depthStencilAttachment:{view:c.createView(),depthClearValue:1,depthLoadOp:"clear",depthStoreOp:m?"discard":"store"}}),cameraBindGroup:Q,cameraBuffer:B,lightsBindGroup:h}}quadModelMatrix(e){if(e.modelMatrix)return e.modelMatrix;let{position:t,width:n,height:r,rotation:i=[0,0,0],scale:o=[1,1,1],anchor:a=[.5,.5]}=e,s=$.identity();s=$.multiply(s,$.translate(t[0],t[1],t[2]));let g=i[0]*Math.PI/180,l=i[1]*Math.PI/180,u=i[2]*Math.PI/180;u!==0&&(s=$.multiply(s,$.rotateZ(u))),l!==0&&(s=$.multiply(s,$.rotateY(l))),g!==0&&(s=$.multiply(s,$.rotateX(g)));let c=n*o[0],B=r*o[1],Q=o[2];s=$.multiply(s,$.scale(c,B,Q));let f=.5-a[0],h=.5-a[1];return(f!==0||h!==0)&&(s=$.multiply(s,$.translate(f,h,0))),s}drawSlugText(e,t,n,r,i,o=0,a=!1){let{width:s,height:g}=i;if(!(s>0&&g>0))return;let l=this.quadModelMatrix(i),u=i.normalMatrix??qA.computeNormalMatrix(l),c=$.multiply(l,$.multiply($.translate(-.5,-.5,0),$.scale(1/s,1/g,1)));for(let B=0;B<r.length;B++){let Q=r[B],[f,h,m,d,x,y]=Q.transform,G=[f,h,0,0,m,d,0,0,0,0,1,0,x,y,0,1];this.slug3dPipeline.draw(e,t,n,Q.font,Q.instances,Q.instanceCount,{modelMatrix:$.multiply(c,G),normalMatrix:u,opacity:Q.opacity*(i.opacity??1),slant:Q.slant,twoSided:i.twoSided??!0,depthPull:uo*(o+B+1),material:i.material,shininess:i.shininess??32,roughness:i.roughness,specularIntensity:i.specularIntensity??.5,ambientIntensity:i.ambientIntensity??1,metallic:i.metallic,emissive:i.emissive,emissiveIntensity:i.emissiveIntensity,matte:i.matte},a,this.passWritesHdr)}}drawTextureQuad(e,t,n,r,i,o=!1){let{width:a,height:s,opacity:g=1,colorTint:l=[1,1,1,1],borderColor:u,borderWidth:c=0,borderRadius:B=0,twoSided:Q=!0,material:f="lit",shininess:h=32,roughness:m,specularIntensity:d=.5,ambientIntensity:x=1,metallic:y}=i,G=this.quadModelMatrix(i),M=i.normalMatrix??qA.computeNormalMatrix(G),D=this.samplerCache.getSampler(this.device),b;if(u)if(Array.isArray(u))b=u;else{let N=et(u);b=[N.r,N.g,N.b,N.a]}this.quad3dPipeline.draw(e,t,n,r,D,{modelMatrix:G,normalMatrix:M,colorTint:l,borderColor:b,borderWidth:c,opacity:g,borderRadius:B,twoSided:Q,width:a,height:s,textureExtent:i.textureExtent,material:f,shininess:h,roughness:m,specularIntensity:d,ambientIntensity:x,metallic:y,emissive:i.emissive,emissiveIntensity:i.emissiveIntensity,matte:i.matte},o,this.passWritesHdr)}meshModelMatrix(e){if(e.modelMatrix)return e.modelMatrix;let{position:t=[0,0,0],rotation:n=[0,0,0],scale:r=[1,1,1]}=e,i=$.translate(t[0],t[1],t[2]),o=n[0]*Math.PI/180,a=n[1]*Math.PI/180,s=n[2]*Math.PI/180;return s!==0&&(i=$.multiply(i,$.rotateZ(s))),a!==0&&(i=$.multiply(i,$.rotateY(a))),o!==0&&(i=$.multiply(i,$.rotateX(o))),$.multiply(i,$.scale(r[0],r[1],r[2]))}getOrCreateMeshBuffers(e){let t=this.meshBuffersCache.get(e);if(t)return t;let n=e.positions.length/3,r=new Float32Array(n*16);for(let l=0;l<n;l++){let u=l*16;r[u]=e.positions[l*3]??0,r[u+1]=e.positions[l*3+1]??0,r[u+2]=e.positions[l*3+2]??0,r[u+3]=e.uvs[l*2]??0,r[u+4]=e.uvs[l*2+1]??0,r[u+5]=e.normals[l*3]??0,r[u+6]=e.normals[l*3+1]??0,r[u+7]=e.normals[l*3+2]??1,e.jointIndices?(r[u+8]=e.jointIndices[l*4]??0,r[u+9]=e.jointIndices[l*4+1]??0,r[u+10]=e.jointIndices[l*4+2]??0,r[u+11]=e.jointIndices[l*4+3]??0):(r[u+8]=0,r[u+9]=0,r[u+10]=0,r[u+11]=0),e.jointWeights?(r[u+12]=e.jointWeights[l*4]??0,r[u+13]=e.jointWeights[l*4+1]??0,r[u+14]=e.jointWeights[l*4+2]??0,r[u+15]=e.jointWeights[l*4+3]??0):(r[u+12]=0,r[u+13]=0,r[u+14]=0,r[u+15]=0)}let i=Math.ceil(r.byteLength/4)*4,o=this.device.createBuffer({size:Math.max(4,i),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC,mappedAtCreation:!0});new Float32Array(o.getMappedRange()).set(r),o.unmap();let a=e.indices instanceof Uint32Array,s=Math.ceil(e.indices.byteLength/4)*4,g=this.device.createBuffer({size:Math.max(4,s),usage:GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});return a?new Uint32Array(g.getMappedRange()).set(e.indices):new Uint16Array(g.getMappedRange()).set(e.indices),g.unmap(),t={vertexBuffer:o,indexBuffer:g,indexCount:e.indices.length,indexFormat:a?"uint32":"uint16"},this.meshBuffersCache.set(e,t),t}deformMesh(e,t,n){let r=this.getOrCreateMeshBuffers(t),i=t.positions.length/3;return{vertexBuffer:this.audioMeshDeformPipeline.execute(e,r.vertexBuffer,{config:n.config,audioLatentBuffer:n.latentBuffer,vertexCount:i,timeMs:n.timeMs,sampleRate:n.sampleRate}),indexBuffer:r.indexBuffer,indexCount:r.indexCount,indexFormat:r.indexFormat}}drawMesh3D(e,t,n,r,i,o={},a=!1){let s="vertexBuffer"in r?r:this.getOrCreateMeshBuffers(r),{opacity:g=1,colorTint:l=[1,1,1,1],twoSided:u=!0,wireframe:c=!1,isSkinned:B=!1,skinningMatrices:Q,material:f="lit",shadeColor:h,alphaCutoff:m,textureWrap:d="clamp",shininess:x=32,roughness:y,specularIntensity:G=.5,ambientIntensity:M=1,metallic:D}=o,b=this.meshModelMatrix(o),N=o.normalMatrix??qA.computeNormalMatrix(b),S=lo[d],v=this.samplerCache.getSampler(this.device,{addressModeU:S,addressModeV:S}),F=f==="glass"||f==="acrylic"||f==="frosted",P=F?{ior:o.ior??(f==="acrylic"?1.49:1.5),dispersion:o.dispersion??(f==="glass"?.04:.015),thickness:o.thickness??80,frost:f==="frosted"?y??.5:0}:void 0;this.mesh3dPipeline.draw(e,t,n,s,i,v,{glass:P,backdrop:o.backdrop,modelMatrix:b,normalMatrix:N,colorTint:l,opacity:g,twoSided:u,wireframe:c,isSkinned:B,skinningMatrices:Q,material:f==="unlit"||f==="toon"?f:"lit",shadeColor:h,alphaCutoff:m,shininess:x,roughness:F?Math.min(y??.05,.3):y,specularIntensity:G,ambientIntensity:M,metallic:D,emissive:o.emissive,emissiveIntensity:o.emissiveIntensity,matte:o.matte,maps:o.maps},a,this.passWritesHdr)}loadModel(e,t="auto",n={}){if(typeof e!="string")return pr(e,t,n);let r=`${t}|${JSON.stringify(n)}|${e}`,i=this.modelCache.get(r);return i||(i=pr(e,t,n),this.modelCache.set(r,i)),i}materialTexture(e){let t=this.materialTextures.get(e);return t||(t=this.uploadMaterialTexture(e),this.materialTextures.set(e,t)),t}materialMaps(e){let t=this.materialMapCache.get(e);return t||(t=(async()=>{let n=e.name,[r,i,o,a]=await Promise.all([this.uploadImage(e.normalTextureBuffer,`${n}:normal`),this.uploadImage(e.metallicRoughnessTextureBuffer,`${n}:metallicRoughness`),this.uploadImage(e.occlusionTextureBuffer,`${n}:occlusion`),this.uploadImage(e.emissiveTextureBuffer,`${n}:emissive`)]);return{...r&&{normal:r,normalScale:e.normalScale??1},...i&&{metallicRoughness:i},...o&&{occlusion:o,occlusionStrength:e.occlusionStrength??1},...a&&{emissive:a}}})(),this.materialMapCache.set(e,t)),t}uploadMaterialTexture(e){return this.uploadImage(e.diffuseTextureBuffer,`Material:${e.name}`)}async uploadImage(e,t){if(!e)return;let n=(await import("./sharp-V6ZTBNDW.mjs")).default,r=Buffer.from(e instanceof Uint8Array?e:new Uint8Array(e)),{width:i,height:o}=await n(r).metadata();if(!i||!o)return;let a=Math.floor(Math.log2(Math.max(i,o)))+1,s=this.device.createTexture({label:t,size:{width:i,height:o},mipLevelCount:a,format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST});for(let g=0;g<a;g++){let l=Math.max(1,i>>g),u=Math.max(1,o>>g),c=await n(r).ensureAlpha().resize(l,u,{fit:"fill"}).raw().toBuffer();this.device.queue.writeTexture({texture:s,mipLevel:g},c,{bytesPerRow:l*4,rowsPerImage:u},{width:l,height:u})}return s}applyBloom(e,t,n,r={},i){this.bloomPipeline??=new It(this.device),this.bloomPipeline.apply(e,t,n,r,i??void 0)}applyDepthOfField(e,t,n,r,i){let o=this.samplerCache.getSampler(this.device),a=this.device.createBindGroup({layout:this.dofBindGroupLayout,entries:[{binding:0,resource:{buffer:i}},{binding:1,resource:o},{binding:2,resource:t.createView()},{binding:3,resource:n.createView()}]}),s=e.beginRenderPass({colorAttachments:[{view:r,loadOp:"clear",storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]});s.setPipeline(this.dofPipeline),s.setBindGroup(0,a),s.draw(3),s.end()}destroy(){this.bloomPipeline?.destroy(),this.depthTexture?.destroy(),this.shadowTexture?.destroy(),this.placeholderShadowTexture?.destroy(),this.linearDepthTexture?.destroy(),this.msaaColorTexture?.destroy(),this.msaaLinearDepthTexture?.destroy(),this.msaaHdrTexture?.destroy(),this.hdrTexture?.destroy(),this.quad3dPipeline.destroy(),this.slug3dPipeline.destroy(),this.mesh3dPipeline.destroy(),this.cameraPool.destroy(),this.lightsPool.destroy(),this.cameraUniformBindGroupCache.destroy()}};function pr(A,e="auto",t={}){if(e==="gltf"||e==="glb")return st(A,t);if(e==="stl")return Ue(A,t);if(e==="ply")return ve(A,t);if(e==="vox")return gt(A,t);if(e==="3ds")return lt(A,t);if(e==="off")return ut(A,t);if(e==="fbx")return Fe(A,t);if(e==="obj")return Ne(A,void 0,t);let n=typeof A!="string",r=typeof A=="string"?A.trim():"",i=r.toLowerCase();if(i.endsWith(".glb")||i.endsWith(".gltf"))return st(A,t);if(i.endsWith(".stl"))return Ue(A,t);if(i.endsWith(".ply"))return ve(A,t);if(i.endsWith(".vox"))return gt(A,t);if(i.endsWith(".3ds"))return lt(A,t);if(i.endsWith(".off"))return ut(A,t);if(i.endsWith(".fbx"))return Fe(A,t);if(i.endsWith(".obj"))return Ne(A,void 0,t);if(n){let o=A instanceof Uint8Array?A:new Uint8Array(A);return Ee.isGlb(o)?ur(o,t):re.isBinary(o)?Fe(o,t):Le.isVox(o)?gt(o,t):ke.is3DS(o)?lt(o,t):o.length>=3&&o[0]===112&&o[1]===108&&o[2]===121?ve(o,t):Se.isBinary(o)?Ue(o,t):Ne(o,void 0,t)}return r.startsWith("{")&&(r.includes('"asset"')||r.includes('"meshes"'))?st(r,t):r.startsWith("ply")||r.startsWith("PLY")?ve(r,t):r.startsWith("OFF")||r.startsWith("NOFF")||r.startsWith("COFF")?ut(r,t):r.includes("FBXHeaderExtension")||r.includes("Kaydara FBX")?Fe(r,t):r.startsWith("solid")&&r.includes("facet")?Ue(r,t):Ne(A,void 0,t)}L();var{cbrt:en,sqrt:tn,PI:he}=Math,Io=(A,e,t,n,r)=>{let i=e+t*A,o=i**2+n;if(o>0){let l=tn(o);return en(i+l)+en(i-l)-r}let a=en(tn(i*i-o)),s=i?Math.atan(tn(-o)/i):-he/2,g;return t<0?g=(i>0?2*he:he)-s:r<0?g=(i>0?2*he:-3*he)+s:g=(i>0?0:he)+s,2*a*Math.cos(g/3)-r},co=(A,e,t,n)=>((e*A+3*t)*A+n)*A,nn=A=>A;function yr(A,e,t,n){if(!(0<=A&&A<=1&&0<=t&&t<=1))throw new Error("bezier x values must be in [0, 1] range");if(A===e&&t===n)return nn;let r=6*(3*A-3*t+1),i=6*(t-2*A),o=3*A,a=r*r,s=i*i,g=i/r,l=3*i*o/a-s*i/(a*r),u=2*o/r-s/a,c=u*u*u,B=3/r,Q=3*e-3*n+1,f=n-2*e,h=3*e,m=r?Io:nn;return function(x){return x===0||x===1?x:co(m(x,l,B,c,g),Q,f,h)}}var fl={linear:nn,ease:yr(.25,.1,.25,1),quad:A=>A*A,cubic:A=>A*A*A,poly:A=>e=>e**A,sin:A=>1-Math.cos(A*Math.PI/2),circle:A=>1-Math.sqrt(1-A*A),exp:A=>2**(10*(A-1)),elastic:(A=1)=>{let e=A*Math.PI;return t=>1-Math.cos(t*Math.PI/2)**3*Math.cos(t*e)},back:(A=1.70158)=>e=>e*e*((A+1)*e-A),bounce:A=>{if(A<1/2.75)return 7.5625*A*A;if(A<2/2.75){let t=A-.5454545454545454;return 7.5625*t*t+.75}if(A<2.5/2.75){let t=A-.8181818181818182;return 7.5625*t*t+.9375}let e=A-2.625/2.75;return 7.5625*e*e+.984375},bezier:yr,in:A=>A,out:A=>e=>1-A(1-e),inOut:A=>e=>e<.5?A(e*2)/2:1-A((1-e)*2)/2};function br(A,e,t,n){let r=n?.extrapolateLeft??"extend",i=n?.extrapolateRight??"extend";if(e.length!==t.length)throw new Error("inputRange and outputRange must have the same length");if(e.length<2)throw new Error("inputRange must have at least 2 elements");let o=e[0],a=e[e.length-1];if(A<o){if(r==="clamp")return t[0];if(r==="identity")return A}if(A>a){if(i==="clamp")return t[t.length-1];if(i==="identity")return A}let s=1;for(;s<e.length-1&&!(A<e[s]);s++);let g=e[s-1],l=e[s],u=t[s-1],c=t[s];if(g===l)return u;let B=(A-g)/(l-g);return n?.easing&&(B=n.easing(B)),u+B*(c-u)}L();var Bo={damping:10,mass:1,stiffness:100,overshootClamping:!1},rn={};function Eo({animation:A,now:e,config:t}){let{toValue:n,lastTimestamp:r,current:i,velocity:o}=A,a=Math.min(e-r,64);if(t.damping<=0)throw new Error("Spring damping must be greater than 0, otherwise the spring() animation will never end, causing an infinite loop.");if(t.stiffness<=0)throw new Error("Spring stiffness must be greater than 0.");if(t.mass<=0)throw new Error("Spring mass must be greater than 0.");let s=t.damping,g=t.mass,l=t.stiffness,u=[n,r,i,o,s,g,l,e].join("-");if(rn[u])return rn[u];let c=-o,B=n-i,Q=s/(2*Math.sqrt(l*g)),f=Math.sqrt(l/g),h=f*Math.sqrt(1-Q**2),m=a/1e3,d=Math.sin(h*m),x=Math.cos(h*m),y=Math.exp(-Q*f*m),G=y*(d*((c+Q*f*B)/h)+B*x),M=n-G,D=Q*f*G-y*(x*(c+Q*f*B)-h*B*d),b=Math.exp(-f*m),N=n-b*(B+(c+f*B)*m),S=b*(c*(m*f-1)+m*B*f*f),v={toValue:n,prevPosition:i,lastTimestamp:e,current:Q<1?M:N,velocity:Q<1?D:S};return rn[u]=v,v}var on={};function Dr({frame:A,fps:e,config:t={}}){let i=[A,e,t.damping,t.mass,t.overshootClamping,t.stiffness].join("-");if(on[i])return on[i];let o={lastTimestamp:0,current:0,toValue:1,velocity:0,prevPosition:0},a=Math.max(0,A),s=a%1;for(let g=0;g<=Math.floor(a);g++){g===Math.floor(a)&&(g+=s);let l=g/e*1e3;o=Eo({animation:o,now:l,config:{...Bo,...t}})}return on[i]=o,o}var an=new Map;function Qo({fps:A,config:e={},threshold:t=.005}){if(typeof t!="number")throw new TypeError(`threshold must be a number, got ${t}`);if(t===0)return 1/0;if(t===1)return 0;if(Number.isNaN(t))throw new TypeError("Threshold is NaN");if(!Number.isFinite(t))throw new TypeError("Threshold is not finite");if(t<0)throw new TypeError("Threshold is below 0");let n=[A,e.damping,e.mass,e.overshootClamping,e.stiffness,t].join("-");if(an.has(n))return an.get(n);let r=0,i=0,o=()=>Dr({fps:A,frame:r,config:e}),a=o(),s=()=>Math.abs(a.current-a.toValue),g=s();for(;g>=t;)r++,a=o(),g=s();i=r;for(let l=0;l<20;l++)r++,a=o(),g=s(),g>=t&&(l=0,i=r+1);return an.set(n,i),i}function hl({frame:A,fps:e,config:t={},from:n=0,to:r=1,durationInFrames:i,durationRestThreshold:o,delay:a=0,reverse:s=!1}){let g=s||typeof i<"u",l=g?Qo({fps:e,config:t,threshold:o}):void 0,u=g?{get:()=>l}:{get:()=>{throw new Error("did not calculate natural duration")}},B=(s?(i??u.get())-A:A)+(s?a:-a),Q=i===void 0?B:B/(i/u.get());if(i&&B>i)return r;let f=Dr({fps:e,frame:Q,config:t}),h=t.overshootClamping?r>=n?Math.min(f.current,r):Math.max(f.current,r):f.current;return n===0&&r===1?h:br(h,[0,1],[n,r])}L();L();L();L();var Te=new Set,sn=!1;function En(A,e,t=2){let n=e&&e.length,r=n?e[0]*t:A.length;Te.size&&Te.clear();let i=Gr(A,0,r,t,!0),o=[];if(!i||i.next===i.prev)return o;let a=0,s=0,g=0;if(n&&(i=po(A,e,i,t)),A.length>80*t){a=A[0],s=A[1];let l=a,u=s;for(let c=t;c<r;c+=t){let B=A[c],Q=A[c+1];B<a&&(a=B),Q<s&&(s=Q),B>l&&(l=B),Q>u&&(u=Q)}g=Math.max(l-a,u-s),g=g!==0?32767/g:0}return gn(i,o,a,s,g),o}function Gr(A,e,t,n,r){let i=null;if(r===Ro(A,e,t,n)>0)for(let o=e;o<t;o+=n)i=Mr(o/n|0,A[o],A[o+1],i);else for(let o=t-n;o>=e;o-=n)i=Mr(o/n|0,A[o],A[o+1],i);return i&&Je(i,i.next)&&(Ke(i),i=i.next),i}function ge(A,e=A){let t=e===A,n=A,r;do r=!1,n!==n.next&&(Te.size===0||!Te.has(n))&&(Je(n,n.next)||MA(n.prev,n,n.next)===0)?((t||n===e)&&(e=n.prev),sn=!0,Ke(n),n=n.prev,r=!0):(t||n!==e)&&(n=n.next,r=!t);while(r||n!==e);return e}function gn(A,e,t,n,r){r&&Go(A,t,n,r);let i=A,o=!1;for(;A.prev!==A.next;){let a=A.prev,s=A.next;if(MA(a,A,s)<0&&(r?Co(A,t,n,r):fo(A))){e.push(a.i,A.i,s.i),Ke(A),A=s,i=s;continue}if(A=s,A===i){if(sn=!1,A=ge(A),sn){i=A;continue}if(!o){A=mo(A,e),i=A,o=!0;continue}ho(A,e,t,n,r);break}}}function fo(A){let e=A.prev,t=A,n=A.next,r=e.x,i=t.x,o=n.x,a=e.y,s=t.y,g=n.y,l=Math.min(r,i,o),u=Math.min(a,s,g),c=Math.max(r,i,o),B=Math.max(a,s,g),Q=n.next;for(;Q!==e;){if(Q.x>=l&&Q.x<=c&&Q.y>=u&&Q.y<=B&&!(r===Q.x&&a===Q.y)&&yt(r,a,i,s,o,g,Q.x,Q.y)&&MA(Q.prev,Q,Q.next)>=0)return!1;Q=Q.next}return!0}function Co(A,e,t,n){let r=A.prev,i=A,o=A.next,a=r.x,s=i.x,g=o.x,l=r.y,u=i.y,c=o.y,B=Math.min(a,s,g),Q=Math.min(l,u,c),f=Math.max(a,s,g),h=Math.max(l,u,c),m=cn(B,Q,e,t,n),d=cn(f,h,e,t,n),x=A.prevZ;for(;x&&x.z>=m;){if(x.x>=B&&x.x<=f&&x.y>=Q&&x.y<=h&&x!==o&&!(a===x.x&&l===x.y)&&yt(a,l,s,u,g,c,x.x,x.y)&&MA(x.prev,x,x.next)>=0)return!1;x=x.prevZ}let y=A.nextZ;for(;y&&y.z<=d;){if(y.x>=B&&y.x<=f&&y.y>=Q&&y.y<=h&&y!==o&&!(a===y.x&&l===y.y)&&yt(a,l,s,u,g,c,y.x,y.y)&&MA(y.prev,y,y.next)>=0)return!1;y=y.nextZ}return!0}function mo(A,e){let t=A,n=!1;do{let r=t.prev,i=t.next.next;Sr(r,t,t.next,i,!1)&&Oe(r,i)&&Oe(i,r)&&(e.push(r.i,t.i,i.i),Ke(t),Ke(t.next),t=A=i,n=!0),t=t.next}while(t!==A);return n?ge(t):t}function ho(A,e,t,n,r){let i=A;do{let o=i.next.next;for(;o!==i.prev;){if(i.i!==o.i&&So(i,o)){let a=Ur(i,o);i=ge(i,i.next),a=ge(a,a.next),gn(i,e,t,n,r),gn(a,e,t,n,r);return}o=o.next}i=i.next}while(i!==A)}var ln=!1;function po(A,e,t,n){let r=[];for(let i=0,o=e.length;i<o;i++){let a=e[i]*n,s=i<o-1?e[i+1]*n:A.length,g=Gr(A,a,s,n,!1);g===g.next&&Te.add(g),r.push(Fo(g))}r.sort(yo),Do(A.length/n,e.length),Fr(t,t),ln=!0;for(let i=0;i<r.length;i++)t=bo(r[i],t);return ln=!1,ge(t)}function yo(A,e){return A.x-e.x||A.y-e.y||(A.next.y-A.y)/(A.next.x-A.x)-(e.next.y-e.y)/(e.next.x-e.x)}function bo(A,e){let t=xo(A,e);if(!t)return e;let n=Ur(t,A),r=n.next;return Fr(t,r.next),ge(n,n.next),ge(t,t.next)}var Nr=16,wA=new Float64Array(0),pt=0,un=[],In=[];function Do(A,e){let t=Math.ceil((A+2*e)/Nr)+e+2;wA.length<t*4&&(wA=new Float64Array(t*4)),pt=0}function Fr(A,e){let t=A;do{let n=pt++;un[n]=t;let r=t.x,i=t.y,o=t.x,a=t.y,s=0;do{let l=t.next;t.z=n,l.x<r&&(r=l.x),l.x>o&&(o=l.x),l.y<i&&(i=l.y),l.y>a&&(a=l.y),t=l}while(++s<Nr&&t!==e);In[n]=t;let g=n*4;wA[g]=r,wA[g+1]=i,wA[g+2]=o,wA[g+3]=a}while(t!==e)}function wo(A,e){let t=A.z*4;e.x<wA[t]&&(wA[t]=e.x),e.y<wA[t+1]&&(wA[t+1]=e.y),e.x>wA[t+2]&&(wA[t+2]=e.x),e.y>wA[t+3]&&(wA[t+3]=e.y)}function wr(A){let e=In[A];for(;e.prev.next!==e;)e=e.next;return In[A]=e,e}function xr(A){let e=un[A];for(;e.prev.next!==e;)e=e.next;return un[A]=e,e}function xo(A,e){let t=e,n=A.x,r=A.y,i=-1/0,o;if(Je(A,t))return t;for(let c=0,B=0;c<pt;c++,B+=4){if(r<wA[B+1]||r>wA[B+3]||wA[B]>n||wA[B+2]<=i)continue;let Q=wr(c);t=xr(c);do{if(t.prev.next===t){if(Je(A,t.next))return t.next;if(r<=t.y&&r>=t.next.y&&t.next.y!==t.y){let f=t.x+(r-t.y)*(t.next.x-t.x)/(t.next.y-t.y);if(f<=n&&f>i&&(i=f,o=t.x<t.next.x?t:t.next,f===n))return o}}t=t.next}while(t!==Q)}if(!o)return null;let a=o.x,s=o.y,g=Math.min(r,s),l=Math.max(r,s),u=1/0;for(let c=0,B=0;c<pt;c++,B+=4){if(wA[B+2]<a||wA[B]>n||wA[B+3]<g||wA[B+1]>l)continue;let Q=wr(c);t=xr(c);do{if(t.prev.next===t&&n>=t.x&&t.x>=a&&n!==t.x&&yt(r<s?n:i,r,a,s,r<s?i:n,r,t.x,t.y)){let f=Math.abs(r-t.y)/(n-t.x);(Oe(t,A)||t.y===r&&t.next.y===r&&t.next.x>n)&&(f<u||f===u&&(t.x>o.x||t.x===o.x&&Mo(o,t)))&&(o=t,u=f)}t=t.next}while(t!==Q)}return o}function Mo(A,e){return MA(A.prev,A,e.prev)<0&&MA(e.next,A,A.next)<0}var FA=[],pe=[],se=new Uint32Array(0),Pe=new Uint32Array(0),He=new Uint32Array(256);function Go(A,e,t,n){let r=A,i=0;do r.z=cn(r.x,r.y,e,t,n),FA[i++]=r,r=r.next;while(r!==A);No(i);let o=null;for(let a=0;a<i;a++){let s=FA[a];s.prevZ=o,o&&(o.nextZ=s),o=s}o.nextZ=null,FA.fill(null,0,i),pe.fill(null,0,i)}function No(A){if(A<=32){for(let e=1;e<A;e++){let t=FA[e],n=t.z,r=e-1;for(;r>=0&&FA[r].z>n;)FA[r+1]=FA[r],r--;FA[r+1]=t}return}se.length<A&&(se=new Uint32Array(A),Pe=new Uint32Array(A),pe=new Array(A));for(let e=0;e<A;e++)se[e]=FA[e].z;mt(A,FA,se,pe,Pe,0),mt(A,pe,Pe,FA,se,8),mt(A,FA,se,pe,Pe,16),mt(A,pe,Pe,FA,se,24)}function mt(A,e,t,n,r,i){He.fill(0);for(let a=0;a<A;a++)He[t[a]>>>i&255]++;let o=0;for(let a=0;a<256;a++){let s=He[a];He[a]=o,o+=s}for(let a=0;a<A;a++){let s=t[a],g=He[s>>>i&255]++;n[g]=e[a],r[g]=s}}function cn(A,e,t,n,r){return A=(A-t)*r|0,e=(e-n)*r|0,A=(A|A<<8)&16711935,A=(A|A<<4)&252645135,A=(A|A<<2)&858993459,A=(A|A<<1)&1431655765,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,A|e<<1}function Fo(A){let e=A,t=A;do(e.x<t.x||e.x===t.x&&e.y<t.y)&&(t=e),e=e.next;while(e!==A);return t}function yt(A,e,t,n,r,i,o,a){return(r-o)*(e-a)>=(A-o)*(i-a)&&(A-o)*(n-a)>=(t-o)*(e-a)&&(t-o)*(i-a)>=(r-o)*(n-a)}function So(A,e){let t=Je(A,e)&&MA(A.prev,A,A.next)>0&&MA(e.prev,e,e.next)>0;return A.next.i!==e.i&&(t||Oe(A,e)&&Oe(e,A)&&(MA(A.prev,A,e.prev)!==0||MA(A,e.prev,e)!==0))&&!Uo(A,e)&&(t||vo(A,e))}function MA(A,e,t){return(e.y-A.y)*(t.x-e.x)-(e.x-A.x)*(t.y-e.y)}function Je(A,e){return A.x===e.x&&A.y===e.y}function Sr(A,e,t,n,r=!0){let i=MA(A,e,t),o=MA(A,e,n),a=MA(t,n,A),s=MA(t,n,e);return(i>0&&o<0||i<0&&o>0)&&(a>0&&s<0||a<0&&s>0)?!0:r?!!(i===0&&ht(A,t,e)||o===0&&ht(A,n,e)||a===0&&ht(t,A,n)||s===0&&ht(t,e,n)):!1}function ht(A,e,t){return e.x<=Math.max(A.x,t.x)&&e.x>=Math.min(A.x,t.x)&&e.y<=Math.max(A.y,t.y)&&e.y>=Math.min(A.y,t.y)}function Uo(A,e){let t=Math.min(A.x,e.x),n=Math.max(A.x,e.x),r=Math.min(A.y,e.y),i=Math.max(A.y,e.y),o=A;do{let a=o.next;if(o.x>n&&a.x>n||o.x<t&&a.x<t||o.y>i&&a.y>i||o.y<r&&a.y<r){o=a;continue}if(o.i!==A.i&&a.i!==A.i&&o.i!==e.i&&a.i!==e.i&&Sr(o,a,A,e))return!0;o=a}while(o!==A);return!1}function Oe(A,e){return MA(A.prev,A,A.next)<0?MA(A,e,A.next)>=0&&MA(A,A.prev,e)>=0:MA(A,e,A.prev)<0||MA(A,A.next,e)<0}function vo(A,e){let t=A,n=!1,r=(A.x+e.x)/2,i=(A.y+e.y)/2;do{let o=t.next;t.y>i!=o.y>i&&r<(o.x-t.x)*(i-t.y)/(o.y-t.y)+t.x&&(n=!n),t=o}while(t!==A);return n}function Ur(A,e){let t=Bn(A.i,A.x,A.y),n=Bn(e.i,e.x,e.y),r=A.next,i=e.prev;return A.next=e,e.prev=A,t.next=r,r.prev=t,n.next=t,t.prev=n,i.next=n,n.prev=i,n}function Mr(A,e,t,n){let r=Bn(A,e,t);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function Ke(A){A.next.prev=A.prev,A.prev.next=A.next,A.prevZ&&(A.prevZ.nextZ=A.nextZ),A.nextZ&&(A.nextZ.prevZ=A.prevZ),ln&&wo(A.prev,A.next)}function Bn(A,e,t){return{i:A,x:e,y:t,prev:null,next:null,z:0,prevZ:null,nextZ:null}}function Ro(A,e,t,n){let r=0;for(let i=e,o=t-n;i<t;i+=n)r+=(A[o]-A[i])*(A[i+1]+A[o+1]),o=i;return r}var Rr=Tn(Mi(),1);function bt(A){let e=A.trim();if(e.startsWith("#")){let t=e.slice(1);if(t.length===3){let n=Number.parseInt(t[0]+t[0],16)/255,r=Number.parseInt(t[1]+t[1],16)/255,i=Number.parseInt(t[2]+t[2],16)/255;return[n,r,i,1]}if(t.length===6){let n=Number.parseInt(t.slice(0,2),16)/255,r=Number.parseInt(t.slice(2,4),16)/255,i=Number.parseInt(t.slice(4,6),16)/255;return[n,r,i,1]}if(t.length===8){let n=Number.parseInt(t.slice(0,2),16)/255,r=Number.parseInt(t.slice(2,4),16)/255,i=Number.parseInt(t.slice(4,6),16)/255,o=Number.parseInt(t.slice(6,8),16)/255;return[n,r,i,o]}}if(e.startsWith("rgb")){let t=e.replace(/rgba?\(/,"").replace(/\)/,"").split(",").map(a=>Number.parseFloat(a.trim())),n=(t[0]??0)/255,r=(t[1]??0)/255,i=(t[2]??0)/255,o=t[3]!==void 0?t[3]:1;return[n,r,i,o]}return[1,1,1,1]}function Ve(A){let e=0,t=A.length;for(let n=0;n<t;n++){let r=(n+1)%t;e+=A[n].x*A[r].y-A[r].x*A[n].y}return e/2}function Dt(A,e){let t=!1,n=e.length;for(let r=0,i=n-1;r<n;i=r++){let o=e[r].x,a=e[r].y,s=e[i].x,g=e[i].y;a>A.y!=g>A.y&&A.x<(s-o)*(A.y-a)/(g-a)+o&&(t=!t)}return t}var Lo=.1,ko=64;function Lr(A,e){if(e.segments!==void 0)return e.segments;let t=Math.ceil(Math.sqrt(A/(8*e.tolerance)));return Math.min(ko,Math.max(1,t))}function Po(A,e,t,n,r){let i=Lr(2*Math.hypot(A.x-2*e.x+t.x,A.y-2*e.y+t.y),n);for(let o=1;o<=i;o++){let a=o/i,s=1-a;r.push({x:s*s*A.x+2*s*a*e.x+a*a*t.x,y:s*s*A.y+2*s*a*e.y+a*a*t.y})}}function Ho(A,e,t,n,r,i){let o=Lr(6*Math.max(Math.hypot(A.x-2*e.x+t.x,A.y-2*e.y+t.y),Math.hypot(e.x-2*t.x+n.x,e.y-2*t.y+n.y)),r);for(let a=1;a<=o;a++){let s=a/o,g=1-s;i.push({x:g*g*g*A.x+3*g*g*s*e.x+3*g*s*s*t.x+s*s*s*n.x,y:g*g*g*A.y+3*g*g*s*e.y+3*g*s*s*t.y+s*s*s*n.y})}}function To(A){try{let e=new Rr.Path2D(A).simplify().edges;return Array.isArray(e)?e:null}catch{return null}}function Jo(A,e,t,n,r){let i=A.path?.toSVG();if(!i)return{contours:[],simplified:!0};let o=To(i),a=o!==null;o??=(A.path?.commands??[]).map(c=>[c.command,...c.args]);let s=[],g={x:0,y:0},l=[],u=()=>{if(l.length>=3){let c=l[0],B=l[l.length-1];Math.hypot(B.x-c.x,B.y-c.y)<1e-4&&l.pop(),l.length>=3&&s.push(l)}l=[]};for(let c of o){let B=c[0],Q=c.slice(1);if(B==="moveTo")u(),g={x:(e+Q[0])*n,y:-(t+Q[1])*n},l=[g];else if(B==="lineTo")g={x:(e+Q[0])*n,y:-(t+Q[1])*n},l.push(g);else if(B==="quadraticCurveTo"){let f={x:(e+Q[0])*n,y:-(t+Q[1])*n},h={x:(e+Q[2])*n,y:-(t+Q[3])*n};Po(g,f,h,r,l),g=h}else if(B==="bezierCurveTo"){let f={x:(e+Q[0])*n,y:-(t+Q[1])*n},h={x:(e+Q[2])*n,y:-(t+Q[3])*n},m={x:(e+Q[4])*n,y:-(t+Q[5])*n};Ho(g,f,h,m,r,l),g=m}else B==="closePath"&&u()}return u(),{contours:s,simplified:a}}var Oo=Math.cos(30*Math.PI/180);function Ko({contours:A,simplified:e}){if(!e)return Vo(A);let t=A.map(o=>({contour:o,area:Math.abs(Ve(o))}));t.sort((o,a)=>a.area-o.area);let n=t.map(()=>[]);for(let o=0;o<t.length;o++){let a=t[o].contour,s=a[Math.floor(a.length/2)];for(let g=0;g<o;g++){if(t[g].area<=t[o].area)continue;let l=t[g].contour;(Dt(a[0],l)||Dt(s,l))&&n[o].push(g)}}let r=[],i=new Map;for(let o=0;o<t.length;o++){let a=n[o];if(a.length%2===0){let s={outer:t[o].contour,holes:[]};r.push(s),i.set(o,s)}else i.get(a[a.length-1])?.holes.push(t[o].contour)}return r}function Vo(A){let e=A.map(r=>{let i=Ve(r);return{contour:r,signed:i,area:Math.abs(i)}});if(e.length===0)return[];e.sort((r,i)=>i.area-r.area);let t=Math.sign(e[0].signed),n=[];for(let r of e)Math.sign(r.signed)===t&&n.push({outer:r.contour,holes:[]});for(let r of e){if(Math.sign(r.signed)===t)continue;let i=r.contour[0],o=r.contour[Math.floor(r.contour.length/2)],a,s=Number.POSITIVE_INFINITY;for(let g of n){let l=Math.abs(Ve(g.outer));l>r.area&&l<s&&(Dt(i,g.outer)||Dt(o,g.outer))&&(a=g,s=l)}a?.holes.push(r.contour)}return n}var vr=new WeakMap;function Yo(A,e,t,n,r,i){let o=vr.get(A);o||(o=new Map,vr.set(A,o));let a=`${e.id}|${r}|${i.segments??""}|${i.tolerance}`,s=o.get(a);s||(s=Ko(Jo(e,0,0,r,i)),o.set(a,s));let g=t*r,l=-n*r,u=c=>c.map(B=>({x:B.x+g,y:B.y+l}));return s.map(c=>({outer:u(c.outer),holes:c.holes.map(u)}))}function Ml(A){let e=A.font,t=A.fontSize??48,n=A.depth??20,r=n/2,i={segments:A.curveSegments!==void 0?Math.max(2,A.curveSegments):void 0,tolerance:Math.max(.001,A.curveTolerance??Lo)},o=e.unitsPerEm||1e3,a=t/o,s=Wn(e,A.text.replace(/\n/g," "),{direction:A.direction,letterSpacing:A.letterSpacing?A.letterSpacing/a:0}),g=[];for(let Z of s.glyphs){let W=e.getGlyph(Z.glyphId),q=Yo(e,W,Z.x,Z.y,a,i);for(let mA of q)g.push(mA)}let l=Number.POSITIVE_INFINITY,u=Number.NEGATIVE_INFINITY,c=Number.POSITIVE_INFINITY,B=Number.NEGATIVE_INFINITY;for(let Z of g){for(let W of Z.outer)W.x<l&&(l=W.x),W.x>u&&(u=W.x),W.y<c&&(c=W.y),W.y>B&&(B=W.y);for(let W of Z.holes)for(let q of W)q.x<l&&(l=q.x),q.x>u&&(u=q.x),q.y<c&&(c=q.y),q.y>B&&(B=q.y)}Number.isFinite(l)||(l=0,u=0,c=0,B=0);let Q=u-l,f=B-c,h=(s.baseLevel&1)===1,m=A.align==="start"?h?"right":"left":A.align==="end"?h?"left":"right":A.align,d=(l+u)/2;m==="left"&&(d=l),m==="right"&&(d=u);let x=(c+B)/2;A.verticalAlign==="top"&&(x=c),A.verticalAlign==="bottom"&&(x=B);for(let Z of g){for(let W of Z.outer)W.x-=d,W.y-=x;for(let W of Z.holes)for(let q of W)q.x-=d,q.y-=x}l-=d,u-=d,c-=x,B-=x;let y=[],G=[],M=[],D=[],b=[],N=[],S=[],v=[],F=(Z,W,q)=>{let mA=b.length/3;return b.push(Z.x,Z.y,r,Z.x,Z.y,-r),N.push(W.x,W.y,0,W.x,W.y,0),S.push(q,0,q,1),mA},P=Z=>{let W=Z.filter((H,rA)=>{let j=Z[(rA+1)%Z.length];return Math.hypot(j.x-H.x,j.y-H.y)>=1e-6}),q=W.length;if(q<2)return;let mA=[],eA=W.map((H,rA)=>{let j=W[(rA+1)%q],sA=Math.hypot(j.x-H.x,j.y-H.y);return mA.push(sA),{x:(j.y-H.y)/sA,y:-(j.x-H.x)/sA}}),lA=mA.reduce((H,rA)=>H+rA,0),uA=[],yA=[],tA=0;for(let H=0;H<q;H++){let rA=eA[(H-1+q)%q],j=eA[H],sA=tA/lA,BA=rA.x+j.x,O=rA.y+j.y,aA=rA.x*j.x+rA.y*j.y>=Oo?{x:BA/Math.hypot(BA,O),y:O/Math.hypot(BA,O)}:null;aA&&H>0?uA[H]=yA[H]=F(W[H],aA,sA):(yA[H]=F(W[H],aA??rA,H===0?1:sA),uA[H]=F(W[H],aA??j,sA)),tA+=mA[H]}for(let H=0;H<q;H++){let rA=uA[H],j=yA[(H+1)%q];v.push(rA,j+1,j),v.push(rA,rA+1,j+1)}};for(let Z of g){let W=Z.outer;Ve(W)<0&&W.reverse();for(let tA of Z.holes)Ve(tA)>0&&tA.reverse();let q=[],mA=[];for(let tA of W)q.push(tA.x,tA.y);for(let tA of Z.holes){mA.push(q.length/2);for(let H of tA)q.push(H.x,H.y)}let eA=En(q,mA,2),lA=q.length/2,uA=y.length/3;for(let tA=0;tA<lA;tA++){let H=q[tA*2],rA=q[tA*2+1];y.push(H,rA,-r),G.push(0,0,-1),M.push((H-l)/(Q||1),(rA-c)/(f||1))}for(let tA=0;tA<eA.length;tA+=3)D.push(uA+eA[tA],uA+eA[tA+2],uA+eA[tA+1]);let yA=y.length/3;for(let tA=0;tA<lA;tA++){let H=q[tA*2],rA=q[tA*2+1];y.push(H,rA,r),G.push(0,0,1),M.push((H-l)/(Q||1),(rA-c)/(f||1))}for(let tA=0;tA<eA.length;tA+=3)D.push(yA+eA[tA],yA+eA[tA+1],yA+eA[tA+2]);P(W);for(let tA of Z.holes)P(tA)}let V=bt(A.fill??"#ffffff"),R=bt(A.bevelColor??A.fill??"#ffffff"),X={name:"front-material",diffuseColor:V,shading:A.material??"lit",shininess:A.shininess??32,roughness:A.roughness,metallic:A.metallic,twoSided:!0},_={name:"side-material",diffuseColor:R,shading:A.material??"lit",shininess:A.shininess??32,roughness:A.roughness,metallic:A.metallic,twoSided:!0},AA=[];return D.length>0&&AA.push({id:"text-front-mesh",name:"front",positions:new Float32Array(y),normals:new Float32Array(G),uvs:new Float32Array(M),indices:y.length/3>65535?new Uint32Array(D):new Uint16Array(D),materialName:"front-material"}),v.length>0&&AA.push({id:"text-side-mesh",name:"side",positions:new Float32Array(b),normals:new Float32Array(N),uvs:new Float32Array(S),indices:b.length/3>65535?new Uint32Array(v):new Uint16Array(v),materialName:"side-material"}),{modelData:{name:`extruded-text-${A.text}`,meshes:AA,materials:{"front-material":X,"side-material":_},animations:[],bounds:{min:[l,c,-r],max:[u,B,r],center:[(l+u)/2,(c+B)/2,0],size:[Q,f,n],boundingSphereRadius:Math.hypot(Q,f,n)/2}},bounds:{minX:l,maxX:u,minY:c,maxY:B,width:Q,height:f,depth:n}}}var fn=class{positions=[];normals=[];uvs=[];indices=[];vertex(e,t,n){return this.positions.push(e[0],e[1],e[2]),this.normals.push(t[0],t[1],t[2]),this.uvs.push(n[0],n[1]),this.positions.length/3-1}grid(e,t,n,r=!1){for(let i=0;i<n;i++)for(let o=0;o<t;o++){let a=e+i*(t+1)+o,s=a+1,g=a+t+1,l=g+1;r?this.indices.push(a,s,g,s,l,g):this.indices.push(a,g,s,s,g,l)}}build(e){let t=this.positions.length/3;return{id:`${e}-mesh`,name:e,positions:new Float32Array(this.positions),normals:new Float32Array(this.normals),uvs:new Float32Array(this.uvs),indices:t>65535?new Uint32Array(this.indices):new Uint16Array(this.indices),materialName:`${e}-material`}}};function Cn(A){let e=Math.hypot(A[0],A[1],A[2]);return e>1e-12?[A[0]/e,A[1]/e,A[2]/e]:[0,0,0]}function Qn(A,e,t){if(e<=0)return[-A,A];let n=A-e,r=[];for(let i=0;i<=t;i++)r.push(-n-e*Math.cos(i/t*Math.PI/2));for(let i=n>1e-9?0:1;i<=t;i++)r.push(n+e*Math.sin(i/t*Math.PI/2));return r}function Wo(A,e){let t=A.width/2,n=A.height/2,r=A.depth/2,i=Math.max(0,Math.min(A.radius??0,t,n,r)),o=Math.max(1,Math.round(A.segments??4)),a=A.taper??1,s=t-i,g=n-i,l=r-i,u=Qn(t,i,o),c=Qn(n,i,o),B=Qn(r,i,o),Q=A.height>0?(1-a)/A.height:0,f=y=>a+Q*(y+n),h=(y,G)=>{let M=[Math.max(-s,Math.min(s,y[0])),Math.max(-g,Math.min(g,y[1])),Math.max(-l,Math.min(l,y[2]))],D=i>0?Cn([y[0]-M[0],y[1]-M[1],y[2]-M[2]]):G;D[0]===0&&D[1]===0&&D[2]===0&&(D=G);let b=[M[0]+D[0]*i,M[1]+D[1]*i,M[2]+D[2]*i];if(a===1)return{p:b,n:D};let N=f(b[1]);return{p:[b[0]*N,b[1],b[2]*N],n:Cn([D[0]/N,D[1]-b[0]*Q*D[0]/N-b[2]*Q*D[2]/N,D[2]/N])}},m=[{axis:2,sign:-1,u:0,v:1},{axis:2,sign:1,u:0,v:1},{axis:0,sign:-1,u:2,v:1},{axis:0,sign:1,u:2,v:1},{axis:1,sign:-1,u:0,v:2},{axis:1,sign:1,u:0,v:2}],d=[t,n,r],x=[u,c,B];for(let y of m){let G=x[y.u],M=x[y.v],D=[0,0,0];D[y.axis]=y.sign;let b=e.positions.length/3;for(let S=0;S<M.length;S++)for(let v=0;v<G.length;v++){let F=[0,0,0];F[y.axis]=y.sign*d[y.axis],F[y.u]=G[v],F[y.v]=M[S];let{p:P,n:V}=h(F,D);e.vertex(P,V,[(G[v]/d[y.u]+1)/2,(M[S]/d[y.v]+1)/2])}let N=(y.v+1)%3===y.u;e.grid(b,G.length-1,M.length-1,(N?1:-1)!==y.sign)}}function zo(A,e){let t=Math.max(3,Math.round(A.segments??32)),n=Math.max(2,Math.round(t/2));for(let r=0;r<=n;r++){let i=r/n*Math.PI;for(let o=0;o<=t;o++){let a=o/t*Math.PI*2,s=[Math.sin(i)*Math.cos(a),-Math.cos(i),Math.sin(i)*Math.sin(a)];e.vertex([s[0]*A.radius,s[1]*A.radius,s[2]*A.radius],s,[o/t,r/n])}}e.grid(0,t,n)}function Xo(A,e){let t=Math.max(3,Math.round(A.segments??32)),n=A.radiusTop??A.radius??50,r=A.radiusBottom??A.radius??50,i=A.height/2,o=A.height>0?(r-n)/A.height:0;for(let a=0;a<=1;a++){let s=a===0?n:r,g=a===0?-i:i;for(let l=0;l<=t;l++){let u=l/t*Math.PI*2,c=Math.cos(u),B=Math.sin(u);e.vertex([c*s,g,B*s],Cn([c,-o,B]),[l/t,a])}}if(e.grid(0,t,1),!A.openEnded)for(let[a,s,g]of[[-i,n,-1],[i,r,1]]){if(s<=0)continue;let l=e.vertex([0,a,0],[0,g,0],[.5,.5]),u=e.positions.length/3;for(let c=0;c<=t;c++){let B=c/t*Math.PI*2,Q=Math.cos(B),f=Math.sin(B);e.vertex([Q*s,a,f*s],[0,g,0],[(Q+1)/2,(f+1)/2])}for(let c=0;c<t;c++)g<0?e.indices.push(l,u+c,u+c+1):e.indices.push(l,u+c+1,u+c)}}function Zo(A){let e=new fn;if(A.type==="roundedBox")Wo(A,e);else if(A.type==="sphere")zo(A,e);else if(A.type==="cylinder")Xo(A,e);else throw new Error(`Unknown 3D primitive: ${A.type}`);let t=A.type,n=e.build(t),r={name:`${t}-material`,diffuseColor:bt(A.color??"#ffffff"),shading:A.material??"lit",shininess:A.shininess??32,roughness:A.roughness,metallic:A.metallic},i=[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY],o=[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],a=n.positions;for(let g=0;g<a.length;g+=3)for(let l=0;l<3;l++){let u=a[g+l];u<i[l]&&(i[l]=u),u>o[l]&&(o[l]=u)}let s=[o[0]-i[0],o[1]-i[1],o[2]-i[2]];return{name:`primitive-${t}`,meshes:[n],materials:{[r.name]:r},animations:[],bounds:{min:i,max:o,center:[(i[0]+o[0])/2,(i[1]+o[1])/2,(i[2]+o[2])/2],size:s,boundingSphereRadius:Math.hypot(...s)/2}}}var wt=new Map;function Sl(A){let e=JSON.stringify(A),t=wt.get(e);return t||(t=Zo(A),wt.size>512&&wt.clear(),wt.set(e,t)),t}var dn=new Map;function qo(A,e){return JSON.stringify({text:A,...e})}function mn(A,e){let t=A?String(A):" ",n=qo(t,e),r=dn.get(n);if(r)return r;let i=e.fontSize??48,o=e.fontFamily??"Inter";te.isFailed(o)&&(o="Inter");let a=e.letterSpacing??0,s=e.lineHeight!==void 0&&e.lineHeight<10?e.lineHeight*i:e.lineHeight??i*1.2,g=te.getFont(o,e.fontWeight,null,void 0,i),l=e.padding??0;if(!g){if(!te.isFailed(o)){let d=Ot(o);te.preloadSlugFont(null,o,d).catch(()=>{})}let B=t.split(`
|
|
1521
|
+
`),Q=0,f=e.width!==void 0?Math.max(10,e.width-l*2):0;for(let d of B)if(f>0){let x=d.length*i*.55+a*d.length,y=Math.max(1,Math.ceil(x/f));Q+=y}else Q+=1;let h=Math.max(0,t.length-1),m={width:e.width!==void 0?e.width:Math.ceil(t.length*i*.6+a*h)+l*2,height:e.height!==void 0?e.height:Math.ceil(Q*s)+l*2};return dn.set(n,m),m}let u=zn.measure(t,g,i,a,s,e.width!==void 0?Math.max(0,e.width-l*2):void 0,e.spans,e.direction),c={width:e.width!==void 0&&!e.keepNaturalWidth?e.width:Math.ceil(u.width)+l*2,height:e.height!==void 0?e.height:Math.ceil(u.height)+l*2};return dn.set(n,c),c}function kl(A,e){let t=e.fontFamily??"Inter";if(te.isFailed(t)&&(t="Inter"),te.isFailed(t))return Promise.resolve(mn(A,e));let n=Ot(t);return te.preloadSlugFont(null,t,n).then(()=>mn(A,e)).catch(()=>mn(A,e))}L();L();L();var _o=(()=>{var A=import.meta.url;return(function(e){e=e||{};var t;t||(t=typeof e<"u"?e:{});var n,r;t.ready=new Promise(function(I,E){n=I,r=E});var i=Object.assign({},t),o="";typeof document<"u"&&document.currentScript&&(o=document.currentScript.src),A&&(o=A),o.indexOf("blob:")!==0?o=o.substr(0,o.replace(/[?#].*/,"").lastIndexOf("/")+1):o="";var a=t.print||console.log.bind(console),s=t.printErr||console.warn.bind(console);Object.assign(t,i),i=null;var g;t.wasmBinary&&(g=t.wasmBinary);var l=t.noExitRuntime||!0;typeof WebAssembly!="object"&&X("no native wasm support detected");var u,c=!1;function B(I,E,C){C=E+C;for(var p="";!(E>=C);){var w=I[E++];if(!w)break;if(w&128){var U=I[E++]&63;if((w&224)==192)p+=String.fromCharCode((w&31)<<6|U);else{var T=I[E++]&63;w=(w&240)==224?(w&15)<<12|U<<6|T:(w&7)<<18|U<<12|T<<6|I[E++]&63,65536>w?p+=String.fromCharCode(w):(w-=65536,p+=String.fromCharCode(55296|w>>10,56320|w&1023))}}else p+=String.fromCharCode(w)}return p}var Q,f,h,m,d,x,y,G,M;function D(){var I=u.buffer;Q=I,t.HEAP8=f=new Int8Array(I),t.HEAP16=m=new Int16Array(I),t.HEAP32=x=new Int32Array(I),t.HEAPU8=h=new Uint8Array(I),t.HEAPU16=d=new Uint16Array(I),t.HEAPU32=y=new Uint32Array(I),t.HEAPF32=G=new Float32Array(I),t.HEAPF64=M=new Float64Array(I)}var b,N=[],S=[],v=[];function F(){var I=t.preRun.shift();N.unshift(I)}var P=0,V=null,R=null;function X(I){throw t.onAbort&&t.onAbort(I),I="Aborted("+I+")",s(I),c=!0,I=new WebAssembly.RuntimeError(I+". Build with -sASSERTIONS for more info."),r(I),I}function _(I){return I.startsWith("data:application/octet-stream;base64,")}var AA;if(AA="data:application/octet-stream;base64,AGFzbQEAAAABugM3YAF/AGACf38AYAF/AX9gA39/fwBgAn98AGACf38Bf2ADf39/AX9gBH9/f30BfWADf398AGAAAGAEf39/fwBgAX8BfGACf38BfGAFf39/f38Bf2AAAX9gA39/fwF9YAZ/f31/fX8AYAV/f39/fwBgAn9/AX1gBX9/f319AX1gAX8BfWADf35/AX5gB39/f39/f38AYAZ/f39/f38AYAR/f39/AX9gBn9/f319fQF9YAR/f31/AGADf399AX1gBn98f39/fwF/YAR/fHx/AGACf30AYAh/f39/f39/fwBgDX9/f39/f39/f39/f38AYAp/f39/f39/f39/AGAFf39/f38BfGAEfHx/fwF9YA1/fX1/f399fX9/f39/AX9gB39/f319f38AYAJ+fwF/YAN/fX0BfWABfAF8YAN/fHwAYAR/f319AGAHf39/fX19fQF9YA1/fX99f31/fX19fX1/AX9gC39/f39/f399fX19AX9gCH9/f39/f319AGAEf39+fgBgB39/f39/f38Bf2ACfH8BfGAFf398fH8AYAN/f38BfGAEf39/fABgA39/fQBgBn9/fX99fwF/ArUBHgFhAWEAHwFhAWIAAwFhAWMACQFhAWQAFgFhAWUAEQFhAWYAIAFhAWcAAAFhAWgAIQFhAWkAAwFhAWoAAAFhAWsAFwFhAWwACgFhAW0ABQFhAW4AAwFhAW8AAQFhAXAAFwFhAXEABgFhAXIAAAFhAXMAIgFhAXQACgFhAXUADQFhAXYAFgFhAXcAAgFhAXgAAwFhAXkAGAFhAXoAAgFhAUEAAQFhAUIAEQFhAUMAAQFhAUQAAAOiAqACAgMSBwcACRkDAAoRBgYKEwAPDxMBBiMTCgcHGgMUASQFJRQHAwMKCgMmAQYYDxobFAAKBw8KBwMDAgkCAAAFGwACBwIHBgIDAQMIDAABKAkHBQURACkZASoAAAIrLAIALQcHBy4HLwkFCgMCMA0xAgMJAgACAQYKAQIBBQEACQIFAQEABQAODQ0GFQIBHBUGAgkCEAAAAAUyDzMMBQYINAUCAwUODg41AgMCAgIDBgICNgIBDAwMAQsLCwsLCx0CAAIAAAABABABBQICAQMCEgMMCwEBAQEBAQsLAQICAwICAgICAgIDAgIICAEICAgEBAQEBAQEBAQABAQABAQEBAAE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GiABQQA2AvADIAFCADcC6AMgAigC7AMiAyACKALoAyIERwRAIAMgBGsiBEEASA0FIAEgBBAeIgM2AuwDIAEgAzYC6AMgASADIARqNgLwAyACKALoAyIEIAIoAuwDIghHBEADQCADIAQoAgA2AgAgA0EEaiEDIARBBGoiBCAIRw0ACwsgASADNgLsAwsgASACKQL0AzcC9AMgASACKAKEBDYChAQgASACKQL8AzcC/AMgAUEANgLkAwsgBSABNgIAIAEgADYC5AMLIAZBAWohBiAFQQRqIgUgB0cNAAsLDwsQAgALUAACQAJAAkACQAJAIAIOBAQAAQIDCyAAIAEgAUEwahBDDwsgACABIAFBMGogAxBEDwsgACABIAFBMGoQQg8LECQACyAAIAEgAUEwaiADEEULcAIBfwF9IwBBEGsiBCQAIARBCGogACABQQJ0QdwlaigCACACEDZDAADAfyEFAkACQAJAIAQtAAxBAWsOAgABAgsgBCoCCCEFDAELIAQqAgggA5RDCtcjPJQhBQsgBEEQaiQAIAVDAAAAACAFIAVbGwt5AgF/AX0jAEEQayIDJAAgA0EIaiAAIAFBAnRB7CVqKAIAIAIQU0MAAMB/IQQCQAJAAkAgAy0ADEEBaw4CAAECCyADKgIIIQQMAQsgAyoCCEMAAAAAlEMK1yM8lCEECyADQRBqJAAgBEMAAAAAl0MAAAAAIAQgBFsbC1QAAkACQAJAAkACQCACDgQEAAECAwsgACABIAFBwgBqEEMPCyAAIAEgAUHCAGogAxBEDwsgACABIAFBwgBqEEIPCxAkAAsgACABIAFBwgBqIAMQRQsvACAAIAJFQQF0IgIgASADEGAgACACIAEQS5IgACACIAEgAxB/IAAgAiABEFKSkgvOAQIDfwJ9IwBBEGsiAyQAQQEhBCADQQhqIABB/ABqIgUgACABQQF0akH2AGoiAS8BABAfAkACQCADKgIIIgcgAioCACIGXARAIAcgB1sEQCACLQAEIQIMAgsgBiAGXCEECyACLQAEIQIgBEUNACADLQAMIAJB/wFxRg0BCyAFIAEgBiACEDkDQCAALQAAIgFBBHENASAAIAFBBHI6AAAgACgCECIBBEAgACABEQAACyAAQYCAgP4HNgKcASAAKALkAyIADQALCyADQRBqJAALzgECA38CfSMAQRBrIgMk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AWsOAgABAgsgBCoCCCEFDAELIAQqAgggA5RDCtcjPJQhBQsgBEEQaiQAIAVDAAAAACAFIAVbGwscACAAIAFBCCACpyACQiCIpyADpyADQiCIpxAVCwUAEFgACzkAIABFBEBBAA8LAn8gAUGAf3FBgL8DRiABQf8ATXJFBEBB/DtBGTYCAEF/DAELIAAgAToAAEEBCwvEAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABQQlrDhIACgsMCgsCAwQFDAsMDAoLBwgJCyACIAIoAgAiAUEEajYCACAAIAEoAgA2AgAPCwALIAIgAigCACIBQQRqNgIAIAAgATIBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATMBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATAAADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATEAADcDAA8LAAsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRAQALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC84BAgN/An0jAEEQayIDJABBASEEIANBCGogAEH8AGoiBSAAIAFBAXRqQegAaiIBLwEAEB8CQAJAIAMqAggiByACKgIAIgZcBEAgByAHWwRAIAItAAQhAgwCCyAGIAZcIQQLIAItAAQhAiAERQ0AIAMtAAwgAkH/AXFGDQELIAUgASAGIAIQOQNAIAAtAAAiAUEEcQ0BIAAgAUEEcjoAACAAKAIQIgEEQCAAIAERAAALIABBgICA/gc2ApwBIAAoAuQDIgANAAsLIANBEGokAAtdAQR/IAAoAgAhAgNAIAIsAAAiAxBXBEBBfyEEIAAgAkEBaiICNgIAIAFBzJmz5gBNBH9BfyADQTBrIgMgAUEKbCIEaiADIARB/////wdzShsFIAQLIQEMAQsLIAELrhQCEn8BfiMAQdAAayIIJAAgCCABNgJMIAhBN2ohFyAIQThqIRQCQAJAAkACQANAIAEhDSAHIA5B/////wdzSg0BIAcgDmohDgJAAkACQCANIgctAAAiCQRAA0ACQAJAIAlB/wFxIgFFBEAgByEBDAELIAFBJUcNASAH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IQEgAEIANwIEIAAgATYCACABIAA2AgQgAkEQaiQAIAALGwEBfyAABEAgACgCACIBBEAgARAjCyAAECMLC0kBAn9BBBAeIQFBIBAeIgBBADYCHCAAQoCAgICAgIDAPzcCFCAAQgA3AgwgAEEAOgAIIABBAzYCBCAAQQA2AgAgASAANgIAIAELIAAgAkEFR0EAIAIbRQRAQbgwIAMgBBBJDwsgAyAEEHALIgEBfiABIAKtIAOtQiCGhCAEIAARFQAiBUIgiKckASAFpwuoAQEFfyAAKAJUIgMoAgAhBSADKAIEIgQgACgCFCAAKAIcIgdrIgYgBCAGSRsiBgRAIAUgByAGECsaIAMgAygCACAGaiIFNgIAIAMgAygCBCAGayIENgIECyAEIAIgAiAESxsiBARAIAUgASAEECsaIAMgAygCACAEaiIFNgIAIAMgAygCBCAEazYCBAsgBUEAOgAAIAAgACgCLCIBNgIcIAAgATYCFCACCwQAQgALBABBAAuKBQIGfgJ/IAEgASgCAEEHakF4cSIBQRBqNgIAIAAhCSABKQMAIQMgASkDCCEGIwBBIGsiCCQAAkAgBkL///////////8AgyIEQoCAgICAgMCAPH0gBEKAgICAgIDA/8MAfVQEQCAGQgSGIANCPIiEIQQgA0L//////////w+DIgNCgYCAgICAgIAIWgRAIARCgYCAgICAgIDAAHwhAgwCCyAEQoCAgICAgICAQH0hAiADQoCAgICAgICACFINASACIARCAYN8IQIMAQsgA1AgBEKAgICAgIDA//8AVCAEQoCAgICAgMD//wBRG0UEQCAGQgSGIANCPIiEQv////////8Dg0KAgICAgICA/P8AhCECDAELQoCAgICAgID4/wAhAiAEQv///////7//wwBWDQBCACECIARCMIinIgBBkfcASQ0AIAMhAiAGQv///////z+DQoCAgICAgMAAhCIFIQcCQCAAQYH3AGsiAUHAAHEEQCACIAFBQGqthiEHQgAhAgwBCyABRQ0AIAcgAa0iBIYgAkHAACABa62IhCEHIAIgBIYhAgsgCCACNwMQIAggBzcDGAJAQYH4ACAAayIAQcAAcQRAIAUgAEFAaq2IIQNCACEFDAELIABFDQAgBUHAACAAa62GIAMgAK0iAoiEIQMgBSACiCEFCyAIIAM3AwAgCCAF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ASAAKAIAIQAgASACQQFxBH8gASgCACAAaigCAAUgAAsRCwALYQECfyMAQRBrIgIkACABIAAoAgQiA0EBdWohASAAKAIAIQAgAiABIANBAXEEfyABKAIAIABqKAIABSAACxEBAEEQEB4iACACKQMINwMIIAAgAikDADcDACACQRBqJAAgAAtjAQJ/IwBBEGsiAyQAIAEgACgCBCIEQQF1aiEBIAAoAgAhACADIAEgAiAEQQFxBH8gASgCACAAaigCAAUgAAsRAwBBEBAeIgAgAykDCDcDCCAAIAMpAwA3AwAgA0EQaiQAIAALNwEBfyABIAAoAgQiA0EBdWohASAAKAIAIQAgASACIANBAXEEfyABKAIAIABqKAIABSAACxEEAAs5AQF/IAEgACgCBCIEQQF1aiEBIAAoAgAhACABIAIgAyAEQQFxBH8gASgCACAAaigCAAUgAAsRCAALCQAgASAAEQIACwUAQcM7Cw8AIAEgACgCAGogAjYCAAsNACABIAAoAgBqKAIACxgBAX9BEBAeIgBCADcDCCAAQQA2AgAgAAsYAQF/QRAQHiIAQgA3AwAgAEIANwMIIAALDABBMBAeQQBBMBAqCzcBAX8gASAAKAIEIgNBAXVqIQEgACgCACEAIAEgAiADQQFxBH8gASgCACAAaigCAAUgAAsRHgALBQBBvjsLIQAgACABKAIAIAEgASwAC0EASBtBuzsgAigCABAQNgIACyoBAX9BDBAeIgFBADoABCABIAAoAgA2AgggAEEANgIAIAFB2Cc2AgAgAQsFAEG7OwsFAEG4OwshACAAIAEoAgAgASABLAALQQBIG0GkOyACKAIAEBA2AgAL2AEBBH8jAEEgayIDJAAgASgCACIEQfD///8HSQRAAkACQCAEQQtPBEAgBEEPckEBaiIFEB4hBiADIAVBgICAgHhyNgIQIAMgBjYCCCADIAQ2AgwgBCAGaiEFDAELIAMgBDoAEyADQQhqIgYgBGohBSAERQ0BCyAGIAFBBGogBBArGgsgBUEAOgAAIAMgAjYCACADQRhqIANBCGogAyAAEQMAIAMoAhgQHSADKAIYIgAQBiADKAIAEAYgAywAE0EASARAIAMoAggQIwsgA0EgaiQAIAAPCxACAAsqAQF/QQwQHiIBQQA6AAQgASAAKAIANgIIIABBADYCACABQeAmNgIA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AkEIaiAIIAYQHyACIAcgAC8AABAfQQEhAyACKgIIIgogAioCACILXAR/IAogClsNAyALIAtcBSADC0UNAiACLQAMIAItAARHDQILIABBAmohAEEBIQMgBCEGQQEhBCAGRQ0ACyABLwB6IgBBB3FFBEAgBS0AekEHcUUNAgsgCCAAECAiCiAHIAUvAHoQICILWw0BIAogClsNACALIAtcDQELIAFBFGogBUEUakHoABArGiABQfwAaiAFQfwAahCgAQNAIAEtAAAiAEEEcQ0BIAEgAEEEcjoAACABKAIQIgAEQCABIAARAAALIAFBgICA/gc2ApwBIAEoAuQDIgENAAsLIAJBEGokAAvGAwEEfyMAQaAEayICJAAgACgCBCEBIABBADYCBCABBEAgASABKAIAKAIEEQAACyAAKAIIIQEgAEEANgIIIAEEQCABIAEoAgAoAgQRAAALAkAgACgCACIAKALoAyAAKALsA0YEQCAAKALkAw0BIAAgAkEYaiAAKAL0AxBcIgEpAgA3AgAgACABKAIQNgIQIAAgASkCCDcCCCAAQRRqIAFBFGpB6AAQKxogACABKQKMATcCjAEgACABKQKEATcChAEgACABKQJ8NwJ8IAEoApQBIQQgAUEANgKUASAAKAKUASEDIAAgBDYClAEgAwRAIAMQWwsgAEGYAWogAUGYAWpB0AIQKxogACgC6AMiAwRAIAAgAzYC7AMgAxAjCyAAIAEoAugDNgLoAyAAIAEoAuwDNgLsAyAAIAEoAvADNgLwAyABQQA2AvADIAFCADcC6AMgACABKQL8AzcC/AMgACABKQL0AzcC9AMgACABKAKEBDYChAQgASgClAEhACABQQA2ApQBIAAEQCAAEFsLIAJBoARqJAAPCyACQfAcNgIQIABBBUHYJSACQRBqECwQJAALIAJB5hE2AgAgAEEFQdglIAIQLBAkAAsLAEEMEB4gABCiAQsLAEEMEB5BABCiAQsNACAAKAIALQAIQQFxCwoAIAAoAgAoAhQLGQAgAUH/AXEEQBACAAsgACgCACgCEEEBcQsYACAAKAIAIgAgAC0ACEH+AXEgAXI6AAgLJgAgASAAKAIAIgAoAhRHBEAgACABNgIUIAAgACgCDEEBajYCDAsLkgEBAn8jAEEQayICJAAgACgCACEAIAFDAAAAAGAEQCABIAAqAhhcBEAgACABOAIYIAAgACgCDEEBajYCDAsgAkEQaiQADwsgAkGIFDYCACMAQRBrIgMkACADIAI2AgwCQCAARQRAQbgwQdglIAIQSRoMAQsgAEEAQQVB2CUgAiAAKAIEEQ0AGgsgA0EQaiQAECQACz8AIAFB/wFxRQRAIAIgACgCACIAKAIQIgFBAXFHBEAgACABQX5xIAJyNgIQIAAgACgCDEEBajYCDAsPCxACAAsL4CYjAEGACAuBHk9ubHkgbGVhZiBub2RlcyB3aXRoIGN1c3RvbSBtZWFzdXJlIGZ1bmN0aW9ucyBzaG91bGQgbWFudWFsbHkgbWFyayB0aGVtc2VsdmVzIGFzIGRpcnR5AGlzRGlydHkAbWFya0RpcnR5AGRlc3Ryb3kAc2V0RGlzcGxheQBnZXREaXNwbGF5AHNldEZsZXgALSsgICAwWDB4AC0wWCswWCAwWC0weCsweCAweABzZXRGbGV4R3JvdwBnZXRGbGV4R3JvdwBzZXRPdmVyZmxvdwBnZXRPdmVyZmxvdwBoYXNOZXdMYXlvdXQAY2FsY3VsYXRlTGF5b3V0AGdldENvbXB1dGVkTGF5b3V0AHVuc2lnbmVkIHNob3J0AGdldENoaWxkQ291bnQAdW5zaWduZWQgaW50AHNldEp1c3RpZnlDb250ZW50AGdldEp1c3RpZnlDb250ZW50AGF2YWlsYWJsZUhlaWdodCBpcyBpbmRlZmluaXRlIHNvIGhlaWdodFNpemluZ01vZGUgbXVzdCBiZSBTaXppbmdNb2RlOjpNYXhDb250ZW50AGF2YWlsYWJsZVdpZHRoIGlzIGluZGVmaW5pdGUgc28gd2lkdGhTaXppbmdNb2RlIG11c3QgYmUgU2l6aW5nTW9kZTo6TWF4Q29udGVudABzZXRBbGlnbkNvbnRlbnQAZ2V0QWxpZ25Db250ZW50AGdldFBhcmVudABpbXBsZW1lbnQAc2V0TWF4SGVpZ2h0UGVyY2VudABzZXRIZWlnaHRQZXJjZW50AHNldE1pbkhlaWdodFBlcmNlbnQAc2V0RmxleEJhc2lzUGVyY2VudABzZXRHYXBQZXJjZW50AHNldFBvc2l0aW9uUGVyY2VudABzZXRNYXJnaW5QZXJjZW50AHNldE1heFdpZHRoUGVyY2VudABzZXRXaWR0aFBlcmNlbnQAc2V0TWluV2lkdGhQZXJjZW50AHNldFBhZGRpbmdQZXJjZW50AGhhbmRsZS50eXBlKCkgPT0gU3R5bGVWYWx1ZUhhbmRsZTo6VHlwZTo6UG9pbnQgfHwgaGFuZGxlLnR5cGUoKSA9PSBTdHlsZVZhbHVlSGFuZGxlOjpUeXBlOjpQZXJjZW50AGNyZWF0ZURlZmF1bHQAdW5pdAByaWdodABoZWlnaHQAc2V0TWF4SGVpZ2h0AGdldE1heEhlaWdodABzZXRIZWlnaHQAZ2V0SGVpZ2h0AHNldE1pbkhlaWdodABnZXRNaW5IZWlnaHQAZ2V0Q29tcHV0ZWRIZWlnaHQAZ2V0Q29tcHV0ZWRSaWdodABsZWZ0AGdldENvbXB1dGVkTGVmdAByZXNldABfX2Rlc3RydWN0AGZsb2F0AHVpbnQ2NF90AHVzZVdlYkRlZmF1bHRzAHNldFVzZVdlYkRlZmF1bHRzAHNldEFsaWduSXRlbXMAZ2V0QWxpZ25JdGVtcwBzZXRGbGV4QmFzaXMAZ2V0RmxleEJhc2lzAENhbm5vdCBnZXQgbGF5b3V0IHByb3BlcnRpZXMgb2YgbXVsdGktZWRnZSBzaG9ydGhhbmRzAHNldFBvaW50U2NhbGVGYWN0b3IATWVhc3VyZUNhbGxiYWNrV3JhcHBlcgBEaXJ0aWVkQ2FsbGJhY2tXcmFwcGVyAENhbm5vdCByZXNldCBhIG5vZGUgc3RpbGwgYXR0YWNoZWQgdG8gYSBvd25lcgBzZXRCb3JkZXIAZ2V0Qm9yZGVyAGdldENvbXB1dGVkQm9yZGVyAGdldE51bWJlcgBoYW5kbGUudHlwZSgpID09IFN0eWxlVmFsdWVIYW5kbGU6OlR5cGU6Ok51bWJlcgB1bnNpZ25lZCBjaGFyAHRvcABnZXRDb21wdXRlZFRvcABzZXRGbGV4V3JhcABnZXRGbGV4V3JhcABzZXRHYXAAZ2V0R2FwACVwAHNldEhlaWdodEF1dG8Ac2V0RmxleEJhc2lzQXV0bwBzZXRQb3NpdGlvbkF1dG8Ac2V0TWFyZ2luQXV0bwBzZXRXaWR0aEF1dG8AU2NhbGUgZmFjdG9yIHNob3VsZCBub3QgYmUgbGVzcyB0aGFuIHplcm8Ac2V0QXNwZWN0UmF0aW8AZ2V0QXNwZWN0UmF0aW8Ac2V0UG9zaXRpb24AZ2V0UG9zaXRpb24Abm90aWZ5T25EZXN0cnVjdGlvbgBzZXRGbGV4RGlyZWN0aW9uAGdldEZsZXhEaXJlY3Rpb24Ac2V0RGlyZWN0aW9uAGdldERpcmVjdGlvbgBzZXRNYXJnaW4AZ2V0TWFyZ2luAGdldENvbXB1dGVkTWFyZ2luAG1hcmtMYXlvdXRTZWVuAG5hbgBib3R0b20AZ2V0Q29tcHV0ZWRCb3R0b20AYm9vbABlbXNjcmlwdGVuOjp2YWwAc2V0RmxleFNocmluawBnZXRGbGV4U2hyaW5rAHNldEFsd2F5c0Zvcm1zQ29udGFpbmluZ0Jsb2NrAE1lYXN1cmVDYWxsYmFjawBEaXJ0aWVkQ2FsbGJhY2sAZ2V0TGVuZ3RoAHdpZHRoAHNldE1heFdpZHRoAGdldE1heFdpZHRoAHNldFdpZHRoAGdldFdpZHRoAHNldE1pbldpZHRoAGdldE1pbldpZHRoAGdldENvbXB1dGVkV2lkdGgAcHVzaAAvaG9tZS9ydW5uZXIvd29yay95b2dhL3lvZ2EvamF2YXNjcmlwdC8uLi95b2dhL3N0eWxlL1NtYWxsVmFsdWVCdWZmZXIuaAAvaG9tZS9ydW5uZXIvd29yay95b2dhL3lvZ2EvamF2YXNjcmlwdC8uLi95b2dhL3N0eWxlL1N0eWxlVmFsdWVQb29sLmgAdW5zaWduZWQgbG9uZwBzZXRCb3hTaXppbmcAZ2V0Qm94U2l6aW5nAHN0ZDo6d3N0cmluZwBzdGQ6OnN0cmluZwBzdGQ6OnUxNnN0cmluZwBzdGQ6OnUzMnN0cmluZwBzZXRQYWRkaW5nAGdldFBhZGRpbmcAZ2V0Q29tcHV0ZWRQYWRkaW5nAFRyaWVkIHRvIGNvbnN0cnVjdCBZR05vZGUgd2l0aCBudWxsIGNvbmZpZwBBdHRlbXB0aW5nIHRvIGNvbnN0cnVjdCBOb2RlIHdpdGggbnVsbCBjb25maWcAY3JlYXRlV2l0aENvbmZpZwBpbmYAc2V0QWxpZ25TZWxmAGdldEFsaWduU2VsZgBTaXplAHZhbHVlAFZhbHVlAGNyZWF0ZQBtZWFzdXJlAHNldFBvc2l0aW9uVHlwZQBnZXRQb3NpdGlvblR5cGUAaXNSZWZlcmVuY2VCYXNlbGluZQBzZXRJc1JlZmVyZW5jZUJhc2VsaW5lAGNvcHlTdHlsZQBkb3VibGUATm9kZQBleHRlbmQAaW5zZXJ0Q2hpbGQAZ2V0Q2hpbGQAcmVtb3ZlQ2hpbGQAdm9pZABzZXRFeHBlcmltZW50YWxGZWF0dXJlRW5hYmxlZABpc0V4cGVyaW1lbnRhbEZlYXR1cmVFbmFibGVkAGRpcnRpZWQAQ2Fubm90IHJlc2V0IGEgbm9kZSB3aGljaCBzdGlsbCBoYXMgY2hpbGRyZW4gYXR0YWNoZWQAdW5zZXRNZWFzdXJlRnVuYwB1bnNldERpcnRpZWRGdW5jAHNldEVycmF0YQBnZXRFcnJhdGEATWVhc3VyZSBmdW5jdGlvbiByZXR1cm5lZCBhbiBpbnZhbGlkIGRpbWVuc2lvbiB0byBZb2dhOiBbd2lkdGg9JWYsIGhlaWdodD0lZl0ARXhwZWN0IGN1c3RvbSBiYXNlbGluZSBmdW5jdGlvbiB0byBub3QgcmV0dXJuIE5hTgBOQU4ASU5GAGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHNob3J0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBzaG9ydD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBpbnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGZsb2F0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50OF90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQ4X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQxNl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQxNl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8Y2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgY2hhcj4Ac3RkOjpiYXNpY19zdHJpbmc8dW5zaWduZWQgY2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8c2lnbmVk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",!_(AA)){var CA=AA;AA=t.locateFile?t.locateFile(CA,o):o+CA}function Z(){var I=AA;try{if(I==AA&&g)return new Uint8Array(g);if(_(I))try{var E=Di(I.slice(37)),C=new Uint8Array(E.length);for(I=0;I<E.length;++I)C[I]=E.charCodeAt(I);var p=C}catch{throw Error("Converting base64 string to bytes failed.")}else p=void 0;var w=p;if(w)return w;throw"both async and sync fetching of the wasm failed"}catch(U){X(U)}}function W(){return g||typeof fetch!="function"?Promise.resolve().then(function(){return Z()}):fetch(AA,{credentials:"same-origin"}).then(function(I){if(!I.ok)throw"failed to load wasm binary file at '"+AA+"'";return I.arrayBuffer()}).catch(function(){return Z()})}function q(I){for(;0<I.length;)I.shift()(t)}function mA(I){if(I===void 0)return"_unknown";I=I.replace(/[^a-zA-Z0-9_]/g,"$");var E=I.charCodeAt(0);return 48<=E&&57>=E?"_"+I:I}function eA(I,E){return I=mA(I),function(){return E.apply(this,arguments)}}var lA=[{},{value:void 0},{value:null},{value:!0},{value:!1}],uA=[];function yA(I){var E=Error,C=eA(I,function(p){this.name=I,this.message=p,p=Error(p).stack,p!==void 0&&(this.stack=this.toString()+`
|
|
1522
|
+
`+p.replace(/^Error(:[^\n]*)?\n/,""))});return C.prototype=Object.create(E.prototype),C.prototype.constructor=C,C.prototype.toString=function(){return this.message===void 0?this.name:this.name+": "+this.message},C}var tA=void 0;function H(I){throw new tA(I)}var rA=I=>(I||H("Cannot use deleted val. handle = "+I),lA[I].value),j=I=>{switch(I){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:var E=uA.length?uA.pop():lA.length;return lA[E]={ga:1,value:I},E}},sA=void 0,BA=void 0;function O(I){for(var E="";h[I];)E+=BA[h[I++]];return E}var oA=[];function aA(){for(;oA.length;){var I=oA.pop();I.M.$=!1,I.delete()}}var IA=void 0,QA={};function cA(I,E){for(E===void 0&&H("ptr should not be undefined");I.R;)E=I.ba(E),I=I.R;return E}var gA={};function DA(I){I=Ln(I);var E=O(I);return XA(I),E}function bA(I,E){var C=gA[I];return C===void 0&&H(E+" has unknown type "+DA(I)),C}function hA(){}var pA=!1;function SA(I){--I.count.value,I.count.value===0&&(I.T?I.U.W(I.T):I.P.N.W(I.O))}function UA(I,E,C){return E===C?I:C.R===void 0?null:(I=UA(I,E,C.R),I===null?null:C.na(I))}var LA={};function Ft(I,E){return E=cA(I,E),QA[E]}var vA=void 0;function ze(I){throw new vA(I)}function Xe(I,E){return E.P&&E.O||ze("makeClassHandle requires ptr and ptrType"),!!E.U!=!!E.T&&ze("Both smartPtrType and smartPtr must be specified"),E.count={value:1},ue(Object.create(I,{M:{value:E}}))}function ue(I){return typeof FinalizationRegistry>"u"?(ue=E=>E,I):(pA=new FinalizationRegistry(E=>{SA(E.M)}),ue=E=>{var C=E.M;return C.T&&pA.register(E,{M:C},E),E},hA=E=>{pA.unregister(E)},ue(I))}var Ze={};function St(I){for(;I.length;){var E=I.pop();I.pop()(E)}}function we(I){return this.fromWireType(x[I>>2])}var Ie={},qe={};function Ae(I,E,C){function p(J){J=C(J),J.length!==I.length&&ze("Mismatched type converter count");for(var Y=0;Y<I.length;++Y)WA(I[Y],J[Y])}I.forEach(function(J){qe[J]=E});var w=Array(E.length),U=[],T=0;E.forEach((J,Y)=>{gA.hasOwnProperty(J)?w[Y]=gA[J]:(U.push(J),Ie.hasOwnProperty(J)||(Ie[J]=[]),Ie[J].push(()=>{w[Y]=gA[J],++T,T===U.length&&p(w)}))}),U.length===0&&p(w)}function Ut(I){switch(I){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+I)}}function WA(I,E,C={}){if(!("argPackAdvance"in E))throw new TypeError("registerType registeredInstance requires argPackAdvance");var p=E.name;if(I||H('type "'+p+'" must have a positive integer typeid pointer'),gA.hasOwnProperty(I)){if(C.ua)return;H("Cannot register type '"+p+"' twice")}gA[I]=E,delete qe[I],Ie.hasOwnProperty(I)&&(E=Ie[I],delete Ie[I],E.forEach(w=>w()))}function vt(I){H(I.M.P.N.name+" instance already deleted")}function ee(){}function Rt(I,E,C){if(I[E].S===void 0){var p=I[E];I[E]=function(){return I[E].S.hasOwnProperty(arguments.length)||H("Function '"+C+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+I[E].S+")!"),I[E].S[arguments.length].apply(this,arguments)},I[E].S=[],I[E].S[p.Z]=p}}function oi(I,E){t.hasOwnProperty(I)?(H("Cannot register public name '"+I+"' twice"),Rt(t,I,I),t.hasOwnProperty(void 0)&&H("Cannot register multiple overloads of a function with the same number of arguments (undefined)!"),t[I].S[void 0]=E):t[I]=E}function ai(I,E,C,p,w,U,T,J){this.name=I,this.constructor=E,this.X=C,this.W=p,this.R=w,this.pa=U,this.ba=T,this.na=J,this.ja=[]}function Lt(I,E,C){for(;E!==C;)E.ba||H("Expected null or instance of "+C.name+", got an instance of "+E.name),I=E.ba(I),E=E.R;return I}function si(I,E){return E===null?(this.ea&&H("null is not a valid "+this.name),0):(E.M||H('Cannot pass "'+Tt(E)+'" as a '+this.name),E.M.O||H("Cannot pass deleted object as a pointer of type "+this.name),Lt(E.M.O,E.M.P.N,this.N))}function gi(I,E){if(E===null){if(this.ea&&H("null is not a valid "+this.name),this.da){var C=this.fa();return I!==null&&I.push(this.W,C),C}return 0}if(E.M||H('Cannot pass "'+Tt(E)+'" as a '+this.name),E.M.O||H("Cannot pass deleted object as a pointer of type "+this.name),!this.ca&&E.M.P.ca&&H("Cannot convert argument of type "+(E.M.U?E.M.U.name:E.M.P.name)+" to parameter type "+this.name),C=Lt(E.M.O,E.M.P.N,this.N),this.da)switch(E.M.T===void 0&&H("Passing raw pointer to smart pointer is illegal"),this.Ba){case 0:E.M.U===this?C=E.M.T:H("Cannot convert argument of type "+(E.M.U?E.M.U.name:E.M.P.name)+" to parameter type "+this.name);break;case 1:C=E.M.T;break;case 2:if(E.M.U===this)C=E.M.T;else{var p=E.clone();C=this.xa(C,j(function(){p.delete()})),I!==null&&I.push(this.W,C)}break;default:H("Unsupporting sharing policy")}return C}function li(I,E){return E===null?(this.ea&&H("null is not a valid "+this.name),0):(E.M||H('Cannot pass "'+Tt(E)+'" as a '+this.name),E.M.O||H("Cannot pass deleted object as a pointer of type "+this.name),E.M.P.ca&&H("Cannot convert argument of type "+E.M.P.name+" to parameter type "+this.name),Lt(E.M.O,E.M.P.N,this.N))}function zA(I,E,C,p){this.name=I,this.N=E,this.ea=C,this.ca=p,this.da=!1,this.W=this.xa=this.fa=this.ka=this.Ba=this.wa=void 0,E.R!==void 0?this.toWireType=gi:(this.toWireType=p?si:li,this.V=null)}function ui(I,E){t.hasOwnProperty(I)||ze("Replacing nonexistant public symbol"),t[I]=E,t[I].Z=void 0}function Ii(I,E){var C=[];return function(){if(C.length=0,Object.assign(C,arguments),I.includes("j")){var p=t["dynCall_"+I];p=C&&C.length?p.apply(null,[E].concat(C)):p.call(null,E)}else p=b.get(E).apply(null,C);return p}}function kA(I,E){I=O(I);var C=I.includes("j")?Ii(I,E):b.get(E);return typeof C!="function"&&H("unknown function pointer with signature "+I+": "+E),C}var Sn=void 0;function _e(I,E){function C(U){w[U]||gA[U]||(qe[U]?qe[U].forEach(C):(p.push(U),w[U]=!0))}var p=[],w={};throw E.forEach(C),new Sn(I+": "+p.map(DA).join([", "]))}function kt(I,E,C,p,w){var U=E.length;2>U&&H("argTypes array size mismatch! Must at least get return value and 'this' types!");var T=E[1]!==null&&C!==null,J=!1;for(C=1;C<E.length;++C)if(E[C]!==null&&E[C].V===void 0){J=!0;break}var Y=E[0].name!=="void",K=U-2,z=Array(K),iA=[],EA=[];return function(){if(arguments.length!==K&&H("function "+I+" called with "+arguments.length+" arguments, expected "+K+" args!"),EA.length=0,iA.length=T?2:1,iA[0]=w,T){var xA=E[1].toWireType(EA,this);iA[1]=xA}for(var dA=0;dA<K;++dA)z[dA]=E[dA+2].toWireType(EA,arguments[dA]),iA.push(z[dA]);if(dA=p.apply(null,iA),J)St(EA);else for(var NA=T?1:2;NA<E.length;NA++){var PA=NA===1?xA:z[NA-2];E[NA].V!==null&&E[NA].V(PA)}return xA=Y?E[0].fromWireType(dA):void 0,xA}}function Pt(I,E){for(var C=[],p=0;p<I;p++)C.push(y[E+4*p>>2]);return C}function Ht(I){4<I&&--lA[I].ga===0&&(lA[I]=void 0,uA.push(I))}function Tt(I){if(I===null)return"null";var E=typeof I;return E==="object"||E==="array"||E==="function"?I.toString():""+I}function ci(I,E){switch(E){case 2:return function(C){return this.fromWireType(G[C>>2])};case 3:return function(C){return this.fromWireType(M[C>>3])};default:throw new TypeError("Unknown float type: "+I)}}function Bi(I,E,C){switch(E){case 0:return C?function(p){return f[p]}:function(p){return h[p]};case 1:return C?function(p){return m[p>>1]}:function(p){return d[p>>1]};case 2:return C?function(p){return x[p>>2]}:function(p){return y[p>>2]};default:throw new TypeError("Unknown integer type: "+I)}}function Ei(I,E){for(var C="",p=0;!(p>=E/2);++p){var w=m[I+2*p>>1];if(w==0)break;C+=String.fromCharCode(w)}return C}function Qi(I,E,C){if(C===void 0&&(C=2147483647),2>C)return 0;C-=2;var p=E;C=C<2*I.length?C/2:I.length;for(var w=0;w<C;++w)m[E>>1]=I.charCodeAt(w),E+=2;return m[E>>1]=0,E-p}function fi(I){return 2*I.length}function Ci(I,E){for(var C=0,p="";!(C>=E/4);){var w=x[I+4*C>>2];if(w==0)break;++C,65536<=w?(w-=65536,p+=String.fromCharCode(55296|w>>10,56320|w&1023)):p+=String.fromCharCode(w)}return p}function di(I,E,C){if(C===void 0&&(C=2147483647),4>C)return 0;var p=E;C=p+C-4;for(var w=0;w<I.length;++w){var U=I.charCodeAt(w);if(55296<=U&&57343>=U){var T=I.charCodeAt(++w);U=65536+((U&1023)<<10)|T&1023}if(x[E>>2]=U,E+=4,E+4>C)break}return x[E>>2]=0,E-p}function mi(I){for(var E=0,C=0;C<I.length;++C){var p=I.charCodeAt(C);55296<=p&&57343>=p&&++C,E+=4}return E}var hi={};function Un(I){var E=hi[I];return E===void 0?O(I):E}var je=[];function pi(I){var E=je.length;return je.push(I),E}function yi(I,E){for(var C=Array(I),p=0;p<I;++p)C[p]=bA(y[E+4*p>>2],"parameter "+p);return C}var vn=[],bi=[null,[],[]];tA=t.BindingError=yA("BindingError"),t.count_emval_handles=function(){for(var I=0,E=5;E<lA.length;++E)lA[E]!==void 0&&++I;return I},t.get_first_emval=function(){for(var I=5;I<lA.length;++I)if(lA[I]!==void 0)return lA[I];return null},sA=t.PureVirtualError=yA("PureVirtualError");for(var Rn=Array(256),$e=0;256>$e;++$e)Rn[$e]=String.fromCharCode($e);BA=Rn,t.getInheritedInstanceCount=function(){return Object.keys(QA).length},t.getLiveInheritedInstances=function(){var I=[],E;for(E in QA)QA.hasOwnProperty(E)&&I.push(QA[E]);return I},t.flushPendingDeletes=aA,t.setDelayFunction=function(I){IA=I,oA.length&&IA&&IA(aA)},vA=t.InternalError=yA("InternalError"),ee.prototype.isAliasOf=function(I){if(!(this instanceof ee&&I instanceof ee))return!1;var E=this.M.P.N,C=this.M.O,p=I.M.P.N;for(I=I.M.O;E.R;)C=E.ba(C),E=E.R;for(;p.R;)I=p.ba(I),p=p.R;return E===p&&C===I},ee.prototype.clone=function(){if(this.M.O||vt(this),this.M.aa)return this.M.count.value+=1,this;var I=ue,E=Object,C=E.create,p=Object.getPrototypeOf(this),w=this.M;return I=I(C.call(E,p,{M:{value:{count:w.count,$:w.$,aa:w.aa,O:w.O,P:w.P,T:w.T,U:w.U}}})),I.M.count.value+=1,I.M.$=!1,I},ee.prototype.delete=function(){this.M.O||vt(this),this.M.$&&!this.M.aa&&H("Object already scheduled for deletion"),hA(this),SA(this.M),this.M.aa||(this.M.T=void 0,this.M.O=void 0)},ee.prototype.isDeleted=function(){return!this.M.O},ee.prototype.deleteLater=function(){return this.M.O||vt(this),this.M.$&&!this.M.aa&&H("Object already scheduled for deletion"),oA.push(this),oA.length===1&&IA&&IA(aA),this.M.$=!0,this},zA.prototype.qa=function(I){return this.ka&&(I=this.ka(I)),I},zA.prototype.ha=function(I){this.W&&this.W(I)},zA.prototype.argPackAdvance=8,zA.prototype.readValueFromPointer=we,zA.prototype.deleteObject=function(I){I!==null&&I.delete()},zA.prototype.fromWireType=function(I){function E(){return this.da?Xe(this.N.X,{P:this.wa,O:C,U:this,T:I}):Xe(this.N.X,{P:this,O:I})}var C=this.qa(I);if(!C)return this.ha(I),null;var p=Ft(this.N,C);if(p!==void 0)return p.M.count.value===0?(p.M.O=C,p.M.T=I,p.clone()):(p=p.clone(),this.ha(I),p);if(p=this.N.pa(C),p=LA[p],!p)return E.call(this);p=this.ca?p.la:p.pointerType;var w=UA(C,this.N,p.N);return w===null?E.call(this):this.da?Xe(p.N.X,{P:p,O:w,U:this,T:I}):Xe(p.N.X,{P:p,O:w})},Sn=t.UnboundTypeError=yA("UnboundTypeError");var Di=typeof atob=="function"?atob:function(I){var E="",C=0;I=I.replace(/[^A-Za-z0-9\+\/=]/g,"");do{var p="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(I.charAt(C++)),w="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(I.charAt(C++)),U="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(I.charAt(C++)),T="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(I.charAt(C++));p=p<<2|w>>4,w=(w&15)<<4|U>>2;var J=(U&3)<<6|T;E+=String.fromCharCode(p),U!==64&&(E+=String.fromCharCode(w)),T!==64&&(E+=String.fromCharCode(J))}while(C<I.length);return E},wi={l:function(I,E,C,p){X("Assertion failed: "+(I?B(h,I):"")+", at: "+[E?E?B(h,E):"":"unknown filename",C,p?p?B(h,p):"":"unknown function"])},q:function(I,E,C){I=O(I),E=bA(E,"wrapper"),C=rA(C);var p=[].slice,w=E.N,U=w.X,T=w.R.X,J=w.R.constructor;I=eA(I,function(){w.R.ja.forEach(function(K){if(this[K]===T[K])throw new sA("Pure virtual function "+K+" must be implemented in JavaScript")}.bind(this)),Object.defineProperty(this,"__parent",{value:U}),this.__construct.apply(this,p.call(arguments))}),U.__construct=function(){this===U&&H("Pass correct 'this' to __construct");var K=J.implement.apply(void 0,[this].concat(p.call(arguments)));hA(K);var z=K.M;K.notifyOnDestruction(),z.aa=!0,Object.defineProperties(this,{M:{value:z}}),ue(this),K=z.O,K=cA(w,K),QA.hasOwnProperty(K)?H("Tried to register registered instance: "+K):QA[K]=this},U.__destruct=function(){this===U&&H("Pass correct 'this' to __destruct"),hA(this);var K=this.M.O;K=cA(w,K),QA.hasOwnProperty(K)?delete QA[K]:H("Tried to unregister unregistered instance: "+K)},I.prototype=Object.create(U);for(var Y in C)I.prototype[Y]=C[Y];return j(I)},j:function(I){var E=Ze[I];delete Ze[I];var C=E.fa,p=E.W,w=E.ia,U=w.map(T=>T.ta).concat(w.map(T=>T.za));Ae([I],U,T=>{var J={};return w.forEach((Y,K)=>{var z=T[K],iA=Y.ra,EA=Y.sa,xA=T[K+w.length],dA=Y.ya,NA=Y.Aa;J[Y.oa]={read:PA=>z.fromWireType(iA(EA,PA)),write:(PA,xe)=>{var ZA=[];dA(NA,PA,xA.toWireType(ZA,xe)),St(ZA)}}}),[{name:E.name,fromWireType:function(Y){var K={},z;for(z in J)K[z]=J[z].read(Y);return p(Y),K},toWireType:function(Y,K){for(var z in J)if(!(z in K))throw new TypeError('Missing field: "'+z+'"');var iA=C();for(z in J)J[z].write(iA,K[z]);return Y!==null&&Y.push(p,iA),iA},argPackAdvance:8,readValueFromPointer:we,V:p}]})},v:function(){},B:function(I,E,C,p,w){var U=Ut(C);E=O(E),WA(I,{name:E,fromWireType:function(T){return!!T},toWireType:function(T,J){return J?p:w},argPackAdvance:8,readValueFromPointer:function(T){if(C===1)var J=f;else if(C===2)J=m;else if(C===4)J=x;else throw new TypeError("Unknown boolean type size: "+E);return this.fromWireType(J[T>>U])},V:null})},f:function(I,E,C,p,w,U,T,J,Y,K,z,iA,EA){z=O(z),U=kA(w,U),J&&(J=kA(T,J)),K&&(K=kA(Y,K)),EA=kA(iA,EA);var xA=mA(z);oi(xA,function(){_e("Cannot construct "+z+" due to unbound types",[p])}),Ae([I,E,C],p?[p]:[],function(dA){if(dA=dA[0],p)var NA=dA.N,PA=NA.X;else PA=ee.prototype;dA=eA(xA,function(){if(Object.getPrototypeOf(this)!==xe)throw new tA("Use 'new' to construct "+z);if(ZA.Y===void 0)throw new tA(z+" has no accessible constructor");var Hn=ZA.Y[arguments.length];if(Hn===void 0)throw new tA("Tried to invoke ctor of "+z+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(ZA.Y).toString()+") parameters instead!");return Hn.apply(this,arguments)});var xe=Object.create(PA,{constructor:{value:dA}});dA.prototype=xe;var ZA=new ai(z,dA,xe,EA,NA,U,J,K);NA=new zA(z,ZA,!0,!1),PA=new zA(z+"*",ZA,!1,!1);var Pn=new zA(z+" const*",ZA,!1,!0);return LA[I]={pointerType:PA,la:Pn},ui(xA,dA),[NA,PA,Pn]})},d:function(I,E,C,p,w,U,T){var J=Pt(C,p);E=O(E),U=kA(w,U),Ae([],[I],function(Y){function K(){_e("Cannot call "+z+" due to unbound types",J)}Y=Y[0];var z=Y.name+"."+E;E.startsWith("@@")&&(E=Symbol[E.substring(2)]);var iA=Y.N.constructor;return iA[E]===void 0?(K.Z=C-1,iA[E]=K):(Rt(iA,E,z),iA[E].S[C-1]=K),Ae([],J,function(EA){return EA=kt(z,[EA[0],null].concat(EA.slice(1)),null,U,T),iA[E].S===void 0?(EA.Z=C-1,iA[E]=EA):iA[E].S[C-1]=EA,[]}),[]})},p:function(I,E,C,p,w,U){0<E||X();var T=Pt(E,C);w=kA(p,w),Ae([],[I],function(J){J=J[0];var Y="constructor "+J.name;if(J.N.Y===void 0&&(J.N.Y=[]),J.N.Y[E-1]!==void 0)throw new tA("Cannot register multiple constructors with identical number of parameters ("+(E-1)+") for class '"+J.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!");return J.N.Y[E-1]=()=>{_e("Cannot construct "+J.name+" due to unbound types",T)},Ae([],T,function(K){return K.splice(1,0,null),J.N.Y[E-1]=kt(Y,K,null,w,U),[]}),[]})},a:function(I,E,C,p,w,U,T,J){var Y=Pt(C,p);E=O(E),U=kA(w,U),Ae([],[I],function(K){function z(){_e("Cannot call "+iA+" due to unbound types",Y)}K=K[0];var iA=K.name+"."+E;E.startsWith("@@")&&(E=Symbol[E.substring(2)]),J&&K.N.ja.push(E);var EA=K.N.X,xA=EA[E];return xA===void 0||xA.S===void 0&&xA.className!==K.name&&xA.Z===C-2?(z.Z=C-2,z.className=K.name,EA[E]=z):(Rt(EA,E,iA),EA[E].S[C-2]=z),Ae([],Y,function(dA){return dA=kt(iA,dA,K,U,T),EA[E].S===void 0?(dA.Z=C-2,EA[E]=dA):EA[E].S[C-2]=dA,[]}),[]})},A:function(I,E){E=O(E),WA(I,{name:E,fromWireType:function(C){var p=rA(C);return Ht(C),p},toWireType:function(C,p){return j(p)},argPackAdvance:8,readValueFromPointer:we,V:null})},n:function(I,E,C){C=Ut(C),E=O(E),WA(I,{name:E,fromWireType:function(p){return p},toWireType:function(p,w){return w},argPackAdvance:8,readValueFromPointer:ci(E,C),V:null})},e:function(I,E,C,p,w){E=O(E),w===-1&&(w=4294967295),w=Ut(C);var U=J=>J;if(p===0){var T=32-8*C;U=J=>J<<T>>>T}C=E.includes("unsigned")?function(J,Y){return Y>>>0}:function(J,Y){return Y},WA(I,{name:E,fromWireType:U,toWireType:C,argPackAdvance:8,readValueFromPointer:Bi(E,w,p!==0),V:null})},b:function(I,E,C){function p(U){U>>=2;var T=y;return new w(Q,T[U+1],T[U])}var w=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][E];C=O(C),WA(I,{name:C,fromWireType:p,argPackAdvance:8,readValueFromPointer:p},{ua:!0})},o:function(I,E){E=O(E);var C=E==="std::string";WA(I,{name:E,fromWireType:function(p){var w=y[p>>2],U=p+4;if(C)for(var T=U,J=0;J<=w;++J){var Y=U+J;if(J==w||h[Y]==0){if(T=T?B(h,T,Y-T):"",K===void 0)var K=T;else K+="\0",K+=T;T=Y+1}}else{for(K=Array(w),J=0;J<w;++J)K[J]=String.fromCharCode(h[U+J]);K=K.join("")}return XA(p),K},toWireType:function(p,w){w instanceof ArrayBuffer&&(w=new Uint8Array(w));var U,T=typeof w=="string";if(T||w instanceof Uint8Array||w instanceof Uint8ClampedArray||w instanceof Int8Array||H("Cannot pass non-string to std::string"),C&&T){var J=0;for(U=0;U<w.length;++U){var Y=w.charCodeAt(U);127>=Y?J++:2047>=Y?J+=2:55296<=Y&&57343>=Y?(J+=4,++U):J+=3}U=J}else U=w.length;if(J=Jt(4+U+1),Y=J+4,y[J>>2]=U,C&&T){if(T=Y,Y=U+1,U=h,0<Y){Y=T+Y-1;for(var K=0;K<w.length;++K){var z=w.charCodeAt(K);if(55296<=z&&57343>=z){var iA=w.charCodeAt(++K);z=65536+((z&1023)<<10)|iA&1023}if(127>=z){if(T>=Y)break;U[T++]=z}else{if(2047>=z){if(T+1>=Y)break;U[T++]=192|z>>6}else{if(65535>=z){if(T+2>=Y)break;U[T++]=224|z>>12}else{if(T+3>=Y)break;U[T++]=240|z>>18,U[T++]=128|z>>12&63}U[T++]=128|z>>6&63}U[T++]=128|z&63}}U[T]=0}}else if(T)for(T=0;T<U;++T)K=w.charCodeAt(T),255<K&&(XA(Y),H("String has UTF-16 code units that do not fit in 8 bits")),h[Y+T]=K;else for(T=0;T<U;++T)h[Y+T]=w[T];return p!==null&&p.push(XA,J),J},argPackAdvance:8,readValueFromPointer:we,V:function(p){XA(p)}})},i:function(I,E,C){if(C=O(C),E===2)var p=Ei,w=Qi,U=fi,T=()=>d,J=1;else E===4&&(p=Ci,w=di,U=mi,T=()=>y,J=2);WA(I,{name:C,fromWireType:function(Y){for(var K=y[Y>>2],z=T(),iA,EA=Y+4,xA=0;xA<=K;++xA){var dA=Y+4+xA*E;(xA==K||z[dA>>J]==0)&&(EA=p(EA,dA-EA),iA===void 0?iA=EA:(iA+="\0",iA+=EA),EA=dA+E)}return XA(Y),iA},toWireType:function(Y,K){typeof K!="string"&&H("Cannot pass non-string to C++ string type "+C);var z=U(K),iA=Jt(4+z+E);return y[iA>>2]=z>>J,w(K,iA+4,z+E),Y!==null&&Y.push(XA,iA),iA},argPackAdvance:8,readValueFromPointer:we,V:function(Y){XA(Y)}})},k:function(I,E,C,p,w,U){Ze[I]={name:O(E),fa:kA(C,p),W:kA(w,U),ia:[]}},h:function(I,E,C,p,w,U,T,J,Y,K){Ze[I].ia.push({oa:O(E),ta:C,ra:kA(p,w),sa:U,za:T,ya:kA(J,Y),Aa:K})},C:function(I,E){E=O(E),WA(I,{va:!0,name:E,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},s:function(I,E,C,p,w){I=je[I],E=rA(E),C=Un(C);var U=[];return y[p>>2]=j(U),I(E,C,U,w)},t:function(I,E,C,p){I=je[I],E=rA(E),C=Un(C),I(E,C,null,p)},g:Ht,m:function(I,E){var C=yi(I,E),p=C[0];E=p.name+"_$"+C.slice(1).map(function(T){return T.name}).join("_")+"$";var w=vn[E];if(w!==void 0)return w;var U=Array(I-1);return w=pi((T,J,Y,K)=>{for(var z=0,iA=0;iA<I-1;++iA)U[iA]=C[iA+1].readValueFromPointer(K+z),z+=C[iA+1].argPackAdvance;for(T=T[J].apply(T,U),iA=0;iA<I-1;++iA)C[iA+1].ma&&C[iA+1].ma(U[iA]);if(!p.va)return p.toWireType(Y,T)}),vn[E]=w},D:function(I){4<I&&(lA[I].ga+=1)},r:function(I){var E=rA(I);St(E),Ht(I)},c:function(){X("")},x:function(I,E,C){h.copyWithin(I,E,E+C)},w:function(I){var E=h.length;if(I>>>=0,2147483648<I)return!1;for(var C=1;4>=C;C*=2){var p=E*(1+.2/C);p=Math.min(p,I+100663296);var w=Math;p=Math.max(I,p),w=w.min.call(w,2147483648,p+(65536-p%65536)%65536);A:{try{u.grow(w-Q.byteLength+65535>>>16),D();var U=1;break A}catch{}U=void 0}if(U)return!0}return!1},z:function(){return 52},u:function(){return 70},y:function(I,E,C,p){for(var w=0,U=0;U<C;U++){var T=y[E>>2],J=y[E+4>>2];E+=8;for(var Y=0;Y<J;Y++){var K=h[T+Y],z=bi[I];K===0||K===10?((I===1?a:s)(B(z,0)),z.length=0):z.push(K)}w+=J}return y[p>>2]=w,0}};(function(){function I(w){t.asm=w.exports,u=t.asm.E,D(),b=t.asm.J,S.unshift(t.asm.F),P--,t.monitorRunDependencies&&t.monitorRunDependencies(P),P==0&&(V!==null&&(clearInterval(V),V=null),R&&(w=R,R=null,w()))}function E(w){I(w.instance)}function C(w){return W().then(function(U){return WebAssembly.instantiate(U,p)}).then(function(U){return U}).then(w,function(U){s("failed to asynchronously prepare wasm: "+U),X(U)})}var p={a:wi};if(P++,t.monitorRunDependencies&&t.monitorRunDependencies(P),t.instantiateWasm)try{return t.instantiateWasm(p,I)}catch(w){s("Module.instantiateWasm callback failed with error: "+w),r(w)}return(function(){return g||typeof WebAssembly.instantiateStreaming!="function"||_(AA)||typeof fetch!="function"?C(E):fetch(AA,{credentials:"same-origin"}).then(function(w){return WebAssembly.instantiateStreaming(w,p).then(E,function(U){return s("wasm streaming compile failed: "+U),s("falling back to ArrayBuffer instantiation"),C(E)})})})().catch(r),{}})(),t.___wasm_call_ctors=function(){return(t.___wasm_call_ctors=t.asm.F).apply(null,arguments)};var Ln=t.___getTypeName=function(){return(Ln=t.___getTypeName=t.asm.G).apply(null,arguments)};t.__embind_initialize_bindings=function(){return(t.__embind_initialize_bindings=t.asm.H).apply(null,arguments)};var Jt=t._malloc=function(){return(Jt=t._malloc=t.asm.I).apply(null,arguments)},XA=t._free=function(){return(XA=t._free=t.asm.K).apply(null,arguments)};t.dynCall_jiji=function(){return(t.dynCall_jiji=t.asm.L).apply(null,arguments)};var At;R=function I(){At||kn(),At||(R=I)};function kn(){function I(){if(!At&&(At=!0,t.calledRun=!0,!c)){if(q(S),n(t),t.onRuntimeInitialized&&t.onRuntimeInitialized(),t.postRun)for(typeof t.postRun=="function"&&(t.postRun=[t.postRun]);t.postRun.length;){var E=t.postRun.shift();v.unshift(E)}q(v)}}if(!(0<P)){if(t.preRun)for(typeof t.preRun=="function"&&(t.preRun=[t.preRun]);t.preRun.length;)F();q(N),0<P||(t.setStatus?(t.setStatus("Running..."),setTimeout(function(){setTimeout(function(){t.setStatus("")},1),I()},1)):I())}}if(t.preInit)for(typeof t.preInit=="function"&&(t.preInit=[t.preInit]);0<t.preInit.length;)t.preInit.pop()();return kn(),e.ready})})(),kr=_o;L();L();var jA=(function(A){return A[A.Auto=0]="Auto",A[A.FlexStart=1]="FlexStart",A[A.Center=2]="Center",A[A.FlexEnd=3]="FlexEnd",A[A.Stretch=4]="Stretch",A[A.Baseline=5]="Baseline",A[A.SpaceBetween=6]="SpaceBetween",A[A.SpaceAround=7]="SpaceAround",A[A.SpaceEvenly=8]="SpaceEvenly",A})({}),Pr=(function(A){return A[A.BorderBox=0]="BorderBox",A[A.ContentBox=1]="ContentBox",A})({}),Hr=(function(A){return A[A.Width=0]="Width",A[A.Height=1]="Height",A})({}),Ye=(function(A){return A[A.Inherit=0]="Inherit",A[A.LTR=1]="LTR",A[A.RTL=2]="RTL",A})({}),hn=(function(A){return A[A.Flex=0]="Flex",A[A.None=1]="None",A[A.Contents=2]="Contents",A})({}),$A=(function(A){return A[A.Left=0]="Left",A[A.Top=1]="Top",A[A.Right=2]="Right",A[A.Bottom=3]="Bottom",A[A.Start=4]="Start",A[A.End=5]="End",A[A.Horizontal=6]="Horizontal",A[A.Vertical=7]="Vertical",A[A.All=8]="All",A})({}),ye=(function(A){return A[A.None=0]="None",A[A.StretchFlexBasis=1]="StretchFlexBasis",A[A.AbsolutePositionWithoutInsetsExcludesPadding=2]="AbsolutePositionWithoutInsetsExcludesPadding",A[A.AbsolutePercentAgainstInnerSize=4]="AbsolutePercentAgainstInnerSize",A[A.All=2147483647]="All",A[A.Classic=2147483646]="Classic",A})({}),jo=(function(A){return A[A.WebFlexBasis=0]="WebFlexBasis",A})({}),xt=(function(A){return A[A.Column=0]="Column",A[A.ColumnReverse=1]="ColumnReverse",A[A.Row=2]="Row",A[A.RowReverse=3]="RowReverse",A})({}),pn=(function(A){return A[A.Column=0]="Column",A[A.Row=1]="Row",A[A.All=2]="All",A})({}),be=(function(A){return A[A.FlexStart=0]="FlexStart",A[A.Center=1]="Center",A[A.FlexEnd=2]="FlexEnd",A[A.SpaceBetween=3]="SpaceBetween",A[A.SpaceAround=4]="SpaceAround",A[A.SpaceEvenly=5]="SpaceEvenly",A})({}),De=(function(A){return A[A.Error=0]="Error",A[A.Warn=1]="Warn",A[A.Info=2]="Info",A[A.Debug=3]="Debug",A[A.Verbose=4]="Verbose",A[A.Fatal=5]="Fatal",A})({}),yn=(function(A){return A[A.Undefined=0]="Undefined",A[A.Exactly=1]="Exactly",A[A.AtMost=2]="AtMost",A})({}),Tr=(function(A){return A[A.Default=0]="Default",A[A.Text=1]="Text",A})({}),bn=(function(A){return A[A.Visible=0]="Visible",A[A.Hidden=1]="Hidden",A[A.Scroll=2]="Scroll",A})({}),Dn=(function(A){return A[A.Static=0]="Static",A[A.Relative=1]="Relative",A[A.Absolute=2]="Absolute",A})({}),HA=(function(A){return A[A.Undefined=0]="Undefined",A[A.Point=1]="Point",A[A.Percent=2]="Percent",A[A.Auto=3]="Auto",A})({}),wn=(function(A){return A[A.NoWrap=0]="NoWrap",A[A.Wrap=1]="Wrap",A[A.WrapReverse=2]="WrapReverse",A})({}),$o={ALIGN_AUTO:jA.Auto,ALIGN_FLEX_START:jA.FlexStart,ALIGN_CENTER:jA.Center,ALIGN_FLEX_END:jA.FlexEnd,ALIGN_STRETCH:jA.Stretch,ALIGN_BASELINE:jA.Baseline,ALIGN_SPACE_BETWEEN:jA.SpaceBetween,ALIGN_SPACE_AROUND:jA.SpaceAround,ALIGN_SPACE_EVENLY:jA.SpaceEvenly,BOX_SIZING_BORDER_BOX:Pr.BorderBox,BOX_SIZING_CONTENT_BOX:Pr.ContentBox,DIMENSION_WIDTH:Hr.Width,DIMENSION_HEIGHT:Hr.Height,DIRECTION_INHERIT:Ye.Inherit,DIRECTION_LTR:Ye.LTR,DIRECTION_RTL:Ye.RTL,DISPLAY_FLEX:hn.Flex,DISPLAY_NONE:hn.None,DISPLAY_CONTENTS:hn.Contents,EDGE_LEFT:$A.Left,EDGE_TOP:$A.Top,EDGE_RIGHT:$A.Right,EDGE_BOTTOM:$A.Bottom,EDGE_START:$A.Start,EDGE_END:$A.End,EDGE_HORIZONTAL:$A.Horizontal,EDGE_VERTICAL:$A.Vertical,EDGE_ALL:$A.All,ERRATA_NONE:ye.None,ERRATA_STRETCH_FLEX_BASIS:ye.StretchFlexBasis,ERRATA_ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING:ye.AbsolutePositionWithoutInsetsExcludesPadding,ERRATA_ABSOLUTE_PERCENT_AGAINST_INNER_SIZE:ye.AbsolutePercentAgainstInnerSize,ERRATA_ALL:ye.All,ERRATA_CLASSIC:ye.Classic,EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS:jo.WebFlexBasis,FLEX_DIRECTION_COLUMN:xt.Column,FLEX_DIRECTION_COLUMN_REVERSE:xt.ColumnReverse,FLEX_DIRECTION_ROW:xt.Row,FLEX_DIRECTION_ROW_REVERSE:xt.RowReverse,GUTTER_COLUMN:pn.Column,GUTTER_ROW:pn.Row,GUTTER_ALL:pn.All,JUSTIFY_FLEX_START:be.FlexStart,JUSTIFY_CENTER:be.Center,JUSTIFY_FLEX_END:be.FlexEnd,JUSTIFY_SPACE_BETWEEN:be.SpaceBetween,JUSTIFY_SPACE_AROUND:be.SpaceAround,JUSTIFY_SPACE_EVENLY:be.SpaceEvenly,LOG_LEVEL_ERROR:De.Error,LOG_LEVEL_WARN:De.Warn,LOG_LEVEL_INFO:De.Info,LOG_LEVEL_DEBUG:De.Debug,LOG_LEVEL_VERBOSE:De.Verbose,LOG_LEVEL_FATAL:De.Fatal,MEASURE_MODE_UNDEFINED:yn.Undefined,MEASURE_MODE_EXACTLY:yn.Exactly,MEASURE_MODE_AT_MOST:yn.AtMost,NODE_TYPE_DEFAULT:Tr.Default,NODE_TYPE_TEXT:Tr.Text,OVERFLOW_VISIBLE:bn.Visible,OVERFLOW_HIDDEN:bn.Hidden,OVERFLOW_SCROLL:bn.Scroll,POSITION_TYPE_STATIC:Dn.Static,POSITION_TYPE_RELATIVE:Dn.Relative,POSITION_TYPE_ABSOLUTE:Dn.Absolute,UNIT_UNDEFINED:HA.Undefined,UNIT_POINT:HA.Point,UNIT_PERCENT:HA.Percent,UNIT_AUTO:HA.Auto,WRAP_NO_WRAP:wn.NoWrap,WRAP_WRAP:wn.Wrap,WRAP_WRAP_REVERSE:wn.WrapReverse},Jr=$o;function xn(A){function e(r,i,o){let a=r[i];r[i]=function(){for(var s=arguments.length,g=new Array(s),l=0;l<s;l++)g[l]=arguments[l];return o.call(this,a,...g)}}for(let r of["setPosition","setMargin","setFlexBasis","setWidth","setHeight","setMinWidth","setMinHeight","setMaxWidth","setMaxHeight","setPadding","setGap"]){let i={[HA.Point]:A.Node.prototype[r],[HA.Percent]:A.Node.prototype[`${r}Percent`],[HA.Auto]:A.Node.prototype[`${r}Auto`]};e(A.Node.prototype,r,function(o){for(var a=arguments.length,s=new Array(a>1?a-1:0),g=1;g<a;g++)s[g-1]=arguments[g];let l=s.pop(),u,c;if(l==="auto")u=HA.Auto,c=void 0;else if(typeof l=="object")u=l.unit,c=l.valueOf();else if(u=typeof l=="string"&&l.endsWith("%")?HA.Percent:HA.Point,c=parseFloat(l),l!==void 0&&!Number.isNaN(l)&&Number.isNaN(c))throw new Error(`Invalid value ${l} for ${r}`);if(!i[u])throw new Error(`Failed to execute "${r}": Unsupported unit '${l}'`);return c!==void 0?i[u].call(this,...s,c):i[u].call(this,...s)})}function t(r){return A.MeasureCallback.implement({measure:function(){let{width:i,height:o}=r(...arguments);return{width:i??NaN,height:o??NaN}}})}e(A.Node.prototype,"setMeasureFunc",function(r,i){return i?r.call(this,t(i)):this.unsetMeasureFunc()});function n(r){return A.DirtiedCallback.implement({dirtied:r})}return e(A.Node.prototype,"setDirtiedFunc",function(r,i){r.call(this,n(i))}),e(A.Config.prototype,"free",function(){A.Config.destroy(this)}),e(A.Node,"create",(r,i)=>i?A.Node.createWithConfig(i):A.Node.createDefault()),e(A.Node.prototype,"free",function(){A.Node.destroy(this)}),e(A.Node.prototype,"freeRecursive",function(){for(let r=0,i=this.getChildCount();r<i;++r)this.getChild(0).freeRecursive();this.free()}),e(A.Node.prototype,"calculateLayout",function(r){let i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:NaN,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:NaN,a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:Ye.LTR;return r.call(this,i,o,a)}),{Config:A.Config,Node:A.Node,...Jr}}async function Or(){return xn(await kr())}var Mt=null;async function Aa(){return Mt||(Mt=await Or(),Mt)}function ea(A,e){switch(e){case"center":return A.JUSTIFY_CENTER;case"end":return A.JUSTIFY_FLEX_END;case"space-between":return A.JUSTIFY_SPACE_BETWEEN;case"space-around":return A.JUSTIFY_SPACE_AROUND;default:return A.JUSTIFY_FLEX_START}}function ta(A,e){switch(e){case"center":return A.ALIGN_CENTER;case"end":return A.ALIGN_FLEX_END;case"stretch":return A.ALIGN_STRETCH;default:return A.ALIGN_FLEX_START}}function na(A,e){switch(e){case"start":return A.ALIGN_FLEX_START;case"center":return A.ALIGN_CENTER;case"end":return A.ALIGN_FLEX_END;case"stretch":return A.ALIGN_STRETCH;case"baseline":return A.ALIGN_BASELINE;default:return A.ALIGN_AUTO}}function le(A){if(A!=null){if(typeof A=="number"||typeof A=="string")return A;if(typeof A=="object"){if("unit"in A&&typeof A.unit=="number")return A;let e=Number(A);if(!Number.isNaN(e))return e}}}function ra(A){switch(A.kind){case"flex":return A.dir??"row";case"block":return"column";case"box":return A.children&&A.children.length>0?"column":null;default:return null}}function ia(A){if(A.kind==="block")return"fill"}function oa(A){let e=0;if(A.kind==="flex"||A.kind==="block"){let o=le(A.gap);e=typeof o=="number"?o:0}let t=0;if(A.kind==="flex"||A.kind==="block"||A.kind==="box"||A.kind==="text"){let o=le(A.padding);t=typeof o=="number"?o:0}let n="start";A.kind==="flex"&&(n=A.justify??"start");let r="start";(A.kind==="flex"||A.kind==="block")&&(r=A.align??"start");let i=!1;return A.kind==="flex"&&(i=typeof A.wrap=="boolean"?A.wrap:!1),{gap:e,padding:t,justify:n,align:r,wrap:i}}function We(A){let e=A;return e.position==="absolute"||e.position===void 0&&(e.x!==void 0||e.y!==void 0)}function aa(A){return"children"in A&&A.children?A.children.filter(e=>!We(e)):[]}function sa(A){return"children"in A&&A.children?A.children.filter(e=>We(e)):[]}function Vr(A,e,t,n,r){let i=e,o=A.Node.create(),a=ra(i),s=a!==null,g=[];if(We(i)){o.setPositionType(A.POSITION_TYPE_ABSOLUTE);let m=le(i.x),d=le(i.y);m!==void 0&&o.setPosition(A.EDGE_LEFT,m),d!==void 0&&o.setPosition(A.EDGE_TOP,d)}else o.setPositionType(A.POSITION_TYPE_RELATIVE);let u=le(i.grow);u!==void 0&&o.setFlexGrow(typeof u=="number"?u:parseFloat(u));let c=le(i.flexShrink);c!==void 0?o.setFlexShrink(typeof c=="number"?c:parseFloat(c)):o.setFlexShrink(r!==null?1:0),i.flexBasis!==void 0&&o.setFlexBasis(i.flexBasis),i.alignSelf!==void 0&&o.setAlignSelf(na(A,i.alignSelf));let B=i.width??ia(i),Q=i.height,f=r==="row",h=r==="column";if(Kr(o,"width",B,t?.width,f),Kr(o,"height",Q,t?.height,h),s){let m=oa(i);o.setFlexDirection(a==="row"?A.FLEX_DIRECTION_ROW:A.FLEX_DIRECTION_COLUMN),o.setJustifyContent(ea(A,m.justify)),o.setAlignItems(ta(A,m.align)),o.setFlexWrap(m.wrap?A.WRAP_WRAP:A.WRAP_NO_WRAP),m.padding>0&&o.setPadding(A.EDGE_ALL,m.padding),m.gap>0&&o.setGap(A.GUTTER_ALL,m.gap);let d=aa(i),x=sa(i),y=[...d,...x];for(let G=0;G<y.length;G++){let M=Vr(A,y[G],void 0,n,We(i)?null:a);o.insertChild(M.yogaNode,G),g.push(M)}}else if(i.kind==="text"||i.kind==="media"&&i.dataType==="Caption")o.setMeasureFunc((m,d,x,y)=>{let G;(d===1||d===2)&&(G=m);let M=n?.(i,G)??{width:0,height:0},D=M.width,b=M.height;return d===1&&(D=m),y===1&&(b=x),{width:D,height:b}});else{let m=n?.(i)??null;if(m){let d=i.aspectRatio!==void 0,x=i.dataType==="Caption",y=m.height>0?m.width/m.height:1;i.kind==="media"&&!x&&!d&&o.setAspectRatio(y);let G=B===void 0||B==="auto"||B==="fit",M=Q===void 0||Q==="auto"||Q==="fit";if(G&&M){let D=i.aspectRatio??(i.kind==="media"?y:void 0)??1;o.setMeasureFunc((b,N,S,v)=>{let F=m.width,P=m.height;if(N===1&&v===1)F=b,P=S;else if(N===1)F=b,P=D>0?Math.round(b/D):m.height;else if(v===1)P=S,F=D>0?Math.round(S*D):m.width;else if(N===2&&v===2){let V=Math.min(1,b/m.width,S/m.height);F=Math.round(m.width*V),P=Math.round(m.height*V)}else N===2?m.width>b&&(F=b,P=D>0?Math.round(b/D):m.height):v===2&&m.height>S&&(P=S,F=D>0?Math.round(S*D):m.width);return{width:F,height:P}})}else if(G){let D=i.aspectRatio??(i.kind==="media"?y:void 0);(D===void 0||D<=0)&&o.setWidth(m.width)}else if(M){let D=i.aspectRatio??(i.kind==="media"?y:void 0);(D===void 0||D<=0)&&o.setHeight(m.height)}}}return{yogaNode:o,layoutNode:i,children:g}}function Kr(A,e,t,n,r){if(t===void 0||t==="auto"||t==="fit")return;let i=le(t);if(typeof i=="number"){e==="width"?A.setWidth(i):A.setHeight(i);return}if(i==="fill"){if(r){A.getFlexGrow()===0&&A.setFlexGrow(1),A.setFlexBasis(0);return}n!==void 0?e==="width"?A.setWidth(n):A.setHeight(n):e==="width"?A.setWidthPercent(100):A.setHeightPercent(100)}}function Yr(A,e,t,n,r){let i=A.yogaNode.getComputedLayout(),o=e+i.left,a=t+i.top,s=i.width,g=i.height,l=A.layoutNode;We(l)||(o+=Number(l.x??0),a+=Number(l.y??0)),n[A.layoutNode.id]={x:Math.round(o*1e3)/1e3,y:Math.round(a*1e3)/1e3,width:Math.round(s*1e3)/1e3,height:Math.round(g*1e3)/1e3},r[A.layoutNode.id]={width:Math.round(s*1e3)/1e3,height:Math.round(g*1e3)/1e3};for(let u of A.children)Yr(u,o,a,n,r)}function Wr(A){for(let e of A.children)Wr(e);A.yogaNode.free()}function ga(A,e){let{layout:t,viewport:n,measure:r}=e,i={},o={};for(let a of t){let s=A.Node.create();s.setWidth(n.width),s.setHeight(n.height),s.setFlexDirection(A.FLEX_DIRECTION_COLUMN);let g=Vr(A,a,{width:n.width,height:n.height},r,null);s.insertChild(g.yogaNode,0),s.calculateLayout(n.width,n.height);let l=g.yogaNode.getComputedLayout(),u=a.position==="absolute"||a.position===void 0&&(a.x!==void 0||a.y!==void 0),c=u?l.left:Number(a.x??0),B=u?l.top:Number(a.y??0);i[a.id]={x:Math.round(c*1e3)/1e3,y:Math.round(B*1e3)/1e3,width:Math.round(l.width*1e3)/1e3,height:Math.round(l.height*1e3)/1e3},o[a.id]={width:Math.round(l.width*1e3)/1e3,height:Math.round(l.height*1e3)/1e3};for(let Q of g.children)Yr(Q,c,B,i,o);Wr(g),s.free()}return{rects:i,sizes:o}}async function Au(A){let e=await Aa();return ga(e,A)}L();L();var la=/-?(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?/gi,ua=/([MmLlHhVvCcSsQqTtAaZz])([^MmLlHhVvCcSsQqTtAaZz]*)/g;function zr(A){let e=[],t=[],n=0,r=0,i=0,o=0,a=0,s=0,g="",l=u=>{t.length>1&&e.push({pts:t,closed:u}),t=[]};for(let u of A.matchAll(ua)){let c=u[1],B=(u[2].match(la)??[]).map(Number),Q=c===c.toLowerCase(),f=c.toUpperCase(),h=0,m=y=>{let G=B.slice(h,h+y);return h+=y,G},d=y=>h+y<=B.length;if(f==="Z"){n=i,r=o,l(!0),t=[[n,r]],g=f;continue}let x=!0;for(;d(f==="H"||f==="V"?1:f==="A"?7:f==="C"?6:f==="S"||f==="Q"?4:2);){if(f==="M"){let[y,G]=m(2);n=Q?n+y:y,r=Q?r+G:G,x?(l(!1),i=n,o=r,t=[[n,r]]):t.push([n,r])}else if(f==="L"||f==="T"){let[y,G]=m(2),M=Q?n+y:y,D=Q?r+G:G;if(f==="T"){let b=g==="Q"||g==="T"?2*n-a:n,N=g==="Q"||g==="T"?2*r-s:r;Xr(t,n,r,b,N,M,D),a=b,s=N}else t.push([M,D]);n=M,r=D}else if(f==="H"){let[y]=m(1);n=Q?n+y:y,t.push([n,r])}else if(f==="V"){let[y]=m(1);r=Q?r+y:y,t.push([n,r])}else if(f==="C"||f==="S"){let y,G;if(f==="C"){let[V,R]=m(2);y=Q?n+V:V,G=Q?r+R:R}else y=g==="C"||g==="S"?2*n-a:n,G=g==="C"||g==="S"?2*r-s:r;let[M,D,b,N]=m(4),S=Q?n+M:M,v=Q?r+D:D,F=Q?n+b:b,P=Q?r+N:N;for(let V=1;V<=16;V++){let R=V/16,X=1-R;t.push([X*X*X*n+3*X*X*R*y+3*X*R*R*S+R*R*R*F,X*X*X*r+3*X*X*R*G+3*X*R*R*v+R*R*R*P])}a=S,s=v,n=F,r=P}else if(f==="Q"){let[y,G,M,D]=m(4),b=Q?n+y:y,N=Q?r+G:G,S=Q?n+M:M,v=Q?r+D:D;Xr(t,n,r,b,N,S,v),a=b,s=N,n=S,r=v}else if(f==="A"){let[y,G,M,D,b,N,S]=m(7),v=Q?n+N:N,F=Q?r+S:S;Ia(t,n,r,y,G,M,D!==0,b!==0,v,F),n=v,r=F}x=!1,g=f,f==="M"&&(g="L")}g=f}return l(!1),e}function Xr(A,e,t,n,r,i,o){for(let a=1;a<=16;a++){let s=a/16,g=1-s;A.push([g*g*e+2*g*s*n+s*s*i,g*g*t+2*g*s*r+s*s*o])}}function Ia(A,e,t,n,r,i,o,a,s,g){let l=Math.abs(n),u=Math.abs(r);if(l===0||u===0){A.push([s,g]);return}let c=i*Math.PI/180,B=Math.cos(c),Q=Math.sin(c),f=(e-s)/2,h=(t-g)/2,m=B*f+Q*h,d=-Q*f+B*h,x=m*m/(l*l)+d*d/(u*u);x>1&&(l*=Math.sqrt(x),u*=Math.sqrt(x));let y=l*l*u*u-l*l*d*d-u*u*m*m,G=l*l*d*d+u*u*m*m,M=Math.sqrt(Math.max(0,y/G));o===a&&(M=-M);let D=M*l*d/u,b=-M*u*m/l,N=B*D-Q*b+(e+s)/2,S=Q*D+B*b+(t+g)/2,v=(R,X,_,AA)=>Math.atan2(R*AA-X*_,R*_+X*AA),F=v(1,0,(m-D)/l,(d-b)/u),P=v((m-D)/l,(d-b)/u,(-m-D)/l,(-d-b)/u);!a&&P>0&&(P-=2*Math.PI),a&&P<0&&(P+=2*Math.PI);let V=Math.max(4,Math.ceil(Math.abs(P)/(Math.PI/2)*16));for(let R=1;R<=V;R++){let X=F+P*R/V,_=l*Math.cos(X),AA=u*Math.sin(X);A.push([B*_-Q*AA+N,Q*_+B*AA+S])}}function Zr(A,e){let t=A.closed?[...A.pts,A.pts[0]]:A.pts,n=[0];for(let s=1;s<t.length;s++)n.push(n[s-1]+Math.hypot(t[s][0]-t[s-1][0],t[s][1]-t[s-1][1]));let r=n[n.length-1],i=[];if(r<=0){for(let s=0;s<e;s++)i.push([t[0][0],t[0][1]]);return i}let o=A.closed?e:e-1,a=0;for(let s=0;s<e;s++){let g=r*s/o;for(;a<n.length-2&&n[a+1]<g;)a++;let l=n[a+1]-n[a],u=l>0?(g-n[a])/l:0;i.push([t[a][0]+(t[a+1][0]-t[a][0])*u,t[a][1]+(t[a+1][1]-t[a][1])*u])}return i}function qr(A){let e=0;for(let t=0;t<A.length;t++){let n=A[(t+1)%A.length];e+=A[t][0]*n[1]-n[0]*A[t][1]}return e/2}function _r(A){let e=0,t=0;for(let n of A)e+=n[0],t+=n[1];return[e/A.length,t/A.length]}function ca(A,e,t){if(!t){let s=Math.hypot(A[0][0]-e[0][0],A[0][1]-e[0][1]);return Math.hypot(A[0][0]-e[e.length-1][0],A[0][1]-e[e.length-1][1])<s?[...e].reverse():e}let n=Math.sign(qr(A))!==Math.sign(qr(e))?[...e].reverse():e,r=A.length,i=0,o=Number.POSITIVE_INFINITY,a=s=>{let g=0;for(let l=0;l<r;l+=2){let u=n[(l+s)%r];g+=(A[l][0]-u[0])**2+(A[l][1]-u[1])**2}return g};for(let s=0;s<r;s+=4){let g=a(s);g<o&&(o=g,i=s)}for(let s=i-3;s<=i+3;s++){let g=(s+r)%r,l=a(g);l<o&&(o=l,i=g)}return A.map((s,g)=>n[(g+i)%r])}var Gt=new Map;function Ba(A,e){let t=`${A}\0${e}`,n=Gt.get(t);if(n)return n;let r=zr(A),i=zr(e),o=Math.max(r.length,i.length),a={a:[],b:[],closed:[]};for(let s=0;s<o;s++){let g=r[s],l=i[s],u=(g?.closed??!0)&&(l?.closed??!0),c=g?Zr(g,128):void 0,B=l?Zr(l,128):void 0;if(!c&&B){let Q=_r(B);c=B.map(()=>[Q[0],Q[1]])}if(!B&&c){let Q=_r(c);B=c.map(()=>[Q[0],Q[1]])}!c||!B||(a.a.push(c),a.b.push(ca(c,B,u)),a.closed.push(u))}return Gt.size>256&&Gt.clear(),Gt.set(t,a),a}var jr=A=>(Math.round(A*100)/100).toString();function $r(A,e,t){if(t<=0)return A;if(t===1)return e;let n=Ba(A,e),r=[];for(let i=0;i<n.a.length;i++){let o=n.a[i],a=n.b[i],s="";for(let g=0;g<o.length;g++){let l=o[g][0]+(a[g][0]-o[g][0])*t,u=o[g][1]+(a[g][1]-o[g][1])*t;s+=`${g===0?"M":"L"}${jr(l)} ${jr(u)}`}r.push(n.closed[i]?`${s}Z`:s)}return r.join("")}function Ai(A,e){let t=Math.floor(A)^e*1013|0;return t=Math.imul(t^t>>>15,t|1),t^=t+Math.imul(t^t>>>7,t|61),((t^t>>>14)>>>0)/4294967295*2-1}function Ea(A,e){let t=Math.floor(A),n=t+1,r=A-t,i=r*r*(3-2*r),o=Ai(t,e),a=Ai(n,e),s=o*r,g=a*(r-1);return(s*(1-i)+g*i)*2}function Qa(A,e,t=0){let n=A.frequency??2,r=A.amplitude??50,i=Math.max(1,Math.min(4,A.octaves??1)),o=A.seed??1234,a=0,s=0,g=1,l=n;for(let c=0;c<i;c++){let B=Ea(e*l,o+c*7919);a+=B*g,s+=g,g*=.5,l*=2}let u=s>0?a/s:0;return t+u*r}function fa(A,e,t,n){if(e<=0)return t;let r=Math.max(.001,A.mass??1),i=Math.max(.001,A.stiffness??180),o=Math.max(.001,A.damping??12),a=Math.sqrt(i/r),s=o/(2*Math.sqrt(i*r)),g=1;if(s<1){let l=a*Math.sqrt(1-s*s),u=-1,c=-s*a/l;g=1+Math.exp(-s*a*e)*(u*Math.cos(l*e)+c*Math.sin(l*e))}else if(Math.abs(s-1)<1e-4)g=1+Math.exp(-a*e)*(-1-a*e);else{let l=Math.sqrt(s*s-1),u=-a*(s-l),c=-a*(s+l),B=-1/(1-u/c),Q=-1-B;g=1+B*Math.exp(u*e)+Q*Math.exp(c*e)}return t+(n-t)*g}function RA(A,e,t){if(A==null)return 0;if(typeof A=="number")return A;if(typeof A=="function")return Number(A(e,t))||0;if(Array.isArray(A)||ArrayBuffer.isView(A)){let n=A;if(n.length===0)return 0;let r=Math.max(0,Math.min(n.length-1,Math.round(e)));return Number(n[r])||0}if(typeof A=="object"){let n=A;if(typeof n.get=="function")return Number(n.get({frame:e,fps:t,time:t>0?e/t:0}))||0;if(n.type==="Signal"&&n.data)return RA(n.data,e,t);let r=n.samples??(typeof n.channel=="string"&&n[n.channel]!==void 0?n[n.channel]:void 0);if(Array.isArray(r)||ArrayBuffer.isView(r)){let i=r;if(i.length===0)return 0;let o=Number(n.fps)||24,a=t>0?t:24,s=e/a,g=Math.max(0,Math.min(i.length-1,Math.round(s*o)));return Number(i[g])||0}if(n.type==="audio_extractor"||n.extractionMode!==void 0){let i=n.nodeId;if(i){let o=n.channel??"primary",a=Yn.getChannelSamples(i,o);if(a&&a.length>0){let s=Number(n.fps)||24,g=t>0?t:24,l=e/g,u=Math.max(0,Math.min(a.length-1,Math.round(l*s)));return Number(a[u])||0}}return 0}if(n.type==="generator"){let i=typeof n.amplitude=="number"?n.amplitude:1,o=typeof n.frequency=="number"?n.frequency:1;if(n.syncToBpm&&typeof n.bpm=="number"&&n.bpm>0){let m=typeof n.bars=="number"&&n.bars>0?n.bars:1;o=n.bpm/60/m}let a=typeof n.phase=="number"?n.phase:0,s=typeof n.offset=="number"?n.offset:0,g=e/(t>0?t:24),l=n.baseType??"sine",u=!!n.fmEnabled,c=g;if(u){let m=Number(n.fmAmplitude)||1,d=Number(n.fmFrequency)||.5;c=g+Math.sin(g*d*Math.PI*2)*m}let B=0,Q=(c*o+a/(Math.PI*2))%1,f=Q<0?Q+1:Q,h=m=>(m%1+1)%1;switch(l){case"triangle":B=4*Math.abs(f-.5)-1;break;case"sawtooth":B=2*f-1;break;case"square":B=f<.5?1:-1;break;case"constant":B=1;break;case"noise_smooth":{let m=c*o+a,d=Math.floor(m),x=m-d,y=x*x*(3-2*x),G=h(Math.sin(d*12.9898)*43758.5453),M=h(Math.sin((d+1)*12.9898)*43758.5453);B=(G*(1-y)+M*y)*2-1;break}case"noise_white":B=h(Math.sin(c*12.9898+a)*43758.5453)*2-1;break;case"pulse":{let m=a===0?.5:Math.max(.01,Math.min(.99,a));B=h(c*o)<m?1:-1;break}case"bounce":B=Math.abs(Math.sin(c*o*Math.PI+a));break;case"staircase":B=Math.floor(f*8)/7*2-1;break;default:B=Math.sin(c*o*Math.PI*2+a);break}return B*i+s}if(n.type==="gate"){let i=n.sourceSignal??n.signal,o=typeof n.threshold=="number"?n.threshold:.5,a=n.mode??"gate",s=!!n.invert,g=typeof n.debounceMs=="number"?n.debounceMs:0,l=Math.max(1,Math.round(g/1e3*t)),u=Math.max(1,Number(n.holdFrames)||4),c=0;if(a==="gate")c=RA(i,e,t)>=o?1:0;else if(a==="trigger"){let B=-1/0,Q=Math.max(0,e-300);for(let f=Q;f<=e;f++){let h=RA(i,f,t),m=f>0?RA(i,f-1,t):0;h>=o&&m<o&&f-B>=l&&(B=f)}c=e>=B&&e<B+u?1:0}else if(a==="toggle"){let B=0,Q=-1/0;for(let f=0;f<=e;f++){let h=RA(i,f,t),m=f>0?RA(i,f-1,t):0;h>=o&&m<o&&f-Q>=l&&(B++,Q=f)}c=B%2===1?1:0}return s?1-c:c}if(n.type==="signal_math"){let i=RA(n.signalA,e,t),a=n.signalB!==void 0?RA(n.signalB,e,t):Number(n.bValue)||0;switch(n.operation){case"add":return i+a;case"subtract":return i-a;case"multiply":return i*a;case"divide":return a!==0?i/a:0;case"min":return Math.min(i,a);case"max":return Math.max(i,a);case"clamp":{let s=Number(n.clampMin)||0,g=Number(n.clampMax)||1;return Math.max(s,Math.min(g,i))}case"abs":return Math.abs(i);case"negate":return-i;case"invert":return 1-i;case"power":return i**(Number(n.exponent)||2);case"modulo":return a!==0?i%a:0;case"remap":{let s=Number(n.inMin)||0,g=Number(n.inMax)||1,l=Number(n.outMin)||0,u=Number(n.outMax)||1,c=g-s,B=c!==0?(i-s)/c:0;return l+B*(u-l)}case"normalize":{let s=Number(n.aMin??n.inMin)||0,l=(Number(n.aMax??n.inMax)||1)-s;return l!==0?Math.max(0,Math.min(1,(i-s)/l)):0}case"smoothstep":{let s=Number(n.edge0)||0,l=(Number(n.edge1)||1)-s,u=l!==0?Math.max(0,Math.min(1,(i-s)/l)):0;return u*u*(3-2*u)}case"custom":return i;default:return i}}if(typeof n.value=="number")return n.value}return 0}function Ca(A,e,t,n=.15,r=2){if(e<0||!A)return 0;let i=A,o=0,a=-1/0;for(let s=0;s<=e;s++){let g=RA(i,s,t),l=s>0?RA(i,s-1,t):0;g>=n&&l<n&&s-a>=r&&(o++,a=s)}return o}function da(A,e,t,n={}){let r=n[A.inputHandleId];if(r===void 0&&n){let c=Object.keys(n);if(c.length===1)r=n[c[0]];else if(c.length>1){let B=c.find(Q=>Q===A.inputHandleId);r=B?n[B]:n[c[0]]}}if(A.channel&&r&&typeof r=="object"){let c=r[A.channel];c!==void 0?r=c:typeof r.get!="function"&&(r={...r,channel:A.channel})}if(A.signalMode==="accumulate"){let c=A.threshold??A.accumulateThreshold??.15,B=A.debounceFrames??2,Q=Ca(r,e,t,c,B),f=A.multiplier??1,h=A.offset??0;return Q*f+h}let i=A.multiplier??1,o=A.offset??0,a=Math.max(0,Math.round(A.smoothingWindowFrames??0));if(a<=1)return RA(r,e,t)*i+o;let s=0,g=0,l=Math.max(0,e-a+1);for(let c=l;c<=e;c++)s+=RA(r,c,t),g++;return(g>0?s/g:0)*i+o}function ma(A,e,t){return A+(e-A)*t}function ha(A){let e=A.trim().replace("#","");if(e.length===3&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]),e.length===6){let t=parseInt(e,16);return[t>>16&255,t>>8&255,t&255,1]}if(e.length===8){let t=parseInt(e,16);return[t>>24&255,t>>16&255,t>>8&255,(t&255)/255]}return[255,255,255,1]}function ei(A,e,t){return Vn(A,e,t)}function Mn(A,e,t){let n=t;return n<0&&(n+=1),n>1&&(n-=1),n<1/6?A+(e-A)*6*n:n<1/2?e:n<2/3?A+(e-A)*(2/3-n)*6:A}function pa(A,e){let[t,n,r,i]=ha(A),o=t/255,a=n/255,s=r/255,g=Math.max(o,a,s),l=Math.min(o,a,s),u=0,c=0,B=(g+l)/2;if(g!==l){let d=g-l;switch(c=B>.5?d/(2-g-l):d/(g+l),g){case o:u=(a-s)/d+(a<s?6:0);break;case a:u=(s-o)/d+2;break;case s:u=(o-a)/d+4;break}u/=6}u=(u+e%1+1)%1;let Q=B,f=B,h=B;if(c!==0){let d=B<.5?B*(1+c):B+c-B*c,x=2*B-d;Q=Mn(x,d,u+1/3),f=Mn(x,d,u),h=Mn(x,d,u-1/3)}let m=d=>Math.round(Math.max(0,Math.min(255,d*255))).toString(16).padStart(2,"0");return i>=.999?`#${m(Q)}${m(f)}${m(h)}`:`rgba(${Math.round(Q*255)}, ${Math.round(f*255)}, ${Math.round(h*255)}, ${Math.round(i*100)/100})`}var ya=new Set(["fill","fillColor","strokeColor","textBackgroundColor","color"]);function Gn(A,e,t){let n=A.keyframes??[];if(n.length===0)return 0;if(n.length===1||e<=n[0].frame)return n[0].value;if(e>=n[n.length-1].frame)return n[n.length-1].value;for(let r=0;r<n.length-1;r++){let i=n[r],o=n[r+1];if(e>=i.frame&&e<=o.frame){let a=o.frame-i.frame,s=a>0?(e-i.frame)/a:0,g=t?t(o.ease??i.ease,a,s):s;if(typeof i.value=="boolean")return s>=1?o.value:i.value;if(typeof i.value=="string"&&typeof o.value=="string")return A.prop==="d"?$r(i.value,o.value,g):ei(i.value,o.value,g);let l=Number(i.value)||0,u=Number(o.value)||0;return ma(l,u,g)}}return n[n.length-1].value}function ba(A,e,t=24,n={}){let r=n.startFrame??0,i=e-r,o=A.source??{type:"keyframe"},a=n.baseValues?.[A.prop];switch(o.type){case"keyframe":return Gn(A,i);case"wiggle":{let s=typeof a=="number"?a:0,g=A.keyframes&&A.keyframes.length>0?Number(Gn(A,i))||0:s,l=i/(t>0?t:24);return Qa(o,l,g)}case"springOvershoot":{let s=0,g=1;A.keyframes&&A.keyframes.length>=2?(s=Number(A.keyframes[0].value)||0,g=Number(A.keyframes[1].value)||1):A.keyframes&&A.keyframes.length===1?(s=Number(a)||0,g=Number(A.keyframes[0].value)||0):typeof a=="number"&&(s=a,g=a);let l=i/(t>0?t:24);return fa(o,l,s,g)}case"signal":{let s=da(o,e,t,n.signals);if(ya.has(A.prop)){let g=o,l=g.colorA??"#ffffff",u=g.colorB??"#ffffff",c=g.colorMode??"interpolate";if(c==="threshold"){let Q=g.colorThreshold??.5;return s>=Q?u:l}if(c==="hueRotate")return pa(l,s);let B=Math.max(0,Math.min(1,s));return ei(l,u,B)}return s}default:return Gn(A,i)}}function su(A,e,t=24,n={}){let r={};if(!A?.tracks)return r;for(let i of A.tracks)r[i.prop]=ba(i,e,t,n);return r}L();var ti=["x","y","width","height"];function Da(A){let e=A.matte,{matte:t,...n}=A,r={...n};if(Array.isArray(r.children)&&(r.children=Nt(r.children)),!e?.node)return[r];let i=e.node,o=i.id??`${String(A.id)}__matte`,a={position:"absolute",...i,id:o,matteOf:String(A.id),matteMode:e.mode??"alpha"};if(ti.every(g=>i[g]===void 0))for(let g of ti)typeof A[g]=="number"&&(a[g]=A[g]);let s=typeof A.startFrame=="number"?A.startFrame:0;return a.startFrame=s+(typeof i.startFrame=="number"?i.startFrame:0),i.durationFrames===void 0&&A.durationFrames!==void 0&&(a.durationFrames=A.durationFrames),Array.isArray(a.children)&&(a.children=Nt(a.children)),r.matteId=o,[r,a]}function Nt(A){return A.flatMap(e=>Da(e))}L();function Nn(A,e,t,n="forward"){if(t<=0||e<=1)return 0;switch(n){case"reverse":return(e-1-A)*t;case"center-out":{let r=(e-1)/2,i=Math.abs(A-r);return Math.round(i*t)}default:return A*t}}function cu(A,e,t="forward",n=0){return!A||A.length===0?[]:e<=0&&n===0?[...A]:A.map((r,i)=>{let o=Nn(i,A.length,e,t),a=r.startFrame??0;return{...r,startFrame:a+o+n}})}L();L();var ri=Symbol.for("framefields.inlineSignal"),ni=new WeakMap,wa=0;function xa(A){let e=ni.get(A);return e===void 0&&(e=`inline_signal_${wa++}`,ni.set(A,e)),e}function Qu(A){if(typeof A=="string")return{handleId:A};if(A===null||typeof A!="object"&&typeof A!="function")throw new TypeError(`LayerAnimation.signal: expected a signal object or a signal name, got ${String(A)}. Pass a signal (Signal.fromArray / Signal.builder / an audio channel \u2026) or register it with comp.addSignal(name, signal) and pass the name.`);let e=A;return typeof e.inputHandleId=="string"?{handleId:e.inputHandleId}:typeof e.gpuBinding?.nodeId=="string"?typeof e.get=="function"?{handleId:e.gpuBinding.nodeId,inline:A}:{handleId:e.gpuBinding.nodeId}:{handleId:xa(A),inline:A}}function fu(A,e){Object.defineProperty(A,ri,{value:e,enumerable:!1,configurable:!0,writable:!0})}function Ma(A){if(!(!A||typeof A!="object"))return A[ri]}function Fn(A,e={}){for(let t of A){if(!t||typeof t!="object")continue;let{animation:n,children:r}=t,i=n?.tracks;if(Array.isArray(i))for(let o of i){let a=o?.source,s=Ma(a);s&&typeof a?.inputHandleId=="string"&&(e[a.inputHandleId]=s)}Array.isArray(r)&&Fn(r,e)}return e}function ii(A,e,t,n=0,r,i){let o=[],a=A.src??A.inputHandleId,s=d=>typeof d=="string"&&(d.startsWith("http://")||d.startsWith("https://")||d.startsWith("file://")||d.startsWith("/")||d.startsWith("./")||d.startsWith("blob:")||d.startsWith("data:")||/\.(png|jpe?g|webp|gif|svg|mp4|webm|mov|mkv|mp3|wav|ogg|m4a|srt|vtt|json|lottie)$/i.test(d)),g;if(A.kind==="media"){if(e&&(g=e(A.inputHandleId)),!g&&a&&(s(a)||A.src)&&(g=Jn(a,A.dataType??"Video")),!g&&!e&&a&&(a.includes(".")||a.includes("/"))&&console.warn(`[Compositor] Media layer '${A.id??"?"}' source '${a}' could not be resolved.`),g&&A.crop){let d=A.crop,x=typeof d.toOperation=="function"?d.toOperation():d;g={metadata:{...g.metadata},operation:{op:"Crop",...x,dataType:g.operation.dataType},children:[g]}}if(g&&Array.isArray(A.effects))for(let d of A.effects){let x=typeof d.toOperation=="function"?d.toOperation():d;g={metadata:{...g.metadata},operation:{id:A.id?`${A.id}-${x.op??"effect"}`:void 0,effect:d,...x,dataType:g.operation.dataType},children:[g]}}if(g&&A.vision){let d=A.vision,x=typeof d.toOperation=="function"?d.toOperation():d;g={metadata:{...g.metadata},operation:{op:"Vision",id:A.id,effect:d,...x,dataType:g.operation.dataType},children:[g]}}}if(A.kind==="media")o=g?[g]:[];else if("children"in A&&A.children){let d="staggerFrames"in A&&typeof A.staggerFrames=="number"?A.staggerFrames:0,x="staggerDirection"in A&&typeof A.staggerDirection=="string"?A.staggerDirection:"forward",y=typeof A.startFrame=="number"&&Number.isFinite(A.startFrame)?Math.round(A.startFrame):0,G=typeof A.durationFrames=="number"&&Number.isFinite(A.durationFrames)?Math.round(A.durationFrames):i;o=A.children.map((M,D)=>{let b=Nn(D,A.children.length,d,x),N=n+y+b;return ii(M,e,t,N,r,M.durationFrames===void 0?G:void 0)})}let l="Image",u;if(g){l=g.operation?.dataType??"Image";let x=l==="Image"||l==="SVG"?void 0:On(g)?.durationMs;x!=null&&(u=Math.max(1,Math.round(x/1e3*t)))}let c=g?.operation?.dataType==="Caption",B=A.kind==="flex"||A.kind==="block"||A.kind==="box",Q=(typeof A.startFrame=="number"&&Number.isFinite(A.startFrame)&&A.startFrame>=0?Math.round(A.startFrame):0)+n,f=typeof A.durationFrames=="number"&&Number.isFinite(A.durationFrames)&&A.durationFrames>0?Math.round(A.durationFrames):void 0,h=i??Math.round((r??1e4)/1e3*t);if(B&&o.length>0){if(f===void 0){let d=o.map(x=>(x.operation?.startFrame??0)+(x.operation?.durationFrames??h));f=Math.max(1,Math.max(...d)-Q)}}else c&&u!==void 0&&u>0?f=u:f!==void 0?(l==="Video"||l==="Audio")&&u!==void 0&&u>0&&(f=Math.min(f,u)):f=u??i??Math.round((r??1e4)/1e3*t);let m=f/t*1e3;if(A.kind==="media"&&g){let d=g;for(;d;)(!d.metadata?.durationMs||d.metadata.durationMs<=0)&&(d.metadata||(d.metadata={}),d.metadata.durationMs=m),d.operation?.sourceMeta&&!d.operation.sourceMeta.durationMs&&(d.operation.sourceMeta.durationMs=m),d=d.children?.[0]}return{metadata:{durationMs:m},operation:{op:"CompositorLayer",...A,startFrame:Q,durationFrames:f,dataType:l},children:o}}function bu(A,e){let{isVideoMode:t,fps:n,durationMs:r,resolveMedia:i,signals:o}=e,a={metadata:{width:A.width,height:A.height,fps:n,...r!==void 0&&{durationMs:r}},operation:{op:"Compositor",width:A.width,height:A.height,fps:n,mode:A.mode??"Video",backgroundColor:A.backgroundColor,...A.antialias3d!==void 0&&{antialias3d:A.antialias3d},volume:A.volume??1,dataType:t?"Video":"Image",layout:A.layout,signals:{...Fn(A.layout),...o??A.signals??{}},...(A.onRequestFrame||e.onRequestFrame)&&{onRequestFrame:A.onRequestFrame??e.onRequestFrame}},children:Nt(A.layout).map(l=>ii(l,i,n,0,r))},s=Array.isArray(e.effects)?e.effects:Array.isArray(A.effects)?A.effects:[];for(let l of s){let u=typeof l.toOperation=="function"?l.toOperation():l;a={metadata:{...a.metadata},operation:{...u,dataType:a.operation.dataType},children:[a]}}let g=A.vision??e.vision;if(g){let l=typeof g.toOperation=="function"?g.toOperation():g;a={metadata:{...a.metadata},operation:{op:"Vision",...l,dataType:a.operation.dataType},children:[a]}}return a}function Du(A){let e=[],t=n=>{n?.operation?.op==="CompositorLayer"&&e.push(n);for(let r of n?.children??[])t(r)};for(let n of A)t(n);return e}export{nt as a,_n as b,k as c,$ as d,ce as e,Ni as f,tr as g,it as h,Vt as i,Kt as j,qA as k,_a as l,ja as m,Ne as n,is as o,Fe as p,gr as q,xs as r,at as s,ct as t,Ml as u,Sl as v,hr as w,pr as x,yr as y,fl as z,br as A,Dr as B,Qo as C,hl as D,mn as E,kl as F,Aa as G,ga as H,Au as I,Qu as J,fu as K,Gn as L,ba as M,su as N,Nt as O,Nn as P,cu as Q,bu as R,Du as S};
|