framefields 2.14.0 → 2.16.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/NOTICE.md +5 -1
- package/dist/audio/index.d.mts +3 -3
- package/dist/audio/index.mjs +10 -10
- package/dist/{audio-DFwRbID_.mjs → audio-6TfPlfl4.mjs} +3 -3
- package/dist/{audio-DFwRbID_.mjs.map → audio-6TfPlfl4.mjs.map} +1 -1
- package/dist/{audio-CdCuGK5d.d.mts → audio-7oqTUi4G.d.mts} +2 -2
- package/dist/{audio-CdCuGK5d.d.mts.map → audio-7oqTUi4G.d.mts.map} +1 -1
- package/dist/cli/check-worker.mjs +44 -44
- package/dist/cli.mjs +1 -1
- package/dist/cloud/index.mjs +1 -1
- package/dist/{cloud-Cj1TIme8.mjs → cloud-jnk1hPYf.mjs} +2 -2
- package/dist/{cloud-Cj1TIme8.mjs.map → cloud-jnk1hPYf.mjs.map} +1 -1
- package/dist/components/index.d.mts +11 -11
- package/dist/components/index.mjs +43 -43
- package/dist/{dist-Kbf-JTry.mjs → dist-BtI6ukB5.mjs} +2 -2
- package/dist/{dist-Kbf-JTry.mjs.map → dist-BtI6ukB5.mjs.map} +1 -1
- package/dist/{dist-B8Nby2CU.mjs → dist-COOpgG9G.mjs} +4 -3
- package/dist/{dist-B8Nby2CU.mjs.map → dist-COOpgG9G.mjs.map} +1 -1
- package/dist/{dist--Uu5bQ_6.mjs → dist-XqlFM2a8.mjs} +13733 -5323
- package/dist/dist-XqlFM2a8.mjs.map +1 -0
- package/dist/{dist-CiTgmfUw.mjs → dist-f1zkl69f.mjs} +4 -4
- package/dist/dist-f1zkl69f.mjs.map +1 -0
- package/dist/{dist-B_rSWeOz.mjs → dist-umQOWz0a.mjs} +1 -1
- package/dist/effects/index.d.mts +4 -4
- package/dist/effects/index.mjs +35 -35
- package/dist/{effects-WMgv8ZaD.mjs → effects-DlRMovU5.mjs} +2 -2
- package/dist/{effects-WMgv8ZaD.mjs.map → effects-DlRMovU5.mjs.map} +1 -1
- package/dist/fonts/index.d.mts +1 -1
- package/dist/fonts/index.mjs +2 -2
- package/dist/{fonts-OW3yAfO5.mjs → fonts-BWYcXjyK.mjs} +3 -3
- package/dist/fonts-BWYcXjyK.mjs.map +1 -0
- package/dist/{gpu-R4T2Tndu.mjs → gpu-CH1PdM4T.mjs} +2 -2
- package/dist/{gpu-R4T2Tndu.mjs.map → gpu-CH1PdM4T.mjs.map} +1 -1
- package/dist/{index-CEKxvGY-.d.mts → index-BHTycml5.d.mts} +2 -2
- package/dist/{index-CEKxvGY-.d.mts.map → index-BHTycml5.d.mts.map} +1 -1
- package/dist/{index-DoP6EiHj.d.mts → index-BcxxxwhV.d.mts} +4 -4
- package/dist/{index-DoP6EiHj.d.mts.map → index-BcxxxwhV.d.mts.map} +1 -1
- package/dist/index-C-V6CAhP.d.mts.map +1 -1
- package/dist/{index-D1FqV1eu.d.mts → index-CMhkkc56.d.mts} +43 -11
- package/dist/index-CMhkkc56.d.mts.map +1 -0
- package/dist/{index-B0Vq8Bwf.d.mts → index-CYVpYGM-.d.mts} +2 -2
- package/dist/{index-B0Vq8Bwf.d.mts.map → index-CYVpYGM-.d.mts.map} +1 -1
- package/dist/{index-Bv7gxGK1.d.mts → index-Cq8jgdNY.d.mts} +90 -3
- package/dist/index-Cq8jgdNY.d.mts.map +1 -0
- package/dist/{index-9xte4JgL.d.mts → index-Dg5BAtDq.d.mts} +1446 -541
- package/dist/index-Dg5BAtDq.d.mts.map +1 -0
- package/dist/{index-C7-p9zwU.d.mts → index-DhL7ckvs.d.mts} +5 -5
- package/dist/index-DhL7ckvs.d.mts.map +1 -0
- package/dist/{index-GA9_Z8Fn.d.mts → index-RILu3ULT.d.mts} +2 -2
- package/dist/{index-GA9_Z8Fn.d.mts.map → index-RILu3ULT.d.mts.map} +1 -1
- package/dist/{index-C5sgRLlG.d.mts → index-TCtdSXd7.d.mts} +3 -1
- package/dist/index-TCtdSXd7.d.mts.map +1 -0
- package/dist/{index-CRaydvLi.d.mts → index-s2qQ8ifZ.d.mts} +886 -51
- package/dist/index-s2qQ8ifZ.d.mts.map +1 -0
- package/dist/index.d.mts +13 -13
- package/dist/index.mjs +52 -52
- package/dist/preview/index.d.mts +4 -4
- package/dist/preview/index.mjs +11 -11
- package/dist/preview-Dm912wly.mjs +1037 -0
- package/dist/preview-Dm912wly.mjs.map +1 -0
- package/dist/preview-engine/audio.mjs +1 -1
- package/dist/preview-engine/{chunk-64L4GUOF.mjs → chunk-4F3DG6YB.mjs} +2 -2
- package/dist/preview-engine/chunk-A2OTOW3B.mjs +4694 -0
- package/dist/preview-engine/{chunk-GNDE3OXQ.mjs → chunk-BR56TQBP.mjs} +1 -1
- package/dist/preview-engine/{chunk-ADLIF544.mjs → chunk-H2XKXXAU.mjs} +1 -1
- package/dist/preview-engine/chunk-NDUODAY2.mjs +3 -0
- package/dist/preview-engine/{chunk-FZ4RD7HV.mjs → chunk-QAQJSWUT.mjs} +1 -1
- package/dist/preview-engine/chunk-SWRGQTVC.mjs +138 -0
- package/dist/preview-engine/{chunk-52X7SURQ.mjs → chunk-TEA3GVBJ.mjs} +1 -1
- package/dist/preview-engine/chunk-VZUVB3BP.mjs +644 -0
- package/dist/preview-engine/{chunk-UBY2UYEL.mjs → chunk-XSHNQJ7L.mjs} +1 -1
- package/dist/preview-engine/components.mjs +1 -1
- package/dist/preview-engine/effects.mjs +1 -1
- package/dist/preview-engine/fonts.mjs +1 -1
- package/dist/preview-engine/framefields.mjs +1 -1
- package/dist/preview-engine/player.mjs +3 -3
- package/dist/preview-engine/{renderers-DU7KPFVV.mjs → renderers-6C7NWWDX.mjs} +1 -1
- package/dist/preview-engine/renderers-HHVGNMSJ.mjs +206 -0
- package/dist/preview-engine/{src-YXNX4MLK.mjs → src-RCNEKIRP.mjs} +1 -1
- package/dist/preview-page/index.html +19 -0
- package/dist/preview-page/main.css +1 -0
- package/dist/preview-page/main.js +326 -0
- package/dist/{program-tFKCWU2j.mjs → program-CMigyfso.mjs} +829 -52
- package/dist/program-CMigyfso.mjs.map +1 -0
- package/dist/renderer/index.d.mts +2 -2
- package/dist/renderer/index.mjs +2 -2
- package/dist/{renderer-DkOuQi84.mjs → renderer-0GMEL_Zi.mjs} +3 -3
- package/dist/{renderer-DkOuQi84.mjs.map → renderer-0GMEL_Zi.mjs.map} +1 -1
- package/dist/{renderer-BGp0An5A.mjs → renderer-3Wv2ZBJG.mjs} +3 -3
- package/dist/{renderer-BGp0An5A.mjs.map → renderer-3Wv2ZBJG.mjs.map} +1 -1
- package/dist/{renderer-BVIXKfbC.mjs → renderer-4nXkaAWu.mjs} +1178 -199
- package/dist/renderer-4nXkaAWu.mjs.map +1 -0
- package/dist/{renderer-Cw6_NL2i.mjs → renderer-6SnfLXeg.mjs} +3 -3
- package/dist/{renderer-Cw6_NL2i.mjs.map → renderer-6SnfLXeg.mjs.map} +1 -1
- package/dist/{renderer-BVU22lBS.mjs → renderer-8gHw3O0P.mjs} +2 -2
- package/dist/{renderer-BVU22lBS.mjs.map → renderer-8gHw3O0P.mjs.map} +1 -1
- package/dist/{renderer-BjDddtw9.mjs → renderer-AOBglZHC.mjs} +2 -2
- package/dist/{renderer-D-KHHWQD.mjs → renderer-B0bSARK3.mjs} +3 -3
- package/dist/{renderer-D-KHHWQD.mjs.map → renderer-B0bSARK3.mjs.map} +1 -1
- package/dist/{renderer-CCxk-RJR.mjs → renderer-B2_tuRfl.mjs} +2 -2
- package/dist/{renderer-CCxk-RJR.mjs.map → renderer-B2_tuRfl.mjs.map} +1 -1
- package/dist/{renderer-k5d7JSbs.mjs → renderer-B82FhkEr.mjs} +3 -3
- package/dist/{renderer-k5d7JSbs.mjs.map → renderer-B82FhkEr.mjs.map} +1 -1
- package/dist/{renderer-I0Hh9cLK.mjs → renderer-B9lzA0PY.mjs} +3 -3
- package/dist/{renderer-I0Hh9cLK.mjs.map → renderer-B9lzA0PY.mjs.map} +1 -1
- package/dist/{renderer-Dwwnx7Dk.mjs → renderer-BBSIWSry.mjs} +2 -2
- package/dist/{renderer-Dwwnx7Dk.mjs.map → renderer-BBSIWSry.mjs.map} +1 -1
- package/dist/{renderer-_pC-jB9O.mjs → renderer-BEKDMxbi.mjs} +2 -2
- package/dist/{renderer-_pC-jB9O.mjs.map → renderer-BEKDMxbi.mjs.map} +1 -1
- package/dist/renderer-BERGAxqA.mjs +5 -0
- package/dist/{renderer-raxwsiGI.mjs → renderer-BF960HY8.mjs} +3 -3
- package/dist/{renderer-raxwsiGI.mjs.map → renderer-BF960HY8.mjs.map} +1 -1
- package/dist/{renderer-Dr0tXA4k.mjs → renderer-BFwyVxCu.mjs} +3 -3
- package/dist/{renderer-Dr0tXA4k.mjs.map → renderer-BFwyVxCu.mjs.map} +1 -1
- package/dist/{renderer-DEjo6dw_.mjs → renderer-BNiwcI3-.mjs} +2 -2
- package/dist/{renderer-DEjo6dw_.mjs.map → renderer-BNiwcI3-.mjs.map} +1 -1
- package/dist/{renderer-DIEeHiQA.mjs → renderer-BPbVb2Q4.mjs} +2 -2
- package/dist/{renderer-DIEeHiQA.mjs.map → renderer-BPbVb2Q4.mjs.map} +1 -1
- package/dist/renderer-BQ_YkBMt.mjs +6 -0
- package/dist/{renderer-BBMtmxks.mjs → renderer-BUWxlA8T.mjs} +3 -3
- package/dist/{renderer-BBMtmxks.mjs.map → renderer-BUWxlA8T.mjs.map} +1 -1
- package/dist/renderer-BW0Tjsv9.mjs +5 -0
- package/dist/{renderer-Dgj46uEU.mjs → renderer-BX8liu-e.mjs} +2 -2
- package/dist/{renderer-ZnrEfkYh.mjs → renderer-BXIwDAr_.mjs} +2 -2
- package/dist/{renderer-ZnrEfkYh.mjs.map → renderer-BXIwDAr_.mjs.map} +1 -1
- package/dist/{renderer-DA8YEo_d.mjs → renderer-B_Hy1W-g.mjs} +3 -3
- package/dist/{renderer-DA8YEo_d.mjs.map → renderer-B_Hy1W-g.mjs.map} +1 -1
- package/dist/{renderer-iMiYStcW.mjs → renderer-Bb6cvSgh.mjs} +2 -2
- package/dist/{renderer-iMiYStcW.mjs.map → renderer-Bb6cvSgh.mjs.map} +1 -1
- package/dist/{renderer-BacY4nh8.mjs → renderer-BdppwWC9.mjs} +2 -2
- package/dist/{renderer-BacY4nh8.mjs.map → renderer-BdppwWC9.mjs.map} +1 -1
- package/dist/{renderer-CrxwW6VQ.mjs → renderer-Bhc24HVe.mjs} +3 -3
- package/dist/{renderer-CrxwW6VQ.mjs.map → renderer-Bhc24HVe.mjs.map} +1 -1
- package/dist/{renderer-BH7UCMPQ.mjs → renderer-BiNA2wF0.mjs} +2 -2
- package/dist/{renderer-BH7UCMPQ.mjs.map → renderer-BiNA2wF0.mjs.map} +1 -1
- package/dist/{renderer-DVPgWHZw.mjs → renderer-BmoBgTp5.mjs} +3 -3
- package/dist/{renderer-DVPgWHZw.mjs.map → renderer-BmoBgTp5.mjs.map} +1 -1
- package/dist/{renderer-C20efMI0.mjs → renderer-BmqFmCWS.mjs} +3 -3
- package/dist/{renderer-C20efMI0.mjs.map → renderer-BmqFmCWS.mjs.map} +1 -1
- package/dist/{renderer-B0yVUOPP.mjs → renderer-BnVwAObV.mjs} +2 -2
- package/dist/{renderer-B0yVUOPP.mjs.map → renderer-BnVwAObV.mjs.map} +1 -1
- package/dist/{renderer-CP8wLzTU.mjs → renderer-BxttZHme.mjs} +2 -2
- package/dist/{renderer-CP8wLzTU.mjs.map → renderer-BxttZHme.mjs.map} +1 -1
- package/dist/renderer-BzyPdUD1.mjs +5 -0
- package/dist/renderer-C0hM-mtY.mjs +5 -0
- package/dist/renderer-C6cyUTvk.mjs +5 -0
- package/dist/{renderer-BOSZAdgF.mjs → renderer-C8E4XsSg.mjs} +2 -2
- package/dist/{renderer-BOSZAdgF.mjs.map → renderer-C8E4XsSg.mjs.map} +1 -1
- package/dist/renderer-C8zY3pzk.mjs +5 -0
- package/dist/{renderer-DWq9gYRw.mjs → renderer-C9U-LY50.mjs} +3 -3
- package/dist/{renderer-DWq9gYRw.mjs.map → renderer-C9U-LY50.mjs.map} +1 -1
- package/dist/{renderer-Dj2H5JPR.mjs → renderer-CB2JVu5x.mjs} +3 -3
- package/dist/{renderer-Dj2H5JPR.mjs.map → renderer-CB2JVu5x.mjs.map} +1 -1
- package/dist/{renderer-Bcu3UrI-.mjs → renderer-CC4YBJ8Z.mjs} +3 -3
- package/dist/{renderer-Bcu3UrI-.mjs.map → renderer-CC4YBJ8Z.mjs.map} +1 -1
- package/dist/renderer-CEkSOyKu.mjs +5 -0
- package/dist/{renderer-DzLrvCB2.mjs → renderer-CIycc5O-.mjs} +2 -2
- package/dist/{renderer-DzLrvCB2.mjs.map → renderer-CIycc5O-.mjs.map} +1 -1
- package/dist/renderer-CJYtfa4x.mjs +5 -0
- package/dist/{renderer-BeNl_6EG.mjs → renderer-CJraQlV-.mjs} +2 -2
- package/dist/{renderer-BeNl_6EG.mjs.map → renderer-CJraQlV-.mjs.map} +1 -1
- package/dist/renderer-CKMtHGZh.mjs +5 -0
- package/dist/renderer-CLzicoiy.mjs +5 -0
- package/dist/renderer-CM2A4BHd.mjs +5 -0
- package/dist/{renderer-DtMVitEF.mjs → renderer-COWGWtob.mjs} +2 -2
- package/dist/{renderer-DtMVitEF.mjs.map → renderer-COWGWtob.mjs.map} +1 -1
- package/dist/{renderer-CT3zkfbf.mjs → renderer-COxG2XGf.mjs} +2 -2
- package/dist/{renderer-CT3zkfbf.mjs.map → renderer-COxG2XGf.mjs.map} +1 -1
- package/dist/{renderer-DNxWOz8Q.mjs → renderer-CQDCIsQm.mjs} +2 -2
- package/dist/{renderer-DNxWOz8Q.mjs.map → renderer-CQDCIsQm.mjs.map} +1 -1
- package/dist/{renderer-C5AoaymD.mjs → renderer-CRUeag8i.mjs} +3 -3
- package/dist/{renderer-C5AoaymD.mjs.map → renderer-CRUeag8i.mjs.map} +1 -1
- package/dist/{renderer-ngmYIIob.mjs → renderer-CWVput06.mjs} +3 -3
- package/dist/{renderer-ngmYIIob.mjs.map → renderer-CWVput06.mjs.map} +1 -1
- package/dist/renderer-CZlHjcxr.mjs +5 -0
- package/dist/{renderer-0rveCDm-.mjs → renderer-CbbnBLOB.mjs} +3 -3
- package/dist/{renderer-0rveCDm-.mjs.map → renderer-CbbnBLOB.mjs.map} +1 -1
- package/dist/renderer-CbimvSU8.mjs +5 -0
- package/dist/renderer-Ccvc63yd.mjs +5 -0
- package/dist/renderer-Cdp-SGfq.mjs +5 -0
- package/dist/renderer-CeTcSs3e.mjs +5 -0
- package/dist/{renderer-Brmbl12Y.mjs → renderer-CfLZein2.mjs} +3 -3
- package/dist/{renderer-Brmbl12Y.mjs.map → renderer-CfLZein2.mjs.map} +1 -1
- package/dist/{renderer-BJ8ea92W.mjs → renderer-Ch-q1O-q.mjs} +3 -3
- package/dist/{renderer-BJ8ea92W.mjs.map → renderer-Ch-q1O-q.mjs.map} +1 -1
- package/dist/{renderer-CP108ABB.mjs → renderer-Ch5JvJWl.mjs} +2 -2
- package/dist/{renderer-CP108ABB.mjs.map → renderer-Ch5JvJWl.mjs.map} +1 -1
- package/dist/{renderer-47y12Z37.mjs → renderer-ChtEzq-R.mjs} +2 -2
- package/dist/{renderer-47y12Z37.mjs.map → renderer-ChtEzq-R.mjs.map} +1 -1
- package/dist/{renderer-DhyMfG1v.mjs → renderer-Cj9nTC5l.mjs} +3 -3
- package/dist/{renderer-DhyMfG1v.mjs.map → renderer-Cj9nTC5l.mjs.map} +1 -1
- package/dist/{renderer-BDzn1AKF.mjs → renderer-CqT8HsSS.mjs} +2 -2
- package/dist/{renderer-BDzn1AKF.mjs.map → renderer-CqT8HsSS.mjs.map} +1 -1
- package/dist/{renderer-B7G1KohJ.mjs → renderer-CuQjMhdV.mjs} +2 -2
- package/dist/renderer-CvNuu52U.mjs +5 -0
- package/dist/renderer-CwciC0oI.mjs +5 -0
- package/dist/renderer-CysLUbIr.mjs +5 -0
- package/dist/{renderer-Cm0tsbQH.mjs → renderer-Cz30EVws.mjs} +2 -2
- package/dist/{renderer-Cm0tsbQH.mjs.map → renderer-Cz30EVws.mjs.map} +1 -1
- package/dist/renderer-D3A22Vxb.mjs +5 -0
- package/dist/renderer-D5SY9EmA.mjs +5 -0
- package/dist/renderer-D8h3ZvaE.mjs +5 -0
- package/dist/renderer-DE-B6N9n.mjs +5 -0
- package/dist/renderer-DETZTI7t.mjs +5 -0
- package/dist/{renderer-nHS3Sius.mjs → renderer-DHoX-5U_.mjs} +3 -3
- package/dist/{renderer-nHS3Sius.mjs.map → renderer-DHoX-5U_.mjs.map} +1 -1
- package/dist/{renderer-BWSRryIA.mjs → renderer-DOkm0Ycd.mjs} +2 -2
- package/dist/{renderer-BWSRryIA.mjs.map → renderer-DOkm0Ycd.mjs.map} +1 -1
- package/dist/{renderer-BHYJlK6H.d.mts → renderer-DU3f6ZrS.d.mts} +2 -2
- package/dist/{renderer-BHYJlK6H.d.mts.map → renderer-DU3f6ZrS.d.mts.map} +1 -1
- package/dist/{renderer-BpVOk9ux.mjs → renderer-DUzv-shq.mjs} +2 -2
- package/dist/{renderer-BpVOk9ux.mjs.map → renderer-DUzv-shq.mjs.map} +1 -1
- package/dist/renderer-DWnDj0IM.mjs +5 -0
- package/dist/renderer-DcGUIbQF.mjs +5 -0
- package/dist/renderer-Dfq6FoNO.mjs +5 -0
- package/dist/renderer-DhasXW6S.mjs +3 -0
- package/dist/{renderer-NRMlYkX6.mjs → renderer-DhnOWnEA.mjs} +3 -3
- package/dist/{renderer-NRMlYkX6.mjs.map → renderer-DhnOWnEA.mjs.map} +1 -1
- package/dist/{renderer-COgwYqev.mjs → renderer-Dhy1XHzz.mjs} +3 -3
- package/dist/{renderer-COgwYqev.mjs.map → renderer-Dhy1XHzz.mjs.map} +1 -1
- package/dist/renderer-DjCvpsV_.mjs +5 -0
- package/dist/{renderer-BfZNIiSv.mjs → renderer-DjJshz9Y.mjs} +2 -2
- package/dist/{renderer-BfZNIiSv.mjs.map → renderer-DjJshz9Y.mjs.map} +1 -1
- package/dist/{renderer-CKo7VR8x.mjs → renderer-DmTUIdus.mjs} +3 -3
- package/dist/{renderer-CKo7VR8x.mjs.map → renderer-DmTUIdus.mjs.map} +1 -1
- package/dist/{renderer-Baw6Utxi.mjs → renderer-Dq7AioJa.mjs} +2 -2
- package/dist/{renderer-Baw6Utxi.mjs.map → renderer-Dq7AioJa.mjs.map} +1 -1
- package/dist/renderer-DrAaM6JD.mjs +5 -0
- package/dist/{renderer-D-GWBoVT.mjs → renderer-Dt4sqNEu.mjs} +2 -2
- package/dist/{renderer-D-GWBoVT.mjs.map → renderer-Dt4sqNEu.mjs.map} +1 -1
- package/dist/{renderer-FYOL5Za6.mjs → renderer-Dtcs4idV.mjs} +3 -3
- package/dist/{renderer-FYOL5Za6.mjs.map → renderer-Dtcs4idV.mjs.map} +1 -1
- package/dist/renderer-Dxlv8LYm.mjs +5 -0
- package/dist/{renderer-D-RhYvVl.mjs → renderer-Gj8SrE2W.mjs} +2 -2
- package/dist/{renderer-D-RhYvVl.mjs.map → renderer-Gj8SrE2W.mjs.map} +1 -1
- package/dist/{renderer-D_j1WKMD.mjs → renderer-KfnXDJS0.mjs} +3 -3
- package/dist/{renderer-D_j1WKMD.mjs.map → renderer-KfnXDJS0.mjs.map} +1 -1
- package/dist/{renderer-Bpm145BW.mjs → renderer-MXVlg4p5.mjs} +3 -3
- package/dist/{renderer-Bpm145BW.mjs.map → renderer-MXVlg4p5.mjs.map} +1 -1
- package/dist/{renderer-Nnmi8Gt6.mjs → renderer-N2b6QZ1E.mjs} +3 -3
- package/dist/{renderer-Nnmi8Gt6.mjs.map → renderer-N2b6QZ1E.mjs.map} +1 -1
- package/dist/renderer-Pb43OO2t.mjs +5 -0
- package/dist/{renderer-Ca1KjNCO.mjs → renderer-Q7gDzm8c.mjs} +2 -2
- package/dist/{renderer-Ca1KjNCO.mjs.map → renderer-Q7gDzm8c.mjs.map} +1 -1
- package/dist/{renderer-D2wNFNRf.mjs → renderer-RCiANtRV.mjs} +2 -2
- package/dist/{renderer-D2wNFNRf.mjs.map → renderer-RCiANtRV.mjs.map} +1 -1
- package/dist/{renderer-Cqb7PGrI.mjs → renderer-Sig9nZcI.mjs} +2 -2
- package/dist/renderer-VQbm-cGr.mjs +5 -0
- package/dist/{renderer-W1bVNVR6.mjs → renderer-fabBgwQX.mjs} +3 -3
- package/dist/{renderer-W1bVNVR6.mjs.map → renderer-fabBgwQX.mjs.map} +1 -1
- package/dist/{renderer-zRq0j6Xy.mjs → renderer-g-0PCNoo.mjs} +3 -3
- package/dist/{renderer-zRq0j6Xy.mjs.map → renderer-g-0PCNoo.mjs.map} +1 -1
- package/dist/{renderer-2PjR3w-q.mjs → renderer-gmHKIbKI.mjs} +3 -3
- package/dist/{renderer-2PjR3w-q.mjs.map → renderer-gmHKIbKI.mjs.map} +1 -1
- package/dist/{renderer-03mYJLgX.mjs → renderer-kVZwiRoK.mjs} +3 -3
- package/dist/{renderer-03mYJLgX.mjs.map → renderer-kVZwiRoK.mjs.map} +1 -1
- package/dist/renderer-oPMypDM1.mjs +5 -0
- package/dist/{renderer-DcAKDAnS.mjs → renderer-p7tgxP-A.mjs} +3 -3
- package/dist/{renderer-DcAKDAnS.mjs.map → renderer-p7tgxP-A.mjs.map} +1 -1
- package/dist/{renderer-jUKdkmG5.mjs → renderer-tvYj306A.mjs} +81 -78
- package/dist/renderer-tvYj306A.mjs.map +1 -0
- package/dist/renderer-xvWGpVyp.mjs +5 -0
- package/dist/renderer-zafZbD6Q.mjs +5 -0
- package/dist/{renderers-CP8CFWDs-CshljORp.mjs → renderers-CP8CFWDs-DLjtjrwx.mjs} +2 -2
- package/dist/{renderers-CP8CFWDs-CshljORp.mjs.map → renderers-CP8CFWDs-DLjtjrwx.mjs.map} +1 -1
- package/dist/sam/index.d.mts +2 -2
- package/dist/sam/index.mjs +1 -1
- package/dist/signals/index.d.mts +4 -4
- package/dist/signals/index.mjs +4 -4
- package/dist/{src-BU6vm9sP-DdTHmCr4.mjs → src-B23p_eh7-Cj6-lvV6.mjs} +293 -6
- package/dist/src-B23p_eh7-Cj6-lvV6.mjs.map +1 -0
- package/dist/{src-Dy4gnc6w.mjs → src-CoHAjviq.mjs} +1349 -177
- package/dist/src-CoHAjviq.mjs.map +1 -0
- package/dist/storage/index.mjs +1 -1
- package/package.json +63 -60
- package/dist/dist--Uu5bQ_6.mjs.map +0 -1
- package/dist/dist-CiTgmfUw.mjs.map +0 -1
- package/dist/fonts-OW3yAfO5.mjs.map +0 -1
- package/dist/index-9xte4JgL.d.mts.map +0 -1
- package/dist/index-Bv7gxGK1.d.mts.map +0 -1
- package/dist/index-C5sgRLlG.d.mts.map +0 -1
- package/dist/index-C7-p9zwU.d.mts.map +0 -1
- package/dist/index-CRaydvLi.d.mts.map +0 -1
- package/dist/index-D1FqV1eu.d.mts.map +0 -1
- package/dist/preview-D7BGmE1E.mjs +0 -2446
- package/dist/preview-D7BGmE1E.mjs.map +0 -1
- package/dist/preview-engine/chunk-5DZTPUMH.mjs +0 -2568
- package/dist/preview-engine/chunk-NCQHOGZK.mjs +0 -3
- package/dist/preview-engine/chunk-PH3UUX6A.mjs +0 -138
- package/dist/preview-engine/chunk-UPZURPJY.mjs +0 -2227
- package/dist/preview-engine/renderers-DLJOA3BM.mjs +0 -228
- package/dist/program-tFKCWU2j.mjs.map +0 -1
- package/dist/renderer-6_bzbbXt.mjs +0 -5
- package/dist/renderer-8M-9G6F_.mjs +0 -5
- package/dist/renderer-B5OzKvF8.mjs +0 -5
- package/dist/renderer-BBCZ2qbE.mjs +0 -5
- package/dist/renderer-BChbxCux.mjs +0 -5
- package/dist/renderer-BGeMPr8C.mjs +0 -5
- package/dist/renderer-BPQ8Pkjb.mjs +0 -5
- package/dist/renderer-BTRpA3HD.mjs +0 -5
- package/dist/renderer-BVIXKfbC.mjs.map +0 -1
- package/dist/renderer-BVsECSn-.mjs +0 -5
- package/dist/renderer-Bgos68gc.mjs +0 -6
- package/dist/renderer-BjHOvoqO.mjs +0 -5
- package/dist/renderer-BjXMPPlV.mjs +0 -5
- package/dist/renderer-Byobxqkv.mjs +0 -5
- package/dist/renderer-CKrsg3EG.mjs +0 -5
- package/dist/renderer-Cj875NuH.mjs +0 -5
- package/dist/renderer-CnmzJoMv.mjs +0 -5
- package/dist/renderer-CtklDaMg.mjs +0 -5
- package/dist/renderer-D1tK3in_.mjs +0 -5
- package/dist/renderer-D2yc9P61.mjs +0 -5
- package/dist/renderer-D4v-JvSr.mjs +0 -5
- package/dist/renderer-D5yp74NL.mjs +0 -3
- package/dist/renderer-D7WRWDwB.mjs +0 -5
- package/dist/renderer-DGvA0tdB.mjs +0 -5
- package/dist/renderer-DO7v5Sdm.mjs +0 -5
- package/dist/renderer-DRVvt7-V.mjs +0 -5
- package/dist/renderer-DYMCd3jL.mjs +0 -5
- package/dist/renderer-DmHKw-MM.mjs +0 -5
- package/dist/renderer-DoDsuZ6G.mjs +0 -5
- package/dist/renderer-EpgclS70.mjs +0 -5
- package/dist/renderer-GroKiYyK.mjs +0 -5
- package/dist/renderer-MQ5K_xIS.mjs +0 -5
- package/dist/renderer-U43SflML.mjs +0 -5
- package/dist/renderer-UqOmBgCv.mjs +0 -5
- package/dist/renderer-XLULgJM0.mjs +0 -5
- package/dist/renderer-jUKdkmG5.mjs.map +0 -1
- package/dist/renderer-lNjxY1GG.mjs +0 -5
- package/dist/renderer-ukufL7pl.mjs +0 -5
- package/dist/renderer-wb0NCKdF.mjs +0 -5
- package/dist/src-BU6vm9sP-DdTHmCr4.mjs.map +0 -1
- package/dist/src-Dy4gnc6w.mjs.map +0 -1
|
@@ -1,2568 +0,0 @@
|
|
|
1
|
-
import{p as co,q as Li,u as lo,v as Oi,z as zo}from"./chunk-52X7SURQ.mjs";import{c as Si}from"./chunk-CJ4CSVU3.mjs";import{a as xi,c as wi,i as vi,j as Di}from"./chunk-HOV6DDBZ.mjs";import{h as _i,l as Mi}from"./chunk-RECQ74RP.mjs";import{e as Fi}from"./chunk-GXFYRMJZ.mjs";import{h as Qi}from"./chunk-ULOFDFHJ.mjs";import{A as Ti,j as gr,w as Ui,x as ki,y as Ye,z as Ni}from"./chunk-64L4GUOF.mjs";import{r as Re,s as Ri,t as _t}from"./chunk-QEWDIPJ7.mjs";import{a as Mt}from"./chunk-354GX6IB.mjs";import{c as Pi,e as Gi}from"./chunk-5RRKGN2U.mjs";import{o as Ze}from"./chunk-BDZ3TSOT.mjs";import{b as Vn,d as Ko,e as Ci,f as me,g as $}from"./chunk-Y4NIR77Z.mjs";var qi=Vn((lu,Wi)=>{$();var po=()=>new Proxy(function(){},{get:(e,t)=>t==="__esModule"?!0:t===Symbol.toPrimitive?()=>"":po(),apply:()=>po(),construct:()=>po()});Wi.exports=po()});var Aa=Vn(($o,Bo)=>{$();var L=L||{};L.scope={};L.ASSUME_ES2020=!1;L.ASSUME_ES6=L.ASSUME_ES2020;L.ASSUME_ES5=L.ASSUME_ES6;L.ASSUME_NO_NATIVE_MAP=!1;L.ASSUME_NO_NATIVE_SET=!1;L.ISOLATE_POLYFILLS=!1;L.FORCE_POLYFILL_PROMISE=!1;L.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION=!1;L.INSTRUMENT_ASYNC_CONTEXT=!0;L.objectCreate=L.ASSUME_ES5||typeof Object.create=="function"?Object.create:function(e){var t=function(){};return t.prototype=e,new t};L.defineProperty=L.ASSUME_ES5||typeof Object.defineProperties=="function"?Object.defineProperty:function(e,t,r){return e==Array.prototype||e==Object.prototype||(e[t]=r.value),e};L.getGlobal=function(e){e=[typeof globalThis=="object"&&globalThis,e,typeof window=="object"&&window,typeof self=="object"&&self,typeof globalThis=="object"&&globalThis];for(var t=0;t<e.length;++t){var r=e[t];if(r&&r.Math==Math)return r}throw Error("Cannot find global object")};L.global=L.ASSUME_ES2020?globalThis:L.getGlobal($o);L.IS_SYMBOL_NATIVE=typeof Symbol=="function"&&typeof Symbol("x")=="symbol";L.TRUST_ES6_POLYFILLS=!L.ISOLATE_POLYFILLS||L.IS_SYMBOL_NATIVE;L.polyfills={};L.propertyToPolyfillSymbol={};L.POLYFILL_PREFIX="$jscp$";L.TYPED_ARRAY_CLASSES=(function(){var e="Int8 Uint8 Uint8Clamped Int16 Uint16 Int32 Uint32 Float32 Float64".split(" ");return L.global.BigInt64Array&&(e.push("BigInt64"),e.push("BigUint64")),e})();L.polyfillTypedArrayMethod=function(e,t,r,n){if(t)for(var o=0;o<L.TYPED_ARRAY_CLASSES.length;o++){var A=L.TYPED_ARRAY_CLASSES[o]+"Array.prototype."+e;L.ISOLATE_POLYFILLS?L.polyfillIsolated(A,t,r,n):L.polyfillUnisolated(A,t,r,n)}};L.polyfill=function(e,t,r,n){t&&(L.ISOLATE_POLYFILLS?L.polyfillIsolated(e,t,r,n):L.polyfillUnisolated(e,t,r,n))};L.polyfillUnisolated=function(e,t,r,n){for(r=L.global,e=e.split("."),n=0;n<e.length-1;n++){var o=e[n];if(!(o in r))return;r=r[o]}e=e[e.length-1],n=r[e],t=t(n),t!=n&&t!=null&&L.defineProperty(r,e,{configurable:!0,writable:!0,value:t})};L.polyfillIsolated=function(e,t,r,n){var o=e.split(".");e=o.length===1,n=o[0],n=!e&&n in L.polyfills?L.polyfills:L.global;for(var A=0;A<o.length-1;A++){var i=o[A];if(!(i in n))return;n=n[i]}o=o[o.length-1],r=L.IS_SYMBOL_NATIVE&&r==="es6"?n[o]:null,t=t(r),t!=null&&(e?L.defineProperty(L.polyfills,o,{configurable:!0,writable:!0,value:t}):t!==r&&(L.propertyToPolyfillSymbol[o]===void 0&&(r=Math.random()*1e9>>>0,L.propertyToPolyfillSymbol[o]=L.IS_SYMBOL_NATIVE?L.global.Symbol(o):L.POLYFILL_PREFIX+r+"$"+o),L.defineProperty(n,L.propertyToPolyfillSymbol[o],{configurable:!0,writable:!0,value:t})))};L.getConstructImplementation=function(){function e(){function r(){}return new r,Reflect.construct(r,[],function(){}),new r instanceof r}if(L.TRUST_ES6_POLYFILLS&&typeof Reflect<"u"&&Reflect.construct){if(e())return Reflect.construct;var t=Reflect.construct;return function(r,n,o){return r=t(r,n),o&&Reflect.setPrototypeOf(r,o.prototype),r}}return function(r,n,o){return o===void 0&&(o=r),o=L.objectCreate(o.prototype||Object.prototype),Function.prototype.apply.call(r,o,n)||o}};L.construct={valueOf:L.getConstructImplementation}.valueOf();L.underscoreProtoCanBeSet=function(){var e={a:!0},t={};try{return t.__proto__=e,t.a}catch{}return!1};L.setPrototypeOf=L.ASSUME_ES6||L.TRUST_ES6_POLYFILLS&&typeof Object.setPrototypeOf=="function"?Object.setPrototypeOf:L.underscoreProtoCanBeSet()?function(e,t){if(e.__proto__=t,e.__proto__!==t)throw new TypeError(e+" is not extensible");return e}:null;L.inherits=function(e,t){if(e.prototype=L.objectCreate(t.prototype),e.prototype.constructor=e,L.ASSUME_ES6||L.setPrototypeOf){var r=L.setPrototypeOf;r(e,t)}else for(r in t)if(r!="prototype")if(Object.defineProperties){var n=Object.getOwnPropertyDescriptor(t,r);n&&Object.defineProperty(e,r,n)}else e[r]=t[r];e.superClass_=t.prototype};L.arrayIteratorImpl=function(e){var t=0;return function(){return t<e.length?{done:!1,value:e[t++]}:{done:!0}}};L.arrayIterator=function(e){return{next:L.arrayIteratorImpl(e)}};L.makeIterator=function(e){var t=typeof Symbol<"u"&&Symbol.iterator&&e[Symbol.iterator];if(t)return t.call(e);if(typeof e.length=="number")return L.arrayIterator(e);throw Error(String(e)+" is not an iterable or ArrayLike")};L.arrayFromIterator=function(e){for(var t,r=[];!(t=e.next()).done;)r.push(t.value);return r};L.arrayFromIterable=function(e){return e instanceof Array?e:L.arrayFromIterator(L.makeIterator(e))};L.createTemplateTagFirstArg=function(e){return L.createTemplateTagFirstArgWithRaw(e,e)};L.createTemplateTagFirstArgWithRaw=function(e,t){return e.raw=t,Object.freeze&&(Object.freeze(e),Object.freeze(t)),e};L.generator={};L.generator.ensureIteratorResultIsObject_=function(e){if(!(e instanceof Object))throw new TypeError("Iterator result "+e+" is not an object")};L.generator.Context=function(){this.isRunning_=!1,this.yieldAllIterator_=null,this.yieldResult=void 0,this.nextAddress=1,this.finallyAddress_=this.catchAddress_=0,this.finallyContexts_=this.abruptCompletion_=null};L.generator.Context.prototype.start_=function(){if(this.isRunning_)throw new TypeError("Generator is already running");this.isRunning_=!0};L.generator.Context.prototype.stop_=function(){this.isRunning_=!1};L.generator.Context.prototype.jumpToErrorHandler_=function(){this.nextAddress=this.catchAddress_||this.finallyAddress_};L.generator.Context.prototype.next_=function(e){this.yieldResult=e};L.generator.Context.prototype.throw_=function(e){this.abruptCompletion_={exception:e,isException:!0},this.jumpToErrorHandler_()};L.generator.Context.prototype.getNextAddressJsc=function(){return this.nextAddress};L.generator.Context.prototype.getNextAddressJsc=function(){return this.nextAddress};L.generator.Context.prototype.getYieldResultJsc=function(){return this.yieldResult};L.generator.Context.prototype.getYieldResultJsc=function(){return this.yieldResult};L.generator.Context.prototype.return=function(e){this.abruptCompletion_={return:e},this.nextAddress=this.finallyAddress_};L.generator.Context.prototype.return=L.generator.Context.prototype.return;L.generator.Context.prototype.jumpThroughFinallyBlocks=function(e){this.abruptCompletion_={jumpTo:e},this.nextAddress=this.finallyAddress_};L.generator.Context.prototype.jumpThroughFinallyBlocks=L.generator.Context.prototype.jumpThroughFinallyBlocks;L.generator.Context.prototype.yield=function(e,t){return this.nextAddress=t,{value:e}};L.generator.Context.prototype.yield=L.generator.Context.prototype.yield;L.generator.Context.prototype.yieldAll=function(e,t){e=L.makeIterator(e);var r=e.next();if(L.generator.ensureIteratorResultIsObject_(r),r.done)this.yieldResult=r.value,this.nextAddress=t;else return this.yieldAllIterator_=e,this.yield(r.value,t)};L.generator.Context.prototype.yieldAll=L.generator.Context.prototype.yieldAll;L.generator.Context.prototype.jumpTo=function(e){this.nextAddress=e};L.generator.Context.prototype.jumpTo=L.generator.Context.prototype.jumpTo;L.generator.Context.prototype.jumpToEnd=function(){this.nextAddress=0};L.generator.Context.prototype.jumpToEnd=L.generator.Context.prototype.jumpToEnd;L.generator.Context.prototype.setCatchFinallyBlocks=function(e,t){this.catchAddress_=e,t!=null&&(this.finallyAddress_=t)};L.generator.Context.prototype.setCatchFinallyBlocks=L.generator.Context.prototype.setCatchFinallyBlocks;L.generator.Context.prototype.setFinallyBlock=function(e){this.catchAddress_=0,this.finallyAddress_=e||0};L.generator.Context.prototype.setFinallyBlock=L.generator.Context.prototype.setFinallyBlock;L.generator.Context.prototype.leaveTryBlock=function(e,t){this.nextAddress=e,this.catchAddress_=t||0};L.generator.Context.prototype.leaveTryBlock=L.generator.Context.prototype.leaveTryBlock;L.generator.Context.prototype.enterCatchBlock=function(e){return this.catchAddress_=e||0,e=this.abruptCompletion_.exception,this.abruptCompletion_=null,e};L.generator.Context.prototype.enterCatchBlock=L.generator.Context.prototype.enterCatchBlock;L.generator.Context.prototype.enterFinallyBlock=function(e,t,r){r?this.finallyContexts_[r]=this.abruptCompletion_:this.finallyContexts_=[this.abruptCompletion_],this.catchAddress_=e||0,this.finallyAddress_=t||0};L.generator.Context.prototype.enterFinallyBlock=L.generator.Context.prototype.enterFinallyBlock;L.generator.Context.prototype.leaveFinallyBlock=function(e,t){if(t=this.finallyContexts_.splice(t||0)[0],t=this.abruptCompletion_=this.abruptCompletion_||t){if(t.isException)return this.jumpToErrorHandler_();t.jumpTo!=null&&this.finallyAddress_<t.jumpTo?(this.nextAddress=t.jumpTo,this.abruptCompletion_=null):this.nextAddress=this.finallyAddress_}else this.nextAddress=e};L.generator.Context.prototype.leaveFinallyBlock=L.generator.Context.prototype.leaveFinallyBlock;L.generator.Context.prototype.forIn=function(e){return new L.generator.Context.PropertyIterator(e)};L.generator.Context.prototype.forIn=L.generator.Context.prototype.forIn;L.generator.Context.PropertyIterator=function(e){this.object_=e,this.properties_=[];for(var t in e)this.properties_.push(t);this.properties_.reverse()};L.generator.Context.PropertyIterator.prototype.getNext=function(){for(;this.properties_.length>0;){var e=this.properties_.pop();if(e in this.object_)return e}return null};L.generator.Context.PropertyIterator.prototype.getNext=L.generator.Context.PropertyIterator.prototype.getNext;L.generator.Engine_=function(e){this.context_=new L.generator.Context,this.program_=e};L.generator.Engine_.prototype.next_=function(e){return this.context_.start_(),this.context_.yieldAllIterator_?this.yieldAllStep_(this.context_.yieldAllIterator_.next,e,this.context_.next_):(this.context_.next_(e),this.nextStep_())};L.generator.Engine_.prototype.return_=function(e){this.context_.start_();var t=this.context_.yieldAllIterator_;return t?this.yieldAllStep_("return"in t?t.return:function(r){return{value:r,done:!0}},e,this.context_.return):(this.context_.return(e),this.nextStep_())};L.generator.Engine_.prototype.throw_=function(e){return this.context_.start_(),this.context_.yieldAllIterator_?this.yieldAllStep_(this.context_.yieldAllIterator_.throw,e,this.context_.next_):(this.context_.throw_(e),this.nextStep_())};L.generator.Engine_.prototype.yieldAllStep_=function(e,t,r){try{var n=e.call(this.context_.yieldAllIterator_,t);if(L.generator.ensureIteratorResultIsObject_(n),!n.done)return this.context_.stop_(),n;var o=n.value}catch(A){return this.context_.yieldAllIterator_=null,this.context_.throw_(A),this.nextStep_()}return this.context_.yieldAllIterator_=null,r.call(this.context_,o),this.nextStep_()};L.generator.Engine_.prototype.nextStep_=function(){for(;this.context_.nextAddress;)try{var e=this.program_(this.context_);if(e)return this.context_.stop_(),{value:e.value,done:!1}}catch(t){this.context_.yieldResult=void 0,this.context_.throw_(t)}if(this.context_.stop_(),this.context_.abruptCompletion_){if(e=this.context_.abruptCompletion_,this.context_.abruptCompletion_=null,e.isException)throw e.exception;return{value:e.return,done:!0}}return{value:void 0,done:!0}};L.generator.Generator_=function(e){this.next=function(t){return e.next_(t)},this.throw=function(t){return e.throw_(t)},this.return=function(t){return e.return_(t)},this[Symbol.iterator]=function(){return this}};L.generator.createGenerator=function(e,t){return t=new L.generator.Generator_(new L.generator.Engine_(t)),L.setPrototypeOf&&e.prototype&&L.setPrototypeOf(t,e.prototype),t};L.asyncExecutePromiseGenerator=function(e){function t(n){return e.next(n)}function r(n){return e.throw(n)}return new Promise(function(n,o){function A(i){i.done?n(i.value):Promise.resolve(i.value).then(t,r).then(A,o)}A(e.next())})};L.asyncExecutePromiseGeneratorFunction=function(e){return L.asyncExecutePromiseGenerator(e())};L.asyncExecutePromiseGeneratorProgram=function(e){return L.asyncExecutePromiseGenerator(new L.generator.Generator_(new L.generator.Engine_(e)))};L.polyfill("globalThis",function(e){return e||L.global},"es_2020","es3");L.polyfill("Reflect",function(e){return e||{}},"es6","es3");L.polyfill("Reflect.construct",function(e){return L.construct},"es6","es3");L.polyfill("Reflect.setPrototypeOf",function(e){if(e)return e;if(L.setPrototypeOf){var t=L.setPrototypeOf;return function(r,n){try{return t(r,n),!0}catch{return!1}}}return null},"es6","es5");L.initSymbol=function(){};L.polyfill("Symbol",function(e){if(e)return e;var t=function(A,i){this.$jscomp$symbol$id_=A,L.defineProperty(this,"description",{configurable:!0,writable:!0,value:i})};t.prototype.toString=function(){return this.$jscomp$symbol$id_};var r="jscomp_symbol_"+(Math.random()*1e9>>>0)+"_",n=0,o=function(A){if(this instanceof o)throw new TypeError("Symbol is not a constructor");return new t(r+(A||"")+"_"+n++,A)};return o},"es6","es3");L.polyfill("Symbol.iterator",function(e){return e||(e=Symbol("Symbol.iterator"),L.defineProperty(Array.prototype,e,{configurable:!0,writable:!0,value:function(){return L.iteratorPrototype(L.arrayIteratorImpl(this))}}),e)},"es6","es3");L.iteratorPrototype=function(e){return e={next:e},e[Symbol.iterator]=function(){return this},e};L.polyfill("Promise",function(e){function t(){this.batch_=null}function r(i){return i instanceof o?i:new o(function(a,s){a(i)})}if(e&&(!(L.FORCE_POLYFILL_PROMISE||L.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION&&typeof L.global.PromiseRejectionEvent>"u")||!L.global.Promise||L.global.Promise.toString().indexOf("[native code]")===-1))return e;t.prototype.asyncExecute=function(i){if(this.batch_==null){this.batch_=[];var a=this;this.asyncExecuteFunction(function(){a.executeBatch_()})}this.batch_.push(i)};var n=L.global.setTimeout;t.prototype.asyncExecuteFunction=function(i){n(i,0)},t.prototype.executeBatch_=function(){for(;this.batch_&&this.batch_.length;){var i=this.batch_;this.batch_=[];for(var a=0;a<i.length;++a){var s=i[a];i[a]=null;try{s()}catch(c){this.asyncThrow_(c)}}}this.batch_=null},t.prototype.asyncThrow_=function(i){this.asyncExecuteFunction(function(){throw i})};var o=function(i){this.state_=0,this.result_=void 0,this.onSettledCallbacks_=[],this.isRejectionHandled_=!1;var a=this.createResolveAndReject_();try{i(a.resolve,a.reject)}catch(s){a.reject(s)}};o.prototype.createResolveAndReject_=function(){function i(c){return function(l){s||(s=!0,c.call(a,l))}}var a=this,s=!1;return{resolve:i(this.resolveTo_),reject:i(this.reject_)}},o.prototype.resolveTo_=function(i){if(i===this)this.reject_(new TypeError("A Promise cannot resolve to itself"));else if(i instanceof o)this.settleSameAsPromise_(i);else{e:switch(typeof i){case"object":var a=i!=null;break e;case"function":a=!0;break e;default:a=!1}a?this.resolveToNonPromiseObj_(i):this.fulfill_(i)}},o.prototype.resolveToNonPromiseObj_=function(i){var a=void 0;try{a=i.then}catch(s){this.reject_(s);return}typeof a=="function"?this.settleSameAsThenable_(a,i):this.fulfill_(i)},o.prototype.reject_=function(i){this.settle_(2,i)},o.prototype.fulfill_=function(i){this.settle_(1,i)},o.prototype.settle_=function(i,a){if(this.state_!=0)throw Error("Cannot settle("+i+", "+a+"): Promise already settled in state"+this.state_);this.state_=i,this.result_=a,this.state_===2&&this.scheduleUnhandledRejectionCheck_(),this.executeOnSettledCallbacks_()},o.prototype.scheduleUnhandledRejectionCheck_=function(){var i=this;n(function(){if(i.notifyUnhandledRejection_()){var a=L.global.console;typeof a<"u"&&a.error(i.result_)}},1)},o.prototype.notifyUnhandledRejection_=function(){if(this.isRejectionHandled_)return!1;var i=L.global.CustomEvent,a=L.global.Event,s=L.global.dispatchEvent;return typeof s>"u"?!0:(typeof i=="function"?i=new i("unhandledrejection",{cancelable:!0}):typeof a=="function"?i=new a("unhandledrejection",{cancelable:!0}):(i=L.global.document.createEvent("CustomEvent"),i.initCustomEvent("unhandledrejection",!1,!0,i)),i.promise=this,i.reason=this.result_,s(i))},o.prototype.executeOnSettledCallbacks_=function(){if(this.onSettledCallbacks_!=null){for(var i=0;i<this.onSettledCallbacks_.length;++i)A.asyncExecute(this.onSettledCallbacks_[i]);this.onSettledCallbacks_=null}};var A=new t;return o.prototype.settleSameAsPromise_=function(i){var a=this.createResolveAndReject_();i.callWhenSettled_(a.resolve,a.reject)},o.prototype.settleSameAsThenable_=function(i,a){var s=this.createResolveAndReject_();try{i.call(a,s.resolve,s.reject)}catch(c){s.reject(c)}},o.prototype.then=function(i,a){function s(g,p){return typeof g=="function"?function(d){try{c(g(d))}catch(f){l(f)}}:p}var c,l,u=new o(function(g,p){c=g,l=p});return this.callWhenSettled_(s(i,c),s(a,l)),u},o.prototype.catch=function(i){return this.then(void 0,i)},o.prototype.callWhenSettled_=function(i,a){function s(){switch(c.state_){case 1:i(c.result_);break;case 2:a(c.result_);break;default:throw Error("Unexpected state: "+c.state_)}}var c=this;this.onSettledCallbacks_==null?A.asyncExecute(s):this.onSettledCallbacks_.push(s),this.isRejectionHandled_=!0},o.resolve=r,o.reject=function(i){return new o(function(a,s){s(i)})},o.race=function(i){return new o(function(a,s){for(var c=L.makeIterator(i),l=c.next();!l.done;l=c.next())r(l.value).callWhenSettled_(a,s)})},o.all=function(i){var a=L.makeIterator(i),s=a.next();return s.done?r([]):new o(function(c,l){function u(d){return function(f){g[d]=f,p--,p==0&&c(g)}}var g=[],p=0;do g.push(void 0),p++,r(s.value).callWhenSettled_(u(g.length-1),l),s=a.next();while(!s.done)})},o},"es6","es3");L.checkStringArgs=function(e,t,r){if(e==null)throw new TypeError("The 'this' value for String.prototype."+r+" must not be null or undefined");if(t instanceof RegExp)throw new TypeError("First argument to String.prototype."+r+" must not be a regular expression");return e+""};L.polyfill("String.prototype.startsWith",function(e){return e||function(t,r){var n=L.checkStringArgs(this,t,"startsWith");t+="";var o=n.length,A=t.length;r=Math.max(0,Math.min(r|0,n.length));for(var i=0;i<A&&r<o;)if(n[r++]!=t[i++])return!1;return i>=A}},"es6","es3");L.polyfill("String.prototype.codePointAt",function(e){return e||function(t){var r=L.checkStringArgs(this,null,"codePointAt"),n=r.length;if(t=Number(t)||0,t>=0&&t<n){t|=0;var o=r.charCodeAt(t);return o<55296||o>56319||t+1===n?o:(t=r.charCodeAt(t+1),t<56320||t>57343?o:(o-55296)*1024+t+9216)}}},"es6","es3");var Zo=(function(){var e,t,r=(e=globalThis.document)==null||(t=e.currentScript)==null?void 0:t.src;return function(n){function o(ee){ee&&typeof ee=="object"&&(ee=ee.ptr),this.ptr=yn(ee),j(o)[this.ptr]=this}function A(){this.ptr=un(),j(A)[this.ptr]=this}function i(){this.ptr=Fe(),j(i)[this.ptr]=this}function a(){this.ptr=C(),j(a)[this.ptr]=this}function s(){this.ptr=Tr(),j(s)[this.ptr]=this}function c(){this.ptr=kr(),j(c)[this.ptr]=this}function l(){this.ptr=Ur(),j(l)[this.ptr]=this}function u(){this.ptr=Pr(),j(u)[this.ptr]=this}function g(){this.ptr=Dr(),j(g)[this.ptr]=this}function p(){this.ptr=or(),j(p)[this.ptr]=this}function d(){this.ptr=at(),j(d)[this.ptr]=this}function f(){throw"cannot construct a VoidPtr, no constructor in IDL"}function h(ee){if(typeof ee=="object"){for(var E=De.alloc(ee,nr),v=E/4,P=0;P<ee.length;P++)nr[v+P]=ee[P];return E}return ee}function I(ee){if(typeof ee=="object"){for(var E=De.alloc(ee,Ut),v=E/4,P=0;P<ee.length;P++)Ut[v+P]=ee[P];return E}return ee}function b(ee){if(typeof ee=="object"){for(var E=De.alloc(ee,rr),v=E/2,P=0;P<ee.length;P++)rr[v+P]=ee[P];return E}return ee}function D(ee){if(typeof ee=="object"){for(var E=De.alloc(ee,Je),v=0;v<ee.length;v++)Je[E+v]=ee[v];return E}return ee}function m(ee){if(typeof ee=="string"){ee=dt(ee);for(var E=De.alloc(ee,Je),v=0;v<ee.length;v++)Je[E+v]=ee[v];return E}return ee}function Q(ee){return ee.__class__}function w(ee){return ee.ptr}function S(ee,E){return ee.ptr===E.ptr}function N(ee){if(!ee.__destroy__)throw"Error: Cannot destroy object. (Did you create it yourself?)";ee.__destroy__(),delete j(ee.__class__)[ee.ptr]}function M(ee,E){return G(ee.ptr,E)}function G(ee,E){var v=j(E),P=v[ee];return P||(P=Object.create((E||R).prototype),P.ptr=ee,v[ee]=P)}function j(ee){return(ee||R).__cache__}function R(){}function K(){var ee,E,v;return(0,L.asyncExecutePromiseGeneratorProgram)(function(P){if(P.getNextAddressJsc()==1)return oe(),ee=F.setStatus,ee?(ee("Running..."),P.yield(new Promise(function(Y){return setTimeout(Y,1)}),3)):P.jumpTo(2);if(P.getNextAddressJsc()!=2&&setTimeout(ee,1,""),Ue)return P.return();je=!0,tt(vt),Or.e(),(v=(E=F).onRuntimeInitialized)==null||v.call(E),re(),P.jumpToEnd()})}function z(){function ee(U){return U=Or=U.exports,F._webidl_free=U.f,F._free=U.g,F._webidl_malloc=U.h,F._malloc=U.i,xr=F._emscripten_bind_VoidPtr___destroy___0=U.j,at=F._emscripten_bind_GeometryAttribute_GeometryAttribute_0=U.k,Yt=F._emscripten_bind_GeometryAttribute___destroy___0=U.l,or=F._emscripten_bind_PointAttribute_PointAttribute_0=U.m,ot=F._emscripten_bind_PointAttribute_size_0=U.n,Ct=F._emscripten_bind_PointAttribute_attribute_type_0=U.o,kt=F._emscripten_bind_PointAttribute_data_type_0=U.p,Wt=F._emscripten_bind_PointAttribute_num_components_0=U.q,qt=F._emscripten_bind_PointAttribute_normalized_0=U.r,Xt=F._emscripten_bind_PointAttribute_byte_stride_0=U.s,Zt=F._emscripten_bind_PointAttribute_byte_offset_0=U.t,wr=F._emscripten_bind_PointAttribute_unique_id_0=U.u,vr=F._emscripten_bind_PointAttribute___destroy___0=U.v,Dr=F._emscripten_bind_PointCloud_PointCloud_0=U.w,_r=F._emscripten_bind_PointCloud_num_attributes_0=U.x,Mr=F._emscripten_bind_PointCloud_num_points_0=U.y,Sr=F._emscripten_bind_PointCloud___destroy___0=U.z,Pr=F._emscripten_bind_Mesh_Mesh_0=U.A,Gr=F._emscripten_bind_Mesh_num_faces_0=U.B,Rr=F._emscripten_bind_Mesh_num_attributes_0=U.C,Ar=F._emscripten_bind_Mesh_num_points_0=U.D,Nt=F._emscripten_bind_Mesh_set_num_points_1=U.E,Fr=F._emscripten_bind_Mesh___destroy___0=U.F,Ur=F._emscripten_bind_Metadata_Metadata_0=U.G,ir=F._emscripten_bind_Metadata___destroy___0=U.H,kr=F._emscripten_bind_DracoInt8Array_DracoInt8Array_0=U.I,ar=F._emscripten_bind_DracoInt8Array_GetValue_1=U.J,Tt=F._emscripten_bind_DracoInt8Array_size_0=U.K,Nr=F._emscripten_bind_DracoInt8Array___destroy___0=U.L,Tr=F._emscripten_bind_MetadataBuilder_MetadataBuilder_0=U.M,sr=F._emscripten_bind_MetadataBuilder_AddStringEntry_3=U.N,$t=F._emscripten_bind_MetadataBuilder_AddIntEntry_3=U.O,st=F._emscripten_bind_MetadataBuilder_AddIntEntryArray_4=U.P,Lt=F._emscripten_bind_MetadataBuilder_AddDoubleEntry_3=U.Q,cr=F._emscripten_bind_MetadataBuilder___destroy___0=U.R,C=F._emscripten_bind_PointCloudBuilder_PointCloudBuilder_0=U.S,x=F._emscripten_bind_PointCloudBuilder_AddFloatAttribute_5=U.T,k=F._emscripten_bind_PointCloudBuilder_AddInt8Attribute_5=U.U,V=F._emscripten_bind_PointCloudBuilder_AddUInt8Attribute_5=U.V,q=F._emscripten_bind_PointCloudBuilder_AddInt16Attribute_5=U.W,te=F._emscripten_bind_PointCloudBuilder_AddUInt16Attribute_5=U.X,ae=F._emscripten_bind_PointCloudBuilder_AddInt32Attribute_5=U.Y,se=F._emscripten_bind_PointCloudBuilder_AddUInt32Attribute_5=U.Z,pe=F._emscripten_bind_PointCloudBuilder_AddMetadata_2=U._,ue=F._emscripten_bind_PointCloudBuilder_SetMetadataForAttribute_3=U.$,fe=F._emscripten_bind_PointCloudBuilder_SetNormalizedFlagForAttribute_3=U.aa,ve=F._emscripten_bind_PointCloudBuilder___destroy___0=U.ba,Fe=F._emscripten_bind_MeshBuilder_MeshBuilder_0=U.ca,Ke=F._emscripten_bind_MeshBuilder_AddFacesToMesh_3=U.da,Ne=F._emscripten_bind_MeshBuilder_AddFloatAttributeToMesh_5=U.ea,et=F._emscripten_bind_MeshBuilder_AddInt32AttributeToMesh_5=U.fa,At=F._emscripten_bind_MeshBuilder_AddMetadataToMesh_2=U.ga,Dt=F._emscripten_bind_MeshBuilder_AddFloatAttribute_5=U.ha,ct=F._emscripten_bind_MeshBuilder_AddInt8Attribute_5=U.ia,lr=F._emscripten_bind_MeshBuilder_AddUInt8Attribute_5=U.ja,ur=F._emscripten_bind_MeshBuilder_AddInt16Attribute_5=U.ka,nn=F._emscripten_bind_MeshBuilder_AddUInt16Attribute_5=U.la,on=F._emscripten_bind_MeshBuilder_AddInt32Attribute_5=U.ma,An=F._emscripten_bind_MeshBuilder_AddUInt32Attribute_5=U.na,an=F._emscripten_bind_MeshBuilder_AddMetadata_2=U.oa,sn=F._emscripten_bind_MeshBuilder_SetMetadataForAttribute_3=U.pa,cn=F._emscripten_bind_MeshBuilder_SetNormalizedFlagForAttribute_3=U.qa,ln=F._emscripten_bind_MeshBuilder___destroy___0=U.ra,un=F._emscripten_bind_Encoder_Encoder_0=U.sa,gn=F._emscripten_bind_Encoder_SetEncodingMethod_1=U.ta,pn=F._emscripten_bind_Encoder_SetAttributeQuantization_2=U.ua,dn=F._emscripten_bind_Encoder_SetAttributeExplicitQuantization_5=U.va,fn=F._emscripten_bind_Encoder_SetSpeedOptions_2=U.wa,hn=F._emscripten_bind_Encoder_SetTrackEncodedProperties_1=U.xa,mn=F._emscripten_bind_Encoder_EncodeMeshToDracoBuffer_2=U.ya,In=F._emscripten_bind_Encoder_EncodePointCloudToDracoBuffer_3=U.za,Bn=F._emscripten_bind_Encoder_GetNumberOfEncodedPoints_0=U.Aa,bn=F._emscripten_bind_Encoder_GetNumberOfEncodedFaces_0=U.Ba,En=F._emscripten_bind_Encoder___destroy___0=U.Ca,yn=F._emscripten_bind_ExpertEncoder_ExpertEncoder_1=U.Da,Cn=F._emscripten_bind_ExpertEncoder_SetEncodingMethod_1=U.Ea,Qn=F._emscripten_bind_ExpertEncoder_SetAttributeQuantization_2=U.Fa,xn=F._emscripten_bind_ExpertEncoder_SetAttributeExplicitQuantization_5=U.Ga,wn=F._emscripten_bind_ExpertEncoder_SetSpeedOptions_2=U.Ha,vn=F._emscripten_bind_ExpertEncoder_SetTrackEncodedProperties_1=U.Ia,Dn=F._emscripten_bind_ExpertEncoder_EncodeToDracoBuffer_2=U.Ja,_n=F._emscripten_bind_ExpertEncoder_GetNumberOfEncodedPoints_0=U.Ka,Mn=F._emscripten_bind_ExpertEncoder_GetNumberOfEncodedFaces_0=U.La,Sn=F._emscripten_bind_ExpertEncoder___destroy___0=U.Ma,Pn=F._emscripten_enum_draco_GeometryAttribute_Type_INVALID=U.Na,Gn=F._emscripten_enum_draco_GeometryAttribute_Type_POSITION=U.Oa,Rn=F._emscripten_enum_draco_GeometryAttribute_Type_NORMAL=U.Pa,Fn=F._emscripten_enum_draco_GeometryAttribute_Type_COLOR=U.Qa,Un=F._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=U.Ra,kn=F._emscripten_enum_draco_GeometryAttribute_Type_GENERIC=U.Sa,Nn=F._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=U.Ta,Tn=F._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=U.Ua,Ln=F._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=U.Va,On=F._emscripten_enum_draco_MeshEncoderMethod_MESH_SEQUENTIAL_ENCODING=U.Wa,Hn=F._emscripten_enum_draco_MeshEncoderMethod_MESH_EDGEBREAKER_ENCODING=U.Xa,Lr=U.d,ne(),Or}var E,v,P,Y;return(0,L.asyncExecutePromiseGeneratorProgram)(function(U){return U.getNextAddressJsc()==1?(E={a:jn},(v=F.instantiateWasm)?U.return(new Promise(function(Ce){v(E,function(rt){return Ce(ee(rt))})})):(Le!=null||(Le=ie("draco_encoder.wasm")),U.yield(J(Ge,Le,E),2))):(P=U.getYieldResultJsc(),Y=ee(P.instance),U.return(Y))})}function J(ee,E,v){var P,Y,U;return(0,L.asyncExecutePromiseGeneratorProgram)(function(Ce){switch(Ce.getNextAddressJsc()){case 1:if(ee||_e(E)||ye){Ce.jumpTo(2);break}return Ce.setCatchFinallyBlocks(3),P=fetch(E,{credentials:"same-origin"}),Ce.yield(WebAssembly.instantiateStreaming(P,v),5);case 5:return Y=Ce.getYieldResultJsc(),Ce.return(Y);case 3:U=Ce.enterCatchBlock(),Me("wasm streaming compile failed: "+U),Me("falling back to ArrayBuffer instantiation");case 2:return Ce.return(W(E,v))}})}function W(ee,E){var v,P,Y;return(0,L.asyncExecutePromiseGeneratorProgram)(function(U){switch(U.getNextAddressJsc()){case 1:return U.setCatchFinallyBlocks(2),U.yield(X(ee),4);case 4:return v=U.getYieldResultJsc(),U.yield(WebAssembly.instantiate(v,E),5);case 5:return P=U.getYieldResultJsc(),U.return(P);case 2:Y=U.enterCatchBlock(),Me("failed to asynchronously prepare wasm: "+Y),Ae(Y),U.jumpToEnd()}})}function X(ee){var E;return(0,L.asyncExecutePromiseGeneratorProgram)(function(v){switch(v.getNextAddressJsc()){case 1:if(Ge){v.jumpTo(2);break}return v.setCatchFinallyBlocks(3),v.yield(ge(ee),5);case 5:return E=v.getYieldResultJsc(),v.return(new Uint8Array(E));case 3:v.enterCatchBlock();case 2:var P=v.return;if(ee==Le&&Ge)var Y=new Uint8Array(Ge);else if(be)Y=be(ee);else throw"both async and sync fetching of the wasm failed";return P.call(v,Y)}})}function Ae(ee){var E,v;throw(v=(E=F).onAbort)==null||v.call(E,ee),ee="Aborted("+ee+")",Me(ee),Ue=!0,new WebAssembly.RuntimeError(ee+". Build with -sASSERTIONS for more info.")}function re(){var ee=F.postRun;ee&&(typeof ee=="function"&&(ee=[ee]),qe.push.apply(qe,(0,L.arrayFromIterable)(ee))),tt(qe)}function oe(){var ee=F.preRun;ee&&(typeof ee=="function"&&(ee=[ee]),Bt.push.apply(Bt,(0,L.arrayFromIterable)(ee))),tt(Bt)}function ne(){var ee,E;!((ee=Je)==null||(E=ee.buffer)==null)&&E.resizable||(ee=Lr.buffer,F.HEAP8=Je=new Int8Array(ee),F.HEAP16=rr=new Int16Array(ee),F.HEAPU8=pt=new Uint8Array(ee),F.HEAPU16=new Uint16Array(ee),F.HEAP32=Ut=new Int32Array(ee),F.HEAPU32=ze=new Uint32Array(ee),F.HEAPF32=nr=new Float32Array(ee),F.HEAPF64=new Float64Array(ee))}function ie(ee){return F.locateFile?F.locateFile(ee,le):le+ee}function he(ee){return typeof ee!="string"?!1:(ee=ee.split("."),ee.length<2||ee.length>3?!1:ee[0]==1&&ee[1]>=0&&ee[1]<=5?!0:!(ee[0]!=0||ee[1]>10))}n=n===void 0?{}:n;var F,Be,Se,Pe,Ie,y,ye,Qe,xe,le,ge,be,we,Me,Ge,Ue,_e,He,Te,je,Le,Je,tt,qe,Bt,ze,Ve,bt,ut,Et,gt,Xe,ht,Rt,pt,zt,it,Ft,dt,vt,Qr,rr,Ut,nr,yt,xr,at,Yt,or,ot,Ct,kt,Wt,qt,Xt,Zt,wr,vr,Dr,_r,Mr,Sr,Pr,Gr,Rr,Ar,Nt,Fr,Ur,ir,kr,ar,Tt,Nr,Tr,sr,$t,st,Lt,cr,C,x,k,V,q,te,ae,se,pe,ue,fe,ve,Fe,Ke,Ne,et,At,Dt,ct,lr,ur,nn,on,An,an,sn,cn,ln,un,gn,pn,dn,fn,hn,mn,In,Bn,bn,En,yn,Cn,Qn,xn,wn,vn,Dn,_n,Mn,Sn,Pn,Gn,Rn,Fn,Un,kn,Nn,Tn,Ln,On,Hn,Lr,jn,Or,De;return(0,L.asyncExecutePromiseGeneratorProgram)(function(ee){if(ee.getNextAddressJsc()==1){if(F=n,Be=!!globalThis.window,Se=!!globalThis.WorkerGlobalScope,ye=((Pe=globalThis.process)==null||(Ie=Pe.versions)==null?void 0:Ie.node)&&((y=globalThis.process)==null?void 0:y.type)!="renderer",xe=Qe=!1,F.onRuntimeInitialized=function(){Qe=!0,xe&&typeof F.onModuleLoaded=="function"&&F.onModuleLoaded(F)},F.onModuleParsed=function(){xe=!0,Qe&&typeof F.onModuleLoaded=="function"&&F.onModuleLoaded(F)},F.isVersionSupported=he,typeof __filename<"u"?r=__filename:Se&&(r=self.location.href),le="",ye)we=(_t(),Ci(Ri)),le=__dirname+"/",be=function(E){return E=_e(E)?new URL(E):E,we.readFileSync(E)},ge=function(E,v){v=v===void 0?!0:v;var P;return(0,L.asyncExecutePromiseGeneratorProgram)(function(Y){return E=_e(E)?new URL(E):E,P=we.readFileSync(E,v?void 0:"utf8"),Y.return(P)})},me.argv.length>1&&me.argv[1].replace(/\\/g,"/"),me.argv.slice(2);else if(Be||Se){try{le=new URL(".",r).href}catch{}Se&&(be=function(E){var v=new XMLHttpRequest;return v.open("GET",E,!1),v.responseType="arraybuffer",v.send(null),new Uint8Array(v.response)}),ge=function(E){var v;return(0,L.asyncExecutePromiseGeneratorProgram)(function(P){if(P.getNextAddressJsc()==1)return _e(E)?P.return(new Promise(function(Y,U){var Ce=new XMLHttpRequest;Ce.open("GET",E,!0),Ce.responseType="arraybuffer",Ce.onload=function(){Ce.status==200||Ce.status==0&&Ce.response?Y(Ce.response):U(Ce.status)},Ce.onerror=U,Ce.send(null)})):P.yield(fetch(E,{credentials:"same-origin"}),2);if(v=P.getYieldResultJsc(),v.ok)return P.return(v.arrayBuffer());throw Error(v.status+" : "+v.url)})}}if(console.log.bind(console),Me=console.error.bind(console),Ue=!1,_e=function(E){return E.startsWith("file://")},He=function(){},Te=function(){return He.apply(this,arguments)||this},L.inherits(Te,He),je=!1,tt=function(E){for(;E.length>0;)E.shift()(F)},qe=[],Bt=[],Ve=function(E){this.excPtr=E,this.ptr=E-24},Ve.prototype.set_type=function(E){ze[this.ptr+4>>2]=E},Ve.prototype.get_type=function(){return ze[this.ptr+4>>2]},Ve.prototype.set_destructor=function(E){ze[this.ptr+8>>2]=E},Ve.prototype.get_destructor=function(){return ze[this.ptr+8>>2]},Ve.prototype.set_caught=function(E){Je[this.ptr+12]=E?1:0},Ve.prototype.get_caught=function(){return Je[this.ptr+12]!=0},Ve.prototype.set_rethrown=function(E){Je[this.ptr+13]=E?1:0},Ve.prototype.get_rethrown=function(){return Je[this.ptr+13]!=0},Ve.prototype.init=function(E,v){this.set_adjusted_ptr(0),this.set_type(E),this.set_destructor(v)},Ve.prototype.set_adjusted_ptr=function(E){ze[this.ptr+16>>2]=E},Ve.prototype.get_adjusted_ptr=function(){return ze[this.ptr+16>>2]},bt=0,ut=function(E){Ae()},Et=function(E,v,P){new Ve(E).init(v,P),bt++,ut(E)},gt=function(){return Ae("")},Xe=function(){return 2147483648},ht=function(E,v){return Math.ceil(E/v)*v},Rt=function(E){var v=Lr.buffer.byteLength;try{return Lr.grow((E-v+65535)/65536|0),ne(),1}catch{}},zt=function(E){var v=pt.length;E>>>=0;var P=Xe();if(E>P)return!1;for(var Y=1;Y<=4;Y*=2){var U=v*(1+.2/Y);if(U=Math.min(U,E+100663296),U=Math.min(P,ht(Math.max(E,U),65536)),Rt(U))return!0}return!1},it=function(E){for(var v=0,P=0;P<E.length;++P){var Y=E.charCodeAt(P);Y<=127?v++:Y<=2047?v+=2:Y>=55296&&Y<=57343?(v+=4,++P):v+=3}return v},Ft=function(E,v,P,Y){if(!(Y>0))return 0;var U=P;Y=P+Y-1;for(var Ce=0;Ce<E.length;++Ce){var rt=E.codePointAt(Ce);if(rt<=127){if(P>=Y)break;v[P++]=rt}else if(rt<=2047){if(P+1>=Y)break;v[P++]=192|rt>>6,v[P++]=128|rt&63}else if(rt<=65535){if(P+2>=Y)break;v[P++]=224|rt>>12,v[P++]=128|rt>>6&63,v[P++]=128|rt&63}else{if(P+3>=Y)break;v[P++]=240|rt>>18,v[P++]=128|rt>>12&63,v[P++]=128|rt>>6&63,v[P++]=128|rt&63,Ce++}}return v[P]=0,P-U},dt=function(E,v,P){return P=P>0?P:it(E)+1,P=Array(P),E=Ft(E,P,0,P.length),v&&(P.length=E),P},globalThis.TextDecoder&&new TextDecoder,vt=[],Qr=function(E){return vt.push(E)},F.printErr&&(Me=F.printErr),F.wasmBinary&&(Ge=F.wasmBinary),yt=F.preInit)for(typeof yt=="function"&&(F.preInit=yt=[yt]);yt.length>0;)yt.shift()();return jn={a:Et,c:gt,b:zt},ee.yield(z(),2)}return ee.getNextAddressJsc()!=3?(Or=ee.getYieldResultJsc(),ee.yield(K(),3)):(R.prototype=Object.create(R.prototype),R.prototype.constructor=R,R.prototype.__class__=R,R.__cache__={},F.WrapperObject=R,F.getCache=j,F.wrapPointer=G,F.castObject=M,F.NULL=G(0),F.destroy=N,F.compare=S,F.getPointer=w,F.getClass=Q,De={buffer:0,size:0,pos:0,temps:[],needed:0,prepare:function(){if(De.needed){for(var E=0;E<De.temps.length;E++)F._webidl_free(De.temps[E]);De.temps.length=0,F._webidl_free(De.buffer),De.buffer=0,De.size+=De.needed,De.needed=0}De.buffer||(De.size+=128,De.buffer=F._webidl_malloc(De.size),De.buffer||Ae(void 0)),De.pos=0},alloc:function(E,v){return De.buffer||Ae(void 0),E=E.length*v.BYTES_PER_ELEMENT,E=ht(E,8),De.pos+E>=De.size?(E>0||Ae(void 0),De.needed+=E,v=F._webidl_malloc(E),De.temps.push(v)):(v=De.buffer+De.pos,De.pos+=E),v}},f.prototype=Object.create(R.prototype),f.prototype.constructor=f,f.prototype.__class__=f,f.__cache__={},F.VoidPtr=f,f.prototype.__destroy__=f.prototype.__destroy__=function(){xr(this.ptr)},d.prototype=Object.create(R.prototype),d.prototype.constructor=d,d.prototype.__class__=d,d.__cache__={},F.GeometryAttribute=d,d.prototype.__destroy__=d.prototype.__destroy__=function(){Yt(this.ptr)},p.prototype=Object.create(R.prototype),p.prototype.constructor=p,p.prototype.__class__=p,p.__cache__={},F.PointAttribute=p,p.prototype.size=p.prototype.size=function(){return ot(this.ptr)},p.prototype.attribute_type=p.prototype.attribute_type=function(){return Ct(this.ptr)},p.prototype.data_type=p.prototype.data_type=function(){return kt(this.ptr)},p.prototype.num_components=p.prototype.num_components=function(){return Wt(this.ptr)},p.prototype.normalized=p.prototype.normalized=function(){return!!qt(this.ptr)},p.prototype.byte_stride=p.prototype.byte_stride=function(){return Xt(this.ptr)},p.prototype.byte_offset=p.prototype.byte_offset=function(){return Zt(this.ptr)},p.prototype.unique_id=p.prototype.unique_id=function(){return wr(this.ptr)},p.prototype.__destroy__=p.prototype.__destroy__=function(){vr(this.ptr)},g.prototype=Object.create(R.prototype),g.prototype.constructor=g,g.prototype.__class__=g,g.__cache__={},F.PointCloud=g,g.prototype.num_attributes=g.prototype.num_attributes=function(){return _r(this.ptr)},g.prototype.num_points=g.prototype.num_points=function(){return Mr(this.ptr)},g.prototype.__destroy__=g.prototype.__destroy__=function(){Sr(this.ptr)},u.prototype=Object.create(R.prototype),u.prototype.constructor=u,u.prototype.__class__=u,u.__cache__={},F.Mesh=u,u.prototype.num_faces=u.prototype.num_faces=function(){return Gr(this.ptr)},u.prototype.num_attributes=u.prototype.num_attributes=function(){return Rr(this.ptr)},u.prototype.num_points=u.prototype.num_points=function(){return Ar(this.ptr)},u.prototype.set_num_points=u.prototype.set_num_points=function(E){var v=this.ptr;E&&typeof E=="object"&&(E=E.ptr),Nt(v,E)},u.prototype.__destroy__=u.prototype.__destroy__=function(){Fr(this.ptr)},l.prototype=Object.create(R.prototype),l.prototype.constructor=l,l.prototype.__class__=l,l.__cache__={},F.Metadata=l,l.prototype.__destroy__=l.prototype.__destroy__=function(){ir(this.ptr)},c.prototype=Object.create(R.prototype),c.prototype.constructor=c,c.prototype.__class__=c,c.__cache__={},F.DracoInt8Array=c,c.prototype.GetValue=c.prototype.GetValue=function(E){var v=this.ptr;return E&&typeof E=="object"&&(E=E.ptr),ar(v,E)},c.prototype.size=c.prototype.size=function(){return Tt(this.ptr)},c.prototype.__destroy__=c.prototype.__destroy__=function(){Nr(this.ptr)},s.prototype=Object.create(R.prototype),s.prototype.constructor=s,s.prototype.__class__=s,s.__cache__={},F.MetadataBuilder=s,s.prototype.AddStringEntry=s.prototype.AddStringEntry=function(E,v,P){var Y=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v=v&&typeof v=="object"?v.ptr:m(v),P=P&&typeof P=="object"?P.ptr:m(P),!!sr(Y,E,v,P)},s.prototype.AddIntEntry=s.prototype.AddIntEntry=function(E,v,P){var Y=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v=v&&typeof v=="object"?v.ptr:m(v),P&&typeof P=="object"&&(P=P.ptr),!!$t(Y,E,v,P)},s.prototype.AddIntEntryArray=s.prototype.AddIntEntryArray=function(E,v,P,Y){var U=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v=v&&typeof v=="object"?v.ptr:m(v),typeof P=="object"&&(P=I(P)),Y&&typeof Y=="object"&&(Y=Y.ptr),!!st(U,E,v,P,Y)},s.prototype.AddDoubleEntry=s.prototype.AddDoubleEntry=function(E,v,P){var Y=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v=v&&typeof v=="object"?v.ptr:m(v),P&&typeof P=="object"&&(P=P.ptr),!!Lt(Y,E,v,P)},s.prototype.__destroy__=s.prototype.__destroy__=function(){cr(this.ptr)},a.prototype=Object.create(R.prototype),a.prototype.constructor=a,a.prototype.__class__=a,a.__cache__={},F.PointCloudBuilder=a,a.prototype.AddFloatAttribute=a.prototype.AddFloatAttribute=function(E,v,P,Y,U){var Ce=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),Y&&typeof Y=="object"&&(Y=Y.ptr),typeof U=="object"&&(U=h(U)),x(Ce,E,v,P,Y,U)},a.prototype.AddInt8Attribute=a.prototype.AddInt8Attribute=function(E,v,P,Y,U){var Ce=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),Y&&typeof Y=="object"&&(Y=Y.ptr),typeof U=="object"&&(U=D(U)),k(Ce,E,v,P,Y,U)},a.prototype.AddUInt8Attribute=a.prototype.AddUInt8Attribute=function(E,v,P,Y,U){var Ce=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),Y&&typeof Y=="object"&&(Y=Y.ptr),typeof U=="object"&&(U=D(U)),V(Ce,E,v,P,Y,U)},a.prototype.AddInt16Attribute=a.prototype.AddInt16Attribute=function(E,v,P,Y,U){var Ce=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),Y&&typeof Y=="object"&&(Y=Y.ptr),typeof U=="object"&&(U=b(U)),q(Ce,E,v,P,Y,U)},a.prototype.AddUInt16Attribute=a.prototype.AddUInt16Attribute=function(E,v,P,Y,U){var Ce=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),Y&&typeof Y=="object"&&(Y=Y.ptr),typeof U=="object"&&(U=b(U)),te(Ce,E,v,P,Y,U)},a.prototype.AddInt32Attribute=a.prototype.AddInt32Attribute=function(E,v,P,Y,U){var Ce=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),Y&&typeof Y=="object"&&(Y=Y.ptr),typeof U=="object"&&(U=I(U)),ae(Ce,E,v,P,Y,U)},a.prototype.AddUInt32Attribute=a.prototype.AddUInt32Attribute=function(E,v,P,Y,U){var Ce=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),Y&&typeof Y=="object"&&(Y=Y.ptr),typeof U=="object"&&(U=I(U)),se(Ce,E,v,P,Y,U)},a.prototype.AddMetadata=a.prototype.AddMetadata=function(E,v){var P=this.ptr;return E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),!!pe(P,E,v)},a.prototype.SetMetadataForAttribute=a.prototype.SetMetadataForAttribute=function(E,v,P){var Y=this.ptr;return E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),!!ue(Y,E,v,P)},a.prototype.SetNormalizedFlagForAttribute=a.prototype.SetNormalizedFlagForAttribute=function(E,v,P){var Y=this.ptr;return E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),!!fe(Y,E,v,P)},a.prototype.__destroy__=a.prototype.__destroy__=function(){ve(this.ptr)},i.prototype=Object.create(R.prototype),i.prototype.constructor=i,i.prototype.__class__=i,i.__cache__={},F.MeshBuilder=i,i.prototype.AddFacesToMesh=i.prototype.AddFacesToMesh=function(E,v,P){var Y=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),typeof P=="object"&&(P=I(P)),!!Ke(Y,E,v,P)},i.prototype.AddFloatAttributeToMesh=i.prototype.AddFloatAttributeToMesh=function(E,v,P,Y,U){var Ce=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),Y&&typeof Y=="object"&&(Y=Y.ptr),typeof U=="object"&&(U=h(U)),Ne(Ce,E,v,P,Y,U)},i.prototype.AddInt32AttributeToMesh=i.prototype.AddInt32AttributeToMesh=function(E,v,P,Y,U){var Ce=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),Y&&typeof Y=="object"&&(Y=Y.ptr),typeof U=="object"&&(U=I(U)),et(Ce,E,v,P,Y,U)},i.prototype.AddMetadataToMesh=i.prototype.AddMetadataToMesh=function(E,v){var P=this.ptr;return E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),!!At(P,E,v)},i.prototype.AddFloatAttribute=i.prototype.AddFloatAttribute=function(E,v,P,Y,U){var Ce=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),Y&&typeof Y=="object"&&(Y=Y.ptr),typeof U=="object"&&(U=h(U)),Dt(Ce,E,v,P,Y,U)},i.prototype.AddInt8Attribute=i.prototype.AddInt8Attribute=function(E,v,P,Y,U){var Ce=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),Y&&typeof Y=="object"&&(Y=Y.ptr),typeof U=="object"&&(U=D(U)),ct(Ce,E,v,P,Y,U)},i.prototype.AddUInt8Attribute=i.prototype.AddUInt8Attribute=function(E,v,P,Y,U){var Ce=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),Y&&typeof Y=="object"&&(Y=Y.ptr),typeof U=="object"&&(U=D(U)),lr(Ce,E,v,P,Y,U)},i.prototype.AddInt16Attribute=i.prototype.AddInt16Attribute=function(E,v,P,Y,U){var Ce=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),Y&&typeof Y=="object"&&(Y=Y.ptr),typeof U=="object"&&(U=b(U)),ur(Ce,E,v,P,Y,U)},i.prototype.AddUInt16Attribute=i.prototype.AddUInt16Attribute=function(E,v,P,Y,U){var Ce=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),Y&&typeof Y=="object"&&(Y=Y.ptr),typeof U=="object"&&(U=b(U)),nn(Ce,E,v,P,Y,U)},i.prototype.AddInt32Attribute=i.prototype.AddInt32Attribute=function(E,v,P,Y,U){var Ce=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),Y&&typeof Y=="object"&&(Y=Y.ptr),typeof U=="object"&&(U=I(U)),on(Ce,E,v,P,Y,U)},i.prototype.AddUInt32Attribute=i.prototype.AddUInt32Attribute=function(E,v,P,Y,U){var Ce=this.ptr;return De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),Y&&typeof Y=="object"&&(Y=Y.ptr),typeof U=="object"&&(U=I(U)),An(Ce,E,v,P,Y,U)},i.prototype.AddMetadata=i.prototype.AddMetadata=function(E,v){var P=this.ptr;return E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),!!an(P,E,v)},i.prototype.SetMetadataForAttribute=i.prototype.SetMetadataForAttribute=function(E,v,P){var Y=this.ptr;return E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),!!sn(Y,E,v,P)},i.prototype.SetNormalizedFlagForAttribute=i.prototype.SetNormalizedFlagForAttribute=function(E,v,P){var Y=this.ptr;return E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),!!cn(Y,E,v,P)},i.prototype.__destroy__=i.prototype.__destroy__=function(){ln(this.ptr)},A.prototype=Object.create(R.prototype),A.prototype.constructor=A,A.prototype.__class__=A,A.__cache__={},F.Encoder=A,A.prototype.SetEncodingMethod=A.prototype.SetEncodingMethod=function(E){var v=this.ptr;E&&typeof E=="object"&&(E=E.ptr),gn(v,E)},A.prototype.SetAttributeQuantization=A.prototype.SetAttributeQuantization=function(E,v){var P=this.ptr;E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),pn(P,E,v)},A.prototype.SetAttributeExplicitQuantization=A.prototype.SetAttributeExplicitQuantization=function(E,v,P,Y,U){var Ce=this.ptr;De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),typeof Y=="object"&&(Y=h(Y)),U&&typeof U=="object"&&(U=U.ptr),dn(Ce,E,v,P,Y,U)},A.prototype.SetSpeedOptions=A.prototype.SetSpeedOptions=function(E,v){var P=this.ptr;E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),fn(P,E,v)},A.prototype.SetTrackEncodedProperties=A.prototype.SetTrackEncodedProperties=function(E){var v=this.ptr;E&&typeof E=="object"&&(E=E.ptr),hn(v,E)},A.prototype.EncodeMeshToDracoBuffer=A.prototype.EncodeMeshToDracoBuffer=function(E,v){var P=this.ptr;return E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),mn(P,E,v)},A.prototype.EncodePointCloudToDracoBuffer=A.prototype.EncodePointCloudToDracoBuffer=function(E,v,P){var Y=this.ptr;return E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),In(Y,E,v,P)},A.prototype.GetNumberOfEncodedPoints=A.prototype.GetNumberOfEncodedPoints=function(){return Bn(this.ptr)},A.prototype.GetNumberOfEncodedFaces=A.prototype.GetNumberOfEncodedFaces=function(){return bn(this.ptr)},A.prototype.__destroy__=A.prototype.__destroy__=function(){En(this.ptr)},o.prototype=Object.create(R.prototype),o.prototype.constructor=o,o.prototype.__class__=o,o.__cache__={},F.ExpertEncoder=o,o.prototype.SetEncodingMethod=o.prototype.SetEncodingMethod=function(E){var v=this.ptr;E&&typeof E=="object"&&(E=E.ptr),Cn(v,E)},o.prototype.SetAttributeQuantization=o.prototype.SetAttributeQuantization=function(E,v){var P=this.ptr;E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),Qn(P,E,v)},o.prototype.SetAttributeExplicitQuantization=o.prototype.SetAttributeExplicitQuantization=function(E,v,P,Y,U){var Ce=this.ptr;De.prepare(),E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),P&&typeof P=="object"&&(P=P.ptr),typeof Y=="object"&&(Y=h(Y)),U&&typeof U=="object"&&(U=U.ptr),xn(Ce,E,v,P,Y,U)},o.prototype.SetSpeedOptions=o.prototype.SetSpeedOptions=function(E,v){var P=this.ptr;E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),wn(P,E,v)},o.prototype.SetTrackEncodedProperties=o.prototype.SetTrackEncodedProperties=function(E){var v=this.ptr;E&&typeof E=="object"&&(E=E.ptr),vn(v,E)},o.prototype.EncodeToDracoBuffer=o.prototype.EncodeToDracoBuffer=function(E,v){var P=this.ptr;return E&&typeof E=="object"&&(E=E.ptr),v&&typeof v=="object"&&(v=v.ptr),Dn(P,E,v)},o.prototype.GetNumberOfEncodedPoints=o.prototype.GetNumberOfEncodedPoints=function(){return _n(this.ptr)},o.prototype.GetNumberOfEncodedFaces=o.prototype.GetNumberOfEncodedFaces=function(){return Mn(this.ptr)},o.prototype.__destroy__=o.prototype.__destroy__=function(){Sn(this.ptr)},(function(){function E(){F.INVALID=Pn(),F.POSITION=Gn(),F.NORMAL=Rn(),F.COLOR=Fn(),F.TEX_COORD=Un(),F.GENERIC=kn(),F.INVALID_GEOMETRY_TYPE=Nn(),F.POINT_CLOUD=Tn(),F.TRIANGULAR_MESH=Ln(),F.MESH_SEQUENTIAL_ENCODING=On(),F.MESH_EDGEBREAKER_ENCODING=Hn()}je?E():Qr(E)})(),typeof F.onModuleParsed=="function"&&F.onModuleParsed(),ee.return(F))})}})();typeof $o=="object"&&typeof Bo=="object"?(Bo.exports=Zo,Bo.exports.default=Zo):typeof define=="function"&&define.amd&&define([],function(){return Zo})});var ia=Vn((tA,bo)=>{$();var O=O||{};O.scope={};O.ASSUME_ES2020=!1;O.ASSUME_ES6=O.ASSUME_ES2020;O.ASSUME_ES5=O.ASSUME_ES6;O.ASSUME_NO_NATIVE_MAP=!1;O.ASSUME_NO_NATIVE_SET=!1;O.ISOLATE_POLYFILLS=!1;O.FORCE_POLYFILL_PROMISE=!1;O.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION=!1;O.INSTRUMENT_ASYNC_CONTEXT=!0;O.objectCreate=O.ASSUME_ES5||typeof Object.create=="function"?Object.create:function(e){var t=function(){};return t.prototype=e,new t};O.defineProperty=O.ASSUME_ES5||typeof Object.defineProperties=="function"?Object.defineProperty:function(e,t,r){return e==Array.prototype||e==Object.prototype||(e[t]=r.value),e};O.getGlobal=function(e){e=[typeof globalThis=="object"&&globalThis,e,typeof window=="object"&&window,typeof self=="object"&&self,typeof globalThis=="object"&&globalThis];for(var t=0;t<e.length;++t){var r=e[t];if(r&&r.Math==Math)return r}throw Error("Cannot find global object")};O.global=O.ASSUME_ES2020?globalThis:O.getGlobal(tA);O.IS_SYMBOL_NATIVE=typeof Symbol=="function"&&typeof Symbol("x")=="symbol";O.TRUST_ES6_POLYFILLS=!O.ISOLATE_POLYFILLS||O.IS_SYMBOL_NATIVE;O.polyfills={};O.propertyToPolyfillSymbol={};O.POLYFILL_PREFIX="$jscp$";O.TYPED_ARRAY_CLASSES=(function(){var e="Int8 Uint8 Uint8Clamped Int16 Uint16 Int32 Uint32 Float32 Float64".split(" ");return O.global.BigInt64Array&&(e.push("BigInt64"),e.push("BigUint64")),e})();O.polyfillTypedArrayMethod=function(e,t,r,n){if(t)for(var o=0;o<O.TYPED_ARRAY_CLASSES.length;o++){var A=O.TYPED_ARRAY_CLASSES[o]+"Array.prototype."+e;O.ISOLATE_POLYFILLS?O.polyfillIsolated(A,t,r,n):O.polyfillUnisolated(A,t,r,n)}};O.polyfill=function(e,t,r,n){t&&(O.ISOLATE_POLYFILLS?O.polyfillIsolated(e,t,r,n):O.polyfillUnisolated(e,t,r,n))};O.polyfillUnisolated=function(e,t,r,n){for(r=O.global,e=e.split("."),n=0;n<e.length-1;n++){var o=e[n];if(!(o in r))return;r=r[o]}e=e[e.length-1],n=r[e],t=t(n),t!=n&&t!=null&&O.defineProperty(r,e,{configurable:!0,writable:!0,value:t})};O.polyfillIsolated=function(e,t,r,n){var o=e.split(".");e=o.length===1,n=o[0],n=!e&&n in O.polyfills?O.polyfills:O.global;for(var A=0;A<o.length-1;A++){var i=o[A];if(!(i in n))return;n=n[i]}o=o[o.length-1],r=O.IS_SYMBOL_NATIVE&&r==="es6"?n[o]:null,t=t(r),t!=null&&(e?O.defineProperty(O.polyfills,o,{configurable:!0,writable:!0,value:t}):t!==r&&(O.propertyToPolyfillSymbol[o]===void 0&&(r=Math.random()*1e9>>>0,O.propertyToPolyfillSymbol[o]=O.IS_SYMBOL_NATIVE?O.global.Symbol(o):O.POLYFILL_PREFIX+r+"$"+o),O.defineProperty(n,O.propertyToPolyfillSymbol[o],{configurable:!0,writable:!0,value:t})))};O.getConstructImplementation=function(){function e(){function r(){}return new r,Reflect.construct(r,[],function(){}),new r instanceof r}if(O.TRUST_ES6_POLYFILLS&&typeof Reflect<"u"&&Reflect.construct){if(e())return Reflect.construct;var t=Reflect.construct;return function(r,n,o){return r=t(r,n),o&&Reflect.setPrototypeOf(r,o.prototype),r}}return function(r,n,o){return o===void 0&&(o=r),o=O.objectCreate(o.prototype||Object.prototype),Function.prototype.apply.call(r,o,n)||o}};O.construct={valueOf:O.getConstructImplementation}.valueOf();O.underscoreProtoCanBeSet=function(){var e={a:!0},t={};try{return t.__proto__=e,t.a}catch{}return!1};O.setPrototypeOf=O.ASSUME_ES6||O.TRUST_ES6_POLYFILLS&&typeof Object.setPrototypeOf=="function"?Object.setPrototypeOf:O.underscoreProtoCanBeSet()?function(e,t){if(e.__proto__=t,e.__proto__!==t)throw new TypeError(e+" is not extensible");return e}:null;O.inherits=function(e,t){if(e.prototype=O.objectCreate(t.prototype),e.prototype.constructor=e,O.ASSUME_ES6||O.setPrototypeOf){var r=O.setPrototypeOf;r(e,t)}else for(r in t)if(r!="prototype")if(Object.defineProperties){var n=Object.getOwnPropertyDescriptor(t,r);n&&Object.defineProperty(e,r,n)}else e[r]=t[r];e.superClass_=t.prototype};O.arrayIteratorImpl=function(e){var t=0;return function(){return t<e.length?{done:!1,value:e[t++]}:{done:!0}}};O.arrayIterator=function(e){return{next:O.arrayIteratorImpl(e)}};O.makeIterator=function(e){var t=typeof Symbol<"u"&&Symbol.iterator&&e[Symbol.iterator];if(t)return t.call(e);if(typeof e.length=="number")return O.arrayIterator(e);throw Error(String(e)+" is not an iterable or ArrayLike")};O.arrayFromIterator=function(e){for(var t,r=[];!(t=e.next()).done;)r.push(t.value);return r};O.arrayFromIterable=function(e){return e instanceof Array?e:O.arrayFromIterator(O.makeIterator(e))};O.createTemplateTagFirstArg=function(e){return O.createTemplateTagFirstArgWithRaw(e,e)};O.createTemplateTagFirstArgWithRaw=function(e,t){return e.raw=t,Object.freeze&&(Object.freeze(e),Object.freeze(t)),e};O.generator={};O.generator.ensureIteratorResultIsObject_=function(e){if(!(e instanceof Object))throw new TypeError("Iterator result "+e+" is not an object")};O.generator.Context=function(){this.isRunning_=!1,this.yieldAllIterator_=null,this.yieldResult=void 0,this.nextAddress=1,this.finallyAddress_=this.catchAddress_=0,this.finallyContexts_=this.abruptCompletion_=null};O.generator.Context.prototype.start_=function(){if(this.isRunning_)throw new TypeError("Generator is already running");this.isRunning_=!0};O.generator.Context.prototype.stop_=function(){this.isRunning_=!1};O.generator.Context.prototype.jumpToErrorHandler_=function(){this.nextAddress=this.catchAddress_||this.finallyAddress_};O.generator.Context.prototype.next_=function(e){this.yieldResult=e};O.generator.Context.prototype.throw_=function(e){this.abruptCompletion_={exception:e,isException:!0},this.jumpToErrorHandler_()};O.generator.Context.prototype.getNextAddressJsc=function(){return this.nextAddress};O.generator.Context.prototype.getNextAddressJsc=function(){return this.nextAddress};O.generator.Context.prototype.getYieldResultJsc=function(){return this.yieldResult};O.generator.Context.prototype.getYieldResultJsc=function(){return this.yieldResult};O.generator.Context.prototype.return=function(e){this.abruptCompletion_={return:e},this.nextAddress=this.finallyAddress_};O.generator.Context.prototype.return=O.generator.Context.prototype.return;O.generator.Context.prototype.jumpThroughFinallyBlocks=function(e){this.abruptCompletion_={jumpTo:e},this.nextAddress=this.finallyAddress_};O.generator.Context.prototype.jumpThroughFinallyBlocks=O.generator.Context.prototype.jumpThroughFinallyBlocks;O.generator.Context.prototype.yield=function(e,t){return this.nextAddress=t,{value:e}};O.generator.Context.prototype.yield=O.generator.Context.prototype.yield;O.generator.Context.prototype.yieldAll=function(e,t){e=O.makeIterator(e);var r=e.next();if(O.generator.ensureIteratorResultIsObject_(r),r.done)this.yieldResult=r.value,this.nextAddress=t;else return this.yieldAllIterator_=e,this.yield(r.value,t)};O.generator.Context.prototype.yieldAll=O.generator.Context.prototype.yieldAll;O.generator.Context.prototype.jumpTo=function(e){this.nextAddress=e};O.generator.Context.prototype.jumpTo=O.generator.Context.prototype.jumpTo;O.generator.Context.prototype.jumpToEnd=function(){this.nextAddress=0};O.generator.Context.prototype.jumpToEnd=O.generator.Context.prototype.jumpToEnd;O.generator.Context.prototype.setCatchFinallyBlocks=function(e,t){this.catchAddress_=e,t!=null&&(this.finallyAddress_=t)};O.generator.Context.prototype.setCatchFinallyBlocks=O.generator.Context.prototype.setCatchFinallyBlocks;O.generator.Context.prototype.setFinallyBlock=function(e){this.catchAddress_=0,this.finallyAddress_=e||0};O.generator.Context.prototype.setFinallyBlock=O.generator.Context.prototype.setFinallyBlock;O.generator.Context.prototype.leaveTryBlock=function(e,t){this.nextAddress=e,this.catchAddress_=t||0};O.generator.Context.prototype.leaveTryBlock=O.generator.Context.prototype.leaveTryBlock;O.generator.Context.prototype.enterCatchBlock=function(e){return this.catchAddress_=e||0,e=this.abruptCompletion_.exception,this.abruptCompletion_=null,e};O.generator.Context.prototype.enterCatchBlock=O.generator.Context.prototype.enterCatchBlock;O.generator.Context.prototype.enterFinallyBlock=function(e,t,r){r?this.finallyContexts_[r]=this.abruptCompletion_:this.finallyContexts_=[this.abruptCompletion_],this.catchAddress_=e||0,this.finallyAddress_=t||0};O.generator.Context.prototype.enterFinallyBlock=O.generator.Context.prototype.enterFinallyBlock;O.generator.Context.prototype.leaveFinallyBlock=function(e,t){if(t=this.finallyContexts_.splice(t||0)[0],t=this.abruptCompletion_=this.abruptCompletion_||t){if(t.isException)return this.jumpToErrorHandler_();t.jumpTo!=null&&this.finallyAddress_<t.jumpTo?(this.nextAddress=t.jumpTo,this.abruptCompletion_=null):this.nextAddress=this.finallyAddress_}else this.nextAddress=e};O.generator.Context.prototype.leaveFinallyBlock=O.generator.Context.prototype.leaveFinallyBlock;O.generator.Context.prototype.forIn=function(e){return new O.generator.Context.PropertyIterator(e)};O.generator.Context.prototype.forIn=O.generator.Context.prototype.forIn;O.generator.Context.PropertyIterator=function(e){this.object_=e,this.properties_=[];for(var t in e)this.properties_.push(t);this.properties_.reverse()};O.generator.Context.PropertyIterator.prototype.getNext=function(){for(;this.properties_.length>0;){var e=this.properties_.pop();if(e in this.object_)return e}return null};O.generator.Context.PropertyIterator.prototype.getNext=O.generator.Context.PropertyIterator.prototype.getNext;O.generator.Engine_=function(e){this.context_=new O.generator.Context,this.program_=e};O.generator.Engine_.prototype.next_=function(e){return this.context_.start_(),this.context_.yieldAllIterator_?this.yieldAllStep_(this.context_.yieldAllIterator_.next,e,this.context_.next_):(this.context_.next_(e),this.nextStep_())};O.generator.Engine_.prototype.return_=function(e){this.context_.start_();var t=this.context_.yieldAllIterator_;return t?this.yieldAllStep_("return"in t?t.return:function(r){return{value:r,done:!0}},e,this.context_.return):(this.context_.return(e),this.nextStep_())};O.generator.Engine_.prototype.throw_=function(e){return this.context_.start_(),this.context_.yieldAllIterator_?this.yieldAllStep_(this.context_.yieldAllIterator_.throw,e,this.context_.next_):(this.context_.throw_(e),this.nextStep_())};O.generator.Engine_.prototype.yieldAllStep_=function(e,t,r){try{var n=e.call(this.context_.yieldAllIterator_,t);if(O.generator.ensureIteratorResultIsObject_(n),!n.done)return this.context_.stop_(),n;var o=n.value}catch(A){return this.context_.yieldAllIterator_=null,this.context_.throw_(A),this.nextStep_()}return this.context_.yieldAllIterator_=null,r.call(this.context_,o),this.nextStep_()};O.generator.Engine_.prototype.nextStep_=function(){for(;this.context_.nextAddress;)try{var e=this.program_(this.context_);if(e)return this.context_.stop_(),{value:e.value,done:!1}}catch(t){this.context_.yieldResult=void 0,this.context_.throw_(t)}if(this.context_.stop_(),this.context_.abruptCompletion_){if(e=this.context_.abruptCompletion_,this.context_.abruptCompletion_=null,e.isException)throw e.exception;return{value:e.return,done:!0}}return{value:void 0,done:!0}};O.generator.Generator_=function(e){this.next=function(t){return e.next_(t)},this.throw=function(t){return e.throw_(t)},this.return=function(t){return e.return_(t)},this[Symbol.iterator]=function(){return this}};O.generator.createGenerator=function(e,t){return t=new O.generator.Generator_(new O.generator.Engine_(t)),O.setPrototypeOf&&e.prototype&&O.setPrototypeOf(t,e.prototype),t};O.asyncExecutePromiseGenerator=function(e){function t(n){return e.next(n)}function r(n){return e.throw(n)}return new Promise(function(n,o){function A(i){i.done?n(i.value):Promise.resolve(i.value).then(t,r).then(A,o)}A(e.next())})};O.asyncExecutePromiseGeneratorFunction=function(e){return O.asyncExecutePromiseGenerator(e())};O.asyncExecutePromiseGeneratorProgram=function(e){return O.asyncExecutePromiseGenerator(new O.generator.Generator_(new O.generator.Engine_(e)))};O.polyfill("globalThis",function(e){return e||O.global},"es_2020","es3");O.polyfill("Reflect",function(e){return e||{}},"es6","es3");O.polyfill("Reflect.construct",function(e){return O.construct},"es6","es3");O.polyfill("Reflect.setPrototypeOf",function(e){if(e)return e;if(O.setPrototypeOf){var t=O.setPrototypeOf;return function(r,n){try{return t(r,n),!0}catch{return!1}}}return null},"es6","es5");O.initSymbol=function(){};O.polyfill("Symbol",function(e){if(e)return e;var t=function(A,i){this.$jscomp$symbol$id_=A,O.defineProperty(this,"description",{configurable:!0,writable:!0,value:i})};t.prototype.toString=function(){return this.$jscomp$symbol$id_};var r="jscomp_symbol_"+(Math.random()*1e9>>>0)+"_",n=0,o=function(A){if(this instanceof o)throw new TypeError("Symbol is not a constructor");return new t(r+(A||"")+"_"+n++,A)};return o},"es6","es3");O.polyfill("Symbol.iterator",function(e){return e||(e=Symbol("Symbol.iterator"),O.defineProperty(Array.prototype,e,{configurable:!0,writable:!0,value:function(){return O.iteratorPrototype(O.arrayIteratorImpl(this))}}),e)},"es6","es3");O.iteratorPrototype=function(e){return e={next:e},e[Symbol.iterator]=function(){return this},e};O.polyfill("Promise",function(e){function t(){this.batch_=null}function r(i){return i instanceof o?i:new o(function(a,s){a(i)})}if(e&&(!(O.FORCE_POLYFILL_PROMISE||O.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION&&typeof O.global.PromiseRejectionEvent>"u")||!O.global.Promise||O.global.Promise.toString().indexOf("[native code]")===-1))return e;t.prototype.asyncExecute=function(i){if(this.batch_==null){this.batch_=[];var a=this;this.asyncExecuteFunction(function(){a.executeBatch_()})}this.batch_.push(i)};var n=O.global.setTimeout;t.prototype.asyncExecuteFunction=function(i){n(i,0)},t.prototype.executeBatch_=function(){for(;this.batch_&&this.batch_.length;){var i=this.batch_;this.batch_=[];for(var a=0;a<i.length;++a){var s=i[a];i[a]=null;try{s()}catch(c){this.asyncThrow_(c)}}}this.batch_=null},t.prototype.asyncThrow_=function(i){this.asyncExecuteFunction(function(){throw i})};var o=function(i){this.state_=0,this.result_=void 0,this.onSettledCallbacks_=[],this.isRejectionHandled_=!1;var a=this.createResolveAndReject_();try{i(a.resolve,a.reject)}catch(s){a.reject(s)}};o.prototype.createResolveAndReject_=function(){function i(c){return function(l){s||(s=!0,c.call(a,l))}}var a=this,s=!1;return{resolve:i(this.resolveTo_),reject:i(this.reject_)}},o.prototype.resolveTo_=function(i){if(i===this)this.reject_(new TypeError("A Promise cannot resolve to itself"));else if(i instanceof o)this.settleSameAsPromise_(i);else{e:switch(typeof i){case"object":var a=i!=null;break e;case"function":a=!0;break e;default:a=!1}a?this.resolveToNonPromiseObj_(i):this.fulfill_(i)}},o.prototype.resolveToNonPromiseObj_=function(i){var a=void 0;try{a=i.then}catch(s){this.reject_(s);return}typeof a=="function"?this.settleSameAsThenable_(a,i):this.fulfill_(i)},o.prototype.reject_=function(i){this.settle_(2,i)},o.prototype.fulfill_=function(i){this.settle_(1,i)},o.prototype.settle_=function(i,a){if(this.state_!=0)throw Error("Cannot settle("+i+", "+a+"): Promise already settled in state"+this.state_);this.state_=i,this.result_=a,this.state_===2&&this.scheduleUnhandledRejectionCheck_(),this.executeOnSettledCallbacks_()},o.prototype.scheduleUnhandledRejectionCheck_=function(){var i=this;n(function(){if(i.notifyUnhandledRejection_()){var a=O.global.console;typeof a<"u"&&a.error(i.result_)}},1)},o.prototype.notifyUnhandledRejection_=function(){if(this.isRejectionHandled_)return!1;var i=O.global.CustomEvent,a=O.global.Event,s=O.global.dispatchEvent;return typeof s>"u"?!0:(typeof i=="function"?i=new i("unhandledrejection",{cancelable:!0}):typeof a=="function"?i=new a("unhandledrejection",{cancelable:!0}):(i=O.global.document.createEvent("CustomEvent"),i.initCustomEvent("unhandledrejection",!1,!0,i)),i.promise=this,i.reason=this.result_,s(i))},o.prototype.executeOnSettledCallbacks_=function(){if(this.onSettledCallbacks_!=null){for(var i=0;i<this.onSettledCallbacks_.length;++i)A.asyncExecute(this.onSettledCallbacks_[i]);this.onSettledCallbacks_=null}};var A=new t;return o.prototype.settleSameAsPromise_=function(i){var a=this.createResolveAndReject_();i.callWhenSettled_(a.resolve,a.reject)},o.prototype.settleSameAsThenable_=function(i,a){var s=this.createResolveAndReject_();try{i.call(a,s.resolve,s.reject)}catch(c){s.reject(c)}},o.prototype.then=function(i,a){function s(g,p){return typeof g=="function"?function(d){try{c(g(d))}catch(f){l(f)}}:p}var c,l,u=new o(function(g,p){c=g,l=p});return this.callWhenSettled_(s(i,c),s(a,l)),u},o.prototype.catch=function(i){return this.then(void 0,i)},o.prototype.callWhenSettled_=function(i,a){function s(){switch(c.state_){case 1:i(c.result_);break;case 2:a(c.result_);break;default:throw Error("Unexpected state: "+c.state_)}}var c=this;this.onSettledCallbacks_==null?A.asyncExecute(s):this.onSettledCallbacks_.push(s),this.isRejectionHandled_=!0},o.resolve=r,o.reject=function(i){return new o(function(a,s){s(i)})},o.race=function(i){return new o(function(a,s){for(var c=O.makeIterator(i),l=c.next();!l.done;l=c.next())r(l.value).callWhenSettled_(a,s)})},o.all=function(i){var a=O.makeIterator(i),s=a.next();return s.done?r([]):new o(function(c,l){function u(d){return function(f){g[d]=f,p--,p==0&&c(g)}}var g=[],p=0;do g.push(void 0),p++,r(s.value).callWhenSettled_(u(g.length-1),l),s=a.next();while(!s.done)})},o},"es6","es3");O.checkStringArgs=function(e,t,r){if(e==null)throw new TypeError("The 'this' value for String.prototype."+r+" must not be null or undefined");if(t instanceof RegExp)throw new TypeError("First argument to String.prototype."+r+" must not be a regular expression");return e+""};O.polyfill("String.prototype.startsWith",function(e){return e||function(t,r){var n=O.checkStringArgs(this,t,"startsWith");t+="";var o=n.length,A=t.length;r=Math.max(0,Math.min(r|0,n.length));for(var i=0;i<A&&r<o;)if(n[r++]!=t[i++])return!1;return i>=A}},"es6","es3");O.polyfill("String.prototype.codePointAt",function(e){return e||function(t){var r=O.checkStringArgs(this,null,"codePointAt"),n=r.length;if(t=Number(t)||0,t>=0&&t<n){t|=0;var o=r.charCodeAt(t);return o<55296||o>56319||t+1===n?o:(t=r.charCodeAt(t+1),t<56320||t>57343?o:(o-55296)*1024+t+9216)}}},"es6","es3");var eA=(function(){var e,t,r=(e=globalThis.document)==null||(t=e.currentScript)==null?void 0:t.src;return function(n){function o(){this.ptr=Un(),W(o)[this.ptr]=this}function A(){this.ptr=vn(),W(A)[this.ptr]=this}function i(){this.ptr=Cn(),W(i)[this.ptr]=this}function a(){this.ptr=Bn(),W(a)[this.ptr]=this}function s(){this.ptr=fn(),W(s)[this.ptr]=this}function c(){this.ptr=un(),W(c)[this.ptr]=this}function l(){this.ptr=an(),W(l)[this.ptr]=this}function u(){this.ptr=ur(),W(u)[this.ptr]=this}function g(){this.ptr=At(),W(g)[this.ptr]=this}function p(){throw"cannot construct a Status, no constructor in IDL"}function d(){this.ptr=fe(),W(d)[this.ptr]=this}function f(){this.ptr=te(),W(f)[this.ptr]=this}function h(){this.ptr=x(),W(h)[this.ptr]=this}function I(){this.ptr=st(),W(I)[this.ptr]=this}function b(){this.ptr=ar(),W(b)[this.ptr]=this}function D(){this.ptr=Mr(),W(D)[this.ptr]=this}function m(){this.ptr=Dr(),W(m)[this.ptr]=this}function Q(){this.ptr=Zt(),W(Q)[this.ptr]=this}function w(){this.ptr=Wt(),W(w)[this.ptr]=this}function S(){throw"cannot construct a VoidPtr, no constructor in IDL"}function N(ce){if(typeof ce=="object"){for(var B=ke.alloc(ce,Ve),_=0;_<ce.length;_++)Ve[B+_]=ce[_];return B}return ce}function M(ce){if(typeof ce=="string"){ce=nr(ce);for(var B=ke.alloc(ce,Ve),_=0;_<ce.length;_++)Ve[B+_]=ce[_];return B}return ce}function G(ce){return ce.__class__}function j(ce){return ce.ptr}function R(ce,B){return ce.ptr===B.ptr}function K(ce){if(!ce.__destroy__)throw"Error: Cannot destroy object. (Did you create it yourself?)";ce.__destroy__(),delete W(ce.__class__)[ce.ptr]}function z(ce,B){return J(ce.ptr,B)}function J(ce,B){var _=W(B),T=_[ce];return T||(T=Object.create((B||X).prototype),T.ptr=ce,_[ce]=T)}function W(ce){return(ce||X).__cache__}function X(){}function Ae(){var ce,B,_;return(0,O.asyncExecutePromiseGeneratorProgram)(function(T){if(T.getNextAddressJsc()==1)return Be(),ce=y.setStatus,ce?(ce("Running..."),T.yield(new Promise(function(de){return setTimeout(de,1)}),3)):T.jumpTo(2);if(T.getNextAddressJsc()!=2&&setTimeout(ce,1,""),Le)return T.return();Bt=!0,bt(or),so.e(),(_=(B=y).onRuntimeInitialized)==null||_.call(B),F(),T.jumpToEnd()})}function re(){function ce(H){return H=so=H.exports,y._webidl_free=H.f,y._free=H.g,y._webidl_malloc=H.h,y._malloc=H.i,kt=y._emscripten_bind_VoidPtr___destroy___0=H.j,Wt=y._emscripten_bind_DecoderBuffer_DecoderBuffer_0=H.k,qt=y._emscripten_bind_DecoderBuffer_Init_2=H.l,Xt=y._emscripten_bind_DecoderBuffer___destroy___0=H.m,Zt=y._emscripten_bind_AttributeTransformData_AttributeTransformData_0=H.n,wr=y._emscripten_bind_AttributeTransformData_transform_type_0=H.o,vr=y._emscripten_bind_AttributeTransformData___destroy___0=H.p,Dr=y._emscripten_bind_GeometryAttribute_GeometryAttribute_0=H.q,_r=y._emscripten_bind_GeometryAttribute___destroy___0=H.r,Mr=y._emscripten_bind_PointAttribute_PointAttribute_0=H.s,Sr=y._emscripten_bind_PointAttribute_size_0=H.t,Pr=y._emscripten_bind_PointAttribute_GetAttributeTransformData_0=H.u,Gr=y._emscripten_bind_PointAttribute_attribute_type_0=H.v,Rr=y._emscripten_bind_PointAttribute_data_type_0=H.w,Ar=y._emscripten_bind_PointAttribute_num_components_0=H.x,Nt=y._emscripten_bind_PointAttribute_normalized_0=H.y,Fr=y._emscripten_bind_PointAttribute_byte_stride_0=H.z,Ur=y._emscripten_bind_PointAttribute_byte_offset_0=H.A,ir=y._emscripten_bind_PointAttribute_unique_id_0=H.B,kr=y._emscripten_bind_PointAttribute___destroy___0=H.C,ar=y._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=H.D,Tt=y._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=H.E,Nr=y._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=H.F,Tr=y._emscripten_bind_AttributeQuantizationTransform_min_value_1=H.G,sr=y._emscripten_bind_AttributeQuantizationTransform_range_0=H.H,$t=y._emscripten_bind_AttributeQuantizationTransform___destroy___0=H.I,st=y._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=H.J,Lt=y._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=H.K,cr=y._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=H.L,C=y._emscripten_bind_AttributeOctahedronTransform___destroy___0=H.M,x=y._emscripten_bind_PointCloud_PointCloud_0=H.N,k=y._emscripten_bind_PointCloud_num_attributes_0=H.O,V=y._emscripten_bind_PointCloud_num_points_0=H.P,q=y._emscripten_bind_PointCloud___destroy___0=H.Q,te=y._emscripten_bind_Mesh_Mesh_0=H.R,ae=y._emscripten_bind_Mesh_num_faces_0=H.S,se=y._emscripten_bind_Mesh_num_attributes_0=H.T,pe=y._emscripten_bind_Mesh_num_points_0=H.U,ue=y._emscripten_bind_Mesh___destroy___0=H.V,fe=y._emscripten_bind_Metadata_Metadata_0=H.W,ve=y._emscripten_bind_Metadata___destroy___0=H.X,Fe=y._emscripten_bind_Status_code_0=H.Y,Ke=y._emscripten_bind_Status_ok_0=H.Z,Ne=y._emscripten_bind_Status_error_msg_0=H._,et=y._emscripten_bind_Status___destroy___0=H.$,At=y._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=H.aa,Dt=y._emscripten_bind_DracoFloat32Array_GetValue_1=H.ba,ct=y._emscripten_bind_DracoFloat32Array_size_0=H.ca,lr=y._emscripten_bind_DracoFloat32Array___destroy___0=H.da,ur=y._emscripten_bind_DracoInt8Array_DracoInt8Array_0=H.ea,nn=y._emscripten_bind_DracoInt8Array_GetValue_1=H.fa,on=y._emscripten_bind_DracoInt8Array_size_0=H.ga,An=y._emscripten_bind_DracoInt8Array___destroy___0=H.ha,an=y._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=H.ia,sn=y._emscripten_bind_DracoUInt8Array_GetValue_1=H.ja,cn=y._emscripten_bind_DracoUInt8Array_size_0=H.ka,ln=y._emscripten_bind_DracoUInt8Array___destroy___0=H.la,un=y._emscripten_bind_DracoInt16Array_DracoInt16Array_0=H.ma,gn=y._emscripten_bind_DracoInt16Array_GetValue_1=H.na,pn=y._emscripten_bind_DracoInt16Array_size_0=H.oa,dn=y._emscripten_bind_DracoInt16Array___destroy___0=H.pa,fn=y._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=H.qa,hn=y._emscripten_bind_DracoUInt16Array_GetValue_1=H.ra,mn=y._emscripten_bind_DracoUInt16Array_size_0=H.sa,In=y._emscripten_bind_DracoUInt16Array___destroy___0=H.ta,Bn=y._emscripten_bind_DracoInt32Array_DracoInt32Array_0=H.ua,bn=y._emscripten_bind_DracoInt32Array_GetValue_1=H.va,En=y._emscripten_bind_DracoInt32Array_size_0=H.wa,yn=y._emscripten_bind_DracoInt32Array___destroy___0=H.xa,Cn=y._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=H.ya,Qn=y._emscripten_bind_DracoUInt32Array_GetValue_1=H.za,xn=y._emscripten_bind_DracoUInt32Array_size_0=H.Aa,wn=y._emscripten_bind_DracoUInt32Array___destroy___0=H.Ba,vn=y._emscripten_bind_MetadataQuerier_MetadataQuerier_0=H.Ca,Dn=y._emscripten_bind_MetadataQuerier_HasEntry_2=H.Da,_n=y._emscripten_bind_MetadataQuerier_GetIntEntry_2=H.Ea,Mn=y._emscripten_bind_MetadataQuerier_GetIntEntryArray_3=H.Fa,Sn=y._emscripten_bind_MetadataQuerier_GetDoubleEntry_2=H.Ga,Pn=y._emscripten_bind_MetadataQuerier_GetStringEntry_2=H.Ha,Gn=y._emscripten_bind_MetadataQuerier_NumEntries_1=H.Ia,Rn=y._emscripten_bind_MetadataQuerier_GetEntryName_2=H.Ja,Fn=y._emscripten_bind_MetadataQuerier___destroy___0=H.Ka,Un=y._emscripten_bind_Decoder_Decoder_0=H.La,kn=y._emscripten_bind_Decoder_DecodeArrayToPointCloud_3=H.Ma,Nn=y._emscripten_bind_Decoder_DecodeArrayToMesh_3=H.Na,Tn=y._emscripten_bind_Decoder_GetAttributeId_2=H.Oa,Ln=y._emscripten_bind_Decoder_GetAttributeIdByName_2=H.Pa,On=y._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=H.Qa,Hn=y._emscripten_bind_Decoder_GetAttribute_2=H.Ra,Lr=y._emscripten_bind_Decoder_GetAttributeByUniqueId_2=H.Sa,jn=y._emscripten_bind_Decoder_GetMetadata_1=H.Ta,Or=y._emscripten_bind_Decoder_GetAttributeMetadata_2=H.Ua,De=y._emscripten_bind_Decoder_GetFaceFromMesh_3=H.Va,ee=y._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=H.Wa,E=y._emscripten_bind_Decoder_GetTrianglesUInt16Array_3=H.Xa,v=y._emscripten_bind_Decoder_GetTrianglesUInt32Array_3=H.Ya,P=y._emscripten_bind_Decoder_GetAttributeFloat_3=H.Za,Y=y._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=H._a,U=y._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=H.$a,Ce=y._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=H.ab,rt=y._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=H.bb,RA=y._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=H.cb,FA=y._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=H.db,UA=y._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=H.eb,kA=y._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=H.fb,NA=y._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=H.gb,TA=y._emscripten_bind_Decoder_SkipAttributeTransform_1=H.hb,LA=y._emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1=H.ib,OA=y._emscripten_bind_Decoder_DecodeBufferToPointCloud_2=H.jb,HA=y._emscripten_bind_Decoder_DecodeBufferToMesh_2=H.kb,jA=y._emscripten_bind_Decoder___destroy___0=H.lb,VA=y._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=H.mb,JA=y._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=H.nb,KA=y._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=H.ob,zA=y._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=H.pb,YA=y._emscripten_enum_draco_GeometryAttribute_Type_INVALID=H.qb,WA=y._emscripten_enum_draco_GeometryAttribute_Type_POSITION=H.rb,qA=y._emscripten_enum_draco_GeometryAttribute_Type_NORMAL=H.sb,XA=y._emscripten_enum_draco_GeometryAttribute_Type_COLOR=H.tb,ZA=y._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=H.ub,$A=y._emscripten_enum_draco_GeometryAttribute_Type_GENERIC=H.vb,ei=y._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=H.wb,ti=y._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=H.xb,ri=y._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=H.yb,ni=y._emscripten_enum_draco_DataType_DT_INVALID=H.zb,oi=y._emscripten_enum_draco_DataType_DT_INT8=H.Ab,Ai=y._emscripten_enum_draco_DataType_DT_UINT8=H.Bb,ii=y._emscripten_enum_draco_DataType_DT_INT16=H.Cb,ai=y._emscripten_enum_draco_DataType_DT_UINT16=H.Db,si=y._emscripten_enum_draco_DataType_DT_INT32=H.Eb,ci=y._emscripten_enum_draco_DataType_DT_UINT32=H.Fb,li=y._emscripten_enum_draco_DataType_DT_INT64=H.Gb,ui=y._emscripten_enum_draco_DataType_DT_UINT64=H.Hb,gi=y._emscripten_enum_draco_DataType_DT_FLOAT32=H.Ib,pi=y._emscripten_enum_draco_DataType_DT_FLOAT64=H.Jb,di=y._emscripten_enum_draco_DataType_DT_BOOL=H.Kb,fi=y._emscripten_enum_draco_DataType_DT_TYPES_COUNT=H.Lb,hi=y._emscripten_enum_draco_StatusCode_OK=H.Mb,mi=y._emscripten_enum_draco_StatusCode_DRACO_ERROR=H.Nb,Ii=y._emscripten_enum_draco_StatusCode_IO_ERROR=H.Ob,Bi=y._emscripten_enum_draco_StatusCode_INVALID_PARAMETER=H.Pb,bi=y._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=H.Qb,Ei=y._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=H.Rb,ao=H.d,Se(),so}var B,_,T,de;return(0,O.asyncExecutePromiseGeneratorProgram)(function(H){return H.getNextAddressJsc()==1?(B={a:yi},(_=y.instantiateWasm)?H.return(new Promise(function(Oe){_(B,function(nt){return Oe(ce(nt))})})):(ze!=null||(ze=Pe("draco_decoder_gltf.wasm")),H.yield(oe(je,ze,B),2))):(T=H.getYieldResultJsc(),de=ce(T.instance),H.return(de))})}function oe(ce,B,_){var T,de,H;return(0,O.asyncExecutePromiseGeneratorProgram)(function(Oe){switch(Oe.getNextAddressJsc()){case 1:if(ce||Je(B)||be){Oe.jumpTo(2);break}return Oe.setCatchFinallyBlocks(3),T=fetch(B,{credentials:"same-origin"}),Oe.yield(WebAssembly.instantiateStreaming(T,_),5);case 5:return de=Oe.getYieldResultJsc(),Oe.return(de);case 3:H=Oe.enterCatchBlock(),Te("wasm streaming compile failed: "+H),Te("falling back to ArrayBuffer instantiation");case 2:return Oe.return(ne(B,_))}})}function ne(ce,B){var _,T,de;return(0,O.asyncExecutePromiseGeneratorProgram)(function(H){switch(H.getNextAddressJsc()){case 1:return H.setCatchFinallyBlocks(2),H.yield(ie(ce),4);case 4:return _=H.getYieldResultJsc(),H.yield(WebAssembly.instantiate(_,B),5);case 5:return T=H.getYieldResultJsc(),H.return(T);case 2:de=H.enterCatchBlock(),Te("failed to asynchronously prepare wasm: "+de),he(de),H.jumpToEnd()}})}function ie(ce){var B;return(0,O.asyncExecutePromiseGeneratorProgram)(function(_){switch(_.getNextAddressJsc()){case 1:if(je){_.jumpTo(2);break}return _.setCatchFinallyBlocks(3),_.yield(Ue(ce),5);case 5:return B=_.getYieldResultJsc(),_.return(new Uint8Array(B));case 3:_.enterCatchBlock();case 2:var T=_.return;if(ce==ze&&je)var de=new Uint8Array(je);else if(_e)de=_e(ce);else throw"both async and sync fetching of the wasm failed";return T.call(_,de)}})}function he(ce){var B,_;throw(_=(B=y).onAbort)==null||_.call(B,ce),ce="Aborted("+ce+")",Te(ce),Le=!0,new WebAssembly.RuntimeError(ce+". Build with -sASSERTIONS for more info.")}function F(){var ce=y.postRun;ce&&(typeof ce=="function"&&(ce=[ce]),ut.push.apply(ut,(0,O.arrayFromIterable)(ce))),bt(ut)}function Be(){var ce=y.preRun;ce&&(typeof ce=="function"&&(ce=[ce]),Et.push.apply(Et,(0,O.arrayFromIterable)(ce))),bt(Et)}function Se(){var ce,B;!((ce=Ve)==null||(B=ce.buffer)==null)&&B.resizable||(ce=ao.buffer,y.HEAP8=Ve=new Int8Array(ce),y.HEAP16=new Int16Array(ce),y.HEAPU8=vt=new Uint8Array(ce),y.HEAPU16=new Uint16Array(ce),y.HEAP32=new Int32Array(ce),y.HEAPU32=gt=new Uint32Array(ce),y.HEAPF32=new Float32Array(ce),y.HEAPF64=new Float64Array(ce))}function Pe(ce){return y.locateFile?y.locateFile(ce,Ge):Ge+ce}function Ie(ce){return typeof ce!="string"?!1:(ce=ce.split("."),ce.length<2||ce.length>3?!1:ce[0]==1&&ce[1]>=0&&ce[1]<=5?!0:!(ce[0]!=0||ce[1]>10))}n=n===void 0?{}:n;var y,ye,Qe,xe,le,ge,be,we,Me,Ge,Ue,_e,He,Te,je,Le,Je,tt,qe,Bt,ze,Ve,bt,ut,Et,gt,Xe,ht,Rt,pt,zt,it,Ft,dt,vt,Qr,rr,Ut,nr,yt,xr,at,Yt,or,ot,Ct,kt,Wt,qt,Xt,Zt,wr,vr,Dr,_r,Mr,Sr,Pr,Gr,Rr,Ar,Nt,Fr,Ur,ir,kr,ar,Tt,Nr,Tr,sr,$t,st,Lt,cr,C,x,k,V,q,te,ae,se,pe,ue,fe,ve,Fe,Ke,Ne,et,At,Dt,ct,lr,ur,nn,on,An,an,sn,cn,ln,un,gn,pn,dn,fn,hn,mn,In,Bn,bn,En,yn,Cn,Qn,xn,wn,vn,Dn,_n,Mn,Sn,Pn,Gn,Rn,Fn,Un,kn,Nn,Tn,Ln,On,Hn,Lr,jn,Or,De,ee,E,v,P,Y,U,Ce,rt,RA,FA,UA,kA,NA,TA,LA,OA,HA,jA,VA,JA,KA,zA,YA,WA,qA,XA,ZA,$A,ei,ti,ri,ni,oi,Ai,ii,ai,si,ci,li,ui,gi,pi,di,fi,hi,mi,Ii,Bi,bi,Ei,ao,yi,so,ke;return(0,O.asyncExecutePromiseGeneratorProgram)(function(ce){if(ce.getNextAddressJsc()==1){if(y=n,ye=!!globalThis.window,Qe=!!globalThis.WorkerGlobalScope,be=((xe=globalThis.process)==null||(le=xe.versions)==null?void 0:le.node)&&((ge=globalThis.process)==null?void 0:ge.type)!="renderer",Me=we=!1,y.onRuntimeInitialized=function(){we=!0,Me&&typeof y.onModuleLoaded=="function"&&y.onModuleLoaded(y)},y.onModuleParsed=function(){Me=!0,we&&typeof y.onModuleLoaded=="function"&&y.onModuleLoaded(y)},y.isVersionSupported=Ie,typeof __filename<"u"?r=__filename:Qe&&(r=self.location.href),Ge="",be)He=(_t(),Ci(Ri)),Ge=__dirname+"/",_e=function(B){return B=Je(B)?new URL(B):B,He.readFileSync(B)},Ue=function(B,_){_=_===void 0?!0:_;var T;return(0,O.asyncExecutePromiseGeneratorProgram)(function(de){return B=Je(B)?new URL(B):B,T=He.readFileSync(B,_?void 0:"utf8"),de.return(T)})},me.argv.length>1&&me.argv[1].replace(/\\/g,"/"),me.argv.slice(2);else if(ye||Qe){try{Ge=new URL(".",r).href}catch{}Qe&&(_e=function(B){var _=new XMLHttpRequest;return _.open("GET",B,!1),_.responseType="arraybuffer",_.send(null),new Uint8Array(_.response)}),Ue=function(B){var _;return(0,O.asyncExecutePromiseGeneratorProgram)(function(T){if(T.getNextAddressJsc()==1)return Je(B)?T.return(new Promise(function(de,H){var Oe=new XMLHttpRequest;Oe.open("GET",B,!0),Oe.responseType="arraybuffer",Oe.onload=function(){Oe.status==200||Oe.status==0&&Oe.response?de(Oe.response):H(Oe.status)},Oe.onerror=H,Oe.send(null)})):T.yield(fetch(B,{credentials:"same-origin"}),2);if(_=T.getYieldResultJsc(),_.ok)return T.return(_.arrayBuffer());throw Error(_.status+" : "+_.url)})}}if(console.log.bind(console),Te=console.error.bind(console),Le=!1,Je=function(B){return B.startsWith("file://")},tt=function(){},qe=function(){return tt.apply(this,arguments)||this},O.inherits(qe,tt),Bt=!1,bt=function(B){for(;B.length>0;)B.shift()(y)},ut=[],Et=[],Xe=function(B){this.excPtr=B,this.ptr=B-24},Xe.prototype.set_type=function(B){gt[this.ptr+4>>2]=B},Xe.prototype.get_type=function(){return gt[this.ptr+4>>2]},Xe.prototype.set_destructor=function(B){gt[this.ptr+8>>2]=B},Xe.prototype.get_destructor=function(){return gt[this.ptr+8>>2]},Xe.prototype.set_caught=function(B){Ve[this.ptr+12]=B?1:0},Xe.prototype.get_caught=function(){return Ve[this.ptr+12]!=0},Xe.prototype.set_rethrown=function(B){Ve[this.ptr+13]=B?1:0},Xe.prototype.get_rethrown=function(){return Ve[this.ptr+13]!=0},Xe.prototype.init=function(B,_){this.set_adjusted_ptr(0),this.set_type(B),this.set_destructor(_)},Xe.prototype.set_adjusted_ptr=function(B){gt[this.ptr+16>>2]=B},Xe.prototype.get_adjusted_ptr=function(){return gt[this.ptr+16>>2]},ht=0,Rt=function(B){he()},pt=function(B,_,T){new Xe(B).init(_,T),ht++,Rt(B)},zt=function(){return he("")},it=function(){return 2147483648},Ft=function(B,_){return Math.ceil(B/_)*_},dt=function(B){var _=ao.buffer.byteLength;try{return ao.grow((B-_+65535)/65536|0),Se(),1}catch{}},Qr=function(B){var _=vt.length;B>>>=0;var T=it();if(B>T)return!1;for(var de=1;de<=4;de*=2){var H=_*(1+.2/de);if(H=Math.min(H,B+100663296),H=Math.min(T,Ft(Math.max(B,H),65536)),dt(H))return!0}return!1},rr=function(B){for(var _=0,T=0;T<B.length;++T){var de=B.charCodeAt(T);de<=127?_++:de<=2047?_+=2:de>=55296&&de<=57343?(_+=4,++T):_+=3}return _},Ut=function(B,_,T,de){if(!(de>0))return 0;var H=T;de=T+de-1;for(var Oe=0;Oe<B.length;++Oe){var nt=B.codePointAt(Oe);if(nt<=127){if(T>=de)break;_[T++]=nt}else if(nt<=2047){if(T+1>=de)break;_[T++]=192|nt>>6,_[T++]=128|nt&63}else if(nt<=65535){if(T+2>=de)break;_[T++]=224|nt>>12,_[T++]=128|nt>>6&63,_[T++]=128|nt&63}else{if(T+3>=de)break;_[T++]=240|nt>>18,_[T++]=128|nt>>12&63,_[T++]=128|nt>>6&63,_[T++]=128|nt&63,Oe++}}return _[T]=0,T-H},nr=function(B,_,T){return T=T>0?T:rr(B)+1,T=Array(T),B=Ut(B,T,0,T.length),_&&(T.length=B),T},yt=globalThis.TextDecoder&&new TextDecoder,xr=function(B,_,T,de){if(T=_+T,de)return T;for(;B[_]&&!(_>=T);)++_;return _},at=function(B,_,T,de){if(_=_===void 0?0:_,T=xr(B,_,T,de),T-_>16&&B.buffer&&yt)return yt.decode(B.subarray(_,T));for(de="";_<T;){var H=B[_++];if(H&128){var Oe=B[_++]&63;if((H&224)==192)de+=String.fromCharCode((H&31)<<6|Oe);else{var nt=B[_++]&63;H=(H&240)==224?(H&15)<<12|Oe<<6|nt:(H&7)<<18|Oe<<12|nt<<6|B[_++]&63,H<65536?de+=String.fromCharCode(H):(H-=65536,de+=String.fromCharCode(55296|H>>10,56320|H&1023))}}else de+=String.fromCharCode(H)}return de},Yt=function(B,_,T){return B?at(vt,B,_,T):""},or=[],ot=function(B){return or.push(B)},y.printErr&&(Te=y.printErr),y.wasmBinary&&(je=y.wasmBinary),Ct=y.preInit)for(typeof Ct=="function"&&(y.preInit=Ct=[Ct]);Ct.length>0;)Ct.shift()();return yi={a:pt,c:zt,b:Qr},ce.yield(re(),2)}return ce.getNextAddressJsc()!=3?(so=ce.getYieldResultJsc(),ce.yield(Ae(),3)):(X.prototype=Object.create(X.prototype),X.prototype.constructor=X,X.prototype.__class__=X,X.__cache__={},y.WrapperObject=X,y.getCache=W,y.wrapPointer=J,y.castObject=z,y.NULL=J(0),y.destroy=K,y.compare=R,y.getPointer=j,y.getClass=G,ke={buffer:0,size:0,pos:0,temps:[],needed:0,prepare:function(){if(ke.needed){for(var B=0;B<ke.temps.length;B++)y._webidl_free(ke.temps[B]);ke.temps.length=0,y._webidl_free(ke.buffer),ke.buffer=0,ke.size+=ke.needed,ke.needed=0}ke.buffer||(ke.size+=128,ke.buffer=y._webidl_malloc(ke.size),ke.buffer||he(void 0)),ke.pos=0},alloc:function(B,_){return ke.buffer||he(void 0),B=B.length*_.BYTES_PER_ELEMENT,B=Ft(B,8),ke.pos+B>=ke.size?(B>0||he(void 0),ke.needed+=B,_=y._webidl_malloc(B),ke.temps.push(_)):(_=ke.buffer+ke.pos,ke.pos+=B),_}},S.prototype=Object.create(X.prototype),S.prototype.constructor=S,S.prototype.__class__=S,S.__cache__={},y.VoidPtr=S,S.prototype.__destroy__=S.prototype.__destroy__=function(){kt(this.ptr)},w.prototype=Object.create(X.prototype),w.prototype.constructor=w,w.prototype.__class__=w,w.__cache__={},y.DecoderBuffer=w,w.prototype.Init=w.prototype.Init=function(B,_){var T=this.ptr;ke.prepare(),typeof B=="object"&&(B=N(B)),_&&typeof _=="object"&&(_=_.ptr),qt(T,B,_)},w.prototype.__destroy__=w.prototype.__destroy__=function(){Xt(this.ptr)},Q.prototype=Object.create(X.prototype),Q.prototype.constructor=Q,Q.prototype.__class__=Q,Q.__cache__={},y.AttributeTransformData=Q,Q.prototype.transform_type=Q.prototype.transform_type=function(){return wr(this.ptr)},Q.prototype.__destroy__=Q.prototype.__destroy__=function(){vr(this.ptr)},m.prototype=Object.create(X.prototype),m.prototype.constructor=m,m.prototype.__class__=m,m.__cache__={},y.GeometryAttribute=m,m.prototype.__destroy__=m.prototype.__destroy__=function(){_r(this.ptr)},D.prototype=Object.create(X.prototype),D.prototype.constructor=D,D.prototype.__class__=D,D.__cache__={},y.PointAttribute=D,D.prototype.size=D.prototype.size=function(){return Sr(this.ptr)},D.prototype.GetAttributeTransformData=D.prototype.GetAttributeTransformData=function(){return J(Pr(this.ptr),Q)},D.prototype.attribute_type=D.prototype.attribute_type=function(){return Gr(this.ptr)},D.prototype.data_type=D.prototype.data_type=function(){return Rr(this.ptr)},D.prototype.num_components=D.prototype.num_components=function(){return Ar(this.ptr)},D.prototype.normalized=D.prototype.normalized=function(){return!!Nt(this.ptr)},D.prototype.byte_stride=D.prototype.byte_stride=function(){return Fr(this.ptr)},D.prototype.byte_offset=D.prototype.byte_offset=function(){return Ur(this.ptr)},D.prototype.unique_id=D.prototype.unique_id=function(){return ir(this.ptr)},D.prototype.__destroy__=D.prototype.__destroy__=function(){kr(this.ptr)},b.prototype=Object.create(X.prototype),b.prototype.constructor=b,b.prototype.__class__=b,b.__cache__={},y.AttributeQuantizationTransform=b,b.prototype.InitFromAttribute=b.prototype.InitFromAttribute=function(B){var _=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),!!Tt(_,B)},b.prototype.quantization_bits=b.prototype.quantization_bits=function(){return Nr(this.ptr)},b.prototype.min_value=b.prototype.min_value=function(B){var _=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),Tr(_,B)},b.prototype.range=b.prototype.range=function(){return sr(this.ptr)},b.prototype.__destroy__=b.prototype.__destroy__=function(){$t(this.ptr)},I.prototype=Object.create(X.prototype),I.prototype.constructor=I,I.prototype.__class__=I,I.__cache__={},y.AttributeOctahedronTransform=I,I.prototype.InitFromAttribute=I.prototype.InitFromAttribute=function(B){var _=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),!!Lt(_,B)},I.prototype.quantization_bits=I.prototype.quantization_bits=function(){return cr(this.ptr)},I.prototype.__destroy__=I.prototype.__destroy__=function(){C(this.ptr)},h.prototype=Object.create(X.prototype),h.prototype.constructor=h,h.prototype.__class__=h,h.__cache__={},y.PointCloud=h,h.prototype.num_attributes=h.prototype.num_attributes=function(){return k(this.ptr)},h.prototype.num_points=h.prototype.num_points=function(){return V(this.ptr)},h.prototype.__destroy__=h.prototype.__destroy__=function(){q(this.ptr)},f.prototype=Object.create(X.prototype),f.prototype.constructor=f,f.prototype.__class__=f,f.__cache__={},y.Mesh=f,f.prototype.num_faces=f.prototype.num_faces=function(){return ae(this.ptr)},f.prototype.num_attributes=f.prototype.num_attributes=function(){return se(this.ptr)},f.prototype.num_points=f.prototype.num_points=function(){return pe(this.ptr)},f.prototype.__destroy__=f.prototype.__destroy__=function(){ue(this.ptr)},d.prototype=Object.create(X.prototype),d.prototype.constructor=d,d.prototype.__class__=d,d.__cache__={},y.Metadata=d,d.prototype.__destroy__=d.prototype.__destroy__=function(){ve(this.ptr)},p.prototype=Object.create(X.prototype),p.prototype.constructor=p,p.prototype.__class__=p,p.__cache__={},y.Status=p,p.prototype.code=p.prototype.code=function(){return Fe(this.ptr)},p.prototype.ok=p.prototype.ok=function(){return!!Ke(this.ptr)},p.prototype.error_msg=p.prototype.error_msg=function(){return Yt(Ne(this.ptr))},p.prototype.__destroy__=p.prototype.__destroy__=function(){et(this.ptr)},g.prototype=Object.create(X.prototype),g.prototype.constructor=g,g.prototype.__class__=g,g.__cache__={},y.DracoFloat32Array=g,g.prototype.GetValue=g.prototype.GetValue=function(B){var _=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),Dt(_,B)},g.prototype.size=g.prototype.size=function(){return ct(this.ptr)},g.prototype.__destroy__=g.prototype.__destroy__=function(){lr(this.ptr)},u.prototype=Object.create(X.prototype),u.prototype.constructor=u,u.prototype.__class__=u,u.__cache__={},y.DracoInt8Array=u,u.prototype.GetValue=u.prototype.GetValue=function(B){var _=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),nn(_,B)},u.prototype.size=u.prototype.size=function(){return on(this.ptr)},u.prototype.__destroy__=u.prototype.__destroy__=function(){An(this.ptr)},l.prototype=Object.create(X.prototype),l.prototype.constructor=l,l.prototype.__class__=l,l.__cache__={},y.DracoUInt8Array=l,l.prototype.GetValue=l.prototype.GetValue=function(B){var _=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),sn(_,B)},l.prototype.size=l.prototype.size=function(){return cn(this.ptr)},l.prototype.__destroy__=l.prototype.__destroy__=function(){ln(this.ptr)},c.prototype=Object.create(X.prototype),c.prototype.constructor=c,c.prototype.__class__=c,c.__cache__={},y.DracoInt16Array=c,c.prototype.GetValue=c.prototype.GetValue=function(B){var _=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),gn(_,B)},c.prototype.size=c.prototype.size=function(){return pn(this.ptr)},c.prototype.__destroy__=c.prototype.__destroy__=function(){dn(this.ptr)},s.prototype=Object.create(X.prototype),s.prototype.constructor=s,s.prototype.__class__=s,s.__cache__={},y.DracoUInt16Array=s,s.prototype.GetValue=s.prototype.GetValue=function(B){var _=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),hn(_,B)},s.prototype.size=s.prototype.size=function(){return mn(this.ptr)},s.prototype.__destroy__=s.prototype.__destroy__=function(){In(this.ptr)},a.prototype=Object.create(X.prototype),a.prototype.constructor=a,a.prototype.__class__=a,a.__cache__={},y.DracoInt32Array=a,a.prototype.GetValue=a.prototype.GetValue=function(B){var _=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),bn(_,B)},a.prototype.size=a.prototype.size=function(){return En(this.ptr)},a.prototype.__destroy__=a.prototype.__destroy__=function(){yn(this.ptr)},i.prototype=Object.create(X.prototype),i.prototype.constructor=i,i.prototype.__class__=i,i.__cache__={},y.DracoUInt32Array=i,i.prototype.GetValue=i.prototype.GetValue=function(B){var _=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),Qn(_,B)},i.prototype.size=i.prototype.size=function(){return xn(this.ptr)},i.prototype.__destroy__=i.prototype.__destroy__=function(){wn(this.ptr)},A.prototype=Object.create(X.prototype),A.prototype.constructor=A,A.prototype.__class__=A,A.__cache__={},y.MetadataQuerier=A,A.prototype.HasEntry=A.prototype.HasEntry=function(B,_){var T=this.ptr;return ke.prepare(),B&&typeof B=="object"&&(B=B.ptr),_=_&&typeof _=="object"?_.ptr:M(_),!!Dn(T,B,_)},A.prototype.GetIntEntry=A.prototype.GetIntEntry=function(B,_){var T=this.ptr;return ke.prepare(),B&&typeof B=="object"&&(B=B.ptr),_=_&&typeof _=="object"?_.ptr:M(_),_n(T,B,_)},A.prototype.GetIntEntryArray=A.prototype.GetIntEntryArray=function(B,_,T){var de=this.ptr;ke.prepare(),B&&typeof B=="object"&&(B=B.ptr),_=_&&typeof _=="object"?_.ptr:M(_),T&&typeof T=="object"&&(T=T.ptr),Mn(de,B,_,T)},A.prototype.GetDoubleEntry=A.prototype.GetDoubleEntry=function(B,_){var T=this.ptr;return ke.prepare(),B&&typeof B=="object"&&(B=B.ptr),_=_&&typeof _=="object"?_.ptr:M(_),Sn(T,B,_)},A.prototype.GetStringEntry=A.prototype.GetStringEntry=function(B,_){var T=this.ptr;return ke.prepare(),B&&typeof B=="object"&&(B=B.ptr),_=_&&typeof _=="object"?_.ptr:M(_),Yt(Pn(T,B,_))},A.prototype.NumEntries=A.prototype.NumEntries=function(B){var _=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),Gn(_,B)},A.prototype.GetEntryName=A.prototype.GetEntryName=function(B,_){var T=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),Yt(Rn(T,B,_))},A.prototype.__destroy__=A.prototype.__destroy__=function(){Fn(this.ptr)},o.prototype=Object.create(X.prototype),o.prototype.constructor=o,o.prototype.__class__=o,o.__cache__={},y.Decoder=o,o.prototype.DecodeArrayToPointCloud=o.prototype.DecodeArrayToPointCloud=function(B,_,T){var de=this.ptr;return ke.prepare(),typeof B=="object"&&(B=N(B)),_&&typeof _=="object"&&(_=_.ptr),T&&typeof T=="object"&&(T=T.ptr),J(kn(de,B,_,T),p)},o.prototype.DecodeArrayToMesh=o.prototype.DecodeArrayToMesh=function(B,_,T){var de=this.ptr;return ke.prepare(),typeof B=="object"&&(B=N(B)),_&&typeof _=="object"&&(_=_.ptr),T&&typeof T=="object"&&(T=T.ptr),J(Nn(de,B,_,T),p)},o.prototype.GetAttributeId=o.prototype.GetAttributeId=function(B,_){var T=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),Tn(T,B,_)},o.prototype.GetAttributeIdByName=o.prototype.GetAttributeIdByName=function(B,_){var T=this.ptr;return ke.prepare(),B&&typeof B=="object"&&(B=B.ptr),_=_&&typeof _=="object"?_.ptr:M(_),Ln(T,B,_)},o.prototype.GetAttributeIdByMetadataEntry=o.prototype.GetAttributeIdByMetadataEntry=function(B,_,T){var de=this.ptr;return ke.prepare(),B&&typeof B=="object"&&(B=B.ptr),_=_&&typeof _=="object"?_.ptr:M(_),T=T&&typeof T=="object"?T.ptr:M(T),On(de,B,_,T)},o.prototype.GetAttribute=o.prototype.GetAttribute=function(B,_){var T=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),J(Hn(T,B,_),D)},o.prototype.GetAttributeByUniqueId=o.prototype.GetAttributeByUniqueId=function(B,_){var T=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),J(Lr(T,B,_),D)},o.prototype.GetMetadata=o.prototype.GetMetadata=function(B){var _=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),J(jn(_,B),d)},o.prototype.GetAttributeMetadata=o.prototype.GetAttributeMetadata=function(B,_){var T=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),J(Or(T,B,_),d)},o.prototype.GetFaceFromMesh=o.prototype.GetFaceFromMesh=function(B,_,T){var de=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),T&&typeof T=="object"&&(T=T.ptr),!!De(de,B,_,T)},o.prototype.GetTriangleStripsFromMesh=o.prototype.GetTriangleStripsFromMesh=function(B,_){var T=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),ee(T,B,_)},o.prototype.GetTrianglesUInt16Array=o.prototype.GetTrianglesUInt16Array=function(B,_,T){var de=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),T&&typeof T=="object"&&(T=T.ptr),!!E(de,B,_,T)},o.prototype.GetTrianglesUInt32Array=o.prototype.GetTrianglesUInt32Array=function(B,_,T){var de=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),T&&typeof T=="object"&&(T=T.ptr),!!v(de,B,_,T)},o.prototype.GetAttributeFloat=o.prototype.GetAttributeFloat=function(B,_,T){var de=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),T&&typeof T=="object"&&(T=T.ptr),!!P(de,B,_,T)},o.prototype.GetAttributeFloatForAllPoints=o.prototype.GetAttributeFloatForAllPoints=function(B,_,T){var de=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),T&&typeof T=="object"&&(T=T.ptr),!!Y(de,B,_,T)},o.prototype.GetAttributeIntForAllPoints=o.prototype.GetAttributeIntForAllPoints=function(B,_,T){var de=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),T&&typeof T=="object"&&(T=T.ptr),!!U(de,B,_,T)},o.prototype.GetAttributeInt8ForAllPoints=o.prototype.GetAttributeInt8ForAllPoints=function(B,_,T){var de=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),T&&typeof T=="object"&&(T=T.ptr),!!Ce(de,B,_,T)},o.prototype.GetAttributeUInt8ForAllPoints=o.prototype.GetAttributeUInt8ForAllPoints=function(B,_,T){var de=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),T&&typeof T=="object"&&(T=T.ptr),!!rt(de,B,_,T)},o.prototype.GetAttributeInt16ForAllPoints=o.prototype.GetAttributeInt16ForAllPoints=function(B,_,T){var de=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),T&&typeof T=="object"&&(T=T.ptr),!!RA(de,B,_,T)},o.prototype.GetAttributeUInt16ForAllPoints=o.prototype.GetAttributeUInt16ForAllPoints=function(B,_,T){var de=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),T&&typeof T=="object"&&(T=T.ptr),!!FA(de,B,_,T)},o.prototype.GetAttributeInt32ForAllPoints=o.prototype.GetAttributeInt32ForAllPoints=function(B,_,T){var de=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),T&&typeof T=="object"&&(T=T.ptr),!!UA(de,B,_,T)},o.prototype.GetAttributeUInt32ForAllPoints=o.prototype.GetAttributeUInt32ForAllPoints=function(B,_,T){var de=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),T&&typeof T=="object"&&(T=T.ptr),!!kA(de,B,_,T)},o.prototype.GetAttributeDataArrayForAllPoints=o.prototype.GetAttributeDataArrayForAllPoints=function(B,_,T,de,H){var Oe=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),T&&typeof T=="object"&&(T=T.ptr),de&&typeof de=="object"&&(de=de.ptr),H&&typeof H=="object"&&(H=H.ptr),!!NA(Oe,B,_,T,de,H)},o.prototype.SkipAttributeTransform=o.prototype.SkipAttributeTransform=function(B){var _=this.ptr;B&&typeof B=="object"&&(B=B.ptr),TA(_,B)},o.prototype.GetEncodedGeometryType_Deprecated=o.prototype.GetEncodedGeometryType_Deprecated=function(B){var _=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),LA(_,B)},o.prototype.DecodeBufferToPointCloud=o.prototype.DecodeBufferToPointCloud=function(B,_){var T=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),J(OA(T,B,_),p)},o.prototype.DecodeBufferToMesh=o.prototype.DecodeBufferToMesh=function(B,_){var T=this.ptr;return B&&typeof B=="object"&&(B=B.ptr),_&&typeof _=="object"&&(_=_.ptr),J(HA(T,B,_),p)},o.prototype.__destroy__=o.prototype.__destroy__=function(){jA(this.ptr)},(function(){function B(){y.ATTRIBUTE_INVALID_TRANSFORM=VA(),y.ATTRIBUTE_NO_TRANSFORM=JA(),y.ATTRIBUTE_QUANTIZATION_TRANSFORM=KA(),y.ATTRIBUTE_OCTAHEDRON_TRANSFORM=zA(),y.INVALID=YA(),y.POSITION=WA(),y.NORMAL=qA(),y.COLOR=XA(),y.TEX_COORD=ZA(),y.GENERIC=$A(),y.INVALID_GEOMETRY_TYPE=ei(),y.POINT_CLOUD=ti(),y.TRIANGULAR_MESH=ri(),y.DT_INVALID=ni(),y.DT_INT8=oi(),y.DT_UINT8=Ai(),y.DT_INT16=ii(),y.DT_UINT16=ai(),y.DT_INT32=si(),y.DT_UINT32=ci(),y.DT_INT64=li(),y.DT_UINT64=ui(),y.DT_FLOAT32=gi(),y.DT_FLOAT64=pi(),y.DT_BOOL=di(),y.DT_TYPES_COUNT=fi(),y.OK=hi(),y.DRACO_ERROR=mi(),y.IO_ERROR=Ii(),y.INVALID_PARAMETER=Bi(),y.UNSUPPORTED_VERSION=bi(),y.UNKNOWN_VERSION=Ei()}Bt?B():ot(B)})(),y.Decoder.prototype.GetEncodedGeometryType=function(B){if(B.__class__&&B.__class__===y.DecoderBuffer)return y.Decoder.prototype.GetEncodedGeometryType_Deprecated(B);if(B.byteLength<8)return y.INVALID_GEOMETRY_TYPE;switch(B[7]){case 0:return y.POINT_CLOUD;case 1:return y.TRIANGULAR_MESH;default:return y.INVALID_GEOMETRY_TYPE}},typeof y.onModuleParsed=="function"&&y.onModuleParsed(),ce.return(y))})}})();typeof tA=="object"&&typeof bo=="object"?(bo.exports=eA,bo.exports.default=eA):typeof define=="function"&&define.amd&&define([],function(){return eA})});var sa=Vn((Ku,aa)=>{$();var Fs=Aa(),Us=ia();aa.exports={createEncoderModule:Fs,createDecoderModule:Us}});var Ua=Vn((Ed,Fa)=>{$();var No=()=>new Proxy(function(){},{get:(e,t)=>t==="__esModule"?!0:t===Symbol.toPrimitive?()=>"":No(),apply:()=>No(),construct:()=>No()});Fa.exports=No()});$();var ji=new Float32Array(2048);for(let e=0;e<2048;e++)ji[e]=.5*(1-Math.cos(2*Math.PI*e/2047));var Vi=new Uint16Array(2048);for(let e=0;e<2048;e++){let t=0,r=e;for(let n=0;n<11;n++)t=t<<1|r&1,r>>=1;Vi[e]=t}var Ji=new Float32Array(2048/2),Ki=new Float32Array(2048/2);for(let e=0;e<2048/2;e++){let t=-2*Math.PI*e/2048;Ji[e]=Math.cos(t),Ki[e]=Math.sin(t)}function bs(e,t){for(let r=0;r<2048;r++){let n=Vi[r]??0;if(n>r){let o=e[r]??0;e[r]=e[n]??0,e[n]=o;let A=t[r]??0;t[r]=t[n]??0,t[n]=A}}for(let r=2;r<=2048;r<<=1){let n=r>>1,o=2048/r;for(let A=0;A<2048;A+=r)for(let i=0;i<n;i++){let a=i*o,s=Ji[a]??1,c=Ki[a]??0,l=e[A+i]??0,u=t[A+i]??0,g=e[A+i+n]??0,p=t[A+i+n]??0,d=g*s-p*c,f=g*c+p*s;e[A+i]=l+d,t[A+i]=u+f,e[A+i+n]=l-d,t[A+i+n]=u-f}}}var uo=class e{tempReal=new Float32Array(2048);tempImag=new Float32Array(2048);previousBins=new Float32Array(1024);extractAtTime(t,r,n){let o=t.length,A=o>0?t[0]?.length??0:0,a=Math.round(n*r)-1024;for(let Q=0;Q<2048;Q++){let w=a+Q,S=0;w>=0&&w<A&&(o===1?S=t[0]?.[w]??0:o>=2&&(S=((t[0]?.[w]??0)+(t[1]?.[w]??0))*.5)),this.tempReal[Q]=S*(ji[Q]??1),this.tempImag[Q]=0}bs(this.tempReal,this.tempImag);let s=new Float32Array(1024),c=2/2048;for(let Q=0;Q<1024;Q++){let w=this.tempReal[Q]??0,S=this.tempImag[Q]??0;s[Q]=Math.sqrt(w*w+S*S)*c*2}let l=r/2048,u=Math.max(1,Math.round(20/l)),g=Math.max(u+1,Math.round(150/l)),p=0;for(let Q=u;Q<=g&&Q<1024;Q++)p+=(s[Q]??0)*(s[Q]??0);let d=Math.min(1,Math.sqrt(p/(g-u+1))*4),f=0;for(let Q=0;Q<1024;Q++){let w=(s[Q]??0)-(this.previousBins[Q]??0);w>0&&(f+=w),this.previousBins[Q]=s[Q]??0}let h=Math.min(1,f*.15),I=Math.round(300/l),b=Math.min(1023,Math.round(3400/l)),D=0;for(let Q=I;Q<=b;Q++)D+=(s[Q]??0)*(s[Q]??0);let m=Math.min(1,Math.sqrt(D/(b-I+1))*3.5);return{fftBins:s,bassEnergy:d,drumTransient:h,vocalEnergy:m,timeMs:n*1e3}}static packBufferData(t){let r=new Float32Array(1028);return r.set(t.fftBins,0),r[1024]=t.bassEnergy,r[1025]=t.drumTransient,r[1026]=t.vocalEnergy,r[1027]=t.timeMs,r}static createGpuBuffer(t,r){let n=r?e.packBufferData(r):new Float32Array(1028),o=t.createBuffer({label:"AudioLatentBuffer",size:4112,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});return new Float32Array(o.getMappedRange()).set(n),o.unmap(),o}static updateGpuBuffer(t,r,n){let o=e.packBufferData(n);t.queue.writeBuffer(r,0,o)}},Hi=class{constructor(t,r,n,o){this.channels=t;this.sampleRate=r;this.fps=n;this.totalFrames=o;let A=new uo,i=r||48e3,a=n||30,s=t[0]?.length??0,c=Math.max(10,Math.ceil(s/i*a)+10),l=typeof o=="number"&&Number.isFinite(o)&&o>0?Math.round(o):c;this.frames=new Array(l);for(let u=0;u<l;u++){let g=u/a;this.frames[u]=A.extractAtTime(t,i,g)}}channels;sampleRate;fps;totalFrames;frames=[];gpuBuffers=new WeakMap;getFrameData(t){let r=Math.max(0,Math.min(this.totalFrames-1,Math.round(t)));return this.frames[r]??{fftBins:new Float32Array(1024),bassEnergy:0,drumTransient:0,vocalEnergy:0,timeMs:r/this.fps*1e3}}getGpuBuffer(t,r){let n=this.gpuBuffers.get(t);n||(n=new Map,this.gpuBuffers.set(t,n));let o=Math.max(0,Math.min(this.totalFrames-1,Math.round(r))),A=n.get(o);if(!A){let i=this.getFrameData(o);A=uo.createGpuBuffer(t,i),n.set(o,A)}return A}};$();var Z={create(e=0,t=0,r=0){return[e,t,r]},copy(e){return[e[0],e[1],e[2]]},set(e,t,r,n){return e[0]=t,e[1]=r,e[2]=n,e},add(e,t){return[e[0]+t[0],e[1]+t[1],e[2]+t[2]]},subtract(e,t){return[e[0]-t[0],e[1]-t[1],e[2]-t[2]]},multiplyScalar(e,t){return[e[0]*t,e[1]*t,e[2]*t]},dot(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]},cross(e,t){return[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]]},lengthSq(e){return e[0]*e[0]+e[1]*e[1]+e[2]*e[2]},length(e){return Math.hypot(e[0],e[1],e[2])},distance(e,t){return Math.hypot(e[0]-t[0],e[1]-t[1],e[2]-t[2])},normalize(e){let t=Math.hypot(e[0],e[1],e[2]);if(t===0)return[0,0,0];let r=1/t;return[e[0]*r,e[1]*r,e[2]*r]},lerp(e,t,r){return[e[0]+(t[0]-e[0])*r,e[1]+(t[1]-e[1])*r,e[2]+(t[2]-e[2])*r]},equals(e,t,r=1e-6){return Math.abs(e[0]-t[0])<=r&&Math.abs(e[1]-t[1])<=r&&Math.abs(e[2]-t[2])<=r}};$();var Ee={identity(){return[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},copy(e){return[...e]},multiply(e,t){let r=new Array(16);for(let n=0;n<4;n++)for(let o=0;o<4;o++)r[o*4+n]=e[0+n]*t[o*4+0]+e[4+n]*t[o*4+1]+e[8+n]*t[o*4+2]+e[12+n]*t[o*4+3];return r},translate(e,t,r=0){return[1,0,0,0,0,1,0,0,0,0,1,0,e,t,r,1]},scale(e,t,r=1){return[e,0,0,0,0,t,0,0,0,0,r,0,0,0,0,1]},rotateX(e){let t=Math.cos(e),r=Math.sin(e);return[1,0,0,0,0,t,r,0,0,-r,t,0,0,0,0,1]},rotateY(e){let t=Math.cos(e),r=Math.sin(e);return[t,0,-r,0,0,1,0,0,r,0,t,0,0,0,0,1]},rotateZ(e){let t=Math.cos(e),r=Math.sin(e);return[t,r,0,0,-r,t,0,0,0,0,1,0,0,0,0,1]},rotateAxis(e,t){let r=Z.normalize(e),n=r[0],o=r[1],A=r[2],i=Math.cos(t),a=Math.sin(t),s=1-i;return[s*n*n+i,s*n*o+a*A,s*n*A-a*o,0,s*n*o-a*A,s*o*o+i,s*o*A+a*n,0,s*n*A+a*o,s*o*A-a*n,s*A*A+i,0,0,0,0,1]},lookAt(e,t,r=[0,-1,0]){let n=Z.subtract(t,e);Z.lengthSq(n)===0?n=[0,0,1]:n=Z.normalize(n);let o=Z.cross(n,r);Z.lengthSq(o)===0?o=[1,0,0]:o=Z.normalize(o);let A=Z.cross(o,n);return[o[0],A[0],n[0],0,o[1],A[1],n[1],0,o[2],A[2],n[2],0,-Z.dot(o,e),-Z.dot(A,e),-Z.dot(n,e),1]},perspective(e,t,r,n){let o=1/Math.tan(e/2),A=1/(n-r);return[o/t,0,0,0,0,o,0,0,0,0,n*A,1,0,0,-r*n*A,0]},orthographic(e,t,r,n,o,A){let i=1/(t-e),a=1/(n-r),s=1/(A-o);return[2*i,0,0,0,0,2*a,0,0,0,0,s,0,-(t+e)*i,-(n+r)*a,-o*s,1]},invert(e){let t=new Array(16);t[0]=e[5]*e[10]*e[15]-e[5]*e[11]*e[14]-e[9]*e[6]*e[15]+e[9]*e[7]*e[14]+e[13]*e[6]*e[11]-e[13]*e[7]*e[10],t[4]=-e[4]*e[10]*e[15]+e[4]*e[11]*e[14]+e[8]*e[6]*e[15]-e[8]*e[7]*e[14]-e[12]*e[6]*e[11]+e[12]*e[7]*e[10],t[8]=e[4]*e[9]*e[15]-e[4]*e[11]*e[13]-e[8]*e[5]*e[15]+e[8]*e[7]*e[13]+e[12]*e[5]*e[11]-e[12]*e[7]*e[9],t[12]=-e[4]*e[9]*e[14]+e[4]*e[10]*e[13]+e[8]*e[5]*e[14]-e[8]*e[6]*e[13]-e[12]*e[5]*e[10]+e[12]*e[6]*e[9],t[1]=-e[1]*e[10]*e[15]+e[1]*e[11]*e[14]+e[9]*e[2]*e[15]-e[9]*e[3]*e[14]-e[13]*e[2]*e[11]+e[13]*e[3]*e[10],t[5]=e[0]*e[10]*e[15]-e[0]*e[11]*e[14]-e[8]*e[2]*e[15]+e[8]*e[3]*e[14]+e[12]*e[2]*e[11]-e[12]*e[3]*e[10],t[9]=-e[0]*e[9]*e[15]+e[0]*e[11]*e[13]+e[8]*e[1]*e[15]-e[8]*e[3]*e[13]-e[12]*e[1]*e[11]+e[12]*e[3]*e[9],t[13]=e[0]*e[9]*e[14]-e[0]*e[10]*e[13]-e[8]*e[1]*e[14]+e[8]*e[2]*e[13]+e[12]*e[1]*e[10]-e[12]*e[2]*e[9],t[2]=e[1]*e[6]*e[15]-e[1]*e[7]*e[14]-e[5]*e[2]*e[15]+e[5]*e[3]*e[14]+e[13]*e[2]*e[7]-e[13]*e[3]*e[6],t[6]=-e[0]*e[6]*e[15]+e[0]*e[7]*e[14]+e[4]*e[2]*e[15]-e[4]*e[3]*e[14]-e[12]*e[2]*e[7]+e[12]*e[3]*e[6],t[10]=e[0]*e[5]*e[15]-e[0]*e[7]*e[13]-e[4]*e[1]*e[15]+e[4]*e[3]*e[13]+e[12]*e[1]*e[7]-e[12]*e[3]*e[5],t[14]=-e[0]*e[5]*e[14]+e[0]*e[6]*e[13]+e[4]*e[1]*e[14]-e[4]*e[2]*e[13]-e[12]*e[1]*e[6]+e[12]*e[2]*e[5],t[3]=-e[1]*e[6]*e[11]+e[1]*e[7]*e[10]+e[5]*e[2]*e[11]-e[5]*e[3]*e[10]-e[9]*e[2]*e[7]+e[9]*e[3]*e[6],t[7]=e[0]*e[6]*e[11]-e[0]*e[7]*e[10]-e[4]*e[2]*e[11]+e[4]*e[3]*e[10]+e[8]*e[2]*e[7]-e[8]*e[3]*e[6],t[11]=-e[0]*e[5]*e[11]+e[0]*e[7]*e[9]+e[4]*e[1]*e[11]-e[4]*e[3]*e[9]-e[8]*e[1]*e[7]+e[8]*e[3]*e[5],t[15]=e[0]*e[5]*e[10]-e[0]*e[6]*e[9]-e[4]*e[1]*e[10]+e[4]*e[2]*e[9]+e[8]*e[1]*e[6]-e[8]*e[2]*e[5];let r=e[0]*t[0]+e[1]*t[4]+e[2]*t[8]+e[3]*t[12];if(Math.abs(r)<1e-12)return null;r=1/r;for(let n=0;n<16;n++)t[n]*=r;return t},transpose(e){return[e[0],e[4],e[8],e[12],e[1],e[5],e[9],e[13],e[2],e[6],e[10],e[14],e[3],e[7],e[11],e[15]]},projectPoint(e,t){let r=t[0],n=t[1],o=t[2],A=e[0]*r+e[4]*n+e[8]*o+e[12],i=e[1]*r+e[5]*n+e[9]*o+e[13],a=e[2]*r+e[6]*n+e[10]*o+e[14],s=e[3]*r+e[7]*n+e[11]*o+e[15],c=Math.abs(s)>1e-6?1/s:1;return[A*c,i*c,a*c]},projectRectangle(e,t,r){return[Ee.projectPoint(e,[0,0,0]),Ee.projectPoint(e,[t,0,0]),Ee.projectPoint(e,[t,r,0]),Ee.projectPoint(e,[0,r,0])]},toFloat32Array(e){return new Float32Array(e)}};$();function Jn(e,t,r=3){let n=0,o=1,A=1,i=0;for(let a=0;a<r;a++){let s=Math.sin(e*o*2*Math.PI+t+a*1.7),c=Math.cos(e*o*1.414*Math.PI+t*2.1+a*.9);n+=(s*.6+c*.4)*A,i+=A,o*=2,A*=.5}return i>0?n/i:0}var pr={createDefaultCamera(e,t,r=50){let n=r*Math.PI/180,o=t/2/Math.tan(n/2);return{eye:[e/2,t/2,-o],target:[e/2,t/2,0],up:[0,-1,0],fov:r,aspect:Math.max(1e-4,e/t),near:1,far:5e4,zoom:1,focusDistance:o,fStop:2.8,maxBlurRadius:32}},computeViewMatrix(e){return Ee.lookAt(e.eye,e.target,e.up)},computeProjectionMatrix(e){let t=e.fov*Math.PI/180,r=Ee.perspective(t,e.aspect,e.near,e.far);return e.zoom!==1&&e.zoom>0&&(r[0]*=e.zoom,r[5]*=e.zoom),r},computeViewProjectionMatrix(e){let t=pr.computeViewMatrix(e),r=pr.computeProjectionMatrix(e);return Ee.multiply(r,t)},dolly(e,t,r){let n=Z.normalize(Z.subtract(t,e)),o=Z.multiplyScalar(n,r);return{eye:Z.add(e,o),target:t}},truckPedestal(e,t,r,n,o){let A=Z.normalize(Z.subtract(t,e)),i=Z.normalize(Z.cross(A,r)),a=Z.cross(i,A),s=Z.multiplyScalar(i,n),c=Z.multiplyScalar(a,o),l=Z.add(s,c);return{eye:Z.add(e,l),target:Z.add(t,l)}},orbit(e,t,r,n){let o=r*Math.PI/180,A=n*Math.PI/180,i=Math.cos(A),a=Math.sin(A),s=Math.cos(o),c=Math.sin(o),l=e[0]+t*i*c,u=e[1]-t*a,g=e[2]-t*i*s;return[l,u,g]},applyOrientation(e,t,r,n){if(t===0&&r===0&&n===0)return e;let o=Z.normalize(Z.subtract(e.target,e.eye)),A=Z.normalize(Z.cross(o,e.up)),i=Z.cross(A,o),a=Z.distance(e.eye,e.target),s=o,c=i;if(r!==0){let g=r*Math.PI/180,p=Math.cos(g),d=Math.sin(g);s=Z.normalize(Z.subtract(Z.multiplyScalar(s,p),Z.multiplyScalar(A,d)))}let l=Z.normalize(Z.cross(s,c));if(t!==0){let g=t*Math.PI/180,p=Math.cos(g),d=Math.sin(g);s=Z.normalize(Z.add(Z.multiplyScalar(s,p),Z.multiplyScalar(c,d))),c=Z.normalize(Z.cross(l,s))}if(n!==0){let g=n*Math.PI/180,p=Math.cos(g),d=Math.sin(g);c=Z.normalize(Z.add(Z.multiplyScalar(c,p),Z.multiplyScalar(l,d)))}let u=Z.add(e.eye,Z.multiplyScalar(s,a));return{...e,target:u,up:c}},applyCameraShake(e,t,r){let{translationAmplitude:n,rotationAmplitude:o,frequency:A=2.5,octaves:i=3,seed:a=42}=r;if(n<=0&&o<=0)return e;let s=t*A,c=Jn(s,a,i)*n,l=Jn(s,a+101.5,i)*n,u=Jn(s,a+203.7,i)*(n*.5),g=Jn(s,a+307.1,i)*o,p=Jn(s,a+409.3,i)*o,d=Z.normalize(Z.subtract(e.target,e.eye)),f=Z.normalize(Z.cross(d,e.up)),h=Z.cross(f,d),I=Z.add(Z.multiplyScalar(f,c),Z.add(Z.multiplyScalar(h,l),Z.multiplyScalar(d,u))),b=Z.add(e.eye,I),D=Z.add(e.target,Z.add(Z.multiplyScalar(f,p*10),Z.multiplyScalar(h,g*10)));return{...e,eye:b,target:D}},computeCircleOfConfusion(e,t,r,n,o=32){if(t<=0||n<=0||e<=0)return 0;let A=Math.abs(e-t),i=r/n,a=A/e*i*.5;return Math.min(o,Math.max(0,a))},computeCameraFrustumPlanes(e){let t=r=>{let n=Math.hypot(r[0],r[1],r[2]);return n===0?r:[r[0]/n,r[1]/n,r[2]/n,r[3]/n]};return{left:t([e[3]+e[0],e[7]+e[4],e[11]+e[8],e[15]+e[12]]),right:t([e[3]-e[0],e[7]-e[4],e[11]-e[8],e[15]-e[12]]),bottom:t([e[3]+e[1],e[7]+e[5],e[11]+e[9],e[15]+e[13]]),top:t([e[3]-e[1],e[7]-e[5],e[11]-e[9],e[15]-e[13]]),near:t([e[2],e[6],e[10],e[14]]),far:t([e[3]-e[2],e[7]-e[6],e[11]-e[10],e[15]-e[14]])}},isBoxInFrustum(e,t,r){let n=[r.left,r.right,r.bottom,r.top,r.near,r.far];for(let o of n){let A=o[0]>0?t[0]:e[0],i=o[1]>0?t[1]:e[1],a=o[2]>0?t[2]:e[2];if(o[0]*A+o[1]*i+o[2]*a+o[3]<0)return!1}return!0}};$();var Es={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}},ys={none:0,aces:1,agx:2,neutral:3};function Hr(e){let t=Pi(e)??[0,0,0,1],r=n=>n<=.04045?n/12.92:((n+.055)/1.055)**2.4;return[r(t[0]),r(t[1]),r(t[2])]}function zi(e){let t=Es[e.preset??"studio"],r=e.intensity??1,n=o=>[o[0]*r,o[1]*r,o[2]*r];return{top:n(Hr(e.top??t.top)),horizon:n(Hr(e.horizon??t.horizon)),bottom:n(Hr(e.bottom??t.bottom)),softboxes:(e.softboxes??t.softboxes)*r,rotationRad:(e.rotation??0)*Math.PI/180,exposureMultiplier:2**(e.exposure??0),toneMapping:ys[e.toneMapping??"neutral"],fog:e.fog?{color:Hr(e.fog.color),start:e.fog.start,end:e.fog.end,opacity:Math.max(0,Math.min(1,e.fog.opacity??1))}:void 0,floor:e.floor?{y:e.floor.y,color:Hr(e.floor.color??"#08070a"),reflectivity:Math.max(0,Math.min(1,e.floor.reflectivity??.35)),roughness:Math.max(0,Math.min(1,e.floor.roughness??.35)),fadeDistance:Math.max(0,e.floor.fadeDistance??900),opacity:Math.max(0,Math.min(1,e.floor.opacity??1))}:void 0}}$();var Yi=8,Wo=768;function Yo(e){if(!e)return[1,1,1];if(Array.isArray(e)){let o=e[0]??1,A=e[1]??1,i=e[2]??1;return[o>1?o/255:o,A>1?A/255:A,i>1?i/255:i]}if(typeof e=="object"&&e!==null){let o=e.r??1,A=e.g??1,i=e.b??1;return[o>1?o/255:o,A>1?A/255:A,i>1?i/255:i]}if(typeof e!="string")return[1,1,1];let t=e.trim().toLowerCase();if(t.startsWith("#")){let o=t.slice(1);if(o.length===3){let A=Number.parseInt(o[0]+o[0],16)/255,i=Number.parseInt(o[1]+o[1],16)/255,a=Number.parseInt(o[2]+o[2],16)/255;return[A,i,a]}if(o.length>=6){let A=Number.parseInt(o.slice(0,2),16)/255,i=Number.parseInt(o.slice(2,4),16)/255,a=Number.parseInt(o.slice(4,6),16)/255;return[A,i,a]}}let r=t.match(/rgba?\s*\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)/);if(r){let o=Number.parseFloat(r[1])/255,A=Number.parseFloat(r[2])/255,i=Number.parseFloat(r[3])/255;return[Math.max(0,Math.min(1,o)),Math.max(0,Math.min(1,A)),Math.max(0,Math.min(1,i))]}let n=t.match(/hsla?\s*\(\s*([\d.]+)\s*,\s*([\d.]+)%?\s*,\s*([\d.]+)%?/);if(n){let o=Number.parseFloat(n[1])/360,A=Number.parseFloat(n[2])/100,i=Number.parseFloat(n[3])/100;return Cs(o,A,i)}return[1,1,1]}function Cs(e,t,r){if(t===0)return[r,r,r];let n=(i,a,s)=>{let c=s;return c<0&&(c+=1),c>1&&(c-=1),c<1/6?i+(a-i)*6*c:c<1/2?a:c<2/3?i+(a-i)*(2/3-c)*6:i},o=r<.5?r*(1+t):r+t-r*t,A=2*r-o;return[n(A,o,e+1/3),n(A,o,e),n(A,o,e-1/3)]}var Qt={computeNormalMatrix(e){let t=Ee.invert(e);return t?[t[0],t[4],t[8],0,t[1],t[5],t[9],0,t[2],t[6],t[10],0,0,0,0,1]:Ee.identity()},processLight(e){let t=Yo(e.color),r=e.intensity??1,n=e.position?e.position[0]:e.x??0,o=e.position?e.position[1]:e.y??0,A=e.position?e.position[2]:e.z??0,i=e.lightType??e.type??"directional",a=1;i==="ambient"?a=0:i==="directional"?a=1:i==="point"?a=2:i==="spot"&&(a=3);let s=[0,0,-1];if(e.direction)s=Z.normalize(e.direction);else if(e.target||e.targetX!==void 0||e.targetY!==void 0||e.targetZ!==void 0){let I=e.target?e.target[0]:e.targetX??n,b=e.target?e.target[1]:e.targetY??o,D=e.target?e.target[2]:e.targetZ??A,m=[I,b,D],Q=Z.subtract(m,[n,o,A]);Z.length(Q)>1e-4&&(s=Z.normalize(Q))}let c=Math.max(1,e.radius??1e3),l=e.decay??2,u=Math.max(.1,Math.min(180,e.angle??45)),g=Math.max(0,Math.min(1,e.penumbra??.2)),p=u*Math.PI/180,d=p*(1-g),f=Math.cos(p),h=Math.cos(d);return{posType:[n,o,A,a],dirRadius:[s[0],s[1],s[2],c],colorIntensity:[t[0],t[1],t[2],r],spotParams:[f,h,l,0]}},packLightsUniforms(e,t,r,n=!1){let o=new Float32Array(Wo/4);if(Qt.packPhysicalBlock(o,e??[],t,r,n),(!e||e.length===0)&&!t)return o[4]=0,o[5]=0,o;let A=0,i=0,a=0,s=[];for(let l of e)if((l.lightType??l.type)==="ambient"){let g=Yo(l.color),p=l.intensity??1;A+=g[0]*p,i+=g[1]*p,a+=g[2]*p}else s.push(Qt.processLight(l));o[0]=A,o[1]=i,o[2]=a,o[3]=1,o[4]=s.length,o[5]=1;let c=8;for(let l=0;l<Yi;l++){if(l<s.length){let u=s[l];o[c+0]=u.posType[0],o[c+1]=u.posType[1],o[c+2]=u.posType[2],o[c+3]=u.posType[3],o[c+4]=u.dirRadius[0],o[c+5]=u.dirRadius[1],o[c+6]=u.dirRadius[2],o[c+7]=u.dirRadius[3],o[c+8]=u.colorIntensity[0],o[c+9]=u.colorIntensity[1],o[c+10]=u.colorIntensity[2],o[c+11]=u.colorIntensity[3],o[c+12]=u.spotParams[0],o[c+13]=u.spotParams[1],o[c+14]=u.spotParams[2],o[c+15]=u.spotParams[3]}else for(let u=0;u<16;u++)o[c+u]=0;c+=16}return o},packDirectLights(e,t=[]){let r=e.filter(A=>(A.lightType??A.type)!=="ambient"),n=new Float32Array(Math.max(1,r.length)*40),o=new Map(t.map((A,i)=>[A.lightIndex,i]));for(let[A,i]of r.entries()){let a=Qt.processLight(i),s=A*40;n.set(a.posType,s),n.set(a.dirRadius,s+4),n.set(a.colorIntensity,s+8),n.set(a.spotParams,s+12);let c=o.get(A),l=c===void 0?void 0:t[c];if(l&&c!==void 0){for(let u=0;u<16;u++)n[s+16+u]=l.matrix[u]??0;n.set([l.softness,l.mapSize,c,1],s+32),n.set([l.bias,l.normalOffset,l.darkness,0],s+36)}}return n},shadowCasterIndex(e){let t=0;for(let r of e){let n=r.lightType??r.type;if(n!=="ambient"){if(r.castShadow&&(n==="directional"||n==="spot"))return t;t++}}return-1},packPhysicalBlock(e,t,r,n,o=!1){let A=8+Yi*16,i=0,a=0,s=0;for(let c of t){if((c.lightType??c.type)!=="ambient")continue;let[l,u,g]=Yo(c.color),p=c.intensity??1,d=f=>f<=.04045?f/12.92:((f+.055)/1.055)**2.4;i+=d(l)*p,a+=d(u)*p,s+=d(g)*p}if(e[A+0]=i,e[A+1]=a,e[A+2]=s,e[A+3]=1,r){let c=zi(r);e[6]=1,e[7]=c.toneMapping,e[A+3]=c.exposureMultiplier,e.set([...c.top,c.rotationRad],A+4),e.set([...c.horizon,c.softboxes],A+8),e.set([...c.bottom,1],A+12),c.fog&&(e.set([...c.fog.color,1],A+16),e.set([c.fog.start,c.fog.end,c.fog.opacity,0],A+20))}if(n&&n.lightIndex>=0){e.set([1,n.lightIndex,n.softness,n.mapSize],A+24),e.set([n.bias,n.normalOffset,n.darkness,0],A+28);for(let c=0;c<16;c++)e[A+32+c]=n.matrix[c]??0}r?.floor?(e[A+48]=r.floor.y,e[A+49]=r.floor.fadeDistance??900,e[A+50]=o?1:0,e[A+51]=0):(e[A+48]=0,e[A+49]=0,e[A+50]=0,e[A+51]=0)}};$();var dr=class e{samples=[];frames=[];totalLength=0;constructor(t){if(t.length<2)throw new Error("Path3D requires at least 2 coordinate samples");this.samples=t,this.totalLength=t[t.length-1].distance,this.computeRotationMinimizingFrames()}computeRotationMinimizingFrames(){let t=this.samples.length;this.frames=new Array(t);let r=this.samples[0].tangent,n=[0,-1,0];Math.abs(Z.dot(r,n))>.95&&(n=[0,0,1]);let o=Z.normalize(Z.subtract(n,Z.multiplyScalar(r,Z.dot(n,r))));Z.lengthSq(o)<1e-4&&(o=[1,0,0]);let A=Z.normalize(Z.cross(r,o));this.frames[0]={normal:o,binormal:A,rotation:this.eulerFromFrame(r,o,A)};for(let i=0;i<t-1;i++){let a=this.samples[i].position,s=this.samples[i+1].position,c=this.samples[i].tangent,l=this.samples[i+1].tangent,u=this.frames[i].normal,g=Z.subtract(s,a),p=Z.dot(g,g),d;if(p>1e-8){let h=Z.subtract(c,Z.multiplyScalar(g,2*Z.dot(g,c)/p)),I=Z.subtract(u,Z.multiplyScalar(g,2*Z.dot(g,u)/p)),b=Z.subtract(l,h),D=Z.dot(b,b);D>1e-8?d=Z.subtract(I,Z.multiplyScalar(b,2*Z.dot(b,I)/D)):d=I}else d=u;d=Z.normalize(Z.subtract(d,Z.multiplyScalar(l,Z.dot(l,d))));let f=Z.normalize(Z.cross(l,d));this.frames[i+1]={normal:d,binormal:f,rotation:this.eulerFromFrame(l,d,f)}}}eulerFromFrame(t,r,n){let o=Math.asin(Math.max(-1,Math.min(1,-t[1])))*(180/Math.PI),A=Math.atan2(t[0],t[2])*(180/Math.PI),i=Math.atan2(r[0],r[1])*(180/Math.PI);return[o,A,i]}getSamples(){return this.samples}getPoints(t=64){let r=Math.max(2,Math.round(t)),n=[];for(let o=0;o<r;o++)n.push(this.getPointAt(o/(r-1)).position);return n}getPointAt(t){let n=Math.max(0,Math.min(1,t))*this.totalLength;return this.getPointAtDistance(n)}getPointAtDistance(t){let r=Math.max(0,Math.min(this.totalLength,t)),n=this.samples.length,o=0,A=n-1;for(;o<A;){let D=o+A>>1;this.samples[D].distance<r?o=D+1:A=D}let i=Math.max(1,o),a=i-1,s=this.samples[a],c=this.samples[i],l=c.distance-s.distance,u=l>1e-6?(r-s.distance)/l:0,g=Z.lerp(s.position,c.position,u),p=Z.normalize(Z.lerp(s.tangent,c.tangent,u)),d=this.frames[a],f=this.frames[i],h=Z.normalize(Z.lerp(d.normal,f.normal,u)),I=Z.normalize(Z.cross(p,h)),b=[d.rotation[0]+(f.rotation[0]-d.rotation[0])*u,d.rotation[1]+(f.rotation[1]-d.rotation[1])*u,d.rotation[2]+(f.rotation[2]-d.rotation[2])*u];return{position:g,tangent:p,normal:h,binormal:I,distance:r,t:this.totalLength>0?r/this.totalLength:0,rotation:b}}static catmullRom(t,r={}){if(t.length<2)throw new Error("Catmull-Rom spline requires at least 2 waypoints");let n=!!r.closed,o=r.samplesPerSegment??40,A=[];if(n)A.push(t[t.length-1]),A.push(...t),A.push(t[0]),A.push(t[1]);else{let s=t[0],c=t[1],l=t[t.length-1],u=t[t.length-2];A.push(Z.subtract(s,Z.subtract(c,s))),A.push(...t),A.push(Z.add(l,Z.subtract(l,u)))}let i=n?t.length:t.length-1,a=[];for(let s=0;s<i;s++){let c=A[s],l=A[s+1],u=A[s+2],g=A[s+3],p=s===i-1?o:o-1;for(let d=0;d<=p;d++){let f=d/o,h=f*f,I=h*f,b=-.5*I+h-.5*f,D=1.5*I-2.5*h+1,m=-1.5*I+2*h+.5*f,Q=.5*I-.5*h,w=[b*c[0]+D*l[0]+m*u[0]+Q*g[0],b*c[1]+D*l[1]+m*u[1]+Q*g[1],b*c[2]+D*l[2]+m*u[2]+Q*g[2]],S=-1.5*h+2*f-.5,N=4.5*h-5*f,M=-4.5*h+4*f+.5,G=1.5*h-1*f,j=[S*c[0]+N*l[0]+M*u[0]+G*g[0],S*c[1]+N*l[1]+M*u[1]+G*g[1],S*c[2]+N*l[2]+M*u[2]+G*g[2]],R=Z.normalize(j);a.push({position:w,tangent:R})}}return e.fromRawSamples(a)}static fromRawSamples(t){let r=0,n=t.map((o,A)=>(A>0&&(r+=Z.distance(o.position,t[A-1].position)),{position:o.position,tangent:o.tangent,distance:r}));if(n.length===0)throw new TypeError("Path3D needs samples");return new e(n)}static bezier(t,r=50){if(t.length===0)throw new Error("Bezier path requires at least 1 segment");let n=[];for(let o=0;o<t.length;o++){let A=t[o],i=o===t.length-1?r:r-1;for(let a=0;a<=i;a++){let s=a/r,c=1-s,l=c*c,u=l*c,g=s*s,p=g*s,d=[u*A.p0[0]+3*l*s*A.p1[0]+3*c*g*A.p2[0]+p*A.p3[0],u*A.p0[1]+3*l*s*A.p1[1]+3*c*g*A.p2[1]+p*A.p3[1],u*A.p0[2]+3*l*s*A.p1[2]+3*c*g*A.p2[2]+p*A.p3[2]],f=[3*l*(A.p1[0]-A.p0[0])+6*c*s*(A.p2[0]-A.p1[0])+3*g*(A.p3[0]-A.p2[0]),3*l*(A.p1[1]-A.p0[1])+6*c*s*(A.p2[1]-A.p1[1])+3*g*(A.p3[1]-A.p2[1]),3*l*(A.p1[2]-A.p0[2])+6*c*s*(A.p2[2]-A.p1[2])+3*g*(A.p3[2]-A.p2[2])],h=Z.normalize(f);n.push({position:d,tangent:h})}}return e.fromRawSamples(n)}static helix(t){let{center:r,radius:n,pitch:o,turns:A,axis:i="z",samplesPerTurn:a=60}=t,s=Math.max(10,Math.round(A*a)),c=[];for(let l=0;l<=s;l++){let u=l/s,g=u*A*Math.PI*2,p=(u-.5)*o*A,d=Math.cos(g),f=Math.sin(g),h,I;i==="z"?(h=[r[0]+n*d,r[1]+n*f,r[2]+p],I=[-n*f,n*d,o*A/(A*Math.PI*2)]):i==="y"?(h=[r[0]+n*d,r[1]+p,r[2]+n*f],I=[-n*f,o*A/(A*Math.PI*2),n*d]):(h=[r[0]+p,r[1]+n*d,r[2]+n*f],I=[o*A/(A*Math.PI*2),-n*f,n*d]),c.push({position:h,tangent:Z.normalize(I)})}return e.fromRawSamples(c)}static circle(t){let{center:r,radius:n,startAngleDeg:o=0,endAngleDeg:A=360,samples:i=128}=t,a=o*Math.PI/180,s=A*Math.PI/180,c=[];for(let l=0;l<=i;l++){let u=a+(s-a)*(l/i),g=Math.cos(u),p=Math.sin(u),d=[r[0]+n*g,r[1],r[2]+n*p],f=[-n*p,0,n*g];c.push({position:d,tangent:Z.normalize(f)})}return e.fromRawSamples(c)}};$();_t();$();_t();var qo={".ktx2":"image/ktx2",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp",".gif":"image/gif",".tif":"image/tiff",".tiff":"image/tiff",".avif":"image/avif"};function Kn(e){return qo[Ze.extname(e).toLowerCase()]??"image/png"}function go(e){let t=Ze.extname(e.replace(/\\/g,"/")).toLowerCase();return!t||t in qo}function zn(e,t){if(!e||typeof Re>"u"||!Re.existsSync||!go(e))return;let r=e.trim().replace(/^file:\/\//,"");try{r=decodeURIComponent(r)}catch{}let n=r.replace(/\\/g,"/"),o=n.split("/").pop()??n,A=[];if(Ze.isAbsolute(n)&&A.push(n),t){A.push(Ze.resolve(t,n)),A.push(Ze.join(t,o)),A.push(Ze.join(t,"textures",o));try{for(let i of Re.readdirSync(t))i.toLowerCase().endsWith(".fbm")&&A.push(Ze.join(t,i,o))}catch{}}for(let i of A)try{if(Re.existsSync(i)&&Re.statSync(i).isFile())return{bytes:new Uint8Array(Re.readFileSync(i)),mime:Kn(i)}}catch{}}function zr(e,t,r){let n=go(r)?"was not found":`is in an unsupported format (use ${Object.keys(qo).join(", ")})`;console.warn(`[${e}] Texture "${r}" for material "${t}" ${n}; the material renders without it.`)}var Yn=class e{static parse(t,r,n){let o=typeof r=="object"&&r!==null?r:n??{},A=typeof r=="string"?r:o.mtlText,i=[],a=[],s=[],c=[],l={materialName:"default",faces:[]};c.push(l);let u={};A&&Object.assign(u,e.loadTextures(e.parseMtl(A),o.basePath));let g=t.split(/\r?\n/);for(let y=0;y<g.length;y++){let ye=g[y]?.trim();if(!ye||ye.startsWith("#"))continue;let Qe=ye.split(/\s+/),xe=Qe[0]?.toLowerCase();if(xe==="mtllib"){let le=Qe.slice(1).join(" ").trim();if(o.basePath&&typeof Re<"u"&&Re.existsSync)try{let ge=Ze.resolve(o.basePath,le);if(Re.existsSync(ge)){let be=Re.readFileSync(ge,"utf-8");Object.assign(u,e.loadTextures(e.parseMtl(be),Ze.dirname(ge)))}}catch{}}else if(xe==="v"){let le=Number.parseFloat(Qe[1]??"0"),ge=Number.parseFloat(Qe[2]??"0"),be=Number.parseFloat(Qe[3]??"0");i.push([le,ge,be])}else if(xe==="vn"){let le=Number.parseFloat(Qe[1]??"0"),ge=Number.parseFloat(Qe[2]??"0"),be=Number.parseFloat(Qe[3]??"0");a.push([le,ge,be])}else if(xe==="vt"){let le=Number.parseFloat(Qe[1]??"0"),ge=Qe[2]!==void 0?Number.parseFloat(Qe[2]):0;s.push([le,ge])}else if(xe==="usemtl"){let le=Qe[1]??"default";l.faces.length>0?(l={materialName:le,faces:[]},c.push(l)):l.materialName=le}else if(xe==="f"){let le=[];for(let ge=1;ge<Qe.length;ge++){let be=Qe[ge];if(!be)continue;let we=be.split("/"),Me=Number.parseInt(we[0]??"0",10),Ge=we[1]&&we[1].length>0?Number.parseInt(we[1],10):0,Ue=we[2]&&we[2].length>0?Number.parseInt(we[2],10):0;Me<0&&(Me=i.length+Me+1),Ge<0&&(Ge=s.length+Ge+1),Ue<0&&(Ue=a.length+Ue+1),le.push({v:Me-1,vt:Ge-1,vn:Ue-1})}if(le.length>=3)for(let ge=1;ge<le.length-1;ge++){let be=le[0],we=le[ge],Me=le[ge+1];be&&we&&Me&&l.faces.push([be,we,Me])}}}let p=1/0,d=1/0,f=1/0,h=-1/0,I=-1/0,b=-1/0;for(let y of i){let[ye,Qe,xe]=y;ye===void 0||Qe===void 0||xe===void 0||(ye<p&&(p=ye),Qe<d&&(d=Qe),xe<f&&(f=xe),ye>h&&(h=ye),Qe>I&&(I=Qe),xe>b&&(b=xe))}Number.isFinite(p)||(p=-1,d=-1,f=-1,h=1,I=1,b=1);let D=(p+h)*.5,m=(d+I)*.5,Q=(f+b)*.5,w=Math.max(1e-4,h-p),S=Math.max(1e-4,I-d),N=Math.max(1e-4,b-f),M=Math.max(w,S,N),G=1;o.normalizeSize&&o.normalizeSize>0&&(G=o.normalizeSize/M),typeof o.scale=="number"&&(G*=o.scale);let j=o.center??!1,R=j?D:0,K=j?m:0,z=j?Q:0,J=[];for(let y=0;y<c.length;y++){let ye=c[y];if(!ye||ye.faces.length===0)continue;let Qe=new Map,xe=[],le=[],ge=[],be=[],we=!1;for(let Ue of ye.faces)for(let _e of Ue){let He=`${_e.v}_${_e.vt}_${_e.vn}`,Te=Qe.get(He);if(Te===void 0){Te=xe.length/3,Qe.set(He,Te);let je=i[_e.v]??[0,0,0],Le=((je[0]??0)-R)*G,Je=((je[1]??0)-K)*G,tt=((je[2]??0)-z)*G;if(xe.push(Le,Je,tt),_e.vt>=0&&s[_e.vt]){let qe=s[_e.vt];ge.push(qe[0]??0,1-(qe[1]??0))}else ge.push(0,0);if(_e.vn>=0&&a[_e.vn]){we=!0;let qe=a[_e.vn];le.push(qe[0]??0,qe[1]??0,qe[2]??0)}else le.push(0,0,0)}be.push(Te)}if(!we||o.smoothNormals){let Ue=new Float32Array(xe.length);for(let _e=0;_e<be.length;_e+=3){let He=be[_e],Te=be[_e+1],je=be[_e+2],Le=[xe[He*3],xe[He*3+1],xe[He*3+2]],Je=[xe[Te*3],xe[Te*3+1],xe[Te*3+2]],tt=[xe[je*3],xe[je*3+1],xe[je*3+2]],qe=Z.subtract(Je,Le),Bt=Z.subtract(tt,Le),ze=Z.cross(qe,Bt);Ue[He*3]+=ze[0],Ue[He*3+1]+=ze[1],Ue[He*3+2]+=ze[2],Ue[Te*3]+=ze[0],Ue[Te*3+1]+=ze[1],Ue[Te*3+2]+=ze[2],Ue[je*3]+=ze[0],Ue[je*3+1]+=ze[1],Ue[je*3+2]+=ze[2]}for(let _e=0;_e<xe.length/3;_e++){let He=Ue[_e*3],Te=Ue[_e*3+1],je=Ue[_e*3+2],Le=Math.hypot(He,Te,je)||1;le[_e*3]=He/Le,le[_e*3+1]=Te/Le,le[_e*3+2]=je/Le}}let Ge=xe.length/3>65535?new Uint32Array(be):new Uint16Array(be);J.push({id:`mesh_${y}`,name:ye.materialName,positions:new Float32Array(xe),normals:new Float32Array(le),uvs:new Float32Array(ge),indices:Ge,materialName:ye.materialName})}let W=(p-R)*G,X=(d-K)*G,Ae=(f-z)*G,re=(h-R)*G,oe=(I-K)*G,ne=(b-z)*G,ie=re-W,he=oe-X,F=ne-Ae,Be=(W+re)*.5,Se=(X+oe)*.5,Pe=(Ae+ne)*.5,Ie=Math.hypot(ie,he,F)*.5;return{meshes:J,materials:u,animations:[],bounds:{min:[W,X,Ae],max:[re,oe,ne],center:[Be,Se,Pe],size:[ie,he,F],boundingSphereRadius:Ie}}}static parseMtl(t){let r={},n=null,o=t.split(/\r?\n/);for(let A of o){let i=A.trim();if(!i||i.startsWith("#"))continue;let a=i.split(/\s+/),s=a[0]?.toLowerCase();if(s==="newmtl"){let c=a[1]??"default";n={name:c,diffuseColor:[1,1,1,1],specularColor:[1,1,1],ambientColor:[.2,.2,.2],shininess:32,opacity:1},r[c]=n}else if(n)if(s==="kd"){let c=Number.parseFloat(a[1]??"1"),l=Number.parseFloat(a[2]??"1"),u=Number.parseFloat(a[3]??"1");n.diffuseColor=[c,l,u,n.diffuseColor?.[3]??1]}else if(s==="ks"){let c=Number.parseFloat(a[1]??"1"),l=Number.parseFloat(a[2]??"1"),u=Number.parseFloat(a[3]??"1");n.specularColor=[c,l,u],n.specularIntensity=(c+l+u)/3}else if(s==="ka"){let c=Number.parseFloat(a[1]??"0.2"),l=Number.parseFloat(a[2]??"0.2"),u=Number.parseFloat(a[3]??"0.2");n.ambientColor=[c,l,u]}else if(s==="ns")n.shininess=Number.parseFloat(a[1]??"32");else if(s==="d"||s==="tr"){let c=Number.parseFloat(a[1]??"1");n.opacity=s==="d"?c:1-c,n.diffuseColor&&(n.diffuseColor[3]=n.opacity)}else if(s==="map_kd"){n.diffuseTexture=e.mapFileName(a);let c=a.findIndex(l=>l.toLowerCase()==="-clamp");n.textureWrap=c>0&&a[c+1]?.toLowerCase()==="on"?"clamp":"repeat"}else(s==="norm"||s==="map_kn")&&(n.normalTexture=e.mapFileName(a))}return r}static MAP_OPTION_ARGS={"-blendu":1,"-blendv":1,"-cc":1,"-clamp":1,"-texres":1,"-bm":1,"-boost":1,"-imfchan":1,"-type":1,"-mm":2};static mapFileName(t){let r=1;for(;r<t.length&&t[r]?.startsWith("-");){let n=t[r].toLowerCase();if(r++,n==="-o"||n==="-s"||n==="-t")for(let o=0;o<3&&r<t.length&&!Number.isNaN(Number(t[r]));o++)r++;else r+=e.MAP_OPTION_ARGS[n]??0}return t.slice(r).join(" ")}static loadTextures(t,r){if(!r)return t;for(let n of Object.values(t)){if(n.diffuseTexture&&!n.diffuseTextureBuffer){let o=zn(n.diffuseTexture,r);o?(n.diffuseTextureBuffer=o.bytes,n.diffuseTextureMime=o.mime):zr("ObjLoader",n.name,n.diffuseTexture)}if(n.normalTexture&&!n.normalTextureBuffer){let o=zn(n.normalTexture,r);o?n.normalTextureBuffer=o.bytes:zr("ObjLoader",n.name,n.normalTexture)}}return t}};function iu(e,t,r={}){return Yn.parse(e,t,r)}function au(e){return Yn.parseMtl(e)}function Wn(e,t,r={}){let n;if(typeof e!="string")n=new TextDecoder().decode(e);else{let o=e.trim();if(!(o.startsWith("v ")||o.startsWith("#")||o.includes(`
|
|
2
|
-
v `)||o.includes("\rv "))&&typeof Re<"u"&&Re.existsSync)try{let i=e.startsWith("file://")?e.slice(7):e;try{i=decodeURIComponent(i)}catch{}Re.existsSync(i)?(n=Re.readFileSync(i,"utf-8"),r={basePath:r.basePath??Ze.dirname(i),...r}):n=e}catch{n=e}else n=e}return Yn.parse(n,t,r)}$();_t();var ra=Ko(qi(),1);$();function fr(e,t,r){let n=o=>[e[o*3],e[o*3+1],e[o*3+2]];for(let o=0;o<t.length;o+=3){let A=t[o],i=t[o+1],a=t[o+2],s=n(A),c=Z.cross(Z.subtract(n(i),s),Z.subtract(n(a),s));for(let l of[A,i,a])r[l*3]+=c[0],r[l*3+1]+=c[1],r[l*3+2]+=c[2]}for(let o=0;o<r.length;o+=3){let A=r[o],i=r[o+1],a=r[o+2],s=Math.hypot(A,i,a)||1;r[o]=A/s,r[o+1]=i/s,r[o+2]=a/s}}function Ot(...e){let t=1/0,r=1/0,n=1/0,o=-1/0,A=-1/0,i=-1/0;for(let a of e)for(let s=0;s<a.length;s+=3){let c=a[s],l=a[s+1],u=a[s+2];c<t&&(t=c),c>o&&(o=c),l<r&&(r=l),l>A&&(A=l),u<n&&(n=u),u>i&&(i=u)}return Number.isFinite(t)||(t=r=n=0,o=A=i=0),{min:[t,r,n],max:[o,A,i],center:[(t+o)*.5,(r+A)*.5,(n+i)*.5],size:[o-t,A-r,i-n]}}function xt(e,t){let r=Math.max(...e.size,1e-4),n=1;t.normalizeSize&&t.normalizeSize>0&&(n=t.normalizeSize/r);let o=[n,n,n];return typeof t.scale=="number"?(o[0]*=t.scale,o[1]*=t.scale,o[2]*=t.scale):Array.isArray(t.scale)&&(o[0]*=t.scale[0],o[1]*=t.scale[1],o[2]*=t.scale[2]),{offset:t.center?e.center:[0,0,0],scale:o}}function Ht(e,{offset:t,scale:r}){let n=new Float32Array(e.length);for(let o=0;o<e.length;o+=3)n[o]=(e[o]-t[0])*r[0],n[o+1]=(e[o+1]-t[1])*r[1],n[o+2]=(e[o+2]-t[2])*r[2];return n}function jt(e,t){return t>65535?new Uint32Array(e):new Uint16Array(e)}function Vt(e,{offset:t,scale:r}){let n=[(e.min[0]-t[0])*r[0],(e.min[1]-t[1])*r[1],(e.min[2]-t[2])*r[2]],o=[(e.max[0]-t[0])*r[0],(e.max[1]-t[1])*r[1],(e.max[2]-t[2])*r[2]];return{min:n,max:o,center:[(n[0]+o[0])*.5,(n[1]+o[1])*.5,(n[2]+o[2])*.5],size:[o[0]-n[0],o[1]-n[1],o[2]-n[2]],boundingSphereRadius:Math.hypot(o[0]-n[0],o[1]-n[1],o[2]-n[2])*.5}}$();function Qs(e,t,r){let[n,o,A,i]=t,a=n*n,s=o*o,c=A*A,l=n*o,u=n*A,g=o*A,p=i*n,d=i*o,f=i*A;return[(1-2*(s+c))*r[0],2*(l+f)*r[0],2*(u-d)*r[0],0,2*(l-f)*r[1],(1-2*(a+c))*r[1],2*(g+p)*r[1],0,2*(u+d)*r[2],2*(g-p)*r[2],(1-2*(a+s))*r[2],0,e[0],e[1],e[2],1]}function Xi(e){let t=Math.hypot(e[0],e[1],e[2],e[3])||1;return[e[0]/t,e[1]/t,e[2]/t,e[3]/t]}function xs(e,t,r){let n=e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3],o=n<0?-1:1;if(n*=o,n>.9995)return Xi([e[0]+(o*t[0]-e[0])*r,e[1]+(o*t[1]-e[1])*r,e[2]+(o*t[2]-e[2])*r,e[3]+(o*t[3]-e[3])*r]);let A=Math.acos(n),i=Math.sin(A),a=Math.sin((1-r)*A)/i,s=o*Math.sin(r*A)/i;return[e[0]*a+t[0]*s,e[1]*a+t[1]*s,e[2]*a+t[2]*s,e[3]*a+t[3]*s]}function ws(e,t){let r=0,n=e.length-1;for(;r<n;){let o=r+n+1>>1;(e[o]??0)<=t?r=o:n=o-1}return r}function jr(e,t,r,n,o=1){let A=n?(t*3+o)*r:t*r;return Array.from(e.subarray(A,A+r))}function fo(e,t,r,n,o=!1){let{times:A}=e,i=e.interpolation==="cubic",a=A.length-1;if(n<=(A[0]??0))return jr(t,0,r,i);if(n>=(A[a]??0))return jr(t,a,r,i);let s=ws(A,n);if(e.interpolation==="step")return jr(t,s,r,i);let c=A[s]??0,l=(A[s+1]??c)-c,u=l>0?(n-c)/l:0,g=jr(t,s,r,i),p=jr(t,s+1,r,i);if(i){let d=jr(t,s,r,!0,2),f=jr(t,s+1,r,!0,0),h=u*u,I=h*u,b=g.map((D,m)=>(2*I-3*h+1)*D+(I-2*h+u)*l*(d[m]??0)+(-2*I+3*h)*(p[m]??0)+(I-h)*l*(f[m]??0));return o?Xi(b):b}return o?xs(g,p,u):g.map((d,f)=>d+((p[f]??d)-d)*u)}function hu(e,t,r){let n=e.morphTargets?.length??0;if(!n)return[];let o=t?.tracks.find(A=>A.node===e.node&&A.weights&&A.times.length>0);return o?.weights?fo(o,o.weights,n,r):e.morphWeights??Array(n).fill(0)}function vs(e,t,r){let n=e.map(a=>[...a.translation]),o=e.map(a=>[...a.rotation]),A=e.map(a=>[...a.scale]),i=new Map(e.map((a,s)=>[a.name,s]));for(let a of t?.tracks??[]){let s=a.node??i.get(a.nodeName);s===void 0||!a.times.length||(a.translations&&(n[s]=fo(a,a.translations,3,r)),a.rotations&&(o[s]=fo(a,a.rotations,4,r,!0)),a.scales&&(A[s]=fo(a,a.scales,3,r)))}return e.map((a,s)=>a.matrix??Qs(n[s],o[s],A[s]))}function ho(e,t,r){let n=e.nodes??[],o=vs(n,t,r),A=new Array(n.length),i=a=>{let s=A[a];if(s)return s;let c=n[a].parent,l=c<0?o[a]:Ee.multiply(i(c),o[a]);return A[a]=l,l};return n.map((a,s)=>i(s))}function mu(e,t,r){let n=e.skins?.[t];if(!n)throw new Error(`model has no skin ${t}`);let o=new Float32Array(Math.max(1,n.joints.length)*16);for(let A=0;A<Math.max(1,n.joints.length);A++){let i=n.joints[A];if(i===void 0){o.set(Ee.identity(),A*16);continue}let a=Array.from(n.inverseBindMatrices.subarray(A*16,A*16+16));o.set(Ee.multiply(r[i],a),A*16)}return o}var Vr=class e{static FBX_KTIME=46186158e3;static parse(t,r={}){let n=typeof t=="string"?e.parseAscii(t):e.isBinary(t)?e.parseBinary(t):e.parseAscii(new TextDecoder().decode(t));return e.buildModelFromTree(n,r)}static isBinary(t){let r=t instanceof Uint8Array?t:new Uint8Array(t);if(r.length<27)return!1;let n="Kaydara FBX Binary \0\0";for(let o=0;o<n.length;o++)if(r[o]!==n.charCodeAt(o))return!1;return!0}static parseBinary(t){let r=t instanceof Uint8Array?t:new Uint8Array(t),n=new DataView(r.buffer,r.byteOffset,r.byteLength),A=n.getUint32(23,!0)>=7500,i=27,a={name:"Root",props:[],children:[]},s=()=>{if(i>=r.byteLength)return null;let c,l,u;if(A){if(i+25>r.byteLength)return null;c=Number(n.getBigUint64(i,!0)),l=Number(n.getBigUint64(i+8,!0)),u=n.getUint8(i+24),i+=25}else{if(i+13>r.byteLength)return null;c=n.getUint32(i,!0),l=n.getUint32(i+4,!0),u=n.getUint8(i+12),i+=13}if(c===0)return null;let g=new TextDecoder().decode(r.subarray(i,i+u));i+=u;let p=[];for(let f=0;f<l;f++){let h=String.fromCharCode(r[i]);switch(i+=1,h){case"Y":{p.push(n.getInt16(i,!0)),i+=2;break}case"C":case"B":{p.push(n.getUint8(i)!==0),i+=1;break}case"I":{p.push(n.getInt32(i,!0)),i+=4;break}case"F":{p.push(n.getFloat32(i,!0)),i+=4;break}case"D":{p.push(n.getFloat64(i,!0)),i+=8;break}case"L":{p.push(Number(n.getBigInt64(i,!0))),i+=8;break}case"S":{let I=n.getUint32(i,!0);i+=4;let b=new TextDecoder().decode(r.subarray(i,i+I));p.push(b),i+=I;break}case"R":{let I=n.getUint32(i,!0);i+=4;let b=r.subarray(i,i+I);p.push(b),i+=I;break}case"f":case"d":case"i":case"l":case"b":case"c":{let I=n.getUint32(i,!0),b=n.getUint32(i+4,!0),D=n.getUint32(i+8,!0);i+=12;let m;if(b===1){let w=r.subarray(i,i+D);m=(0,ra.inflateSync)(w),i+=D}else{let S=I*(h==="d"||h==="l"?8:h==="f"||h==="i"?4:1);m=r.subarray(i,i+S),i+=S}let Q=new DataView(m.buffer,m.byteOffset,m.byteLength);if(h==="f"){let w=new Float32Array(I);for(let S=0;S<I;S++)w[S]=Q.getFloat32(S*4,!0);p.push(w)}else if(h==="d"){let w=new Float64Array(I);for(let S=0;S<I;S++)w[S]=Q.getFloat64(S*8,!0);p.push(w)}else if(h==="i"){let w=new Int32Array(I);for(let S=0;S<I;S++)w[S]=Q.getInt32(S*4,!0);p.push(w)}else if(h==="l"){let w=new Float64Array(I);for(let S=0;S<I;S++)w[S]=Number(Q.getBigInt64(S*8,!0));p.push(w)}else if(h==="b"){let w=new Uint8Array(I);for(let S=0;S<I;S++)w[S]=Q.getUint8(S);p.push(w)}else p.push(m);break}default:break}}let d=[];for(;i<c;){let f=s();if(f)d.push(f);else break}return i=c,{name:g,props:p,children:d}};for(;i<r.byteLength-(A?25:13);){let c=s();if(c)a.children.push(c);else break}return a}static parseAscii(t){let r={name:"Root",props:[],children:[]},n=[r],o=t.split(/\r?\n/);for(let A=0;A<o.length;A++){let i=o[A]?.trim();if(!i||i.startsWith(";"))continue;if(i==="}"){n.length>1&&n.pop();continue}let a=i.indexOf(":");if(a===-1)continue;let s=i.substring(0,a).trim(),c=i.substring(a+1).trim(),l=c.endsWith("{"),u=l?c.slice(0,-1).trim():c,g=[];if(u){let f=u.split(",").map(h=>h.trim());for(let h of f)h.startsWith('"')&&h.endsWith('"')?g.push(h.slice(1,-1)):Number.isNaN(Number(h))?g.push(h):g.push(Number(h))}let p={name:s,props:g,children:[]},d=n[n.length-1];d&&d.children.push(p),l&&n.push(p)}return r}static textureSlot(t){let r=t.toLowerCase();if(r==="diffusecolor"||r==="diffuse"||r.endsWith("|basecolor")||r.endsWith("|base_color")||r==="basecolor")return"diffuse";if(r==="normalmap"||r.endsWith("|normalcamera")||r.endsWith("|bump_map"))return"normal"}static attachTextures(t,r,n,o,A){let i=(a,s)=>{let c=a?.children.find(l=>l.name===s)?.props[0];return typeof c=="string"&&c?c:void 0};for(let a of o){if(a.parentId!==r||!a.propName)continue;let s=e.textureSlot(a.propName),c=n.get(a.childId);if(!s||c?.node.name!=="Texture"||(s==="diffuse"?t.diffuseTextureBuffer:t.normalTextureBuffer))continue;let l=o.filter(d=>d.parentId===a.childId&&!d.propName).map(d=>n.get(d.childId)?.node).find(d=>d?.name==="Video"),u=i(c.node,"RelativeFilename")??i(c.node,"FileName")??i(l,"RelativeFilename")??i(l,"Filename");if(u&&!go(u)){zr("FbxLoader",t.name,u);continue}let g,p=l?.children.find(d=>d.name==="Content")?.props[0];if(p instanceof Uint8Array&&p.length>0?g=p:u&&(g=zn(u,A)?.bytes),!g){u&&zr("FbxLoader",t.name,u);continue}s==="diffuse"?(t.diffuseTextureBuffer=g,t.diffuseTextureMime=Kn(u??""),u&&(t.diffuseTexture=u),t.textureWrap="repeat"):(t.normalTextureBuffer=g,u&&(t.normalTexture=u))}}static buildModelFromTree(t,r={}){let n=t.children.find(M=>M.name==="Objects"),o=t.children.find(M=>M.name==="Connections"),A=new Map;if(n)for(let M of n.children){let G=M.props[0]??0,R=String(M.props[1]??"").split("::"),K=R.length>1?R[1]:R[0],z=String(M.props[2]??M.name);A.set(G,{id:G,name:K,type:z,node:M})}let i=[];if(o){for(let M of o.children)if(M.name==="C"||M.name==="Connect"){let G=String(M.props[0]),j=M.props[1]??0,R=M.props[2]??0,K=G==="OP"?String(M.props[3]):void 0;i.push({childId:j,parentId:R,propName:K})}}let a=M=>{for(let G of i){let j=G.parentId===M?A.get(G.childId):void 0;if(j?.node.name==="Material"&&!G.propName)return j.name}for(let G of i)if(!(G.childId!==M||G.propName))for(let j of i){if(j.parentId!==G.parentId||j.propName)continue;let R=A.get(j.childId);if(R?.node.name==="Material")return R.name}},s=[],c={};function l(M){if(!M)return[];if(M.props[0]instanceof Float32Array||M.props[0]instanceof Float64Array||M.props[0]instanceof Int32Array||Array.isArray(M.props[0]))return M.props[0];let G=M.children.find(j=>j.name==="a");return G&&G.props.length>0?G.props:Array.isArray(M.props)&&M.props.length>0&&typeof M.props[0]=="number"?M.props:[]}let u=[...A.values()].filter(M=>M.node.name==="Model").map(M=>M.id),g=new Map(u.map((M,G)=>[M,G])),p=u.map(M=>{let G=A.get(M),j=i.find(R=>R.childId===M&&!R.propName&&g.has(R.parentId));return{name:G.name,parent:j?g.get(j.parentId):-1,translation:qn(G.node,"Lcl Translation",0),rotation:$i(G.node,mo(qn(G.node,"Lcl Rotation",0),na(G.node))),scale:qn(G.node,"Lcl Scaling",1)}}),d=M=>i.find(G=>G.childId===M&&!G.propName&&g.has(G.parentId))?.parentId,f=[];for(let[M,G]of A)if(G.node.name==="Geometry"&&(G.type==="Mesh"||G.node.props[2]==="Mesh"||G.type==="")){let j=G.node,R=j.children.find(le=>le.name==="Vertices"),K=j.children.find(le=>le.name==="PolygonVertexIndex");if(!R||!K)continue;let z=l(R),J=l(K),W=(le,ge,be,we)=>{let Me=j.children.find(Ge=>Ge.name===le);if(Me)return Ds(Me,l(Me.children.find(Ge=>Ge.name===ge)),l(Me.children.find(Ge=>Ge.name===be)),we)},X=W("LayerElementNormal","Normals","NormalsIndex",3),Ae=W("LayerElementUV","UV","UVIndex",2),re=[],oe=[],ne=0;for(let le=0;le<J.length;le++){let ge=J[le];if(oe.push({cp:ge<0?-(ge+1):ge,pv:le}),!(ge>=0)){for(let be=1;be<oe.length-1;be++)for(let we of[oe[0],oe[be],oe[be+1]])re.push({...we,poly:ne});oe=[],ne++}}let ie=re.length,he=new Float32Array(ie*3),F=new Float32Array(ie*3),Be=new Float32Array(ie*2),Se=new Array(ie);re.forEach(({cp:le,pv:ge,poly:be},we)=>{he[we*3]=z[le*3]??0,he[we*3+1]=z[le*3+1]??0,he[we*3+2]=z[le*3+2]??0;let Me=X?.(le,ge,be);F.set(Me??[0,0,1],we*3);let Ge=Ae?.(le,ge,be);Be[we*2]=Ge?.[0]??0,Be[we*2+1]=1-(Ge?.[1]??0),Se[we]=we}),(!X||r.smoothNormals)&&(F.fill(0),fr(he,Se,F));let Pe=i.find(le=>le.parentId===M&&A.get(le.childId)?.node.name==="Deformer"&&A.get(le.childId)?.node.props[2]==="Skin"),Ie,y,ye;if(Pe){let le=[],ge=[],be=new Map;for(let we of i){let Me=A.get(we.childId);if(we.parentId!==Pe.childId||Me?.node.name!=="Deformer"||Me.node.props[2]!=="Cluster")continue;let Ge=i.find(Le=>Le.parentId===Me.id&&g.has(Le.childId))?.childId;if(Ge===void 0)continue;let Ue=le.length;le.push(g.get(Ge));let _e=ea(Me.node,"Transform"),He=ea(Me.node,"TransformLink");ge.push(...Ee.multiply(Ee.invert(He)??Ee.identity(),_e));let Te=l(Me.node.children.find(Le=>Le.name==="Indexes")),je=l(Me.node.children.find(Le=>Le.name==="Weights"));for(let Le=0;Le<Te.length;Le++){let Je=Number(je[Le]??0);if(!(Je>0))continue;let tt=Number(Te[Le]),qe=be.get(tt)??[];qe.push([Ue,Je]),be.set(tt,qe)}}le.length>0&&(ye=f.length,f.push({joints:le,inverseBindMatrices:new Float32Array(ge)}),Ie=new Float32Array(ie*4),y=new Float32Array(ie*4),re.forEach(({cp:we},Me)=>{let Ge=(be.get(we)??[]).sort((_e,He)=>He[1]-_e[1]).slice(0,4),Ue=Ge.reduce((_e,[,He])=>_e+He,0);Ge.forEach(([_e,He],Te)=>{Ie[Me*4+Te]=_e,y[Me*4+Te]=Ue>0?He/Ue:0})}))}let Qe=d(M),xe=ie>65535;s.push({id:`fbx_mesh_${M}`,name:G.name,positions:he,normals:F,uvs:Be,indices:xe?new Uint32Array(Se):new Uint16Array(Se),jointIndices:Ie,jointWeights:y,materialName:a(M)??G.name,node:Qe!==void 0?g.get(Qe):void 0,skin:ye})}for(let[,M]of A)if(M.node.name==="Material"){let j=M.node.children.find(W=>W.name==="Properties70"),R=[1,1,1,1],K=32,z=1;if(j){for(let W of j.children)if(W.name==="P"){let X=String(W.props[0]);if(X==="DiffuseColor"||X==="Color"){let Ae=Number(W.props[4]??1),re=Number(W.props[5]??1),oe=Number(W.props[6]??1);R=[Ae,re,oe,1]}else X==="Shininess"||X==="ShininessExponent"?K=Number(W.props[4]??32):X==="Opacity"&&(z=Number(W.props[4]??1),R[3]=z)}}let J={name:M.name,diffuseColor:R,shininess:K,opacity:z};e.attachTextures(J,M.id,A,i,r.basePath),c[M.name]=J}let h=[];for(let[M,G]of A)if(G.node.name==="AnimationStack"){let j=G.name||"Take 001",R=[],K=i.find(J=>J.parentId===M&&A.get(J.childId)?.node.name==="AnimationLayer");if(K){let J=i.filter(X=>X.parentId===K.childId&&A.get(X.childId)?.node.name==="AnimationCurveNode"),W=new Map;for(let X of J){let Ae=A.get(X.childId);if(!Ae)continue;let re=i.find(Be=>Be.childId===Ae.id&&A.get(Be.parentId)?.node.name==="Model"),oe=re?A.get(re.parentId):void 0,ne=ta(re?.propName)??ta(Ae.name);if(!ne)continue;let ie=`${oe?.id??Ae.id}|${ne}`,he=W.get(ie);if(!he){let Be=oe?.node;he={nodeName:oe?.name??Ae.name,modelId:oe?.id,model:Be,kind:ne,defaults:Ms(Be,Ae.node,ne),channels:[void 0,void 0,void 0]},W.set(ie,he)}i.filter(Be=>Be.parentId===Ae.id&&A.get(Be.childId)?.node.name==="AnimationCurve").forEach((Be,Se)=>{let Pe=_s(Be.propName)??Se;if(Pe>2)return;let Ie=A.get(Be.childId)?.node,y=l(Ie?.children.find(xe=>xe.name==="KeyTime")),ye=l(Ie?.children.find(xe=>xe.name==="KeyValueFloat")),Qe=Math.min(y.length,ye.length);Qe!==0&&(he.channels[Pe]={times:Array.from(y.slice(0,Qe),xe=>Number(xe)),values:Array.from(ye.slice(0,Qe),xe=>Number(xe))})})}for(let X of W.values()){let Ae=Gs(X);if(Ae){if(X.modelId!==void 0&&(Ae.node=g.get(X.modelId)),Ae.rotations&&X.model)for(let re=0;re<Ae.rotations.length;re+=4){let oe=Array.from(Ae.rotations.subarray(re,re+4));Ae.rotations.set($i(X.model,oe),re)}R.push(Ae)}}}let z=1;for(let J of R)if(J.times.length>0){let W=J.times[J.times.length-1]??0;W>z&&(z=W)}h.push({name:j,duration:z,fps:30,tracks:R})}let I={meshes:s,materials:c,animations:h,nodes:p,skins:f,bounds:{min:[0,0,0],max:[0,0,0],center:[0,0,0],size:[0,0,0],boundingSphereRadius:0}},b=ho(I,void 0,0),D=[1/0,1/0,1/0],m=[-1/0,-1/0,-1/0];for(let M of s){let G=M.node!==void 0?b[M.node]:void 0;for(let j=0;j<M.positions.length;j+=3){let R=[M.positions[j],M.positions[j+1],M.positions[j+2]],K=G?Ee.projectPoint(G,R):R;for(let z=0;z<3;z++)K[z]<D[z]&&(D[z]=K[z]),K[z]>m[z]&&(m[z]=K[z])}}Number.isFinite(D[0])||(D.fill(-1),m.fill(1));let{offset:Q,scale:w}=xt({min:D,max:m,center:[(D[0]+m[0])*.5,(D[1]+m[1])*.5,(D[2]+m[2])*.5],size:[m[0]-D[0],m[1]-D[1],m[2]-D[2]]},r);I.rootTransform=Ee.multiply(Ee.scale(w[0],w[1],w[2]),Ee.translate(-Q[0],-Q[1],-Q[2]));let S=[0,1,2].map(M=>(D[M]-Q[M])*w[M]),N=[0,1,2].map(M=>(m[M]-Q[M])*w[M]);return I.bounds={min:S,max:N,center:[(S[0]+N[0])*.5,(S[1]+N[1])*.5,(S[2]+N[2])*.5],size:[N[0]-S[0],N[1]-S[1],N[2]-S[2]],boundingSphereRadius:Math.hypot(N[0]-S[0],N[1]-S[1],N[2]-S[2])*.5},I}};function qn(e,t,r){let n=Yr(e,t);return[0,1,2].map(o=>{let A=n?.[o];return A!==void 0&&Number.isFinite(A)?A:r})}function Zi(e,t){return[e[3]*t[0]+e[0]*t[3]+e[1]*t[2]-e[2]*t[1],e[3]*t[1]-e[0]*t[2]+e[1]*t[3]+e[2]*t[0],e[3]*t[2]+e[0]*t[1]-e[1]*t[0]+e[2]*t[3],e[3]*t[3]-e[0]*t[0]-e[1]*t[1]-e[2]*t[2]]}function $i(e,t){let r=Yr(e,"PreRotation"),n=Yr(e,"PostRotation"),o=t;if(r&&(o=Zi(mo(qn(e,"PreRotation",0)),o)),n){let A=mo(qn(e,"PostRotation",0));o=Zi(o,[-A[0],-A[1],-A[2],A[3]])}return o}function ea(e,t){let r=e.children.find(A=>A.name===t),n=r?.children.find(A=>A.name==="a")?.props??r?.props,o=n?.[0]instanceof Float64Array||n?.[0]instanceof Float32Array?Array.from(n[0]):(n??[]).map(Number);return o.length===16?o:Ee.identity()}function Ds(e,t,r,n){if(t.length===0)return;let o=a=>String(e.children.find(s=>s.name===a)?.props[0]??""),A=o("MappingInformationType"),i=/^Index/.test(o("ReferenceInformationType"))&&r.length>0;return(a,s,c)=>{let l=A==="ByPolygonVertex"?s:A==="ByPolygon"?c:A==="AllSame"?0:a;return i&&(l=Number(r[l]??l)),Array.from({length:n},(u,g)=>Number(t[l*n+g]??0))}}function ta(e){switch(e){case"Lcl Translation":case"T":return"T";case"Lcl Rotation":case"R":return"R";case"Lcl Scaling":case"S":return"S";default:return}}function _s(e){switch(e){case"d|X":return 0;case"d|Y":return 1;case"d|Z":return 2;default:return}}function Yr(e,t){let n=e?.children.find(o=>o.name==="Properties70")?.children.find(o=>o.name==="P"&&o.props[0]===t);if(n)return n.props.slice(4).map(o=>Number(o))}function Ms(e,t,r){let n=r==="S"?1:0,o=Yr(e,r==="T"?"Lcl Translation":r==="R"?"Lcl Rotation":"Lcl Scaling"),A=[n,n,n];for(let i=0;i<3;i++){let a=o?.[i],s=Yr(t,`d|${"XYZ"[i]}`)?.[0],c=a??s;c!==void 0&&Number.isFinite(c)&&(A[i]=c)}return A}var Ss=["XYZ","XZY","YZX","YXZ","ZXY","ZYX"];function na(e){let t=Yr(e,"RotationOrder")?.[0]??0;return Ss[t]??"XYZ"}function mo(e,t="XYZ"){let r=[0,0,0,1];for(let n of t){let o="XYZ".indexOf(n),A=(e[o]??0)*Math.PI/360,i=Math.sin(A),a=[0,0,0,Math.cos(A)];a[o]=i,r=[a[3]*r[0]+a[0]*r[3]+a[1]*r[2]-a[2]*r[1],a[3]*r[1]-a[0]*r[2]+a[1]*r[3]+a[2]*r[0],a[3]*r[2]+a[0]*r[1]-a[1]*r[0]+a[2]*r[3],a[3]*r[3]-a[0]*r[0]-a[1]*r[1]-a[2]*r[2]]}return r}function Ps(e,t){let{times:r,values:n}=e,o=r.length-1;if(t<=r[0])return n[0];if(t>=r[o])return n[o];let A=0;for(;A<o-1&&r[A+1]<=t;)A++;let i=r[A],a=r[A+1],s=a>i?(t-i)/(a-i):0;return n[A]+(n[A+1]-n[A])*s}function Gs(e){let t=new Set;for(let s of e.channels)for(let c of s?.times??[])t.add(c);if(t.size===0)return;let r=[...t].sort((s,c)=>s-c),n=new Float32Array(r.length),o=e.kind==="R",A=new Float32Array(r.length*(o?4:3)),i=o?na(e.model):"XYZ",a;return r.forEach((s,c)=>{n[c]=s/Vr.FBX_KTIME;let l=[0,1,2].map(g=>{let p=e.channels[g];return p?Ps(p,s):e.defaults[g]});if(!o){A.set(l,c*3);return}let u=mo(l,i);if(a&&a[0]*u[0]+a[1]*u[1]+a[2]*u[2]+a[3]*u[3]<0)for(let g=0;g<4;g++)u[g]=-u[g];a=u,A.set(u,c*4)}),{nodeName:e.nodeName,times:n,translations:e.kind==="T"?A:void 0,rotations:o?A:void 0,scales:e.kind==="S"?A:void 0}}function wu(e,t={}){return Vr.parse(e,t)}function Xn(e,t={}){let r=e;if(typeof e=="string"){let n=e.trim();if(!(n.includes("FBXHeaderExtension")||n.includes("Kaydara FBX"))&&typeof Re<"u"&&Re.existsSync)try{let A=e.startsWith("file://")?e.slice(7):e;try{A=decodeURIComponent(A)}catch{}if(Re.existsSync(A)){let i=Re.readFileSync(A);r=new Uint8Array(i.buffer,i.byteOffset,i.byteLength),t={basePath:Ze.dirname(A),...t}}}catch{}}return Vr.parse(r,t)}$();$();var oa=`
|
|
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 Rs={normal_extrusion:0,radial_pulse:1,harmonic_wave:2,twist:3,ripple:4},Io=class{device;pipeline;bindGroupLayout;uniformPool;deformedBuffers=new WeakMap;uniformData=new ArrayBuffer(32);uniformUint32=new Uint32Array(this.uniformData);uniformFloat32=new Float32Array(this.uniformData);constructor(t){this.device=t,this.uniformPool=new Ye(32,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.bindGroupLayout=t.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 r=t.createShaderModule({label:"audioMeshDisplace.wgsl",code:oa}),n=t.createPipelineLayout({label:"AudioMeshDeformPipelineLayout",bindGroupLayouts:[this.bindGroupLayout]});this.pipeline=t.createComputePipeline({label:"AudioMeshDeformComputePipeline",layout:n,compute:{module:r,entryPoint:"cs_displace"}})}getOrCreateDeformedBuffer(t,r){let n=this.deformedBuffers.get(t);return(!n||n.size<r)&&(n?.destroy(),n=this.device.createBuffer({label:"DeformedMeshVertexBuffer",size:Math.max(64,Math.ceil(r/4)*4),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC}),this.deformedBuffers.set(t,n)),n}execute(t,r,n){let{config:o,audioLatentBuffer:A,vertexCount:i,timeMs:a=0,sampleRate:s=48e3}=n,c=i*64,l=this.getOrCreateDeformedBuffer(r,c),u=Rs[o.mode]??0,g=s/2048,p=o.frequencyRange?o.frequencyRange[0]:20,d=o.frequencyRange?o.frequencyRange[1]:120,f=Math.max(0,Math.min(1023,Math.round(p/g))),h=Math.max(f,Math.min(1023,Math.round(d/g))),I=typeof o.amplitudeMultiplier=="number"?o.amplitudeMultiplier:typeof o.amplitudeMultiplier?.value=="number"?o.amplitudeMultiplier.value:1,b=o.damping??0;this.uniformUint32[0]=u,this.uniformUint32[1]=f,this.uniformUint32[2]=h,this.uniformUint32[3]=i,this.uniformFloat32[4]=I,this.uniformFloat32[5]=b,this.uniformFloat32[6]=a,this.uniformFloat32[7]=0;let D=this.uniformPool.getBuffer(this.device,new Uint8Array(this.uniformData)),m=this.device.createBindGroup({layout:this.bindGroupLayout,entries:[{binding:0,resource:{buffer:A}},{binding:1,resource:{buffer:D}},{binding:2,resource:{buffer:r}},{binding:3,resource:{buffer:l}}]}),Q=t.beginComputePass({label:"AudioMeshDeformComputePass"});Q.setPipeline(this.pipeline),Q.setBindGroup(0,m);let w=Math.ceil(i/256);return Q.dispatchWorkgroups(w),Q.end(),l}resetPools(){this.uniformPool.reset()}destroy(){this.uniformPool.destroy()}};$();$();_t();var Zn=class e{static isBinary(t){let r=t instanceof Uint8Array?t:new Uint8Array(t);if(r.length<84)return!1;let o=new DataView(r.buffer,r.byteOffset,r.byteLength).getUint32(80,!0),A=84+o*50;if(r.length===A)return!0;let i=Math.min(r.length,512);for(let s=0;s<i;s++){let c=r[s];if(c>127||c<32&&c!==9&&c!==10&&c!==13)return!0}let a=new TextDecoder("utf-8").decode(r.subarray(0,80)).trim();return a.startsWith("solid")&&!a.includes(`
|
|
142
|
-
`)?r.length>=84+o*50:!a.startsWith("solid")}static parse(t,r={}){if(typeof t=="string")return e.parseAscii(t,r);let n=t instanceof Uint8Array?t:new Uint8Array(t);if(e.isBinary(n))return e.parseBinary(n,r);let o=new TextDecoder("utf-8").decode(n);return e.parseAscii(o,r)}static parseBinary(t,r={}){let n=new DataView(t.buffer,t.byteOffset,t.byteLength),o=n.getUint32(80,!0),A=[],i=[],a=[],s=84;for(let c=0;c<o&&!(s+50>t.byteLength);c++){let l=n.getFloat32(s,!0),u=n.getFloat32(s+4,!0),g=n.getFloat32(s+8,!0);s+=12;let p=n.getFloat32(s,!0),d=n.getFloat32(s+4,!0),f=n.getFloat32(s+8,!0);s+=12;let h=n.getFloat32(s,!0),I=n.getFloat32(s+4,!0),b=n.getFloat32(s+8,!0);s+=12;let D=n.getFloat32(s,!0),m=n.getFloat32(s+4,!0),Q=n.getFloat32(s+8,!0);s+=12,s+=2;let w=l,S=u,N=g;if(w===0&&S===0&&N===0){let G=Z.subtract([h,I,b],[p,d,f]),j=Z.subtract([D,m,Q],[p,d,f]),R=Z.normalize(Z.cross(G,j));w=R[0],S=R[1],N=R[2]}let M=A.length/3;A.push(p,d,f,h,I,b,D,m,Q),i.push(w,S,N,w,S,N,w,S,N),a.push(M,M+1,M+2)}return e.finalizeModel(A,i,a,r)}static parseAscii(t,r={}){let n=[],o=[],A=[],i=t.split(/\r?\n/),a=[0,0,1],s=[];for(let c of i){let l=c.trim();if(l){if(l.startsWith("facet normal")){let u=l.split(/\s+/),g=Number.parseFloat(u[2]??"0")||0,p=Number.parseFloat(u[3]??"0")||0,d=Number.parseFloat(u[4]??"0")||0;a=[g,p,d],s=[]}else if(l.startsWith("vertex")){let u=l.split(/\s+/),g=Number.parseFloat(u[1]??"0")||0,p=Number.parseFloat(u[2]??"0")||0,d=Number.parseFloat(u[3]??"0")||0;s.push([g,p,d])}else if(l.startsWith("endfacet")){if(s.length>=3){let u=s[0],g=s[1],p=s[2],d=a;if(d[0]===0&&d[1]===0&&d[2]===0){let f=Z.subtract(g,u),h=Z.subtract(p,u);d=Z.normalize(Z.cross(f,h))}for(let f=1;f<s.length-1;f++){let h=s[f],I=s[f+1],b=n.length/3;n.push(u[0],u[1],u[2],h[0],h[1],h[2],I[0],I[1],I[2]),o.push(d[0],d[1],d[2],d[0],d[1],d[2],d[0],d[1],d[2]),A.push(b,b+1,b+2)}}s=[]}}}return e.finalizeModel(n,o,A,r)}static finalizeModel(t,r,n,o={}){let A=Ot(t),i=xt(A,o),a=Ht(t,i),[s,c]=A.min,[l,u]=A.size,g=new Float32Array(t.length/3*2);for(let h=0;h<t.length;h+=3){let I=h/3*2;g[I]=l>0?(t[h]-s)/l:0,g[I+1]=u>0?(t[h+1]-c)/u:0}let p=jt(n,a.length/3),d={name:"stl_default",diffuseColor:[.8,.8,.85,1],shininess:32,specularIntensity:.5,...o.defaultMaterial};return{name:"STL_Model",meshes:[{id:"stl_mesh_0",name:"stl_geometry",positions:a,normals:new Float32Array(r),uvs:g,indices:p,materialName:"stl_default"}],materials:{stl_default:d},animations:[],bounds:Vt(A,i)}}static load(t,r={}){if(typeof t!="string")return e.parse(t,r);if(t.startsWith("/")||t.startsWith("./")||t.startsWith("../")||t.startsWith("file://")){let n=t.startsWith("file://")?t.replace("file://",""):t,o=Re.readFileSync(n);return e.parse(o,r)}return e.parse(t,r)}};function $n(e,t={}){return Zn.load(e,t)}$();_t();var Xo=class e{static parse(t,r={}){let n=typeof t=="string"?new TextEncoder().encode(t):t instanceof Uint8Array?t:new Uint8Array(t),o=e.extractHeader(n),A=e.parseHeader(o.text);if(A.format==="ascii"){let a=new TextDecoder("utf-8").decode(n.subarray(o.endOffset));return e.parseAsciiBody(A,a,r)}let i=A.format==="binary_little_endian";return e.parseBinaryBody(A,n.subarray(o.endOffset),i,r)}static extractHeader(t){let r=Math.min(t.length,1e4),n=t.subarray(0,r),o=new TextDecoder("utf-8").decode(n),A=o.indexOf("end_header");if(A===-1)throw new Error("Invalid PLY file: 'end_header' marker not found");let i=o.indexOf(`
|
|
143
|
-
`,A);return i===-1?i=A+10:i+=1,{text:o.substring(0,i),endOffset:i}}static parseHeader(t){let r=t.split(/\r?\n/),n="ascii",o="1.0",A=[],i=null;for(let a of r){let s=a.trim();if(!s||s.startsWith("comment"))continue;let c=s.split(/\s+/),l=c[0]?.toLowerCase();if(l!=="ply"){if(l==="format"){let u=c[1]?.toLowerCase();u==="binary_little_endian"?n="binary_little_endian":u==="binary_big_endian"?n="binary_big_endian":n="ascii",o=c[2]??"1.0"}else if(l==="element"){let u=c[1]??"",g=Number.parseInt(c[2]??"0",10);i={name:u,count:g,properties:[]},A.push(i)}else if(l==="property"&&i)c[1]?.toLowerCase()==="list"?i.properties.push({name:c[4]??"",type:"list",isList:!0,countType:c[2]??"uchar",itemType:c[3]??"int"}):i.properties.push({name:c[2]??"",type:c[1]?.toLowerCase()??"float"});else if(l==="end_header")break}}return{format:n,version:o,elements:A}}static parseAsciiBody(t,r,n){let o=t.elements.find(J=>J.name==="vertex"),A=t.elements.find(J=>J.name==="face"),i=o?.count??0,a=A?.count??0,s=[],c=[],l=[],u=[],g=[],p=o?.properties??[],d=p.findIndex(J=>J.name==="x"),f=p.findIndex(J=>J.name==="y"),h=p.findIndex(J=>J.name==="z"),I=p.findIndex(J=>J.name==="nx"),b=p.findIndex(J=>J.name==="ny"),D=p.findIndex(J=>J.name==="nz"),m=p.findIndex(J=>J.name==="u"||J.name==="s"||J.name==="texture_u"),Q=p.findIndex(J=>J.name==="v"||J.name==="t"||J.name==="texture_v"),w=p.findIndex(J=>J.name==="red"||J.name==="r"),S=p.findIndex(J=>J.name==="green"||J.name==="g"),N=p.findIndex(J=>J.name==="blue"||J.name==="b"),M=p.findIndex(J=>J.name==="alpha"||J.name==="a"),G=I!==-1&&b!==-1&&D!==-1,j=w!==-1&&S!==-1&&N!==-1,R=m!==-1&&Q!==-1,K=r.trim().split(/\r?\n/),z=0;for(let J=0;J<i&&!(z>=K.length);J++){let W=K[z++]?.trim();if(!W)continue;let X=W.split(/\s+/),Ae=Number.parseFloat(X[d]??"0")||0,re=Number.parseFloat(X[f]??"0")||0,oe=Number.parseFloat(X[h]??"0")||0;if(s.push(Ae,re,oe),G){let ne=Number.parseFloat(X[I]??"0")||0,ie=Number.parseFloat(X[b]??"0")||0,he=Number.parseFloat(X[D]??"0")||0;c.push(ne,ie,he)}else c.push(0,0,0);if(R){let ne=Number.parseFloat(X[m]??"0")||0,ie=Number.parseFloat(X[Q]??"0")||0;l.push(ne,1-ie)}else l.push(0,0);if(j){let ne=(Number.parseFloat(X[w]??"255")||0)/255,ie=(Number.parseFloat(X[S]??"255")||0)/255,he=(Number.parseFloat(X[N]??"255")||0)/255,F=M!==-1?(Number.parseFloat(X[M]??"255")||0)/255:1;u.push(ne,ie,he,F)}}for(let J=0;J<a&&!(z>=K.length);J++){let W=K[z++]?.trim();if(!W)continue;let X=W.split(/\s+/),Ae=Number.parseInt(X[0]??"0",10);if(Ae>=3){let re=Number.parseInt(X[1]??"0",10);for(let oe=1;oe<Ae-1;oe++){let ne=Number.parseInt(X[oe+1]??"0",10),ie=Number.parseInt(X[oe+2]??"0",10);g.push(re,ne,ie)}}}return e.finalizeModel(s,c,l,j?u:void 0,g,G,n)}static parseBinaryBody(t,r,n,o){let A=new DataView(r.buffer,r.byteOffset,r.byteLength),i=0,a=t.elements.find(w=>w.name==="vertex"),s=t.elements.find(w=>w.name==="face"),c=a?.count??0,l=s?.count??0,u=[],g=[],p=[],d=[],f=[],h=a?.properties??[],I=h.some(w=>w.name==="nx"),b=h.some(w=>w.name==="red"||w.name==="r"),D=w=>{let S=0;switch(w.toLowerCase()){case"char":case"int8":S=A.getInt8(i),i+=1;break;case"uchar":case"uint8":S=A.getUint8(i),i+=1;break;case"short":case"int16":S=A.getInt16(i,n),i+=2;break;case"ushort":case"uint16":S=A.getUint16(i,n),i+=2;break;case"int":case"int32":S=A.getInt32(i,n),i+=4;break;case"uint":case"uint32":S=A.getUint32(i,n),i+=4;break;case"float":case"float32":S=A.getFloat32(i,n),i+=4;break;case"double":case"float64":S=A.getFloat64(i,n),i+=8;break;default:S=A.getFloat32(i,n),i+=4;break}return S};for(let w=0;w<c;w++){let S=0,N=0,M=0,G=0,j=0,R=0,K=0,z=0,J=1,W=1,X=1,Ae=1;for(let re of h){let oe=D(re.type),ne=re.name.toLowerCase();ne==="x"?S=oe:ne==="y"?N=oe:ne==="z"?M=oe:ne==="nx"?G=oe:ne==="ny"?j=oe:ne==="nz"?R=oe:ne==="u"||ne==="s"?K=oe:ne==="v"||ne==="t"?z=oe:ne==="red"||ne==="r"?J=re.type.includes("int")?oe/255:oe:ne==="green"||ne==="g"?W=re.type.includes("int")?oe/255:oe:ne==="blue"||ne==="b"?X=re.type.includes("int")?oe/255:oe:(ne==="alpha"||ne==="a")&&(Ae=re.type.includes("int")?oe/255:oe)}u.push(S,N,M),g.push(G,j,R),p.push(K,1-z),b&&d.push(J,W,X,Ae)}let Q=(s?.properties??[]).find(w=>w.isList);for(let w=0;w<l&&!(i>=r.byteLength);w++)if(Q){let S=D(Q.countType??"uchar"),N=[];for(let M=0;M<S;M++)N.push(D(Q.itemType??"int"));if(N.length>=3){let M=N[0];for(let G=1;G<N.length-1;G++)f.push(M,N[G],N[G+1])}}return e.finalizeModel(u,g,p,b?d:void 0,f,I,o)}static finalizeModel(t,r,n,o,A,i,a){(!i||a.smoothNormals)&&fr(t,A,r);let s=Ot(t),c=xt(s,a),l=Ht(t,c),u=jt(A,l.length/3),g={name:"ply_default",diffuseColor:o?[1,1,1,1]:[.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(r),uvs:new Float32Array(n),colors:o?new Float32Array(o):void 0,indices:u,materialName:"ply_default"}],materials:{ply_default:g},animations:[],bounds:Vt(s,c)}}static load(t,r={}){if(typeof t!="string")return e.parse(t,r);if(t.startsWith("/")||t.startsWith("./")||t.startsWith("../")||t.startsWith("file://")){let n=t.startsWith("file://")?t.replace("file://",""):t,o=Re.readFileSync(n);return e.parse(o,r)}return e.parse(t,r)}};function eo(e,t={}){return Xo.load(e,t)}$();_t();var ga=Ko(sa(),1);$();var rA=(function(){var e="b9H79Tebbbe8Fv9Gbb9Gvuuuuueu9Giuuub9Geueu9Giuuueuixkbeeeddddillviebeoweuecj:Gdkr;Neqo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbeY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVbdE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbiL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtblK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949WboY9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVJ9V29VVbrl79IV9Rbwq;X8:kdbk:kYi5ud9:du8Jjjjjbcjq9Rgv8Kjjjjbc9:hodnalTmbcuhoaiRbbgrc;WeGc:Ge9hmbarcsGgwce0mbc9:hoalcufadcd4cbawEgDadfgrcKcaawEgqaraq0Egk6mbaicefhxcj;abad9Uc;WFbGcjdadca0EhmaialfgPar9Rgoadfhsavaoadz:jjjjbgzceVhHcbhOdndninaeaO9nmeaPax9RaD6mdamaeaO9RaOamfgoae6EgAcsfglc9WGhCaAcethXaxaDfhiaOaeaoaeao6E9RhQalcl4cifcd4hLazcjdfaAfhKcbhYabaOad2fg8AhEaHh3incbh5dnawTmbaxaYcd4fRbbh5kcbh8Eazcjdfhqinaih8Fdndndndna5a8Ecet4ciGgoc9:fPdebdkaPa8F9RaA6mrazcjdfa8EaA2fa8FaAz:jjjjb8Aa8FaAfhixdkazcjdfa8EaA2fcbaAz:kjjjb8Aa8FhixekaPa8F9RaL6mva8FaLfhidnaCTmbaPai9RcK6mbaocdtc:q:G:cjbfcj:G:cjbawEhaczhrcbhlinargoc9Wfghaqfhrdndndndndndnaaa8Fahco4fRbbalcoG4ciGcdtfydbPDbedvivvvlvkar9cb83bwar9cb83bbxlkarcbaiRbdai8Xbb9c:c:qj:bw9:9c:q;c1:I1e:d9c:b:c:e1z9:gg9cjjjjjz:dg8J9qE86bbaqaofgrcGfcbaicdfa8J9c8N1:NfghRbbag9cjjjjjw:dg8J9qE86bbarcVfcbaha8J9c8M1:NfghRbbag9cjjjjjl:dg8J9qE86bbarc7fcbaha8J9c8L1:NfghRbbag9cjjjjjd:dg8J9qE86bbarctfcbaha8J9c8K1:NfghRbbag9cjjjjje:dg8J9qE86bbarc91fcbaha8J9c8J1:NfghRbbag9cjjjj;ab:dg8J9qE86bbarc4fcbaha8J9cg1:NfghRbbag9cjjjja:dg8J9qE86bbarc93fcbaha8J9ch1:NfghRbbag9cjjjjz:dgg9qE86bbarc94fcbahag9ca1:NfghRbbai8Xbe9c:c:qj:bw9:9c:q;c1:I1e:d9c:b:c:e1z9:gg9cjjjjjz:dg8J9qE86bbarc95fcbaha8J9c8N1:NfgiRbbag9cjjjjjw:dg8J9qE86bbarc96fcbaia8J9c8M1:NfgiRbbag9cjjjjjl:dg8J9qE86bbarc97fcbaia8J9c8L1:NfgiRbbag9cjjjjjd:dg8J9qE86bbarc98fcbaia8J9c8K1:NfgiRbbag9cjjjjje:dg8J9qE86bbarc99fcbaia8J9c8J1:NfgiRbbag9cjjjj;ab:dg8J9qE86bbarc9:fcbaia8J9cg1:NfgiRbbag9cjjjja:dg8J9qE86bbarcufcbaia8J9ch1:NfgiRbbag9cjjjjz:dgg9qE86bbaiag9ca1:NfhixikaraiRblaiRbbghco4g8Ka8KciSg8KE86bbaqaofgrcGfaiclfa8Kfg8KRbbahcl4ciGg8La8LciSg8LE86bbarcVfa8Ka8Lfg8KRbbahcd4ciGg8La8LciSg8LE86bbarc7fa8Ka8Lfg8KRbbahciGghahciSghE86bbarctfa8Kahfg8KRbbaiRbeghco4g8La8LciSg8LE86bbarc91fa8Ka8Lfg8KRbbahcl4ciGg8La8LciSg8LE86bbarc4fa8Ka8Lfg8KRbbahcd4ciGg8La8LciSg8LE86bbarc93fa8Ka8Lfg8KRbbahciGghahciSghE86bbarc94fa8Kahfg8KRbbaiRbdghco4g8La8LciSg8LE86bbarc95fa8Ka8Lfg8KRbbahcl4ciGg8La8LciSg8LE86bbarc96fa8Ka8Lfg8KRbbahcd4ciGg8La8LciSg8LE86bbarc97fa8Ka8Lfg8KRbbahciGghahciSghE86bbarc98fa8KahfghRbbaiRbigico4g8Ka8KciSg8KE86bbarc99faha8KfghRbbaicl4ciGg8Ka8KciSg8KE86bbarc9:faha8KfghRbbaicd4ciGg8Ka8KciSg8KE86bbarcufaha8KfgrRbbaiciGgiaiciSgiE86bbaraifhixdkaraiRbwaiRbbghcl4g8Ka8KcsSg8KE86bbaqaofgrcGfaicwfa8Kfg8KRbbahcsGghahcsSghE86bbarcVfa8KahfghRbbaiRbeg8Kcl4g8La8LcsSg8LE86bbarc7faha8LfghRbba8KcsGg8Ka8KcsSg8KE86bbarctfaha8KfghRbbaiRbdg8Kcl4g8La8LcsSg8LE86bbarc91faha8LfghRbba8KcsGg8Ka8KcsSg8KE86bbarc4faha8KfghRbbaiRbig8Kcl4g8La8LcsSg8LE86bbarc93faha8LfghRbba8KcsGg8Ka8KcsSg8KE86bbarc94faha8KfghRbbaiRblg8Kcl4g8La8LcsSg8LE86bbarc95faha8LfghRbba8KcsGg8Ka8KcsSg8KE86bbarc96faha8KfghRbbaiRbvg8Kcl4g8La8LcsSg8LE86bbarc97faha8LfghRbba8KcsGg8Ka8KcsSg8KE86bbarc98faha8KfghRbbaiRbog8Kcl4g8La8LcsSg8LE86bbarc99faha8LfghRbba8KcsGg8Ka8KcsSg8KE86bbarc9:faha8KfghRbbaiRbrgicl4g8Ka8KcsSg8KE86bbarcufaha8KfgrRbbaicsGgiaicsSgiE86bbaraifhixekarai8Pbw83bwarai8Pbb83bbaiczfhikdnaoaC9pmbalcdfhlaoczfhraPai9RcL0mekkaoaC6moaimexokaCmva8FTmvkaqaAfhqa8Ecefg8Ecl9hmbkdndndndnawTmbasaYcd4fRbbgociGPlbedrbkaATmdazaYfh8Fazcjdfhhcbh8EaEhaina8FRbbhraahocbhlinaoahalfRbbgqce4cbaqceG9R7arfgr86bbaoadfhoaAalcefgl9hmbkaacefhaa8Fcefh8FahaAfhha8Ecefg8Ecl9hmbxikkaATmeazaYfhaazcjdfhhcbhoceh8EaKh8FinaEaofhlaa8Vbbhrcbhoinala8FaofRbbcwtahaofRbbgqVc;:FiGce4cbaqceG9R7arfgr87bbaladfhlaQaocefgofmbka8FaXfh8FcdhoaacdfhaahaXfhha8EceGhlcbh8EalmbxdkkaATmbaocl4h8EazaYfRbbhqcwhoa3hlinalRbbaotaqVhqalcefhlaocwfgoca9hmbkcbhhaEh8FaKhainazcjdfahfRbbhrcwhoaahlinalRbbaotarVhralaAfhlaocwfgoca9hmbkara8E94aq7hqcbhoa8Fhlinalaqao486bbalcefhlaocwfgoca9hmbka8Fadfh8FaacefhaahcefghaA9hmbkkaEclfhEa3clfh3aYclfgYad6mbkaza8AaAcufad2fadz:jjjjb8AaAaOfhOaihxaimbkc9:hoxdkcbc99aPax9RakSEhoxekc9:hokavcjqf8Kjjjjbaok:bsesu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnalaeci9UgrcHf6mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgwce0mbavc;abfcFecjez:kjjjb8Aav9cu83iUav9cu83i8Wav9cu83iyav9cu83iaav9cu83iKav9cu83izav9cu83iwav9cu83ibaialfc9WfhDaicefgiarfhqdndnaeci9pmbaqhexekcmcsawceSEhkcbhxcbhmaqhecbhlcbhoindndnaiRbbgrc;Ve0mbavc;abfaoarcu7gPcl4fcsGcitfgwydlhsawydbhzdndnarcsGgwak9pmbavalaPfcsGcdtfydbaxawEhraxawTgHfhxxekdnaeaD9nmbc9:hoxokdndnawcsSmbcehHamawcetfcWfhrxekaecefhrae8SbbgwcFeGhPdndnawcu9mmbarhexekaecvfheaPcFbGhPcrhwdninar8SbbgHcFbGawtaPVhPaHcu9kmearcefhrawcrfgwc8J9hmbxdkkarcefhekcehHaPce4cbaPceG9R7amfhrkarhmkavc;abfaocitfgwarBdbawasBdlavalcdtfarBdbavc;abfaocefcsGcitfgwazBdbawarBdlaocdfhoaHalfhldnadcd9hmbabar87elabas87edabaz87ebabcofhbxdkabarBdwabasBdlabazBdbabcxfhbxekdnarcpe0mbavalaDarcsGfRbbgwcl4gP9RcsGcdtfydbaxcefgsaPEhravalaw9RcsGcdtfydbasaPTgzfgsawcsGgPEhwaPThPdndnadcd9hmbabaw87elabar87edabax87ebcohHxekabawBdwabarBdlabaxBdbcxhHkavalcdtfaxBdbavc;abfaocitfgOarBdbaOaxBdlavalcefglcsGcdtfarBdbavc;abfaocefcsGcitfgOawBdbaOarBdlavalazfglcsGcdtfawBdbavc;abfaocdfcsGcitfgraxBdbarawBdlaocifhoabaHfhbalaPfhlasaPfhxxekdnaeaD9nmbc9:hoxlkaxcbaeRbbgwEgHarc;:eSgrfhsawcsGhOdndnawcl4gAmbascefhzxekashzavalaA9RcsGcdtfydbhskdndnaOmbazcefhxxekazhxavalaw9RcsGcdtfydbhzkdndnarTmbaecefhrxekaecdfhrae8SbegPcFeGhwdnaPcu9kmbaecofhHawcFbGhwcrhedninar8SbbgPcFbGaetawVhwaPcu9kmearcefhraecrfgec8J9hmbkaHhrxekarcefhrkawce4cbawceG9R7amfgmhHkdndnaAcsSmbarhwxekarcefhwar8SbbgecFeGhPdnaecu9kmbarcvfhsaPcFbGhPcrhedninaw8SbbgrcFbGaetaPVhParcu9kmeawcefhwaecrfgec8J9hmbkashwxekawcefhwkaPce4cbaPceG9R7amfgmhskdndnaOcsSmbawhexekawcefheaw8SbbgrcFeGhPdnarcu9kmbawcvfhzaPcFbGhPcrhrdninae8SbbgwcFbGartaPVhPawcu9kmeaecefhearcrfgrc8J9hmbkazhexekaecefhekaPce4cbaPceG9R7amfgmhzkdndnadcd9hmbabaz87elabas87edabaH87ebcohrxekabazBdwabasBdlabaHBdbcxhrkavc;abfaocitfgwasBdbawaHBdlavalcdtfaHBdbavc;abfaocefcsGcitfgwazBdbawasBdlavalcefglcsGcdtfasBdbavc;abfaocdfcsGcitfgwaHBdbawazBdlavalaATaAcsSVfglcsGcdtfazBdbalaOTaOcsSVfhlaocifhoabarfhbkaocsGhoalcsGhlaicefgiaq6mbkkcbc99aeaDSEhokavc;aef8Kjjjjbaok:clevu8Jjjjjbcz9Rhvdnalaecvf9pmbc9:skdnaiRbbc;:eGc;qeSmbcuskav9cb83iwaicefhoaialfc98fhrdnaeTmbdnadcdSmbcbhwindnaoar6mbc9:skaocefhlao8SbbgicFeGhddndnaicu9mmbalhoxekaocvfhoadcFbGhdcrhidninal8SbbgDcFbGaitadVhdaDcu9kmealcefhlaicrfgic8J9hmbxdkkalcefhokabawcdtfadc8Etc8F91adcd47avcwfadceGcdtVglydbfgiBdbalaiBdbawcefgwae9hmbxdkkcbhwindnaoar6mbc9:skaocefhlao8SbbgicFeGhddndnaicu9mmbalhoxekaocvfhoadcFbGhdcrhidninal8SbbgDcFbGaitadVhdaDcu9kmealcefhlaicrfgic8J9hmbxdkkalcefhokabawcetfadc8Etc8F91adcd47avcwfadceGcdtVglydbfgi87ebalaiBdbawcefgwae9hmbkkcbc99aoarSEk:Lvoeue99dud99eud99dndnadcl9hmbaeTmeindndnabcdfgd8Sbb:Yab8Sbbgi:Ygl:l:tabcefgv8Sbbgo:Ygr:l:tgwJbb;:9cawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai86bbdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad86bbdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad86bbabclfhbaecufgembxdkkaeTmbindndnabclfgd8Ueb:Yab8Uebgi:Ygl:l:tabcdfgv8Uebgo:Ygr:l:tgwJb;:FSawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai87ebdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad87ebdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad87ebabcwfhbaecufgembkkk:4ioiue99dud99dud99dnaeTmbcbhiabhlindndnal8Uebgv:YgoJ:ji:1Salcof8UebgrciVgw:Y:vgDNJbbbZJbbb:;avcu9kEMgq:lJbbb9p9DTmbaq:Ohkxekcjjjj94hkkalclf8Uebhvalcdf8UebhxalarcefciGcetfak87ebdndnax:YgqaDNJbbbZJbbb:;axcu9kEMgm:lJbbb9p9DTmbam:Ohxxekcjjjj94hxkabaiarciGgkfcd7cetfax87ebdndnav:YgmaDNJbbbZJbbb:;avcu9kEMgP:lJbbb9p9DTmbaP:Ohvxekcjjjj94hvkalarcufciGcetfav87ebdndnawaw2:ZgPaPMaoaoN:taqaqN:tamamN:tgoJbbbbaoJbbbb9GE:raDNJbbbZMgD:lJbbb9p9DTmbaD:Ohrxekcjjjj94hrkalakcetfar87ebalcwfhlaiclfhiaecufgembkkk9mbdnadcd4ae2gdTmbinababydbgecwtcw91:Yaece91cjjj98Gcjjj;8if::NUdbabclfhbadcufgdmbkkk:Tvirud99eudndnadcl9hmbaeTmeindndnabRbbgiabcefgl8Sbbgvabcdfgo8Sbbgrf9R:YJbbuJabcifgwRbbgdce4adVgDcd4aDVgDcl4aDVgD:Z:vgqNJbbbZMgk:lJbbb9p9DTmbak:Ohxxekcjjjj94hxkaoax86bbdndnaraif:YaqNJbbbZMgk:lJbbb9p9DTmbak:Ohoxekcjjjj94hokalao86bbdndnavaifar9R:YaqNJbbbZMgk:lJbbb9p9DTmbak:Ohixekcjjjj94hikabai86bbdndnaDadcetGadceGV:ZaqNJbbbZMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkawad86bbabclfhbaecufgembxdkkaeTmbindndnab8Vebgiabcdfgl8Uebgvabclfgo8Uebgrf9R:YJbFu9habcofgw8Vebgdce4adVgDcd4aDVgDcl4aDVgDcw4aDVgD:Z:vgqNJbbbZMgk:lJbbb9p9DTmbak:Ohxxekcjjjj94hxkaoax87ebdndnaraif:YaqNJbbbZMgk:lJbbb9p9DTmbak:Ohoxekcjjjj94hokalao87ebdndnavaifar9R:YaqNJbbbZMgk:lJbbb9p9DTmbak:Ohixekcjjjj94hikabai87ebdndnaDadcetGadceGV:ZaqNJbbbZMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkawad87ebabcwfhbaecufgembkkk9teiucbcbyd:K:G:cjbgeabcifc98GfgbBd:K:G:cjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabkk83dbcj:Gdk8Kbbbbdbbblbbbwbbbbbbbebbbdbbblbbbwbbbbc:K:Gdkl8W:qbb",t="b9H79TebbbeKl9Gbb9Gvuuuuueu9Giuuub9Geueuixkbbebeeddddilve9Weeeviebeoweuecj:Gdkr;Neqo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbdY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVblE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtboK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbrL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949WbwY9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVJ9V29VVbDl79IV9Rbqq:I9Dklbzik94evu8Jjjjjbcz9Rhbcbheincbhdcbhiinabcwfadfaicjuaead4ceGglE86bbaialfhiadcefgdcw9hmbkaeai86b:q:W:cjbaecitab8Piw83i:q:G:cjbaecefgecjd9hmbkk:SBlEud97dur978Jjjjjbcj;kb9Rgv8Kjjjjbc9:hodnalTmbcuhoaiRbbgrc;WeGc:Ge9hmbarcsGgwce0mbc9:hoalcufadcd4cbawEgDadfgrcKcaawEgqaraq0Egk6mbaialfgxar9RhodnadTgmmbavaoad;8qbbkaicefhPcj;abad9Uc;WFbGcjdadca0EhsdndndnadTmbaoadfhzcbhHinaeaH9nmdaxaP9RaD6miabaHad2fgOavcjdfasaeaH9RaHasfae6EgAaAcsfgoc9WGgCSEhXaPaDfhQaocl4cifcd4hLavcj;cbfaCcetfhKavcj;cbfaCci2fhYavcj;cbfaCfh8AcbhEaoc;ab6h3incbh5dnawTmbaPaEcd4fRbbh5kcbh8Eavcj;cbfh8Findndndndna5a8Ecet4ciGgoc9:fPdebdkaxaQ9RaC6mwdnaCTmbavcj;cbfa8EaC2faQaC;8qbbkaQaAfhQxdkaCTmeavcj;cbfa8EaC2fcbaC;8kbxekaxaQ9RaL6moaoclVcbawEhraQaLfhocbhidna3mbaxao9Rc;Gb6mbcbhlina8FalfhidndndndndndnaQalco4fRbbgqciGarfPDbedibledibkaipxbbbbbbbbbbbbbbbbpklbxlkaiaopbblaopbbbgaclp:meaapmbzeHdOiAlCvXoQrLgacdp:meaapmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9oghpxiiiiiiiiiiiiiiiip8Jgap5b9cjF;8;4;W;G;ab9:9cU1:Nggcitpbi:q:G:cjbagRb:q:W:cjbggpsaap5e9cjF;8;4;W;G;ab9:9cU1:Ng8Jcitpbi:q:G:cjbp9UpmbedilvorzHOACXQLpPahaap9spklbagaoclffa8JRb:q:W:cjbfhoxikaiaopbbwaopbbbgaclp:meaapmbzeHdOiAlCvXoQrLpxssssssssssssssssp9oghpxssssssssssssssssp8Jgap5b9cjF;8;4;W;G;ab9:9cU1:Nggcitpbi:q:G:cjbagRb:q:W:cjbggpsaap5e9cjF;8;4;W;G;ab9:9cU1:Ng8Jcitpbi:q:G:cjbp9UpmbedilvorzHOACXQLpPahaap9spklbagaocwffa8JRb:q:W:cjbfhoxdkaiaopbbbpklbaoczfhoxekaiaopbbdaoRbbggcitpbi:q:G:cjbagRb:q:W:cjbggpsaoRbeg8Jcitpbi:q:G:cjbp9UpmbedilvorzHOACXQLpPpklbagaocdffa8JRb:q:W:cjbfhokdndndndndndnaqcd4ciGarfPDbedibledibkaiczfpxbbbbbbbbbbbbbbbbpklbxlkaiczfaopbblaopbbbgaclp:meaapmbzeHdOiAlCvXoQrLgacdp:meaapmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9oghpxiiiiiiiiiiiiiiiip8Jgap5b9cjF;8;4;W;G;ab9:9cU1:Nggcitpbi:q:G:cjbagRb:q:W:cjbggpsaap5e9cjF;8;4;W;G;ab9:9cU1:Ng8Jcitpbi:q:G:cjbp9UpmbedilvorzHOACXQLpPahaap9spklbagaoclffa8JRb:q:W:cjbfhoxikaiczfaopbbwaopbbbgaclp:meaapmbzeHdOiAlCvXoQrLpxssssssssssssssssp9oghpxssssssssssssssssp8Jgap5b9cjF;8;4;W;G;ab9:9cU1:Nggcitpbi:q:G:cjbagRb:q:W:cjbggpsaap5e9cjF;8;4;W;G;ab9:9cU1:Ng8Jcitpbi:q:G:cjbp9UpmbedilvorzHOACXQLpPahaap9spklbagaocwffa8JRb:q:W:cjbfhoxdkaiczfaopbbbpklbaoczfhoxekaiczfaopbbdaoRbbggcitpbi:q:G:cjbagRb:q:W:cjbggpsaoRbeg8Jcitpbi:q:G:cjbp9UpmbedilvorzHOACXQLpPpklbagaocdffa8JRb:q:W:cjbfhokdndndndndndnaqcl4ciGarfPDbedibledibkaicafpxbbbbbbbbbbbbbbbbpklbxlkaicafaopbblaopbbbgaclp:meaapmbzeHdOiAlCvXoQrLgacdp:meaapmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9oghpxiiiiiiiiiiiiiiiip8Jgap5b9cjF;8;4;W;G;ab9:9cU1:Nggcitpbi:q:G:cjbagRb:q:W:cjbggpsaap5e9cjF;8;4;W;G;ab9:9cU1:Ng8Jcitpbi:q:G:cjbp9UpmbedilvorzHOACXQLpPahaap9spklbagaoclffa8JRb:q:W:cjbfhoxikaicafaopbbwaopbbbgaclp:meaapmbzeHdOiAlCvXoQrLpxssssssssssssssssp9oghpxssssssssssssssssp8Jgap5b9cjF;8;4;W;G;ab9:9cU1:Nggcitpbi:q:G:cjbagRb:q:W:cjbggpsaap5e9cjF;8;4;W;G;ab9:9cU1:Ng8Jcitpbi:q:G:cjbp9UpmbedilvorzHOACXQLpPahaap9spklbagaocwffa8JRb:q:W:cjbfhoxdkaicafaopbbbpklbaoczfhoxekaicafaopbbdaoRbbggcitpbi:q:G:cjbagRb:q:W:cjbggpsaoRbeg8Jcitpbi:q:G:cjbp9UpmbedilvorzHOACXQLpPpklbagaocdffa8JRb:q:W:cjbfhokdndndndndndnaqco4arfPDbedibledibkaic8Wfpxbbbbbbbbbbbbbbbbpklbxlkaic8Wfaopbblaopbbbgaclp:meaapmbzeHdOiAlCvXoQrLgacdp:meaapmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9oghpxiiiiiiiiiiiiiiiip8Jgap5b9cjF;8;4;W;G;ab9:9cU1:Ngicitpbi:q:G:cjbaiRb:q:W:cjbgipsaap5e9cjF;8;4;W;G;ab9:9cU1:Ngqcitpbi:q:G:cjbp9UpmbedilvorzHOACXQLpPahaap9spklbaiaoclffaqRb:q:W:cjbfhoxikaic8Wfaopbbwaopbbbgaclp:meaapmbzeHdOiAlCvXoQrLpxssssssssssssssssp9oghpxssssssssssssssssp8Jgap5b9cjF;8;4;W;G;ab9:9cU1:Ngicitpbi:q:G:cjbaiRb:q:W:cjbgipsaap5e9cjF;8;4;W;G;ab9:9cU1:Ngqcitpbi:q:G:cjbp9UpmbedilvorzHOACXQLpPahaap9spklbaiaocwffaqRb:q:W:cjbfhoxdkaic8Wfaopbbbpklbaoczfhoxekaic8WfaopbbdaoRbbgicitpbi:q:G:cjbaiRb:q:W:cjbgipsaoRbegqcitpbi:q:G:cjbp9UpmbedilvorzHOACXQLpPpklbaiaocdffaqRb:q:W:cjbfhokalc;abfhialcjefaC0meaihlaxao9Rc;Fb0mbkkdnaiaC9pmbaici4hlinaxao9RcK6mwa8FaifhqdndndndndndnaQaico4fRbbalcoG4ciGarfPDbedibledibkaqpxbbbbbbbbbbbbbbbbpkbbxlkaqaopbblaopbbbgaclp:meaapmbzeHdOiAlCvXoQrLgacdp:meaapmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9oghpxiiiiiiiiiiiiiiiip8Jgap5b9cjF;8;4;W;G;ab9:9cU1:Nggcitpbi:q:G:cjbagRb:q:W:cjbggpsaap5e9cjF;8;4;W;G;ab9:9cU1:Ng8Jcitpbi:q:G:cjbp9UpmbedilvorzHOACXQLpPahaap9spkbbagaoclffa8JRb:q:W:cjbfhoxikaqaopbbwaopbbbgaclp:meaapmbzeHdOiAlCvXoQrLpxssssssssssssssssp9oghpxssssssssssssssssp8Jgap5b9cjF;8;4;W;G;ab9:9cU1:Nggcitpbi:q:G:cjbagRb:q:W:cjbggpsaap5e9cjF;8;4;W;G;ab9:9cU1:Ng8Jcitpbi:q:G:cjbp9UpmbedilvorzHOACXQLpPahaap9spkbbagaocwffa8JRb:q:W:cjbfhoxdkaqaopbbbpkbbaoczfhoxekaqaopbbdaoRbbggcitpbi:q:G:cjbagRb:q:W:cjbggpsaoRbeg8Jcitpbi:q:G:cjbp9UpmbedilvorzHOACXQLpPpkbbagaocdffa8JRb:q:W:cjbfhokalcdfhlaiczfgiaC6mbkkaohQaoTmoka8FaCfh8Fa8Ecefg8Ecl9hmbkdndndndnawTmbazaEcd4fRbbglciGPlbedwbkaCTmdaXaEfhlavaEfpbdbh8Kcbhoinalavcj;cbfaofpblbg8La8Aaofpblbg8MpmbzeHdOiAlCvXoQrLg8NaKaofpblbgyaYaofpblbg8PpmbzeHdOiAlCvXoQrLgIpmbezHdiOAlvCXorQLgacep9Taapxeeeeeeeeeeeeeeeeghp9op9Hp9rgaa8Kp9Ug8Kp9Abbbaladfgla8Kaaaapmlvorlvorlvorlvorp9Ug8Kp9Abbbaladfgla8KaaaapmwDqkwDqkwDqkwDqkp9Ug8Kp9Abbbaladfgla8KaaaapmxmPsxmPsxmPsxmPsp9Ug8Kp9Abbbaladfgla8Ka8NaIpmwDKYqk8AExm35Ps8E8Fgacep9Taaahp9op9Hp9rgap9Ug8Kp9Abbbaladfgla8Kaaaapmlvorlvorlvorlvorp9Ug8Kp9Abbbaladfgla8KaaaapmwDqkwDqkwDqkwDqkp9Ug8Kp9Abbbaladfgla8KaaaapmxmPsxmPsxmPsxmPsp9Ug8Kp9Abbbaladfgla8Ka8La8MpmwKDYq8AkEx3m5P8Es8Fg8Laya8PpmwKDYq8AkEx3m5P8Es8Fg8MpmbezHdiOAlvCXorQLgacep9Taaahp9op9Hp9rgap9Ug8Kp9Abbbaladfgla8Kaaaapmlvorlvorlvorlvorp9Ug8Kp9Abbbaladfgla8KaaaapmwDqkwDqkwDqkwDqkp9Ug8Kp9Abbbaladfgla8KaaaapmxmPsxmPsxmPsxmPsp9Ug8Kp9Abbbaladfgla8Ka8La8MpmwDKYqk8AExm35Ps8E8Fgacep9Taaahp9op9Hp9rgap9Ughp9Abbbaladfglahaaaapmlvorlvorlvorlvorp9Ughp9AbbbaladfglahaaaapmwDqkwDqkwDqkwDqkp9Ughp9AbbbaladfglahaaaapmxmPsxmPsxmPsxmPsp9Ug8Kp9AbbbaladfhlaoczfgoaC6mbxikkaCTmeaXaEfhlavaEfpbdbh8Kcbhoinalavcj;cbfaofpblbg8La8Aaofpblbg8MpmbzeHdOiAlCvXoQrLg8NaKaofpblbgyaYaofpblbg8PpmbzeHdOiAlCvXoQrLgIpmbezHdiOAlvCXorQLgacep:neaapxebebebebebebebebghp9op:bep9rgaa8Kp:oeg8Kp9Abbbaladfgla8Kaaaapmlvorlvorlvorlvorp:oeg8Kp9Abbbaladfgla8KaaaapmwDqkwDqkwDqkwDqkp:oeg8Kp9Abbbaladfgla8KaaaapmxmPsxmPsxmPsxmPsp:oeg8Kp9Abbbaladfgla8Ka8NaIpmwDKYqk8AExm35Ps8E8Fgacep:neaaahp9op:bep9rgap:oeg8Kp9Abbbaladfgla8Kaaaapmlvorlvorlvorlvorp:oeg8Kp9Abbbaladfgla8KaaaapmwDqkwDqkwDqkwDqkp:oeg8Kp9Abbbaladfgla8KaaaapmxmPsxmPsxmPsxmPsp:oeg8Kp9Abbbaladfgla8Ka8La8MpmwKDYq8AkEx3m5P8Es8Fg8Laya8PpmwKDYq8AkEx3m5P8Es8Fg8MpmbezHdiOAlvCXorQLgacep:neaaahp9op:bep9rgap:oeg8Kp9Abbbaladfgla8Kaaaapmlvorlvorlvorlvorp:oeg8Kp9Abbbaladfgla8KaaaapmwDqkwDqkwDqkwDqkp:oeg8Kp9Abbbaladfgla8KaaaapmxmPsxmPsxmPsxmPsp:oeg8Kp9Abbbaladfgla8Ka8La8MpmwDKYqk8AExm35Ps8E8Fgacep:neaaahp9op:bep9rgap:oeghp9Abbbaladfglahaaaapmlvorlvorlvorlvorp:oeghp9AbbbaladfglahaaaapmwDqkwDqkwDqkwDqkp:oeghp9AbbbaladfglahaaaapmxmPsxmPsxmPsxmPsp:oeg8Kp9AbbbaladfhlaoczfgoaC6mbxdkkaCTmbaXaEfhrcbhocbalcl4gl9Rc8FGhiavaEfpbdbhhinaravcj;cbfaofpblbg8Ka8Aaofpblbg8LpmbzeHdOiAlCvXoQrLg8MaKaofpblbg8NaYaofpblbgypmbzeHdOiAlCvXoQrLg8PpmbezHdiOAlvCXorQLgaaip:Reaaalp:Tep9qgaahp9rghp9Abbbaradfgrahaaaapmlvorlvorlvorlvorp9rghp9AbbbaradfgrahaaaapmwDqkwDqkwDqkwDqkp9rghp9AbbbaradfgrahaaaapmxmPsxmPsxmPsxmPsp9rghp9Abbbaradfgraha8Ma8PpmwDKYqk8AExm35Ps8E8Fgaaip:Reaaalp:Tep9qgap9rghp9Abbbaradfgrahaaaapmlvorlvorlvorlvorp9rghp9AbbbaradfgrahaaaapmwDqkwDqkwDqkwDqkp9rghp9AbbbaradfgrahaaaapmxmPsxmPsxmPsxmPsp9rghp9Abbbaradfgraha8Ka8LpmwKDYq8AkEx3m5P8Es8Fg8Ka8NaypmwKDYq8AkEx3m5P8Es8Fg8LpmbezHdiOAlvCXorQLgaaip:Reaaalp:Tep9qgap9rghp9Abbbaradfgrahaaaapmlvorlvorlvorlvorp9rghp9AbbbaradfgrahaaaapmwDqkwDqkwDqkwDqkp9rghp9AbbbaradfgrahaaaapmxmPsxmPsxmPsxmPsp9rghp9Abbbaradfgraha8Ka8LpmwDKYqk8AExm35Ps8E8Fgaaip:Reaaalp:Tep9qgap9rghp9Abbbaradfgrahaaaapmlvorlvorlvorlvorp9rghp9AbbbaradfgrahaaaapmwDqkwDqkwDqkwDqkp9rghp9AbbbaradfgrahaaaapmxmPsxmPsxmPsxmPsp9rghp9AbbbaradfhraoczfgoaC6mbkkaEclfgEad6mbkdnaXavcjdf9hmbaAad2goTmbaOavcjdfao;8qbbkdnammbavaXaAcufad2fad;8qbbkaAaHfhHc9:hoaQhPaQmbxlkkaeTmbaDalfhrcbhocuhlinaralaD9RglfaD6mdasaeao9Raoasfae6Eaofgoae6mbkaial9RhPkcbc99axaP9RakSEhoxekc9:hokavcj;kbf8Kjjjjbaokwbz:bjjjbkpPesu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnalaeci9UgrcHf6mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgwce0mbavc;abfcFecje;8kbav9cu83iUav9cu83i8Wav9cu83iyav9cu83iaav9cu83iKav9cu83izav9cu83iwav9cu83ibaialfc9WfhDaicefgiarfhqdndnaeci9pmbaqhexekcmcsawceSEhkcbhxcbhmaqhecbhlcbhoindndnaiRbbgrc;Ve0mbavc;abfaoarcu7gPcl4fcsGcitfgwydlhsawydbhzdndnarcsGgwak9pmbavalaPfcsGcdtfydbaxawEhraxawTgHfhxxekdnaeaD9nmbc9:hoxokdndnawcsSmbcehHamawcetfcWfhrxekaecefhrae8SbbgwcFeGhPdndnawcu9mmbarhexekaecvfheaPcFbGhPcrhwdninar8SbbgHcFbGawtaPVhPaHcu9kmearcefhrawcrfgwc8J9hmbxdkkarcefhekcehHaPce4cbaPceG9R7amfhrkarhmkavc;abfaocitfgwarBdbawasBdlavalcdtfarBdbavc;abfaocefcsGcitfgwazBdbawarBdlaocdfhoaHalfhldnadcd9hmbabar87elabas87edabaz87ebabcofhbxdkabarBdwabasBdlabazBdbabcxfhbxekdnarcpe0mbavalaDarcsGfRbbgwcl4gP9RcsGcdtfydbaxcefgsaPEhravalaw9RcsGcdtfydbasaPTgzfgsawcsGgPEhwaPThPdndnadcd9hmbabaw87elabar87edabax87ebcohHxekabawBdwabarBdlabaxBdbcxhHkavalcdtfaxBdbavc;abfaocitfgOarBdbaOaxBdlavalcefglcsGcdtfarBdbavc;abfaocefcsGcitfgOawBdbaOarBdlavalazfglcsGcdtfawBdbavc;abfaocdfcsGcitfgraxBdbarawBdlaocifhoabaHfhbalaPfhlasaPfhxxekdnaeaD9nmbc9:hoxlkaxcbaeRbbgwEgHarc;:eSgrfhsawcsGhOdndnawcl4gAmbascefhzxekashzavalaA9RcsGcdtfydbhskdndnaOmbazcefhxxekazhxavalaw9RcsGcdtfydbhzkdndnarTmbaecefhrxekaecdfhrae8SbegPcFeGhwdnaPcu9kmbaecofhHawcFbGhwcrhedninar8SbbgPcFbGaetawVhwaPcu9kmearcefhraecrfgec8J9hmbkaHhrxekarcefhrkawce4cbawceG9R7amfgmhHkdndnaAcsSmbarhwxekarcefhwar8SbbgecFeGhPdnaecu9kmbarcvfhsaPcFbGhPcrhedninaw8SbbgrcFbGaetaPVhParcu9kmeawcefhwaecrfgec8J9hmbkashwxekawcefhwkaPce4cbaPceG9R7amfgmhskdndnaOcsSmbawhexekawcefheaw8SbbgrcFeGhPdnarcu9kmbawcvfhzaPcFbGhPcrhrdninae8SbbgwcFbGartaPVhPawcu9kmeaecefhearcrfgrc8J9hmbkazhexekaecefhekaPce4cbaPceG9R7amfgmhzkdndnadcd9hmbabaz87elabas87edabaH87ebcohrxekabazBdwabasBdlabaHBdbcxhrkavc;abfaocitfgwasBdbawaHBdlavalcdtfaHBdbavc;abfaocefcsGcitfgwazBdbawasBdlavalcefglcsGcdtfasBdbavc;abfaocdfcsGcitfgwaHBdbawazBdlavalaATaAcsSVfglcsGcdtfazBdbalaOTaOcsSVfhlaocifhoabarfhbkaocsGhoalcsGhlaicefgiaq6mbkkcbc99aeaDSEhokavc;aef8Kjjjjbaok:clevu8Jjjjjbcz9Rhvdnalaecvf9pmbc9:skdnaiRbbc;:eGc;qeSmbcuskav9cb83iwaicefhoaialfc98fhrdnaeTmbdnadcdSmbcbhwindnaoar6mbc9:skaocefhlao8SbbgicFeGhddndnaicu9mmbalhoxekaocvfhoadcFbGhdcrhidninal8SbbgDcFbGaitadVhdaDcu9kmealcefhlaicrfgic8J9hmbxdkkalcefhokabawcdtfadc8Etc8F91adcd47avcwfadceGcdtVglydbfgiBdbalaiBdbawcefgwae9hmbxdkkcbhwindnaoar6mbc9:skaocefhlao8SbbgicFeGhddndnaicu9mmbalhoxekaocvfhoadcFbGhdcrhidninal8SbbgDcFbGaitadVhdaDcu9kmealcefhlaicrfgic8J9hmbxdkkalcefhokabawcetfadc8Etc8F91adcd47avcwfadceGcdtVglydbfgi87ebalaiBdbawcefgwae9hmbkkcbc99aoarSEk;Toio97eue97aec98Ghedndnadcl9hmbaeTmecbhdinababpbbbgicKp:RecKp:Sep;6eglaicwp:RecKp:Sep;6ealp;Geaiczp:RecKp:Sep;6egvp;Gep;Kep;Legopxbbbbbbbbbbbbbbbbp:2egralpxbbbjbbbjbbbjbbbjgwp9op9rp;Keglpxbb;:9cbb;:9cbb;:9cbb;:9calalp;Meaoaop;Meavaravawp9op9rp;Keglalp;Mep;Kep;Kep;Jep;Negvp;Mepxbbn0bbn0bbn0bbn0grp;KepxFbbbFbbbFbbbFbbbp9oaipxbbbFbbbFbbbFbbbFp9op9qalavp;Mearp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaoavp;Mearp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpkbbabczfhbadclfgdae6mbxdkkaeTmbcbhdinabczfgDaDpbbbgipxbbbbbbFFbbbbbbFFgwp9oabpbbbgoaipmbediwDqkzHOAKY8AEgvczp:Reczp:Sep;6eglaoaipmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eavczp:Sep;6egvp;Gealp;Gep;Kep;Legipxbbbbbbbbbbbbbbbbp:2egralpxbbbjbbbjbbbjbbbjgqp9op9rp;Keglpxb;:FSb;:FSb;:FSb;:FSalalp;Meaiaip;Meavaravaqp9op9rp;Keglalp;Mep;Kep;Kep;Jep;Negvp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbp9oaiavp;Mearp;Keczp:Rep9qgialavp;Mearp;KepxFFbbFFbbFFbbFFbbp9oglpmwDKYqk8AExm35Ps8E8Fp9qpkbbabaoawp9oaialpmbezHdiOAlvCXorQLp9qpkbbabcafhbadclfgdae6mbkkk;2ileue97euo97dnaec98GgiTmbcbheinabcKfpx:ji:1S:ji:1S:ji:1S:ji:1SabpbbbglabczfgvpbbbgopmlvorxmPsCXQL358E8Fgrczp:Segwpxibbbibbbibbbibbbp9qp;6egDp;NegqaDaDp;MegDaDp;KealaopmbediwDqkzHOAKY8AEgDczp:Reczp:Sep;6eglalp;MeaDczp:Sep;6egoaop;Mearczp:Reczp:Sep;6egrarp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jep;Mepxbbn0bbn0bbn0bbn0gDp;KepxFFbbFFbbFFbbFFbbgkp9oaqaop;MeaDp;Keczp:Rep9qgoaqalp;MeaDp;Keakp9oaqarp;MeaDp;Keczp:Rep9qgDpmwDKYqk8AExm35Ps8E8Fglp5eawclp:RegqpEi:T:j83ibavalp5baqpEd:T:j83ibabcwfaoaDpmbezHdiOAlvCXorQLgDp5eaqpEe:T:j83ibabaDp5baqpEb:T:j83ibabcafhbaeclfgeai6mbkkkuee97dnadcd4ae2c98GgeTmbcbhdinababpbbbgicwp:Recwp:Sep;6eaicep:SepxbbjFbbjFbbjFbbjFp9opxbbjZbbjZbbjZbbjZp:Uep;Mepkbbabczfhbadclfgdae6mbkkk:Sodw97euaec98Ghedndnadcl9hmbaeTmecbhdinabpxbbuJbbuJbbuJbbuJabpbbbgicKp:TeglaicYp:Tep9qgvcdp:Teavp9qgvclp:Teavp9qgop;6ep;Negvaicwp:RecKp:SegraipxFbbbFbbbFbbbFbbbgwp9ogDp:Uep;6ep;Mepxbbn0bbn0bbn0bbn0gqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9oavaDarp:Xeaiczp:RecKp:Segip:Uep;6ep;Meaqp;Keawp9op9qavaDaraip:Uep:Xep;6ep;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qavaoalcep:Rep9oalpxebbbebbbebbbebbbp9op9qp;6ep;Meaqp;KecKp:Rep9qpkbbabczfhbadclfgdae6mbxdkkaeTmbcbhdinabczfgkpxbFu9hbFu9hbFu9hbFu9habpbbbglakpbbbgrpmlvorxmPsCXQL358E8Fgvczp:TegqavcHp:Tep9qgicdp:Teaip9qgiclp:Teaip9qgicwp:Teaip9qgop;6ep;NegialarpmbediwDqkzHOAKY8AEgDpxFFbbFFbbFFbbFFbbglp9ograDczp:Segwp:Ueavczp:Reczp:SegDp:Xep;6ep;Mepxbbn0bbn0bbn0bbn0gvp;Kealp9oaiarawaDp:Uep:Xep;6ep;Meavp;Keczp:Rep9qgwaiaoaqcep:Rep9oaqpxebbbebbbebbbebbbp9op9qp;6ep;Meavp;Keczp:ReaiaDarp:Uep;6ep;Meavp;Kealp9op9qgipmwDKYqk8AExm35Ps8E8FpkbbabawaipmbezHdiOAlvCXorQLpkbbabcafhbadclfgdae6mbkkk9teiucbcbydj:G:cjbgeabcifc98GfgbBdj:G:cjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaikkxebcj:Gdklz:zbb",r=new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,3,2,0,0,5,3,1,0,1,12,1,0,10,22,2,12,0,65,0,65,0,65,0,252,10,0,0,11,7,0,65,0,253,15,26,11]),n=new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);if(typeof WebAssembly!="object")return{supported:!1};var o=WebAssembly.validate(r)?a(t):a(e),A,i=WebAssembly.instantiate(o,{}).then(function(I){A=I.instance,A.exports.__wasm_call_ctors()});function a(I){for(var b=new Uint8Array(I.length),D=0;D<I.length;++D){var m=I.charCodeAt(D);b[D]=m>96?m-97:m>64?m-39:m+4}for(var Q=0,D=0;D<I.length;++D)b[Q++]=b[D]<60?n[b[D]]:(b[D]-60)*64+b[++D];return b.buffer.slice(0,Q)}function s(I,b,D,m,Q,w,S){var N=I.exports.sbrk,M=m+3&-4,G=N(M*Q),j=N(w.length),R=new Uint8Array(I.exports.memory.buffer);R.set(w,j);var K=b(G,m,Q,j,w.length);if(K==0&&S&&S(G,M,Q),D.set(R.subarray(G,G+m*Q)),N(G-N(0)),K!=0)throw new Error("Malformed buffer data: "+K)}var c={NONE:"",OCTAHEDRAL:"meshopt_decodeFilterOct",QUATERNION:"meshopt_decodeFilterQuat",EXPONENTIAL:"meshopt_decodeFilterExp",COLOR:"meshopt_decodeFilterColor"},l={ATTRIBUTES:"meshopt_decodeVertexBuffer",TRIANGLES:"meshopt_decodeIndexBuffer",INDICES:"meshopt_decodeIndexSequence"},u=[],g=0;function p(I){var b={object:new Worker(I),pending:0,requests:{}};return b.object.onmessage=function(D){var m=D.data;b.pending-=m.count,b.requests[m.id][m.action](m.value),delete b.requests[m.id]},b}function d(I){for(var b="self.ready = WebAssembly.instantiate(new Uint8Array(["+new Uint8Array(o)+"]), {}).then(function(result) { result.instance.exports.__wasm_call_ctors(); return result.instance; });self.onmessage = "+h.name+";"+s.toString()+h.toString(),D=new Blob([b],{type:"text/javascript"}),m=URL.createObjectURL(D),Q=u.length;Q<I;++Q)u[Q]=p(m);for(var Q=I;Q<u.length;++Q)u[Q].object.postMessage({});u.length=I,URL.revokeObjectURL(m)}function f(I,b,D,m,Q){for(var w=u[0],S=1;S<u.length;++S)u[S].pending<w.pending&&(w=u[S]);return new Promise(function(N,M){var G=new Uint8Array(D),j=++g;w.pending+=I,w.requests[j]={resolve:N,reject:M},w.object.postMessage({id:j,count:I,size:b,source:G,mode:m,filter:Q},[G.buffer])})}function h(I){var b=I.data;self.ready.then(function(D){if(!b.id)return self.close();try{var m=new Uint8Array(b.count*b.size);s(D,D.exports[b.mode],m,b.count,b.size,b.source,D.exports[b.filter]),self.postMessage({id:b.id,count:b.count,action:"resolve",value:m},[m.buffer])}catch(Q){self.postMessage({id:b.id,count:b.count,action:"reject",value:Q})}})}return{ready:i,supported:!0,useWorkers:function(I){d(I)},decodeVertexBuffer:function(I,b,D,m,Q){s(A,A.exports.meshopt_decodeVertexBuffer,I,b,D,m,A.exports[c[Q]])},decodeIndexBuffer:function(I,b,D,m){s(A,A.exports.meshopt_decodeIndexBuffer,I,b,D,m)},decodeIndexSequence:function(I,b,D,m){s(A,A.exports.meshopt_decodeIndexSequence,I,b,D,m)},decodeGltfBuffer:function(I,b,D,m,Q,w){s(A,A.exports[l[Q]],I,b,D,m,A.exports[c[w]])},decodeGltfBufferAsync:function(I,b,D,m,Q){return u.length>0?f(I,b,D,l[m],c[Q]):i.then(function(){var w=new Uint8Array(I*b);return s(A,A.exports[l[m]],w,I,b,D,A.exports[c[Q]]),w})}}})();var nA={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16},ca={5120:1,5121:1,5122:2,5123:2,5125:4,5126:4};function la(e,t=!1){switch(e){case 5120:return t?(r,n)=>Math.max(r.getInt8(n)/127,-1):(r,n)=>r.getInt8(n);case 5121:return t?(r,n)=>r.getUint8(n)/255:(r,n)=>r.getUint8(n);case 5122:return t?(r,n)=>Math.max(r.getInt16(n,!0)/32767,-1):(r,n)=>r.getInt16(n,!0);case 5123:return t?(r,n)=>r.getUint16(n,!0)/65535:(r,n)=>r.getUint16(n,!0);case 5125:return(r,n)=>r.getUint32(n,!0);default:return(r,n)=>r.getFloat32(n,!0)}}var ks=new Set(["KHR_materials_unlit","KHR_materials_emissive_strength","KHR_texture_transform","KHR_texture_basisu","EXT_texture_webp"]);function Ns(e,t){if(t===0)return{indices:e,topology:"point-list"};if(t===1){if(e.length%2!==0)throw new Error("glTF LINES index count must be even");return{indices:e,topology:"line-list"}}if(t===4)return{indices:e,topology:"triangle-list"};if(![2,3,5,6].includes(t))throw new Error(`Invalid glTF primitive mode ${t}`);let r=[];if(t===2||t===3){for(let n=1;n<e.length;n++)r.push(e[n-1],e[n]);t===2&&e.length>1&&r.push(e[e.length-1],e[0])}else for(let n=2;n<e.length;n++)t===6?r.push(e[0],e[n-1],e[n]):n%2===0?r.push(e[n-2],e[n-1],e[n]):r.push(e[n-1],e[n-2],e[n]);return{indices:e instanceof Uint32Array?Uint32Array.from(r):Uint16Array.from(r),topology:t<=3?"line-list":"triangle-list"}}var ua=1179937895,Ts=1313821514,Ls=5130562,hr=class e{static isGlb(t){let r=t instanceof Uint8Array?t:new Uint8Array(t);return r.length<12?!1:new DataView(r.buffer,r.byteOffset,r.byteLength).getUint32(0,!0)===ua}static parse(t,r={},n){let{doc:o,binaryBuffers:A}=e.readDocument(t,n);e.checkExtensions(o);for(let i of o.meshes??[])for(let a of i.primitives){let s=a.extensions?.KHR_draco_mesh_compression;if(s){if(a.indices!==void 0){let c=o.accessors?.[a.indices];if(!c||c.bufferView===void 0&&!c.sparse)throw new Error("Draco indices without an uncompressed fallback require GltfLoader.parseAsync")}for(let c of Object.keys(s.attributes)){let l=a.attributes[c],u=l===void 0?void 0:o.accessors?.[l];if(!u||u.bufferView===void 0&&!u.sparse)throw new Error("Draco geometry without an uncompressed fallback requires GltfLoader.parseAsync")}}}return e.buildModel(o,A,r,n)}static async parseAsync(t,r={},n){let{doc:o,binaryBuffers:A}=e.readDocument(t,n);return e.checkExtensions(o,new Set(["EXT_meshopt_compression","KHR_meshopt_compression","KHR_draco_mesh_compression"])),await e.decodeMeshopt(o,A),await e.decodeDraco(o,A),e.buildModel(o,A,r,n)}static checkExtensions(t,r=new Set){for(let n of t.extensionsRequired??[])if(!ks.has(n)&&!r.has(n))throw new Error(`glTF file requires ${n}, which framefields cannot decode or render`)}static async decodeMeshopt(t,r){let n=(t.bufferViews??[]).filter(o=>o.extensions?.EXT_meshopt_compression||o.extensions?.KHR_meshopt_compression);if(n.length){await rA.ready;for(let o of n){if(o.extensions?.EXT_meshopt_compression&&o.extensions?.KHR_meshopt_compression)throw new Error("A buffer view cannot use both EXT and KHR meshopt compression");let A=o.extensions?.KHR_meshopt_compression??o.extensions?.EXT_meshopt_compression;if(!A)continue;let i=r[A.buffer];if(!i)throw new Error(`meshopt buffer ${A.buffer} not loaded`);let a=A.byteOffset??0;if(a<0||A.byteLength<0||a+A.byteLength>i.byteLength)throw new Error("Invalid meshopt compressed buffer range");let s=A.count*A.byteStride;if(!Number.isSafeInteger(A.count)||A.count<0||!Number.isSafeInteger(A.byteStride)||A.byteStride<1||!Number.isSafeInteger(s)||s!==o.byteLength)throw new Error("Invalid meshopt decoded buffer length");if(!["ATTRIBUTES","TRIANGLES","INDICES"].includes(A.mode)||!["NONE","OCTAHEDRAL","QUATERNION","EXPONENTIAL","COLOR"].includes(A.filter??"NONE"))throw new Error("Invalid meshopt compression mode or filter");let c=new Uint8Array(s);rA.decodeGltfBuffer(c,A.count,A.byteStride,i.subarray(a,a+A.byteLength),A.mode,A.filter??"NONE"),o.buffer=r.length,o.byteOffset=0,r.push(c)}}}static async decodeDraco(t,r){let n=(t.meshes??[]).flatMap(i=>i.primitives).filter(i=>i.extensions?.KHR_draco_mesh_compression);if(!n.length)return;let o=await ga.default.createDecoderModule({}),A=new o.Decoder;try{for(let i of n){let a=i.extensions?.KHR_draco_mesh_compression;if(!a)continue;let s=t.bufferViews?.[a.bufferView];if(!s)throw new Error(`Draco bufferView ${a.bufferView} not found`);let c=r[s.buffer];if(!c)throw new Error(`Draco buffer ${s.buffer} not loaded`);let l=s.byteOffset??0;if(l<0||l+s.byteLength>c.byteLength)throw new Error("Invalid Draco buffer range");let u=c.subarray(l,l+s.byteLength),g=new o.DecoderBuffer,p=new o.Mesh;try{if(g.Init(new Int8Array(u.buffer,u.byteOffset,u.byteLength),u.byteLength),A.GetEncodedGeometryType(g)!==o.TRIANGULAR_MESH)throw new Error("Draco primitive is not a triangular mesh");let d=A.DecodeBufferToMesh(g,p),f=d.ok(),h=f?"":d.error_msg();if(o.destroy(d),!f)throw new Error(`Draco decode failed: ${h}`);let I={};for(let[m,Q]of Object.entries(a.attributes)){let w=i.attributes[m],S=w===void 0?void 0:t.accessors?.[w];if(w===void 0||!S)throw new Error(`Draco ${m} accessor not found`);let N=A.GetAttributeByUniqueId(p,Q);if(!N)throw new Error(`Draco ${m} attribute ${Q} not found`);let M=new o.DracoFloat32Array;try{if(!A.GetAttributeFloatForAllPoints(p,N,M))throw new Error(`Failed to decode Draco ${m}`);let G=p.num_points()*(nA[S.type]??1);if(S.count!==p.num_points()||M.size()!==G)throw new Error(`Invalid Draco ${m} attribute size`);let j=new Float32Array(G);for(let R=0;R<G;R++){let K=M.GetValue(R);S.normalized&&(S.componentType===5120?K=Math.max(K/127,-1):S.componentType===5121?K/=255:S.componentType===5122?K=Math.max(K/32767,-1):S.componentType===5123&&(K/=65535)),j[R]=K}I[w]=j}finally{o.destroy(M)}}let b=p.num_points()>65535?new Uint32Array(p.num_faces()*3):new Uint16Array(p.num_faces()*3),D=new o.DracoInt32Array;try{for(let m=0;m<p.num_faces();m++){if(!A.GetFaceFromMesh(p,m,D))throw new Error(`Failed to decode Draco face ${m}`);for(let Q=0;Q<3;Q++)b[m*3+Q]=D.GetValue(Q)}}finally{o.destroy(D)}i.decodedDraco={attributes:I,indices:b}}finally{o.destroy(p),o.destroy(g)}}}finally{o.destroy(A)}}static readDocument(t,r){let n,o=[];if(typeof t=="string")try{n=JSON.parse(t)}catch(A){throw new Error(`Failed to parse glTF JSON: ${String(A)}`)}else{let A=t instanceof Uint8Array?t:new Uint8Array(t);if(e.isGlb(A)){let i=e.unpackGlb(A);n=i.doc,i.binBuffer&&o.push(i.binBuffer)}else{let i=new TextDecoder("utf-8").decode(A);n=JSON.parse(i)}}if(n.buffers)for(let A=0;A<n.buffers.length;A++){if(A===0&&o.length>0)continue;let i=n.buffers[A];if(i.uri){if(i.uri.startsWith("data:")){let a=i.uri.indexOf("base64,");if(a!==-1){let s=i.uri.substring(a+7),c=Buffer.from(s,"base64");o[A]=new Uint8Array(c.buffer,c.byteOffset,c.byteLength)}}else if(r){let a=Ze.isAbsolute(i.uri)?i.uri:Ze.join(r,i.uri);if(Re.existsSync(a)){let s=Re.readFileSync(a);o[A]=new Uint8Array(s.buffer,s.byteOffset,s.byteLength)}}}}return{doc:n,binaryBuffers:o}}static unpackGlb(t){let r=new DataView(t.buffer,t.byteOffset,t.byteLength),n=r.getUint32(0,!0),o=r.getUint32(8,!0);if(n!==ua)throw new Error("Invalid GLB header: magic mismatch");let A=12,i=null,a;for(;A<o&&A<t.byteLength;){let s=r.getUint32(A,!0),c=r.getUint32(A+4,!0);A+=8;let l=t.subarray(A,A+s);if(A+=s,c===Ts){let u=new TextDecoder("utf-8").decode(l);i=JSON.parse(u)}else c===Ls&&(a=l)}if(!i)throw new Error("Invalid GLB: JSON chunk not found");return{doc:i,binBuffer:a}}static readFloats(t,r,n){let o=t.accessors?.[n];if(!o)throw new Error(`Accessor ${n} not found`);let A=nA[o.type]??1,i=new Float32Array(o.count*A),a=ca[o.componentType]??4,s=la(o.componentType,o.normalized);if(o.bufferView!==void 0){let c=t.bufferViews?.[o.bufferView];if(!c)throw new Error(`BufferView ${o.bufferView} not found`);let l=r[c.buffer];if(!l)throw new Error(`Binary buffer ${c.buffer} not loaded`);let u=c.byteStride??a*A,g=new DataView(l.buffer,l.byteOffset,l.byteLength),p=(c.byteOffset??0)+(o.byteOffset??0);for(let d=0;d<o.count;d++)for(let f=0;f<A;f++)i[d*A+f]=s(g,p+d*u+f*a)}if(o.sparse){let c=o.sparse,l=t.bufferViews?.[c.indices.bufferView],u=t.bufferViews?.[c.values.bufferView];if(!l||!u)throw new Error(`Sparse accessor ${n} references a missing buffer view`);let g=r[l.buffer],p=r[u.buffer];if(!g||!p)throw new Error(`Sparse accessor ${n} references a missing buffer`);let d=la(c.indices.componentType),f=ca[c.indices.componentType],h=new DataView(g.buffer,g.byteOffset,g.byteLength),I=new DataView(p.buffer,p.byteOffset,p.byteLength),b=(l.byteOffset??0)+(c.indices.byteOffset??0),D=(u.byteOffset??0)+(c.values.byteOffset??0);for(let m=0;m<c.count;m++){let Q=d(h,b+m*f);if(Q>=o.count)throw new Error(`Sparse accessor ${n} index ${Q} is out of range`);for(let w=0;w<A;w++)i[Q*A+w]=s(I,D+(m*A+w)*a)}}return{data:i,itemSize:A,count:o.count}}static readIndices(t,r,n){let{data:o}=e.readFloats(t,r,n);return o.reduce((i,a)=>a>i?a:i,0)>65535?Uint32Array.from(o):Uint16Array.from(o)}static imageBytes(t,r,n,o){let A=t.images?.[n];if(!A)return;if(A.bufferView!==void 0){let a=t.bufferViews?.[A.bufferView],s=a?r[a.buffer]:void 0;if(!a||!s)return;let c=a.byteOffset??0;return{bytes:s.subarray(c,c+a.byteLength),mime:A.mimeType??"image/png"}}if(!A.uri)return;if(A.uri.startsWith("data:")){let a=A.uri.indexOf(","),s=A.uri.slice(5,A.uri.indexOf(";"));return{bytes:new Uint8Array(Buffer.from(A.uri.slice(a+1),"base64")),mime:s}}if(!o)return;let i=Ze.isAbsolute(A.uri)?A.uri:Ze.join(o,decodeURIComponent(A.uri));if(!Re.existsSync(i)){e.warn(`Image "${A.uri}" was not found next to the model; textures using it are skipped.`);return}return{bytes:new Uint8Array(Re.readFileSync(i)),mime:A.mimeType??Kn(i)}}static warn(t){console.warn(`[GltfLoader] ${t}`)}static texCoordOf(t){return t.extensions?.KHR_texture_transform?.texCoord??t.texCoord??0}static textureImage(t,r,n,o,A){let i=t.textures?.[n];if(!i)return;let a=i.extensions?.KHR_texture_basisu?.source??i.extensions?.EXT_texture_webp?.source??i.source;if(a===void 0)return;let s=e.imageBytes(t,r,a,o);if(!s)return;if(!Hs.has(s.mime)){e.warn(`${A} is ${s.mime}, which framefields cannot decode; it is skipped (use PNG, JPEG or WebP).`);return}let c=i.sampler!==void 0?t.samplers?.[i.sampler]:void 0;return{...s,sampler:c}}static buildMaterial(t,r,n,o,A){let i=n.pbrMetallicRoughness,a=i?.baseColorFactor??[1,1,1,1],s={name:o,diffuseColor:a,roughness:i?.roughnessFactor??.5,metallic:i?.metallicFactor??0,shininess:32*(1-(i?.roughnessFactor??.5)),twoSided:n.doubleSided??!0,alphaMode:n.alphaMode==="MASK"?"mask":n.alphaMode==="BLEND"?"blend":"opaque",alphaCutoff:n.alphaMode==="MASK"?n.alphaCutoff??.5:0},c=n.emissiveFactor;c&&(c[0]>0||c[1]>0||c[2]>0)&&(s.emissive=[c[0],c[1],c[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=(b,D)=>{if(b)return e.textureImage(t,r,b.index,A,`The ${D} map of material "${o}"`)},g=u(i?.baseColorTexture,"base color");if(g){s.diffuseTextureBuffer=g.bytes,s.diffuseTextureMime=g.mime;let b=g.sampler?.wrapS;s.textureWrap=b===33071?"clamp":b===33648?"mirror":"repeat",g.sampler?.magFilter===9728&&(s.textureFilter="nearest")}let p=(b,D)=>u(b,D)?.bytes,d=p(n.normalTexture,"normal");d&&(s.normalTextureBuffer=d,s.normalScale=n.normalTexture?.scale??1);let f=p(i?.metallicRoughnessTexture,"metallic-roughness");f&&(s.metallicRoughnessTextureBuffer=f,s.roughness=i?.roughnessFactor??1,s.metallic=i?.metallicFactor??1);let h=p(n.occlusionTexture,"occlusion");h&&(s.occlusionTextureBuffer=h,s.occlusionStrength=n.occlusionTexture?.strength??1);let I=s.emissive&&p(n.emissiveTexture,"emissive");return I&&(s.emissiveTextureBuffer=I),s}static buildNodes(t){let r=(t.nodes??[]).map((n,o)=>({name:n.name??`node_${o}`,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(t.nodes??[]).forEach((n,o)=>{for(let A of n.children??[]){let i=r[A];i&&(i.parent=o)}}),r}static buildAnimations(t,r,n){return(t.animations??[]).map((o,A)=>{let i=[],a=0;for(let s of o.channels){let c=o.samplers[s.sampler],l=s.target.node;if(!c||l===void 0)continue;let u=e.readFloats(t,r,c.input).data,g=e.readFloats(t,r,c.output).data;a=Math.max(a,u[u.length-1]??0);let p={nodeName:n[l]?.name??`node_${l}`,node:l,times:u,interpolation:c.interpolation==="STEP"?"step":c.interpolation==="CUBICSPLINE"?"cubic":"linear"};s.target.path==="translation"?p.translations=g:s.target.path==="rotation"?p.rotations=g:s.target.path==="scale"?p.scales=g:p.weights=g,i.push(p)}return{name:o.name??`Animation_${A}`,duration:a>0?a:1,fps:30,tracks:i}})}static buildModel(t,r,n,o){let A=(t.materials??[]).map((R,K,z)=>{let J=R.name??`material_${K}`;return z.findIndex((W,X)=>(W.name??`material_${X}`)===J)===K?J:`${J}#${K}`}),i={};(t.materials??[]).forEach((R,K)=>{let z=A[K];i[z]=e.buildMaterial(t,r,R,z,o)});let a=e.buildNodes(t),s=(t.skins??[]).map(R=>({joints:R.joints,inverseBindMatrices:R.inverseBindMatrices!==void 0?e.readFloats(t,r,R.inverseBindMatrices).data:Float32Array.from(R.joints.flatMap(()=>Ee.identity()))})),c=e.buildAnimations(t,r,a),l=(t.nodes??[]).flatMap((R,K)=>R.mesh!==void 0?[{mesh:R.mesh,node:K,skin:R.skin}]:[]),u=l.length>0?l:(t.meshes??[]).map((R,K)=>({mesh:K})),g={name:"glTF_Model",meshes:[],materials:i,nodes:a,skins:s,animations:c,bounds:{min:[0,0,0],max:[0,0,0],center:[0,0,0],size:[0,0,0],boundingSphereRadius:0}},p=ho(g,void 0,0),d=1/0,f=1/0,h=1/0,I=-1/0,b=-1/0,D=-1/0,m=(R,K,z)=>{R<d&&(d=R),R>I&&(I=R),K<f&&(f=K),K>b&&(b=K),z<h&&(h=z),z>D&&(D=z)};for(let R of u){let K=t.meshes?.[R.mesh];K&&K.primitives.forEach((z,J)=>{if(z.attributes.POSITION===void 0)throw new Error(`glTF mesh ${R.mesh} primitive ${J} has no POSITION attribute`);let W=le=>{if(le===void 0)return;let ge=z.decodedDraco?.attributes[le];if(!ge)return e.readFloats(t,r,le);let be=t.accessors?.[le];if(!be)throw new Error(`Accessor ${le} not found`);return{data:ge,itemSize:nA[be.type]??1,count:be.count}},X=W(z.attributes.POSITION),Ae=X.count,re=z.material===void 0?void 0:t.materials?.[z.material],oe=z.attributes,ne=le=>{if(!le)return;let ge=e.texCoordOf(le),be=oe[`TEXCOORD_${ge}`];if(be===void 0)throw new Error(`glTF mesh ${R.mesh} primitive ${J} lacks TEXCOORD_${ge} required by a texture`);let we=W(be);if(!we)throw new Error(`glTF mesh ${R.mesh} has missing texture coordinates`);if(we.itemSize!==2||we.count!==Ae)throw new Error(`Invalid TEXCOORD_${ge} on glTF mesh ${R.mesh} primitive ${J}`);let Me=le.extensions?.KHR_texture_transform;return Me&&js(we.data,Me),we.data},ie=ne(re?.pbrMetallicRoughness?.baseColorTexture)??W(z.attributes.TEXCOORD_0)?.data??new Float32Array(Ae*2),he={normal:ne(re?.normalTexture),metallicRoughness:ne(re?.pbrMetallicRoughness?.metallicRoughnessTexture),occlusion:ne(re?.occlusionTexture),emissive:ne(re?.emissiveTexture)},F=W(z.attributes.COLOR_0),Be;if(F){Be=new Float32Array(Ae*4).fill(1);for(let le=0;le<Ae;le++)for(let ge=0;ge<F.itemSize;ge++){let be=F.data[le*F.itemSize+ge]??1;Be[le*4+ge]=ge<3?Os(be):be}}let Se;if(z.decodedDraco)Se=z.decodedDraco.indices;else if(z.indices!==void 0)Se=e.readIndices(t,r,z.indices);else{Se=Ae>65535?new Uint32Array(Ae):new Uint16Array(Ae);for(let le=0;le<Ae;le++)Se[le]=le}let Pe=Ns(Se,z.mode??4);Se=Pe.indices;let Ie=R.skin!==void 0&&z.attributes.JOINTS_0!==void 0,y=!Ie&&R.node!==void 0?p[R.node]:void 0;for(let le=0;le<Ae;le++){let ge=X.data[le*3],be=X.data[le*3+1],we=X.data[le*3+2];if(y){let Me=Ee.projectPoint(y,[ge,be,we]);m(Me[0],Me[1],Me[2])}else m(ge,be,we)}let ye=z.targets?.map(le=>{let ge=W(le.POSITION),be=W(le.NORMAL);if(ge&&(ge.count!==Ae||ge.itemSize!==3)||be&&(be.count!==Ae||be.itemSize!==3))throw new Error(`Invalid morph target on glTF mesh ${R.mesh} primitive ${J}`);return{positions:ge?.data,normals:be?.data}}),Qe=(R.node===void 0?void 0:t.nodes?.[R.node]?.weights)??K.weights,xe=ye?.map((le,ge)=>Qe?.[ge]??0);g.meshes.push({id:`gltf_mesh_${R.mesh}_${J}${R.node!==void 0?`_n${R.node}`:""}`,name:K.name??`Mesh_${R.mesh}`,positions:X.data,normals:W(z.attributes.NORMAL)?.data??new Float32Array(Ae*3),uvs:ie,mapUvs:he,morphTargets:ye,morphWeights:xe,colors:Be,jointIndices:Ie?W(z.attributes.JOINTS_0)?.data:void 0,jointWeights:Ie?W(z.attributes.WEIGHTS_0)?.data:void 0,indices:Se,topology:Pe.topology,materialName:z.material!==void 0?A[z.material]:void 0,node:R.node,skin:Ie?R.skin:void 0})})}Number.isFinite(d)||(d=f=h=0,I=b=D=0);let Q=Math.max(I-d,b-f,D-h,1e-4),w=n.normalizeSize&&n.normalizeSize>0?n.normalizeSize/Q:1,S=typeof n.scale=="number"?[n.scale,n.scale,n.scale]:n.scale??[1,1,1],N=[w*S[0],w*S[1],w*S[2]],M=n.center?[(d+I)*.5,(f+b)*.5,(h+D)*.5]:[0,0,0];g.rootTransform=Ee.multiply(Ee.scale(N[0],N[1],N[2]),Ee.translate(-M[0],-M[1],-M[2]));let G=[(d-M[0])*N[0],(f-M[1])*N[1],(h-M[2])*N[2]],j=[(I-M[0])*N[0],(b-M[1])*N[1],(D-M[2])*N[2]];return g.bounds={min:G,max:j,center:[(G[0]+j[0])*.5,(G[1]+j[1])*.5,(G[2]+j[2])*.5],size:[j[0]-G[0],j[1]-G[1],j[2]-G[2]],boundingSphereRadius:Math.hypot(j[0]-G[0],j[1]-G[1],j[2]-G[2])*.5},g}static async loadAsync(t,r={}){if(typeof t!="string")return e.parseAsync(t,r);let n=t.startsWith("file://")?t.replace("file://",""):t;return!t.trimStart().startsWith("{")&&Re.existsSync(n)?e.parseAsync(Re.readFileSync(n),r,Ze.dirname(n)):e.parseAsync(t,r)}static load(t,r={}){if(typeof t!="string")return e.parse(t,r);let n=t.startsWith("file://")?t.replace("file://",""):t;if(t.startsWith("/")||t.startsWith("./")||t.startsWith("../")||t.startsWith("file://")||!t.trimStart().startsWith("{")&&Re.existsSync(n)){let o=Re.readFileSync(n),A=Ze.dirname(n);return e.parse(o,r,A)}return e.parse(t,r)}};function Eo(e,t={}){return hr.load(e,t)}async function oA(e,t={}){return hr.loadAsync(e,t)}function pa(e,t={}){return hr.load(e,t)}function Os(e){let t=Math.min(Math.max(e,0),1);return t<=.0031308?t*12.92:1.055*t**(1/2.4)-.055}var Hs=new Set(["image/png","image/jpeg","image/webp","image/gif","image/tiff","image/avif","image/ktx2"]);function js(e,{offset:t=[0,0],rotation:r=0,scale:n=[1,1]}){let o=Math.cos(r),A=Math.sin(r);for(let i=0;i<e.length;i+=2){let a=e[i]*n[0],s=e[i+1]*n[1];e[i]=o*a-A*s+t[0],e[i+1]=A*a+o*s+t[1]}}$();_t();var Vs=[[0,0,0,0],...Array.from({length:255},(e,t)=>{let r=(t+1)/256;return[r,r,r,1]})],to=class e{static isVox(t){let r=t instanceof Uint8Array?t:new Uint8Array(t);return r.length<8?!1:new TextDecoder("ascii").decode(r.subarray(0,4))==="VOX "}static parse(t,r={}){let n=t instanceof Uint8Array?t:new Uint8Array(t),o=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 i=8,a=16,s=16,c=16,l=[],u=[...Vs];for(;i+12<=n.byteLength;){let g=new TextDecoder("ascii").decode(n.subarray(i,i+4)),p=o.getUint32(i+4,!0);i+=12;let d=i;if(g==="SIZE")a=o.getUint32(d,!0),s=o.getUint32(d+4,!0),c=o.getUint32(d+8,!0);else if(g==="XYZI"){let f=o.getUint32(d,!0),h=d+4;for(let I=0;I<f&&!(h+4>n.byteLength);I++){let b=o.getUint8(h),D=o.getUint8(h+1),m=o.getUint8(h+2),Q=o.getUint8(h+3);h+=4,l.push({x:b,y:D,z:m,colorIndex:Q})}}else if(g==="RGBA")for(let f=0;f<256;f++){let h=d+f*4;if(h+4>n.byteLength)break;let I=o.getUint8(h)/255,b=o.getUint8(h+1)/255,D=o.getUint8(h+2)/255,m=o.getUint8(h+3)/255,Q=f===255?0:f+1;u[Q]=[I,b,D,m]}i+=p}return e.buildModel(l,u,a,s,c,r)}static buildModel(t,r,n,o,A,i){let a=new Set;t.forEach(m=>a.add(`${m.x},${m.y},${m.z}`));let s=[],c=[],l=[],u=[],g=[],p=(m,Q,w,S,N,M)=>{let G=s.length/3;s.push(...m,...Q,...w,...S),c.push(...N,...N,...N,...N),l.push(...M,...M,...M,...M),u.push(0,0,1,0,1,1,0,1),g.push(G,G+1,G+2,G,G+2,G+3)};for(let m of t){let{x:Q,y:w,z:S,colorIndex:N}=m,M=r[N]??[.8,.8,.8,1],G=Q,j=-S,R=w;a.has(`${Q+1},${w},${S}`)||p([G+1,j,R],[G+1,j-1,R],[G+1,j-1,R+1],[G+1,j,R+1],[1,0,0],M),a.has(`${Q-1},${w},${S}`)||p([G,j,R+1],[G,j-1,R+1],[G,j-1,R],[G,j,R],[-1,0,0],M),a.has(`${Q},${w},${S+1}`)||p([G,j-1,R],[G+1,j-1,R],[G+1,j-1,R+1],[G,j-1,R+1],[0,-1,0],M),a.has(`${Q},${w},${S-1}`)||p([G,j,R+1],[G+1,j,R+1],[G+1,j,R],[G,j,R],[0,1,0],M),a.has(`${Q},${w+1},${S}`)||p([G+1,j,R+1],[G+1,j-1,R+1],[G,j-1,R+1],[G,j,R+1],[0,0,1],M),a.has(`${Q},${w-1},${S}`)||p([G,j,R],[G,j-1,R],[G+1,j-1,R],[G+1,j,R],[0,0,-1],M)}let d=Ot(s),f=xt(d,i),h=Ht(s,f),I=jt(g,h.length/3),b={name:"vox_default",diffuseColor:[1,1,1,1],shininess:32,specularIntensity:.4,...i.defaultMaterial};return{name:"VOX_Model",meshes:[{id:"vox_mesh_0",name:"vox_geometry",positions:h,normals:new Float32Array(c),uvs:new Float32Array(u),colors:new Float32Array(l),indices:I,materialName:"vox_default"}],materials:{vox_default:b},animations:[],bounds:Vt(d,f)}}static load(t,r={}){if(typeof t!="string")return e.parse(t,r);if(t.startsWith("/")||t.startsWith("./")||t.startsWith("../")||t.startsWith("file://")){let n=t.startsWith("file://")?t.replace("file://",""):t,o=Re.readFileSync(n);return e.parse(o,r)}throw new Error("VOX files must be binary buffers or local file paths")}};function yo(e,t={}){return to.load(e,t)}$();_t();var AA=19789,Js=15677,Ks=16384,zs=16640,Ys=16656,Ws=16672,qs=16704,Xs=45055,Zs=40960,$s=40992,ec=16,tc=17,ro=class e{static is3DS(t){let r=t instanceof Uint8Array?t:new Uint8Array(t);return r.length<6?!1:new DataView(r.buffer,r.byteOffset,r.byteLength).getUint16(0,!0)===AA}static parse(t,r={}){let n=t instanceof Uint8Array?t:new Uint8Array(t),o=new DataView(n.buffer,n.byteOffset,n.byteLength);if(o.getUint16(0,!0)!==AA)throw new Error("Invalid 3DS file: 0x4D4D magic mismatch");let i=[],a={};return e.readChunk(o,0,n.byteLength,i,a),e.buildModel(i,a,r)}static readChunk(t,r,n,o,A,i="Object"){let a=r;for(;a+6<=n&&a+6<=t.byteLength;){let s=t.getUint16(a,!0),c=t.getUint32(a+2,!0);if(c<6)break;let l=a+c,u=a+6,g=Math.min(l,n,t.byteLength);switch(s){case AA:case Js:e.readChunk(t,u,g,o,A,i);break;case Ks:{let p=u;for(;p<g&&t.getUint8(p)!==0;)p++;let d=new Uint8Array(t.buffer,t.byteOffset+u,p-u),f=new TextDecoder("ascii").decode(d)||"Object";e.readChunk(t,p+1,g,o,A,f);break}case zs:{let p={name:i,positions:[],indices:[],uvs:[]};e.readTriMesh(t,u,g,p,A),p.positions.length>0&&p.indices.length>0&&o.push(p);break}case Xs:e.readMaterial(t,u,g,A);break;default:break}a=l}}static readTriMesh(t,r,n,o,A){let i=r;for(;i+6<=n;){let a=t.getUint16(i,!0),s=t.getUint32(i+2,!0);if(s<6)break;let c=i+s,l=i+6;if(a===Ys){let u=t.getUint16(l,!0),g=l+2;for(let p=0;p<u&&!(g+12>n);p++){let d=t.getFloat32(g,!0),f=t.getFloat32(g+4,!0),h=t.getFloat32(g+8,!0);o.positions.push(d,f,h),g+=12}}else if(a===Ws){let u=t.getUint16(l,!0),g=l+2;for(let p=0;p<u&&!(g+8>n);p++){let d=t.getUint16(g,!0),f=t.getUint16(g+2,!0),h=t.getUint16(g+4,!0);o.indices.push(d,f,h),g+=8}}else if(a===qs){let u=t.getUint16(l,!0),g=l+2;for(let p=0;p<u&&!(g+8>n);p++){let d=t.getFloat32(g,!0),f=t.getFloat32(g+4,!0);o.uvs.push(d,1-f),g+=8}}i=c}}static readMaterial(t,r,n,o){let A=r,i="Material",a=[.8,.8,.8,1];for(;A+6<=n;){let s=t.getUint16(A,!0),c=t.getUint32(A+2,!0);if(c<6)break;let l=A+c,u=A+6;if(s===Zs){let g=u;for(;g<l&&t.getUint8(g)!==0;)g++;let p=new Uint8Array(t.buffer,t.byteOffset+u,g-u);i=new TextDecoder("ascii").decode(p)||i}else if(s===$s&&u+6<=l){let g=t.getUint16(u,!0);if(g===ec&&u+18<=l){let p=t.getFloat32(u+6,!0),d=t.getFloat32(u+10,!0),f=t.getFloat32(u+14,!0);a=[p,d,f,1]}else if(g===tc&&u+9<=l){let p=t.getUint8(u+6)/255,d=t.getUint8(u+7)/255,f=t.getUint8(u+8)/255;a=[p,d,f,1]}}A=l}o[i]={name:i,diffuseColor:a,shininess:32,specularIntensity:.5}}static buildModel(t,r,n){let o=Ot(...t.map(a=>a.positions)),A=xt(o,n);return{name:"3DS_Model",meshes:t.map((a,s)=>{let c=Ht(a.positions,A),l=new Float32Array(a.positions.length);fr(c,a.indices,l);let u=a.uvs.length===a.positions.length/3*2?new Float32Array(a.uvs):new Float32Array(a.positions.length/3*2),g=jt(a.indices,c.length/3);return{id:`3ds_mesh_${s}`,name:a.name,positions:c,normals:l,uvs:u,indices:g,materialName:a.materialName}}),materials:r,animations:[],bounds:Vt(o,A)}}static load(t,r={}){if(typeof t!="string")return e.parse(t,r);if(t.startsWith("/")||t.startsWith("./")||t.startsWith("../")||t.startsWith("file://")){let n=t.startsWith("file://")?t.replace("file://",""):t,o=Re.readFileSync(n);return e.parse(o,r)}throw new Error("3DS files must be binary buffers or local file paths")}};function Co(e,t={}){return ro.load(e,t)}$();_t();var iA=class e{static parse(t,r={}){let o=(typeof t=="string"?t:new TextDecoder("utf-8").decode(t instanceof Uint8Array?t:new Uint8Array(t))).split(/\r?\n/),A=0;for(;A<o.length&&(!o[A].trim()||o[A].trim().startsWith("#"));)A++;if(A>=o.length)throw new Error("Empty OFF file");let i=o[A++].trim(),a=!1,s=!1;if(i.startsWith("NOFF")||i.startsWith("STOFF"))a=!0;else if(i.startsWith("COFF"))s=!0;else if(!i.startsWith("OFF"))throw new Error("Invalid OFF header: missing 'OFF'");i=i.replace(/^(?:ST|CO|NO|C|N)?OFF\s*/i,"").trim();let c=0,l=0;if(i.length>0){let N=i.split(/\s+/);c=Number.parseInt(N[0]??"0",10),l=Number.parseInt(N[1]??"0",10)}else for(;A<o.length;){let N=o[A++].trim();if(!N||N.startsWith("#"))continue;let M=N.split(/\s+/);c=Number.parseInt(M[0]??"0",10),l=Number.parseInt(M[1]??"0",10);break}let u=[],g=[],p=[],d=[],f=[],h=0;for(;A<o.length&&h<c;){let N=o[A++].trim();if(!N||N.startsWith("#"))continue;let M=N.split(/\s+/),G=Number.parseFloat(M[0]??"0")||0,j=Number.parseFloat(M[1]??"0")||0,R=Number.parseFloat(M[2]??"0")||0;u.push(G,j,R);let K=3;if(a){let z=Number.parseFloat(M[K]??"0")||0,J=Number.parseFloat(M[K+1]??"0")||0,W=Number.parseFloat(M[K+2]??"0")||0;g.push(z,J,W),K+=3}else g.push(0,0,0);if(s&&M.length>K){let z=(Number.parseFloat(M[K]??"255")||0)/(Number.parseFloat(M[K]??"255")>1?255:1),J=(Number.parseFloat(M[K+1]??"255")||0)/(Number.parseFloat(M[K+1]??"255")>1?255:1),W=(Number.parseFloat(M[K+2]??"255")||0)/(Number.parseFloat(M[K+2]??"255")>1?255:1),X=M.length>K+3&&Number.parseFloat(M[K+3]??"1")||1;p.push(z,J,W,X)}d.push(0,0),h++}let I=0;for(;A<o.length&&I<l;){let N=o[A++].trim();if(!N||N.startsWith("#"))continue;let M=N.split(/\s+/),G=Number.parseInt(M[0]??"0",10);if(G>=3){let j=Number.parseInt(M[1]??"0",10);for(let R=1;R<G-1;R++){let K=Number.parseInt(M[R+1]??"0",10),z=Number.parseInt(M[R+2]??"0",10);f.push(j,K,z)}}I++}(!a||r.smoothNormals)&&fr(u,f,g);let b=Ot(u),D=xt(b,r),m=Ht(u,D),Q=jt(f,m.length/3),w={name:"off_default",diffuseColor:s?[1,1,1,1]:[.8,.8,.85,1],shininess:32,specularIntensity:.5,...r.defaultMaterial};return{name:"OFF_Model",meshes:[{id:"off_mesh_0",name:"off_geometry",positions:m,normals:new Float32Array(g),uvs:new Float32Array(d),colors:s?new Float32Array(p):void 0,indices:Q,materialName:"off_default"}],materials:{off_default:w},animations:[],bounds:Vt(b,D)}}static load(t,r={}){if(typeof t!="string")return e.parse(t,r);if(t.startsWith("/")||t.startsWith("./")||t.startsWith("../")||t.startsWith("file://")){let n=t.startsWith("file://")?t.replace("file://",""):t,o=Re.readFileSync(n,"utf-8");return e.parse(o,r)}return e.parse(t,r)}};function Qo(e,t={}){return iA.load(e,t)}$();var da=`
|
|
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
|
-
`;$();var rc=`
|
|
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
|
-
`,aA="rgba16float",xo=class{device;layout;prefilterPipe;downPipe;upPipe;compositePipes=new Map;module;pipelineLayout;sampler;chains=new Map;usedThisFrame=new Set;placeholder;uniformPool=new Ye(48,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);constructor(t){this.device=t,this.module=t.createShaderModule({label:"bloom.wgsl",code:rc}),this.layout=t.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=t.createPipelineLayout({bindGroupLayouts:[this.layout]});let r=(n,o)=>t.createRenderPipeline({label:`Bloom:${n}`,layout:this.pipelineLayout,vertex:{module:this.module,entryPoint:"vs"},fragment:{module:this.module,entryPoint:n,targets:[{format:aA,...o&&{blend:{color:{srcFactor:"one",dstFactor:"one",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one",operation:"add"}}}}]},primitive:{topology:"triangle-list"}});this.prefilterPipe=r("fs_prefilter",!1),this.downPipe=r("fs_down",!1),this.upPipe=r("fs_up",!0),this.sampler=t.createSampler({label:"BloomSampler",magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}),this.placeholder=t.createTexture({size:{width:1,height:1},format:aA,usage:GPUTextureUsage.TEXTURE_BINDING})}compositePipe(t){let r=this.compositePipes.get(t);return r||(r=this.device.createRenderPipeline({label:"Bloom:composite",layout:this.pipelineLayout,vertex:{module:this.module,entryPoint:"vs"},fragment:{module:this.module,entryPoint:"fs_composite",targets:[{format:t}]},primitive:{topology:"triangle-list"}}),this.compositePipes.set(t,r)),r}mipChain(t,r,n){let o=`${t}x${r}x${n}`;this.usedThisFrame.add(o);let A=this.chains.get(o);if(A)return A;let i=[],a=t,s=r;for(let c=0;c<n&&(a=Math.max(1,Math.floor(a/2)),s=Math.max(1,Math.floor(s/2)),i.push(this.device.createTexture({label:`BloomMip${c}`,size:{width:a,height:s},format:aA,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING})),!(a===1&&s===1));c++);return this.chains.set(o,i),i}uniforms(t,r,n){let o=new Float32Array([t,r,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,o)}pass(t,r,n,o,A,i,a){let s=this.device.createBindGroup({layout:this.layout,entries:[{binding:0,resource:{buffer:i}},{binding:1,resource:this.sampler},{binding:2,resource:o.createView()},{binding:3,resource:A.createView()}]}),c=t.beginRenderPass({colorAttachments:[{view:n,loadOp:a,storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]});c.setPipeline(r),c.setBindGroup(0,s),c.draw(3),c.end()}apply(t,r,n,o={},A){let i=!A,a=d=>d<=.04045?d/12.92:((d+.055)/1.055)**2.4,s=o.threshold??(i?.85:2.5),c={intensity:o.intensity??.2,threshold:i?a(s):s,knee:o.knee??.4,tint:o.tint??[1,1,1],mode:i?1:0},l=Math.max(1,Math.min(8,Math.round(o.radius??6))),u=this.mipChain(r.width,r.height,l),g=(d,f)=>this.uniforms(1/d,1/f,c),p=A??r;this.pass(t,this.prefilterPipe,u[0].createView(),p,this.placeholder,g(p.width,p.height),"clear");for(let d=1;d<u.length;d++){let f=u[d-1];this.pass(t,this.downPipe,u[d].createView(),f,this.placeholder,g(f.width,f.height),"clear")}for(let d=u.length-1;d>0;d--){let f=u[d];this.pass(t,this.upPipe,u[d-1].createView(),f,this.placeholder,g(f.width,f.height),"load")}this.pass(t,this.compositePipe(n.format),n.createView(),u[0],r,g(u[0].width,u[0].height),"clear")}resetPools(){this.uniformPool.reset();for(let[t,r]of this.chains)if(!this.usedThisFrame.has(t)){for(let n of r)n.destroy();this.chains.delete(t)}this.usedThisFrame.clear()}destroy(){for(let t of this.chains.values())for(let r of t)r.destroy();this.chains.clear(),this.placeholder.destroy(),this.uniformPool.destroy()}};$();$();var mr=`
|
|
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 DirectLight {
|
|
371
|
-
posType : vec4<f32>,
|
|
372
|
-
dirRadius : vec4<f32>,
|
|
373
|
-
colorIntensity : vec4<f32>,
|
|
374
|
-
spotParams : vec4<f32>,
|
|
375
|
-
shadowMatrix : mat4x4<f32>,
|
|
376
|
-
shadowParams : vec4<f32>,
|
|
377
|
-
shadowBias : vec4<f32>,
|
|
378
|
-
};
|
|
379
|
-
|
|
380
|
-
struct LightsUniforms {
|
|
381
|
-
ambientColor : vec4<f32>, // rgb = ambient color * intensity (sRGB), w = unused
|
|
382
|
-
params : vec4<f32>, // x = numLights, y = hasLights, z = physical (1), w = tone mapping (0 none, 1 ACES, 2 AgX, 3 PBR Neutral)
|
|
383
|
-
lights : array<GPULight, 8>,
|
|
384
|
-
// Appended after the original layout so older readers of the prefix still line up.
|
|
385
|
-
ambientLinear : vec4<f32>, // rgb = ambient irradiance (linear), w = exposure multiplier
|
|
386
|
-
envTop : vec4<f32>, // rgb = sky radiance (linear), w = environment rotation (rad)
|
|
387
|
-
envHorizon : vec4<f32>, // rgb = horizon radiance, w = softbox strength
|
|
388
|
-
envBottom : vec4<f32>, // rgb = ground radiance, w = environment enabled
|
|
389
|
-
fog : vec4<f32>, // rgb = fog color (display linear), w = enabled
|
|
390
|
-
fogRange : vec4<f32>, // x = start distance, y = full distance, z = max opacity, w = unused
|
|
391
|
-
shadowParams : vec4<f32>, // x = enabled, y = shadowed light index, z = softness (texels), w = map size
|
|
392
|
-
shadowBias : vec4<f32>, // x = depth bias, y = normal offset (world px), z = darkness 0..1, w = unused
|
|
393
|
-
shadowMatrix : mat4x4<f32>,
|
|
394
|
-
floorParams : vec4<f32>, // x = floorY, y = fadeDistance, z = isReflectionPass, w = unused
|
|
395
|
-
};
|
|
396
|
-
|
|
397
|
-
const PI = 3.14159265359;
|
|
398
|
-
|
|
399
|
-
fn srgbToLinear(c: vec3<f32>) -> vec3<f32> {
|
|
400
|
-
let lo = c / 12.92;
|
|
401
|
-
let hi = pow((max(c, vec3<f32>(0.0)) + 0.055) / 1.055, vec3<f32>(2.4));
|
|
402
|
-
return select(hi, lo, c <= vec3<f32>(0.04045));
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
fn linearToSrgb(c: vec3<f32>) -> vec3<f32> {
|
|
406
|
-
let x = clamp(c, vec3<f32>(0.0), vec3<f32>(1.0));
|
|
407
|
-
let lo = x * 12.92;
|
|
408
|
-
let hi = 1.055 * pow(x, vec3<f32>(1.0 / 2.4)) - 0.055;
|
|
409
|
-
return select(hi, lo, x <= vec3<f32>(0.0031308));
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
// \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
|
|
413
|
-
|
|
414
|
-
fn rrtAndOdtFit(v: vec3<f32>) -> vec3<f32> {
|
|
415
|
-
let a = v * (v + 0.0245786) - 0.000090537;
|
|
416
|
-
let b = v * (0.983729 * v + 0.4329510) + 0.238081;
|
|
417
|
-
return a / b;
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
// Stephen Hill's fitted ACES (RRT + sRGB ODT).
|
|
421
|
-
fn toneMapAces(c: vec3<f32>) -> vec3<f32> {
|
|
422
|
-
let x = c / 0.6;
|
|
423
|
-
var v = vec3<f32>(
|
|
424
|
-
dot(vec3<f32>(0.59719, 0.35458, 0.04823), x),
|
|
425
|
-
dot(vec3<f32>(0.07600, 0.90834, 0.01566), x),
|
|
426
|
-
dot(vec3<f32>(0.02840, 0.13383, 0.83777), x),
|
|
427
|
-
);
|
|
428
|
-
v = rrtAndOdtFit(v);
|
|
429
|
-
v = vec3<f32>(
|
|
430
|
-
dot(vec3<f32>(1.60475, -0.53108, -0.07367), v),
|
|
431
|
-
dot(vec3<f32>(-0.10208, 1.10813, -0.00605), v),
|
|
432
|
-
dot(vec3<f32>(-0.00327, -0.07276, 1.07602), v),
|
|
433
|
-
);
|
|
434
|
-
return clamp(v, vec3<f32>(0.0), vec3<f32>(1.0));
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
fn agxContrast(x: vec3<f32>) -> vec3<f32> {
|
|
438
|
-
let x2 = x * x;
|
|
439
|
-
let x4 = x2 * x2;
|
|
440
|
-
return 15.5 * x4 * x2 - 40.14 * x4 * x + 31.96 * x4 - 6.868 * x2 * x
|
|
441
|
-
+ 0.4298 * x2 + 0.1191 * x - 0.00232;
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
// AgX (Troy Sobotka), base look: graceful highlight roll-off that keeps
|
|
445
|
-
// saturated emissives from clipping to flat primaries.
|
|
446
|
-
fn toneMapAgx(c: vec3<f32>) -> vec3<f32> {
|
|
447
|
-
let inset = mat3x3<f32>(
|
|
448
|
-
0.842479062253094, 0.0423282422610123, 0.0423756549057051,
|
|
449
|
-
0.0784335999999992, 0.878468636469772, 0.0784336,
|
|
450
|
-
0.0792237451477643, 0.0791661274605434, 0.879142973793104,
|
|
451
|
-
);
|
|
452
|
-
let outset = mat3x3<f32>(
|
|
453
|
-
1.19687900512017, -0.0528968517574562, -0.0529716355144438,
|
|
454
|
-
-0.0980208811401368, 1.15190312990417, -0.0980434501171241,
|
|
455
|
-
-0.0990297440797205, -0.0989611768448433, 1.15107367264116,
|
|
456
|
-
);
|
|
457
|
-
let minEv = -12.47393;
|
|
458
|
-
let maxEv = 4.026069;
|
|
459
|
-
var v = inset * max(c, vec3<f32>(0.0));
|
|
460
|
-
v = clamp(log2(max(v, vec3<f32>(1e-10))), vec3<f32>(minEv), vec3<f32>(maxEv));
|
|
461
|
-
v = (v - minEv) / (maxEv - minEv);
|
|
462
|
-
v = agxContrast(v);
|
|
463
|
-
v = outset * v;
|
|
464
|
-
return clamp(pow(max(v, vec3<f32>(0.0)), vec3<f32>(2.2)), vec3<f32>(0.0), vec3<f32>(1.0));
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
// Khronos PBR Neutral: base colors come out as authored (hue and
|
|
468
|
-
// saturation kept) up to near-white; only highlights are compressed.
|
|
469
|
-
fn toneMapNeutral(cIn: vec3<f32>) -> vec3<f32> {
|
|
470
|
-
let startCompression = 0.8 - 0.04;
|
|
471
|
-
let desaturation = 0.15;
|
|
472
|
-
var c = max(cIn, vec3<f32>(0.0));
|
|
473
|
-
let x = min(c.r, min(c.g, c.b));
|
|
474
|
-
let offset = select(0.04, x - 6.25 * x * x, x < 0.08);
|
|
475
|
-
c = c - offset;
|
|
476
|
-
let peak = max(c.r, max(c.g, c.b));
|
|
477
|
-
if (peak < startCompression) {
|
|
478
|
-
return c;
|
|
479
|
-
}
|
|
480
|
-
let d = 1.0 - startCompression;
|
|
481
|
-
let newPeak = 1.0 - d * d / (peak + d - startCompression);
|
|
482
|
-
c = c * (newPeak / peak);
|
|
483
|
-
let g = 1.0 - 1.0 / (desaturation * (peak - newPeak) + 1.0);
|
|
484
|
-
return mix(c, vec3<f32>(newPeak), g);
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
fn toneMap(c: vec3<f32>) -> vec3<f32> {
|
|
488
|
-
let exposed = c * lights.ambientLinear.w;
|
|
489
|
-
let mode = lights.params.w;
|
|
490
|
-
if (mode > 2.5) {
|
|
491
|
-
return toneMapNeutral(exposed);
|
|
492
|
-
}
|
|
493
|
-
if (mode > 1.5) {
|
|
494
|
-
return toneMapAgx(exposed);
|
|
495
|
-
}
|
|
496
|
-
if (mode > 0.5) {
|
|
497
|
-
return toneMapAces(exposed);
|
|
498
|
-
}
|
|
499
|
-
return clamp(exposed, vec3<f32>(0.0), vec3<f32>(1.0));
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
// \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
|
|
503
|
-
|
|
504
|
-
// A rectangular-ish softbox seen from the scene: bright inside its angular
|
|
505
|
-
// radius, blurring out with roughness while keeping roughly the same energy.
|
|
506
|
-
fn softbox(d: vec3<f32>, axis: vec3<f32>, radius: f32, rough: f32) -> f32 {
|
|
507
|
-
let cosA = dot(d, axis);
|
|
508
|
-
let edge = cos(radius + rough * 0.9);
|
|
509
|
-
let width = 0.004 + rough * rough * 0.5;
|
|
510
|
-
let lobe = smoothstep(edge - width, edge + width * 0.25, cosA);
|
|
511
|
-
return lobe / (1.0 + rough * rough * 6.0);
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
/// Radiance arriving from direction d (world space; y points down), as a
|
|
515
|
-
/// surface of the given roughness sees it.
|
|
516
|
-
fn envRadiance(dirIn: vec3<f32>, rough: f32) -> vec3<f32> {
|
|
517
|
-
if (lights.envBottom.w < 0.5) {
|
|
518
|
-
return vec3<f32>(0.0);
|
|
519
|
-
}
|
|
520
|
-
let rot = lights.envTop.w;
|
|
521
|
-
let c = cos(rot);
|
|
522
|
-
let s = sin(rot);
|
|
523
|
-
let d = normalize(vec3<f32>(c * dirIn.x + s * dirIn.z, dirIn.y, -s * dirIn.x + c * dirIn.z));
|
|
524
|
-
let up = -d.y;
|
|
525
|
-
let spread = 0.35 + rough * 0.9;
|
|
526
|
-
let tUp = smoothstep(-0.05, spread, up);
|
|
527
|
-
let tDown = smoothstep(-0.05, spread, -up);
|
|
528
|
-
var col = mix(lights.envHorizon.rgb, lights.envTop.rgb, tUp);
|
|
529
|
-
col = mix(col, lights.envBottom.rgb, tDown);
|
|
530
|
-
let k = lights.envHorizon.w;
|
|
531
|
-
if (k > 0.0) {
|
|
532
|
-
// Key softbox overhead-front-left, a rim strip behind-right, a fill strip left.
|
|
533
|
-
let key = softbox(d, normalize(vec3<f32>(-0.35, -0.85, -0.4)), 0.32, rough);
|
|
534
|
-
let rim = softbox(d, normalize(vec3<f32>(0.75, -0.35, 0.55)), 0.2, rough);
|
|
535
|
-
let fill = softbox(d, normalize(vec3<f32>(-0.92, -0.15, -0.2)), 0.16, rough);
|
|
536
|
-
col += vec3<f32>(k * (key * 1.0 + rim * 0.7 + fill * 0.35));
|
|
537
|
-
}
|
|
538
|
-
return col;
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
// Karis' analytic approximation of the split-sum environment BRDF.
|
|
542
|
-
fn envBrdfApprox(f0: vec3<f32>, rough: f32, nDotV: f32) -> vec3<f32> {
|
|
543
|
-
let c0 = vec4<f32>(-1.0, -0.0275, -0.572, 0.022);
|
|
544
|
-
let c1 = vec4<f32>(1.0, 0.0425, 1.04, -0.04);
|
|
545
|
-
let r = rough * c0 + c1;
|
|
546
|
-
let a004 = min(r.x * r.x, exp2(-9.28 * nDotV)) * r.x + r.y;
|
|
547
|
-
let ab = vec2<f32>(-1.04, 1.04) * a004 + r.zw;
|
|
548
|
-
return f0 * ab.x + ab.y;
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
// \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
|
|
552
|
-
|
|
553
|
-
var<private> POISSON : array<vec2<f32>, 12> = array<vec2<f32>, 12>(
|
|
554
|
-
vec2<f32>(-0.326, -0.406), vec2<f32>(-0.840, -0.074), vec2<f32>(-0.696, 0.457),
|
|
555
|
-
vec2<f32>(-0.203, 0.621), vec2<f32>(0.962, -0.195), vec2<f32>(0.473, -0.480),
|
|
556
|
-
vec2<f32>(0.519, 0.767), vec2<f32>(0.185, -0.893), vec2<f32>(0.507, 0.064),
|
|
557
|
-
vec2<f32>(0.896, 0.412), vec2<f32>(-0.322, -0.933), vec2<f32>(-0.792, -0.598),
|
|
558
|
-
);
|
|
559
|
-
|
|
560
|
-
/// 1 = fully lit, 0 = fully shadowed, for light index i.
|
|
561
|
-
fn shadowFactor(worldPos: vec3<f32>, N: vec3<f32>, i: i32) -> f32 {
|
|
562
|
-
let shadow = directLights[i];
|
|
563
|
-
if (shadow.shadowParams.w < 0.5) {
|
|
564
|
-
return 1.0;
|
|
565
|
-
}
|
|
566
|
-
let p = worldPos + N * shadow.shadowBias.y;
|
|
567
|
-
let lp = shadow.shadowMatrix * vec4<f32>(p, 1.0);
|
|
568
|
-
let ndc = lp.xyz / lp.w;
|
|
569
|
-
let uv = vec2<f32>(ndc.x * 0.5 + 0.5, 0.5 - ndc.y * 0.5);
|
|
570
|
-
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) {
|
|
571
|
-
return 1.0;
|
|
572
|
-
}
|
|
573
|
-
let texel = 1.0 / max(shadow.shadowParams.y, 1.0);
|
|
574
|
-
let radius = shadow.shadowParams.x * texel;
|
|
575
|
-
let depthRef = ndc.z - shadow.shadowBias.x;
|
|
576
|
-
var lit = 0.0;
|
|
577
|
-
for (var k = 0; k < 12; k++) {
|
|
578
|
-
lit += textureSampleCompareLevel(shadowMap, shadowSampler, uv + POISSON[k] * radius, i32(shadow.shadowParams.z), depthRef);
|
|
579
|
-
}
|
|
580
|
-
lit = lit / 12.0;
|
|
581
|
-
return mix(1.0, lit, shadow.shadowBias.z);
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
// \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
|
|
585
|
-
|
|
586
|
-
struct LightSample {
|
|
587
|
-
L : vec3<f32>,
|
|
588
|
-
attenuation : f32,
|
|
589
|
-
valid : bool,
|
|
590
|
-
};
|
|
591
|
-
|
|
592
|
-
fn sampleLight(i: i32, worldPos: vec3<f32>) -> LightSample {
|
|
593
|
-
var out = LightSample(vec3<f32>(0.0, 0.0, 1.0), 1.0, false);
|
|
594
|
-
let light = directLights[i];
|
|
595
|
-
let lightType = light.posType.w;
|
|
596
|
-
if (lightType > 0.5 && lightType < 1.5) {
|
|
597
|
-
out.L = normalize(-light.dirRadius.xyz);
|
|
598
|
-
out.valid = true;
|
|
599
|
-
return out;
|
|
600
|
-
}
|
|
601
|
-
if (lightType < 1.5) {
|
|
602
|
-
return out;
|
|
603
|
-
}
|
|
604
|
-
let toLight = light.posType.xyz - worldPos;
|
|
605
|
-
let dist = length(toLight);
|
|
606
|
-
let radius = max(1.0, light.dirRadius.w);
|
|
607
|
-
if (dist > radius) {
|
|
608
|
-
return out;
|
|
609
|
-
}
|
|
610
|
-
out.L = normalize(toLight);
|
|
611
|
-
let dNorm = clamp(dist / radius, 0.0, 1.0);
|
|
612
|
-
let decay = max(0.5, light.spotParams.z);
|
|
613
|
-
out.attenuation = pow(clamp(1.0 - dNorm, 0.0, 1.0), decay);
|
|
614
|
-
if (lightType > 2.5) {
|
|
615
|
-
let spotDir = normalize(light.dirRadius.xyz);
|
|
616
|
-
let cosAngle = dot(-out.L, spotDir);
|
|
617
|
-
if (cosAngle < light.spotParams.x) {
|
|
618
|
-
return out;
|
|
619
|
-
}
|
|
620
|
-
out.attenuation *= smoothstep(light.spotParams.x, light.spotParams.y, cosAngle);
|
|
621
|
-
}
|
|
622
|
-
out.valid = true;
|
|
623
|
-
return out;
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
// Blinn-Phong in display space: the original look, plus shadows when a
|
|
627
|
-
// light casts them.
|
|
628
|
-
fn applyLighting3D(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3<f32>, material: vec4<f32>) -> vec3<f32> {
|
|
629
|
-
if (lights.params.y < 0.5 || material.w < 0.5) {
|
|
630
|
-
return baseColor;
|
|
631
|
-
}
|
|
632
|
-
var N = normalize(worldNormal);
|
|
633
|
-
let V = normalize(cam.cameraPos.xyz - worldPos);
|
|
634
|
-
if (dot(N, V) < 0.0) {
|
|
635
|
-
N = -N;
|
|
636
|
-
}
|
|
637
|
-
let shininess = max(1.0, material.x);
|
|
638
|
-
let specularInt = material.y;
|
|
639
|
-
let ambientInt = material.z;
|
|
640
|
-
|
|
641
|
-
var totalIllumination = baseColor * (lights.ambientColor.rgb * ambientInt);
|
|
642
|
-
let numLights = i32(lights.params.x);
|
|
643
|
-
for (var i = 0; i < numLights; i++) {
|
|
644
|
-
let ls = sampleLight(i, worldPos);
|
|
645
|
-
if (!ls.valid) {
|
|
646
|
-
continue;
|
|
647
|
-
}
|
|
648
|
-
let light = directLights[i];
|
|
649
|
-
let lightColor = light.colorIntensity.rgb;
|
|
650
|
-
let intensity = light.colorIntensity.w;
|
|
651
|
-
let NdotL = max(dot(N, ls.L), 0.0);
|
|
652
|
-
let diffuse = baseColor * lightColor * (NdotL * intensity * ls.attenuation);
|
|
653
|
-
var specular = vec3<f32>(0.0);
|
|
654
|
-
if (NdotL > 0.0 && specularInt > 0.001) {
|
|
655
|
-
let H = normalize(ls.L + V);
|
|
656
|
-
let NdotH = max(dot(N, H), 0.0);
|
|
657
|
-
specular = lightColor * (pow(NdotH, shininess) * specularInt * intensity * ls.attenuation);
|
|
658
|
-
}
|
|
659
|
-
totalIllumination += (diffuse + specular) * shadowFactor(worldPos, N, i);
|
|
660
|
-
}
|
|
661
|
-
return totalIllumination;
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
// GGX / Smith-correlated / Schlick, image-based light from envRadiance.
|
|
665
|
-
// Returns linear scene radiance (unbounded).
|
|
666
|
-
fn shadePhysical(worldPos: vec3<f32>, worldNormal: vec3<f32>, albedo: vec3<f32>, rough: f32, metal: f32, ambientInt: f32) -> vec3<f32> {
|
|
667
|
-
var N = normalize(worldNormal);
|
|
668
|
-
let V = normalize(cam.cameraPos.xyz - worldPos);
|
|
669
|
-
if (dot(N, V) < 0.0) {
|
|
670
|
-
N = -N;
|
|
671
|
-
}
|
|
672
|
-
let nDotV = max(dot(N, V), 1e-4);
|
|
673
|
-
let r = clamp(rough, 0.03, 1.0);
|
|
674
|
-
let a = r * r;
|
|
675
|
-
let a2 = a * a;
|
|
676
|
-
let f0 = mix(vec3<f32>(0.04), albedo, metal);
|
|
677
|
-
let diffuseColor = albedo * (1.0 - metal);
|
|
678
|
-
|
|
679
|
-
var lo = vec3<f32>(0.0);
|
|
680
|
-
let numLights = i32(lights.params.x);
|
|
681
|
-
for (var i = 0; i < numLights; i++) {
|
|
682
|
-
let ls = sampleLight(i, worldPos);
|
|
683
|
-
if (!ls.valid) {
|
|
684
|
-
continue;
|
|
685
|
-
}
|
|
686
|
-
let light = directLights[i];
|
|
687
|
-
let nDotL = max(dot(N, ls.L), 0.0);
|
|
688
|
-
if (nDotL <= 0.0) {
|
|
689
|
-
continue;
|
|
690
|
-
}
|
|
691
|
-
let H = normalize(ls.L + V);
|
|
692
|
-
let nDotH = max(dot(N, H), 0.0);
|
|
693
|
-
let vDotH = max(dot(V, H), 0.0);
|
|
694
|
-
let dDen = nDotH * nDotH * (a2 - 1.0) + 1.0;
|
|
695
|
-
let D = a2 / (PI * dDen * dDen);
|
|
696
|
-
let gv = nDotL * sqrt(nDotV * nDotV * (1.0 - a2) + a2);
|
|
697
|
-
let gl = nDotV * sqrt(nDotL * nDotL * (1.0 - a2) + a2);
|
|
698
|
-
let Vis = 0.5 / max(gv + gl, 1e-5);
|
|
699
|
-
let F = f0 + (vec3<f32>(1.0) - f0) * pow(1.0 - vDotH, 5.0);
|
|
700
|
-
let spec = D * Vis * F;
|
|
701
|
-
let diff = (vec3<f32>(1.0) - F) * diffuseColor / PI;
|
|
702
|
-
// x PI so a white light of intensity 1 lights a white wall about as
|
|
703
|
-
// brightly as the legacy shading does.
|
|
704
|
-
let radiance = srgbToLinear(light.colorIntensity.rgb) * light.colorIntensity.w * ls.attenuation * PI;
|
|
705
|
-
lo += (diff + spec) * radiance * nDotL * shadowFactor(worldPos, N, i);
|
|
706
|
-
}
|
|
707
|
-
|
|
708
|
-
let R = reflect(-V, N);
|
|
709
|
-
let irradiance = envRadiance(N, 1.0) + lights.ambientLinear.rgb;
|
|
710
|
-
let specEnv = envRadiance(R, r) * envBrdfApprox(f0, r, nDotV);
|
|
711
|
-
lo += (diffuseColor * irradiance + specEnv) * ambientInt;
|
|
712
|
-
return lo;
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
struct Shaded {
|
|
716
|
-
/** Display-encoded (sRGB) color for the color target. */
|
|
717
|
-
display : vec3<f32>,
|
|
718
|
-
/** Unclamped scene-referred linear radiance, for the bloom target. */
|
|
719
|
-
hdr : vec3<f32>,
|
|
720
|
-
};
|
|
721
|
-
|
|
722
|
-
// Two-sided, art-directed diffuse lighting. Shares the full direct-light
|
|
723
|
-
// storage, range/spot attenuation and PCF shadows with the physical renderer.
|
|
724
|
-
fn shadeToon(worldPos: vec3<f32>, worldNormal: vec3<f32>, base: vec3<f32>, ambient: f32, shade: vec4<f32>, lightTint: vec4<f32>, params: vec4<f32>) -> vec3<f32> {
|
|
725
|
-
if (lights.params.y < 0.5) { return base; }
|
|
726
|
-
var N = normalize(worldNormal);
|
|
727
|
-
let V = normalize(cam.cameraPos.xyz - worldPos);
|
|
728
|
-
if (dot(N, V) < 0.0) { N = -N; }
|
|
729
|
-
var illumination = lights.ambientColor.rgb * ambient * lightTint.rgb;
|
|
730
|
-
var visibility = clamp(max(illumination.r, max(illumination.g, illumination.b)), 0.0, 1.0);
|
|
731
|
-
for (var i = 0; i < i32(lights.params.x); i++) {
|
|
732
|
-
let ls = sampleLight(i, worldPos);
|
|
733
|
-
if (!ls.valid) { continue; }
|
|
734
|
-
let cosine = dot(N, ls.L);
|
|
735
|
-
let softness = max(params.x, 0.0001);
|
|
736
|
-
let band = smoothstep(lightTint.w - softness * 0.5, lightTint.w + softness * 0.5, cosine);
|
|
737
|
-
let light = directLights[i];
|
|
738
|
-
let strength = band * ls.attenuation * light.colorIntensity.w * shadowFactor(worldPos, N, i);
|
|
739
|
-
let contribution = light.colorIntensity.rgb * lightTint.rgb * strength * mix(1.0, max(cosine, 0.0), shade.w);
|
|
740
|
-
// Remove the shadow floor only as actual modeled light arrives.
|
|
741
|
-
// Using the pre-diffuse band here creates a dark ring between the
|
|
742
|
-
// shadow floor and the lit region, which slides as a surface turns.
|
|
743
|
-
let energy = max(contribution.r, max(contribution.g, contribution.b));
|
|
744
|
-
visibility = max(visibility, clamp(energy, 0.0, 1.0));
|
|
745
|
-
illumination += contribution;
|
|
746
|
-
}
|
|
747
|
-
return base * (shade.rgb * (1.0 - visibility) + illumination);
|
|
748
|
-
}
|
|
749
|
-
|
|
750
|
-
// The existing linear-depth attachment doubles as a geometry buffer:
|
|
751
|
-
// r = optical depth, gb = octahedral world normal, a = outline participation.
|
|
752
|
-
// Geometric normals deliberately ignore normal maps and texture seams.
|
|
753
|
-
fn geometryPixel(depth: f32, normal: vec3<f32>, outlined: f32) -> vec4<f32> {
|
|
754
|
-
let n = normalize(normal);
|
|
755
|
-
let p = n.xy / max(abs(n.x) + abs(n.y) + abs(n.z), 1e-6);
|
|
756
|
-
let signs = select(vec2<f32>(-1.0), vec2<f32>(1.0), p >= vec2<f32>(0.0));
|
|
757
|
-
let oct = select((1.0 - abs(p.yx)) * signs, p, n.z >= 0.0);
|
|
758
|
-
return vec4<f32>(depth, oct * 0.5 + 0.5, outlined);
|
|
759
|
-
}
|
|
760
|
-
|
|
761
|
-
/// Shades a surface for the scene's mode.
|
|
762
|
-
/// material: x shininess, y specularIntensity, z ambientIntensity, w mode (0 unlit).
|
|
763
|
-
/// pbr: x roughness (<0 = default), y metallic, z/w unused.
|
|
764
|
-
/// emissive: rgb sRGB color, w strength.
|
|
765
|
-
fn shadeSurfaceFull(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3<f32>, material: vec4<f32>, pbr: vec4<f32>, emissive: vec4<f32>, toonShadow: vec4<f32>, toonLight: vec4<f32>, toonParams: vec4<f32>) -> Shaded {
|
|
766
|
-
var out: Shaded;
|
|
767
|
-
if (lights.params.z < 0.5) {
|
|
768
|
-
var c = baseColor;
|
|
769
|
-
if (material.w > 1.5) {
|
|
770
|
-
c = shadeToon(worldPos, worldNormal, baseColor, material.z, toonShadow, toonLight, toonParams);
|
|
771
|
-
} else if (material.w >= 0.5) {
|
|
772
|
-
c = applyLighting3D(worldPos, worldNormal, baseColor, material);
|
|
773
|
-
}
|
|
774
|
-
c += emissive.rgb * emissive.w;
|
|
775
|
-
out.display = c;
|
|
776
|
-
out.hdr = srgbToLinear(clamp(c, vec3<f32>(0.0), vec3<f32>(1.0))) * max(max(c.r, max(c.g, c.b)), 1.0);
|
|
777
|
-
return out;
|
|
778
|
-
}
|
|
779
|
-
var radiance: vec3<f32>;
|
|
780
|
-
if (material.w < 0.5) {
|
|
781
|
-
radiance = srgbToLinear(baseColor);
|
|
782
|
-
} else if (material.w > 1.5) {
|
|
783
|
-
radiance = srgbToLinear(shadeToon(worldPos, worldNormal, baseColor, material.z, toonShadow, toonLight, toonParams));
|
|
784
|
-
} else {
|
|
785
|
-
let rough = select(pbr.x, 0.5, pbr.x < 0.0);
|
|
786
|
-
radiance = shadePhysical(worldPos, worldNormal, srgbToLinear(baseColor), rough, clamp(pbr.y, 0.0, 1.0), material.z);
|
|
787
|
-
}
|
|
788
|
-
radiance += srgbToLinear(emissive.rgb) * emissive.w;
|
|
789
|
-
var display: vec3<f32>;
|
|
790
|
-
if (material.w < 0.5) {
|
|
791
|
-
// Unlit layers keep their exact authored colors.
|
|
792
|
-
display = clamp(radiance, vec3<f32>(0.0), vec3<f32>(1.0));
|
|
793
|
-
} else {
|
|
794
|
-
display = toneMap(radiance);
|
|
795
|
-
}
|
|
796
|
-
var hdr = radiance * lights.ambientLinear.w;
|
|
797
|
-
if (lights.fog.w > 0.5) {
|
|
798
|
-
let dist = distance(worldPos, cam.cameraPos.xyz);
|
|
799
|
-
let f = smoothstep(lights.fogRange.x, max(lights.fogRange.y, lights.fogRange.x + 1.0), dist) * lights.fogRange.z;
|
|
800
|
-
display = mix(display, lights.fog.rgb, f);
|
|
801
|
-
hdr = hdr * (1.0 - f);
|
|
802
|
-
}
|
|
803
|
-
if (lights.floorParams.z > 0.5) {
|
|
804
|
-
if (worldPos.y > lights.floorParams.x + 0.1) {
|
|
805
|
-
discard;
|
|
806
|
-
}
|
|
807
|
-
if (lights.floorParams.y > 0.0) {
|
|
808
|
-
let deltaY = max(0.0, lights.floorParams.x - worldPos.y);
|
|
809
|
-
let fade = exp(-deltaY / lights.floorParams.y);
|
|
810
|
-
display = display * fade;
|
|
811
|
-
hdr = hdr * fade;
|
|
812
|
-
}
|
|
813
|
-
}
|
|
814
|
-
out.display = linearToSrgb(display);
|
|
815
|
-
out.hdr = hdr;
|
|
816
|
-
return out;
|
|
817
|
-
}
|
|
818
|
-
|
|
819
|
-
`,Ir=`
|
|
820
|
-
@group(3) @binding(0) var<uniform> lights : LightsUniforms;
|
|
821
|
-
@group(3) @binding(1) var shadowMap : texture_depth_2d_array;
|
|
822
|
-
@group(3) @binding(2) var shadowSampler : sampler_comparison;
|
|
823
|
-
@group(3) @binding(3) var<storage, read> directLights : array<DirectLight>;
|
|
824
|
-
`;$();var fa="rgba16float",nc="rgba16float";function mt(e,t){let r=n=>e.createRenderPipeline({label:`${t.label}${n?"Mrt":"Single"}`,layout:t.layout,vertex:t.vertex,fragment:{module:t.module,entryPoint:n?"fs_mrt":"fs_single",targets:[{format:t.format,blend:lo},...n?[{format:fa}]:[]]},depthStencil:t.depthStencil,primitive:t.primitive,multisample:t.multisample});return{single:r(!1),mrt:r(!0)}}var lt=class{constructor(t,r){this.device=t;this.base=r}device;base;cache=new Map;get(t){let r=this.cache.get(t);if(!r){let n=this.base;r=this.device.createRenderPipeline({label:`${n.label}${t?"MrtBloom":"Bloom"}`,layout:n.layout,vertex:n.vertex,fragment:{module:n.module,entryPoint:t?"fs_mrt_bloom":"fs_single_bloom",targets:[{format:n.format,blend:lo},...t?[{format:fa}]:[],{format:nc,blend:lo}]},depthStencil:n.depthStencil,primitive:n.primitive,multisample:n.multisample}),this.cache.set(t,r)}return r}};function wo(e,t,r,n){let o=r??t,A=n??[1,1,1,1];for(let i=0;i<16;i++)e[i]=t[i]??0,e[16+i]=o[i]??0;e[32]=A[0],e[33]=A[1],e[34]=A[2],e[35]=A[3]}var oc=`
|
|
825
|
-
struct BlurUniforms {
|
|
826
|
-
texelStep : vec2<f32>,
|
|
827
|
-
radius : f32,
|
|
828
|
-
_pad : f32,
|
|
829
|
-
};
|
|
830
|
-
|
|
831
|
-
@group(0) @binding(0) var<uniform> u : BlurUniforms;
|
|
832
|
-
@group(0) @binding(1) var samp : sampler;
|
|
833
|
-
@group(0) @binding(2) var src : texture_2d<f32>;
|
|
834
|
-
|
|
835
|
-
struct VsOut {
|
|
836
|
-
@builtin(position) pos : vec4<f32>,
|
|
837
|
-
@location(0) uv : vec2<f32>,
|
|
838
|
-
};
|
|
839
|
-
|
|
840
|
-
@vertex
|
|
841
|
-
fn vs(@builtin(vertex_index) i : u32) -> VsOut {
|
|
842
|
-
let p = vec2<f32>(f32((i << 1u) & 2u), f32(i & 2u));
|
|
843
|
-
var o : VsOut;
|
|
844
|
-
o.pos = vec4<f32>(p * 2.0 - 1.0, 0.0, 1.0);
|
|
845
|
-
o.uv = vec2<f32>(p.x, 1.0 - p.y);
|
|
846
|
-
return o;
|
|
847
|
-
}
|
|
848
|
-
|
|
849
|
-
@fragment
|
|
850
|
-
fn fs(in : VsOut) -> @location(0) vec4<f32> {
|
|
851
|
-
if (u.radius <= 0.01) {
|
|
852
|
-
return textureSampleLevel(src, samp, in.uv, 0.0);
|
|
853
|
-
}
|
|
854
|
-
var col = vec4<f32>(0.0);
|
|
855
|
-
var totalW = 0.0;
|
|
856
|
-
let sigma = max(0.5, u.radius * 0.45);
|
|
857
|
-
let inv2Sigma2 = 0.5 / (sigma * sigma);
|
|
858
|
-
for (var k = -8; k <= 8; k = k + 1) {
|
|
859
|
-
let fk = f32(k);
|
|
860
|
-
let offsetFrac = fk * 0.125 * u.radius;
|
|
861
|
-
let w = exp(-(offsetFrac * offsetFrac) * inv2Sigma2);
|
|
862
|
-
let sampleUV = clamp(in.uv + u.texelStep * offsetFrac, vec2<f32>(0.001), vec2<f32>(0.999));
|
|
863
|
-
col += textureSampleLevel(src, samp, sampleUV, 0.0) * w;
|
|
864
|
-
totalW += w;
|
|
865
|
-
}
|
|
866
|
-
return col / max(totalW, 0.0001);
|
|
867
|
-
}
|
|
868
|
-
`,Ac=`
|
|
869
|
-
${mr}
|
|
870
|
-
|
|
871
|
-
struct FloorUniforms {
|
|
872
|
-
params0 : vec4<f32>, // x = floorY, y = reflectivity, z = roughness, w = fadeDistance
|
|
873
|
-
params1 : vec4<f32>, // x = opacity, y = unused, z = unused, w = unused
|
|
874
|
-
baseColor : vec4<f32>, // rgb = base linear color, a = 1.0
|
|
875
|
-
};
|
|
876
|
-
|
|
877
|
-
@group(0) @binding(0) var<uniform> cam : CameraUniforms;
|
|
878
|
-
@group(1) @binding(0) var<uniform> floorU : FloorUniforms;
|
|
879
|
-
@group(2) @binding(0) var reflectionTexture : texture_2d<f32>;
|
|
880
|
-
@group(2) @binding(1) var reflectionSampler : sampler;
|
|
881
|
-
${Ir}
|
|
882
|
-
|
|
883
|
-
struct VsOut {
|
|
884
|
-
@builtin(position) pos : vec4<f32>,
|
|
885
|
-
@location(0) uv : vec2<f32>,
|
|
886
|
-
};
|
|
887
|
-
|
|
888
|
-
@vertex
|
|
889
|
-
fn vs_floor(@builtin(vertex_index) vid : u32) -> VsOut {
|
|
890
|
-
let p = vec2<f32>(f32((vid << 1u) & 2u), f32(vid & 2u));
|
|
891
|
-
var o : VsOut;
|
|
892
|
-
o.pos = vec4<f32>(p * 2.0 - 1.0, 0.0, 1.0);
|
|
893
|
-
o.uv = vec2<f32>(p.x, 1.0 - p.y);
|
|
894
|
-
return o;
|
|
895
|
-
}
|
|
896
|
-
|
|
897
|
-
struct FloorShaded {
|
|
898
|
-
display : vec3<f32>,
|
|
899
|
-
hdr : vec3<f32>,
|
|
900
|
-
depth : f32,
|
|
901
|
-
linearDepth : f32,
|
|
902
|
-
alpha : f32,
|
|
903
|
-
};
|
|
904
|
-
|
|
905
|
-
fn shadeFloor(in: VsOut) -> FloorShaded {
|
|
906
|
-
var out: FloorShaded;
|
|
907
|
-
|
|
908
|
-
let ndcX = in.uv.x * 2.0 - 1.0;
|
|
909
|
-
let ndcY = 1.0 - 2.0 * in.uv.y;
|
|
910
|
-
|
|
911
|
-
let pNear = cam.invViewProjMatrix * vec4<f32>(ndcX, ndcY, 0.0, 1.0);
|
|
912
|
-
let pFar = cam.invViewProjMatrix * vec4<f32>(ndcX, ndcY, 1.0, 1.0);
|
|
913
|
-
|
|
914
|
-
let p0 = pNear.xyz / pNear.w;
|
|
915
|
-
let p1 = pFar.xyz / pFar.w;
|
|
916
|
-
|
|
917
|
-
let D = normalize(p1 - p0);
|
|
918
|
-
let O = p0;
|
|
919
|
-
|
|
920
|
-
let floorY = floorU.params0.x;
|
|
921
|
-
let diffY = floorY - O.y;
|
|
922
|
-
if (diffY * D.y <= 0.0001) {
|
|
923
|
-
discard;
|
|
924
|
-
}
|
|
925
|
-
|
|
926
|
-
let t = diffY / D.y;
|
|
927
|
-
let worldP = O + t * D;
|
|
928
|
-
|
|
929
|
-
let clip = cam.viewProjMatrix * vec4<f32>(worldP, 1.0);
|
|
930
|
-
let depth = clip.z / clip.w;
|
|
931
|
-
if (depth < 0.0 || depth > 1.0) {
|
|
932
|
-
discard;
|
|
933
|
-
}
|
|
934
|
-
|
|
935
|
-
out.depth = depth;
|
|
936
|
-
out.linearDepth = dot(worldP - cam.cameraPos.xyz, cam.cameraDir.xyz);
|
|
937
|
-
|
|
938
|
-
let N = vec3<f32>(0.0, -1.0, 0.0);
|
|
939
|
-
let toCam = cam.cameraPos.xyz - worldP;
|
|
940
|
-
let dist = length(toCam);
|
|
941
|
-
let V = toCam / max(dist, 0.0001);
|
|
942
|
-
let NdotV = max(0.0, dot(N, V));
|
|
943
|
-
|
|
944
|
-
let F0 = floorU.params0.y;
|
|
945
|
-
let fresnel = F0 + (1.0 - F0) * pow(1.0 - NdotV, 5.0);
|
|
946
|
-
|
|
947
|
-
let fadeDist = max(floorU.params0.w, 1.0);
|
|
948
|
-
let distFade = clamp(1.0 - dist / (fadeDist * 2.2), 0.0, 1.0);
|
|
949
|
-
let horizonFade = smoothstep(0.015, 0.14, NdotV);
|
|
950
|
-
let smoothFade = distFade * distFade * (3.0 - 2.0 * distFade) * horizonFade;
|
|
951
|
-
|
|
952
|
-
let reflUV = vec2<f32>(in.uv.x, 1.0 - in.uv.y);
|
|
953
|
-
let reflSample = textureSample(reflectionTexture, reflectionSampler, reflUV);
|
|
954
|
-
let reflRgb = reflSample.rgb;
|
|
955
|
-
|
|
956
|
-
let baseColor = floorU.baseColor.rgb;
|
|
957
|
-
let opacity = floorU.params1.x;
|
|
958
|
-
|
|
959
|
-
let baseSrgb = linearToSrgb(baseColor);
|
|
960
|
-
let reflWeight = fresnel * floorU.params0.y * smoothFade;
|
|
961
|
-
let reflSrgb = reflRgb * reflWeight;
|
|
962
|
-
|
|
963
|
-
var displaySrgb = select(
|
|
964
|
-
clamp(baseSrgb + reflSrgb, vec3<f32>(0.0), vec3<f32>(1.0)),
|
|
965
|
-
reflSrgb,
|
|
966
|
-
opacity <= 0.001,
|
|
967
|
-
);
|
|
968
|
-
|
|
969
|
-
let reflLin = pow(max(reflRgb, vec3<f32>(0.0)), vec3<f32>(2.2));
|
|
970
|
-
let reflLum = max(reflLin.r, max(reflLin.g, reflLin.b));
|
|
971
|
-
var hdr = reflLin * max(0.0, reflLum - 0.25) * 3.0 * reflWeight;
|
|
972
|
-
|
|
973
|
-
if (lights.fog.w > 0.5) {
|
|
974
|
-
let f = smoothstep(lights.fogRange.x, max(lights.fogRange.y, lights.fogRange.x + 1.0), dist) * lights.fogRange.z;
|
|
975
|
-
displaySrgb = mix(displaySrgb, linearToSrgb(lights.fog.rgb), f);
|
|
976
|
-
hdr = hdr * (1.0 - f);
|
|
977
|
-
}
|
|
978
|
-
|
|
979
|
-
let a = select(opacity * smoothFade, clamp(reflSample.a * reflWeight, 0.0, 1.0), opacity <= 0.001);
|
|
980
|
-
out.display = displaySrgb;
|
|
981
|
-
out.hdr = hdr;
|
|
982
|
-
out.alpha = a;
|
|
983
|
-
return out;
|
|
984
|
-
}
|
|
985
|
-
|
|
986
|
-
struct FsOutputSingle {
|
|
987
|
-
@location(0) color : vec4<f32>,
|
|
988
|
-
@builtin(frag_depth) depth : f32,
|
|
989
|
-
};
|
|
990
|
-
|
|
991
|
-
struct FsOutputMrt {
|
|
992
|
-
@location(0) color : vec4<f32>,
|
|
993
|
-
@location(1) linearDepth : vec4<f32>,
|
|
994
|
-
@builtin(frag_depth) depth : f32,
|
|
995
|
-
};
|
|
996
|
-
|
|
997
|
-
struct FsOutputSingleBloom {
|
|
998
|
-
@location(0) color : vec4<f32>,
|
|
999
|
-
@location(1) hdr : vec4<f32>,
|
|
1000
|
-
@builtin(frag_depth) depth : f32,
|
|
1001
|
-
};
|
|
1002
|
-
|
|
1003
|
-
struct FsOutputMrtBloom {
|
|
1004
|
-
@location(0) color : vec4<f32>,
|
|
1005
|
-
@location(1) linearDepth : vec4<f32>,
|
|
1006
|
-
@location(2) hdr : vec4<f32>,
|
|
1007
|
-
@builtin(frag_depth) depth : f32,
|
|
1008
|
-
};
|
|
1009
|
-
|
|
1010
|
-
@fragment
|
|
1011
|
-
fn fs_single(in: VsOut) -> FsOutputSingle {
|
|
1012
|
-
var out: FsOutputSingle;
|
|
1013
|
-
let s = shadeFloor(in);
|
|
1014
|
-
out.color = vec4<f32>(s.display * s.alpha, s.alpha);
|
|
1015
|
-
out.depth = s.depth;
|
|
1016
|
-
return out;
|
|
1017
|
-
}
|
|
1018
|
-
|
|
1019
|
-
@fragment
|
|
1020
|
-
fn fs_mrt(in: VsOut) -> FsOutputMrt {
|
|
1021
|
-
var out: FsOutputMrt;
|
|
1022
|
-
let s = shadeFloor(in);
|
|
1023
|
-
out.color = vec4<f32>(s.display * s.alpha, s.alpha);
|
|
1024
|
-
out.linearDepth = geometryPixel(s.linearDepth, vec3<f32>(0.0, -1.0, 0.0), 1.0);
|
|
1025
|
-
out.depth = s.depth;
|
|
1026
|
-
return out;
|
|
1027
|
-
}
|
|
1028
|
-
|
|
1029
|
-
@fragment
|
|
1030
|
-
fn fs_single_bloom(in: VsOut) -> FsOutputSingleBloom {
|
|
1031
|
-
var out: FsOutputSingleBloom;
|
|
1032
|
-
let s = shadeFloor(in);
|
|
1033
|
-
out.color = vec4<f32>(s.display * s.alpha, s.alpha);
|
|
1034
|
-
out.hdr = vec4<f32>(s.hdr * s.alpha, 1.0);
|
|
1035
|
-
out.depth = s.depth;
|
|
1036
|
-
return out;
|
|
1037
|
-
}
|
|
1038
|
-
|
|
1039
|
-
@fragment
|
|
1040
|
-
fn fs_mrt_bloom(in: VsOut) -> FsOutputMrtBloom {
|
|
1041
|
-
var out: FsOutputMrtBloom;
|
|
1042
|
-
let s = shadeFloor(in);
|
|
1043
|
-
out.color = vec4<f32>(s.display * s.alpha, s.alpha);
|
|
1044
|
-
out.linearDepth = geometryPixel(s.linearDepth, vec3<f32>(0.0, -1.0, 0.0), 1.0);
|
|
1045
|
-
out.hdr = vec4<f32>(s.hdr * s.alpha, 1.0);
|
|
1046
|
-
out.depth = s.depth;
|
|
1047
|
-
return out;
|
|
1048
|
-
}
|
|
1049
|
-
`,vo=class{constructor(t,r,n,o,A,i="depth24plus"){this.device=t;let a=t.createShaderModule({label:"FloorBlurShader",code:oc});this.blurBindGroupLayout=t.createBindGroupLayout({label:"FloorBlurBindGroupLayout",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"}}]}),this.blurPipeline=t.createRenderPipeline({label:"FloorBlurPipeline",layout:t.createPipelineLayout({bindGroupLayouts:[this.blurBindGroupLayout]}),vertex:{module:a,entryPoint:"vs"},fragment:{module:a,entryPoint:"fs",targets:[{format:r}]},primitive:{topology:"triangle-list"}}),this.blurSampler=t.createSampler({label:"FloorBlurSampler",magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}),this.blurPool=new Ye(16,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.floorLayout=t.createBindGroupLayout({label:"FloorUniformLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.reflectionLayout=t.createBindGroupLayout({label:"FloorReflectionLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}}]}),this.floorSampler=t.createSampler({label:"FloorReflectionSampler",magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}),this.floorPool=new Ye(64,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);let s=t.createShaderModule({label:"FloorPlaneShader",code:Ac}),l={label:"FloorPlanePipeline",layout:t.createPipelineLayout({label:"FloorPlanePipelineLayout",bindGroupLayouts:[o,this.floorLayout,this.reflectionLayout,A]}),vertex:{module:s,entryPoint:"vs_floor"},module:s,format:r,depthStencil:{format:i,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:n}},{single:u,mrt:g}=mt(t,l);this.pipelineSingle=u,this.pipelineMrt=g,this.bloomVariants=new lt(t,l)}device;blurPipeline;blurBindGroupLayout;blurSampler;blurPool;floorLayout;reflectionLayout;floorSampler;floorPool;pipelineSingle;pipelineMrt;bloomVariants;applyBlur(t,r,n,o,A,i,a){let s=a*24,c=a*130;{let l=new Float32Array([1/A,0,s,0]),u=this.blurPool.getBuffer(this.device,l),g=this.device.createBindGroup({layout:this.blurBindGroupLayout,entries:[{binding:0,resource:{buffer:u}},{binding:1,resource:this.blurSampler},{binding:2,resource:r.createView()}]}),p=t.beginRenderPass({colorAttachments:[{view:n.createView(),loadOp:"clear",storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]});p.setPipeline(this.blurPipeline),p.setBindGroup(0,g),p.draw(3),p.end()}{let l=new Float32Array([0,1/i,c,0]),u=this.blurPool.getBuffer(this.device,l),g=this.device.createBindGroup({layout:this.blurBindGroupLayout,entries:[{binding:0,resource:{buffer:u}},{binding:1,resource:this.blurSampler},{binding:2,resource:n.createView()}]}),p=t.beginRenderPass({colorAttachments:[{view:o.createView(),loadOp:"clear",storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]});p.setPipeline(this.blurPipeline),p.setBindGroup(0,g),p.draw(3),p.end()}}draw(t,r,n,o,A,i=!1,a=!1){let s=Hr(A.color??"#08070a"),c=new Float32Array([A.y,A.reflectivity??.35,A.roughness??.35,A.fadeDistance??900,A.opacity??1,0,0,0,s[0],s[1],s[2],1,0,0,0,0]),l=this.floorPool.getBuffer(this.device,c),u=this.device.createBindGroup({layout:this.floorLayout,entries:[{binding:0,resource:{buffer:l}}]}),g=this.device.createBindGroup({layout:this.reflectionLayout,entries:[{binding:0,resource:o.createView()},{binding:1,resource:this.floorSampler}]});t.setPipeline(a?this.bloomVariants.get(i):i?this.pipelineMrt:this.pipelineSingle),t.setBindGroup(0,r),t.setBindGroup(1,u),t.setBindGroup(2,g),t.setBindGroup(3,n),t.draw(3)}destroy(){this.blurPool.destroy(),this.floorPool.destroy()}};$();function ic(e){let t=e>1,r=t?"texture_multisampled_2d<f32>":"texture_2d<f32>";return`
|
|
1050
|
-
struct Uniforms {
|
|
1051
|
-
params : vec4<f32>, // width, cosine(crease angle), relative depth threshold, opacity
|
|
1052
|
-
ink : vec4<f32>,
|
|
1053
|
-
fog : vec4<f32>,
|
|
1054
|
-
fogRange : vec4<f32>,
|
|
1055
|
-
projection : vec4<f32>, // inverse projection x/y scale, far depth
|
|
1056
|
-
};
|
|
1057
|
-
@group(0) @binding(0) var<uniform> u : Uniforms;
|
|
1058
|
-
@group(0) @binding(1) var colorTex : ${r};
|
|
1059
|
-
@group(0) @binding(2) var geometryTex : ${r};
|
|
1060
|
-
|
|
1061
|
-
@vertex fn vs(@builtin(vertex_index) i : u32) -> @builtin(position) vec4<f32> {
|
|
1062
|
-
let p = vec2<f32>(f32((i << 1u) & 2u), f32(i & 2u));
|
|
1063
|
-
return vec4<f32>(p * 2.0 - 1.0, 0.0, 1.0);
|
|
1064
|
-
}
|
|
1065
|
-
|
|
1066
|
-
fn geometry(p : vec2<i32>, sample : i32) -> vec4<f32> {
|
|
1067
|
-
let size = vec2<i32>(textureDimensions(geometryTex));
|
|
1068
|
-
// Beyond the viewport is the same surface: never ink the canvas border.
|
|
1069
|
-
return textureLoad(geometryTex, clamp(p, vec2<i32>(0), size - 1), sample);
|
|
1070
|
-
}
|
|
1071
|
-
|
|
1072
|
-
fn normal(oct : vec2<f32>) -> vec3<f32> {
|
|
1073
|
-
let p = oct * 2.0 - 1.0;
|
|
1074
|
-
var n = vec3<f32>(p, 1.0 - abs(p.x) - abs(p.y));
|
|
1075
|
-
let t = max(-n.z, 0.0);
|
|
1076
|
-
n = vec3<f32>(n.xy + select(vec2<f32>(t), vec2<f32>(-t), n.xy >= vec2<f32>(0.0)), n.z);
|
|
1077
|
-
return normalize(n);
|
|
1078
|
-
}
|
|
1079
|
-
|
|
1080
|
-
fn srgbToLinear(c : vec3<f32>) -> vec3<f32> {
|
|
1081
|
-
return select(pow((max(c, vec3<f32>(0.0)) + 0.055) / 1.055, vec3<f32>(2.4)), c / 12.92, c <= vec3<f32>(0.04045));
|
|
1082
|
-
}
|
|
1083
|
-
fn linearToSrgb(c : vec3<f32>) -> vec3<f32> {
|
|
1084
|
-
let x = max(c, vec3<f32>(0.0));
|
|
1085
|
-
return select(1.055 * pow(x, vec3<f32>(1.0 / 2.4)) - 0.055, x * 12.92, x <= vec3<f32>(0.0031308));
|
|
1086
|
-
}
|
|
1087
|
-
|
|
1088
|
-
fn edge(center : vec4<f32>, next : vec4<f32>, previous : vec4<f32>) -> f32 {
|
|
1089
|
-
let z = 1.0 / max(center.r, 0.0001);
|
|
1090
|
-
let a = 1.0 / max(next.r, 0.0001);
|
|
1091
|
-
let b = 1.0 / max(previous.r, 0.0001);
|
|
1092
|
-
// Inverse depth is affine on a perspective-projected plane. Its signed
|
|
1093
|
-
// second difference suppresses grazing surfaces and inks only the near
|
|
1094
|
-
// side of an occlusion, including thin geometry with background both sides.
|
|
1095
|
-
let curvature = (2.0 * z - a - b) / z;
|
|
1096
|
-
let depthEdge = smoothstep(u.params.z, u.params.z * 2.0, curvature);
|
|
1097
|
-
let sameDepth = abs(center.r - next.r) / max(center.r, 0.0001) < 0.03;
|
|
1098
|
-
let crease = select(0.0, 1.0, next.a > 0.5 && sameDepth && dot(normal(center.gb), normal(next.gb)) < u.params.y);
|
|
1099
|
-
return max(depthEdge, crease);
|
|
1100
|
-
}
|
|
1101
|
-
|
|
1102
|
-
@fragment fn fs(@builtin(position) pos : vec4<f32>${t?", @builtin(sample_index) sampleIndex : u32":""}) -> @location(0) vec4<f32> {
|
|
1103
|
-
let sample = ${t?"i32(sampleIndex)":"0"};
|
|
1104
|
-
let pixel = vec2<i32>(pos.xy);
|
|
1105
|
-
let source = textureLoad(colorTex, pixel, sample);
|
|
1106
|
-
let c = geometry(pixel, sample);
|
|
1107
|
-
if (c.a <= 0.0 || u.params.x <= 0.0 || u.params.w <= 0.0) { return source; }
|
|
1108
|
-
var coverage = 0.0;
|
|
1109
|
-
let directions = array<vec2<f32>, 8>(
|
|
1110
|
-
vec2<f32>(1.0, 0.0), vec2<f32>(-1.0, 0.0), vec2<f32>(0.0, 1.0), vec2<f32>(0.0, -1.0),
|
|
1111
|
-
vec2<f32>(0.707107, 0.707107), vec2<f32>(-0.707107, 0.707107), vec2<f32>(0.707107, -0.707107), vec2<f32>(-0.707107, -0.707107));
|
|
1112
|
-
for (var r = 1; r <= i32(ceil(u.params.x)); r++) {
|
|
1113
|
-
let weight = clamp(u.params.x - f32(r) + 1.0, 0.0, 1.0);
|
|
1114
|
-
for (var d = 0; d < 8; d++) {
|
|
1115
|
-
let offset = vec2<i32>(round(directions[d] * f32(r)));
|
|
1116
|
-
coverage = max(coverage, edge(c, geometry(pixel + offset, sample), geometry(pixel - offset, sample)) * weight);
|
|
1117
|
-
}
|
|
1118
|
-
}
|
|
1119
|
-
var ink = u.ink.rgb;
|
|
1120
|
-
if (u.fog.w > 0.5) {
|
|
1121
|
-
let uv = pos.xy / vec2<f32>(textureDimensions(colorTex));
|
|
1122
|
-
let ray = vec3<f32>((uv * 2.0 - 1.0) * u.projection.xy, 1.0);
|
|
1123
|
-
let distance = c.r * length(ray);
|
|
1124
|
-
let fog = smoothstep(u.fogRange.x, max(u.fogRange.y, u.fogRange.x + 1.0), distance) * u.fogRange.z;
|
|
1125
|
-
// Match surface fog's linear-light blend; display-space interpolation
|
|
1126
|
-
// would darken outlines halfway into a light-colored atmosphere.
|
|
1127
|
-
ink = linearToSrgb(mix(srgbToLinear(ink), srgbToLinear(u.fog.rgb), fog));
|
|
1128
|
-
}
|
|
1129
|
-
let visibleCoverage = min(c.a / max(source.a, 0.0001), 1.0);
|
|
1130
|
-
return vec4<f32>(mix(source.rgb, ink * source.a, coverage * visibleCoverage * u.params.w * u.ink.a), source.a);
|
|
1131
|
-
}
|
|
1132
|
-
`}var Do=class{constructor(t,r,n=1){this.device=t;this.format=r;this.sampleCount=n;this.layout=t.createBindGroupLayout({label:"GeometryOutlineLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},...[1,2].map(A=>({binding:A,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"unfilterable-float",multisampled:n>1}}))]});let o=t.createShaderModule({label:"geometry-outlines.wgsl",code:ic(n)});this.pipeline=t.createRenderPipeline({label:"GeometryOutlines",layout:t.createPipelineLayout({bindGroupLayouts:[this.layout]}),vertex:{module:o,entryPoint:"vs"},fragment:{module:o,entryPoint:"fs",targets:[{format:r}]},primitive:{topology:"triangle-list"},multisample:{count:n}})}device;format;sampleCount;layout;pipeline;multisampledOutput=null;pool=new Ye(80,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);reset(){this.pool.reset()}destroy(){this.pool.destroy(),this.multisampledOutput?.destroy()}attachment(t,r){return this.sampleCount<=1?{view:r,loadOp:"clear",storeOp:"store"}:((!this.multisampledOutput||this.multisampledOutput.width!==t.width||this.multisampledOutput.height!==t.height)&&(this.multisampledOutput?.destroy(),this.multisampledOutput=this.device.createTexture({label:"GeometryOutlineMsaaOutput",size:{width:t.width,height:t.height},format:this.format,sampleCount:this.sampleCount,usage:GPUTextureUsage.RENDER_ATTACHMENT})),{view:this.multisampledOutput.createView(),resolveTarget:r,loadOp:"clear",storeOp:"discard"})}render(t,r,n,o,A,i,a){let s=new Float32Array(20);s.set([(i.width??1.5)*r.height/(i.referenceHeight??1080),Math.cos((i.creaseAngle??45)*Math.PI/180),i.depthThreshold??.01,i.opacity??1]);let c=Mt(i.color??"#16131c");if(s.set([c.r,c.g,c.b,c.a],4),a){let p=Mt(a.color);s.set([p.r,p.g,p.b,1],8),s.set([a.start,a.end,a.opacity??1,0],12)}let l=pr.computeProjectionMatrix(A);s.set([1/l[0],1/l[5],A.far,0],16);let u=this.device.createBindGroup({layout:this.layout,entries:[{binding:0,resource:{buffer:this.pool.getBuffer(this.device,s)}},{binding:1,resource:r.createView()},{binding:2,resource:n.createView()}]}),g=t.beginRenderPass({colorAttachments:[this.attachment(r,o)]});g.setPipeline(this.pipeline),g.setBindGroup(0,u),g.draw(3),g.end()}};$();var ac=`
|
|
1133
|
-
@group(0) @binding(0) var geometry : texture_multisampled_2d<f32>;
|
|
1134
|
-
@vertex fn vs(@builtin(vertex_index) i : u32) -> @builtin(position) vec4<f32> {
|
|
1135
|
-
let p = vec2<f32>(f32((i << 1u) & 2u), f32(i & 2u));
|
|
1136
|
-
return vec4<f32>(p * 2.0 - 1.0, 0.0, 1.0);
|
|
1137
|
-
}
|
|
1138
|
-
@fragment fn fs(@builtin(position) pos : vec4<f32>) -> @location(0) vec4<f32> {
|
|
1139
|
-
let pixel = vec2<i32>(pos.xy);
|
|
1140
|
-
let samples = i32(textureNumSamples(geometry));
|
|
1141
|
-
var nearest = textureLoad(geometry, pixel, 0);
|
|
1142
|
-
var coverage = 0.0;
|
|
1143
|
-
for (var i = 0; i < samples; i++) {
|
|
1144
|
-
let s = textureLoad(geometry, pixel, i);
|
|
1145
|
-
if (s.r < nearest.r) { nearest = s; }
|
|
1146
|
-
coverage += s.a;
|
|
1147
|
-
}
|
|
1148
|
-
return vec4<f32>(nearest.rgb, nearest.a * coverage / f32(samples));
|
|
1149
|
-
}
|
|
1150
|
-
`,_o=class{constructor(t){this.device=t;this.layout=t.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"unfilterable-float",multisampled:!0}}]});let r=t.createShaderModule({label:"geometry-resolve.wgsl",code:ac});this.pipeline=t.createRenderPipeline({label:"GeometryResolve",layout:t.createPipelineLayout({bindGroupLayouts:[this.layout]}),vertex:{module:r,entryPoint:"vs"},fragment:{module:r,entryPoint:"fs",targets:[{format:"rgba16float"}]},primitive:{topology:"triangle-list"}})}device;layout;pipeline;render(t,r,n){let o=this.device.createBindGroup({layout:this.layout,entries:[{binding:0,resource:r.createView()}]}),A=t.beginRenderPass({colorAttachments:[{view:n,loadOp:"clear",storeOp:"store"}]});A.setPipeline(this.pipeline),A.setBindGroup(0,o),A.draw(3),A.end()}};$();$();function St(e,t){return{ok:!1,error:{code:e,expected:"valid compressed data or supported compression scheme",hint:{"decompression-failed":"Check catalog row compression field and asset binary consistency; re-run asset import.","codec-init-failed":"Uncompressed assets are still loadable. Verify the codec module is installed correctly.","ktx2-parse-failed":"Check that the KTX2 file is valid and not truncated. Re-import the texture asset.","ktx2-unsupported-scheme":"This supercompression scheme requires a future codec upgrade. Check the codec README Loop 2 extension points.","transcode-failed":"Basis transcode failed for this source/target format pair. Verify the KTX2 payload is a valid Basis (ETC1S / UASTC) texture and re-import the asset.","ktx2-encode-failed":"Basis encode failed for this compression mode. Verify the source image dimensions / pixel format match the mode (LDR rgba8 vs HDR rgba16float) and retry the asset import."}[e],detail:t}}}var ha=new URL("../pkg/basis_transcoder.mjs",import.meta.url),ma=new URL("../pkg/basis_transcoder.wasm",import.meta.url);function Pt(e,t){let r=globalThis.__forgeaxAssetLoadTrace;if(r!==void 0)try{r({phase:`codec.${e}`,at:Date.now(),...t===void 0?{}:{detail:t}})}catch{}}var sc=async()=>{Pt("basis.glue.import.start",{url:ha.href});let e=(await import(ha.href)).default;Pt("basis.glue.import.complete"),Pt("basis.wasm.factory.start",{url:ma.href});let t=await e({locateFile:()=>ma.href});return Pt("basis.wasm.factory.complete"),Pt("basis.initialize.start"),t.initializeBasis(),Pt("basis.initialize.complete"),t},cc=sc,no=null;function lc(){return no!==null||(Pt("basis.init.start"),no=cc().catch(e=>{throw no=null,new Error("codec-init-failed",{cause:e})})),no}function uc(e,t){let r=e.transcoder_texture_format;switch(t){case"bc7-rgba-unorm":case"bc7-rgba-unorm-srgb":return r.cTFBC7_RGBA.value;case"bc5-rg-unorm":return r.cTFBC5_RG.value;case"bc4-r-unorm":return r.cTFBC4_R.value;case"bc6h-rgb-ufloat":return r.cTFBC6H.value;case"etc2-rgba8unorm":case"etc2-rgba8unorm-srgb":return r.cTFETC2_RGBA.value;case"astc-4x4-unorm":case"astc-4x4-unorm-srgb":return r.cTFASTC_4x4_RGBA.value;case"rgba16float":return r.cTFRGBA_HALF.value;case"rgba8unorm":case"rgba8unorm-srgb":case"rg8unorm":case"r8unorm":return r.cTFRGBA32.value;default:return null}}async function Ia(e,t){Pt("ktx2.transcode.start",{targetFormat:t});let r;try{r=await lc()}catch{return St("codec-init-failed",{stage:"dynamic-import-basis-transcoder"})}let n=uc(r,t);if(n===null)return St("transcode-failed",{sourceFormat:`dfd-model-${e.dfd?.colorModel??"unknown"}`,targetFormat:t});let o=new r.KTX2File(e.rawBytes);try{if(Pt("ktx2.file.start"),!o.isValid())return St("transcode-failed",{sourceFormat:"invalid-ktx2-file",targetFormat:t});if(o.startTranscoding()===0)return St("transcode-failed",{sourceFormat:"start-transcoding-failed",targetFormat:t});let A=o.getLevels();Pt("ktx2.file.ready",{levels:A});let i=[];for(let a=0;a<A;a++){let s=o.getImageLevelInfo(a,0,0),c=o.getImageTranscodedSizeInBytes(a,0,0,n),l=new Uint8Array(c);if(o.transcodeImage(l,a,0,0,n,0,-1,-1)===0)return St("transcode-failed",{sourceFormat:`dfd-model-${e.dfd?.colorModel??"unknown"}-level-${a}`,targetFormat:t});Pt("ktx2.mip.complete",{level:a}),i.push({level:a,width:s.origWidth,height:s.origHeight,data:l})}return{ok:!0,value:{format:t,width:o.getWidth(),height:o.getHeight(),mips:i}}}finally{o.close()}}var Mo=new Uint8Array([171,75,84,88,32,50,48,187,13,10,26,10]);var gc=new TextDecoder;function We(e,t){return new DataView(e.buffer,e.byteOffset+t,4).getUint32(0,!0)}function oo(e,t){return Number(new DataView(e.buffer,e.byteOffset+t,8).getBigUint64(0,!0))}function Br(e,t,r,n){if(t+r>e.length)throw new Error(`KTX2 parse ${n}: OOB (offset=${t}, length=${r}, fileSize=${e.length})`)}function pc(e,t,r){Br(e,t,4,"DFD-totalSize");let n=We(e,t);Br(e,t,n,"DFD-block");let o=t+4,A=We(e,o),i=A&131071,a=A>>>17&32767,s=We(e,o+4),c=s&65535,l=s>>>16&65535,u=We(e,o+8),g=u&255,p=u>>>8&255,d=u>>>16&255,f=u>>>24&255,h=We(e,o+12),I=h&255,b=h>>>8&255,D=h>>>16&255,m=h>>>24&255,Q=We(e,o+16),w=We(e,o+20),S=[Q&255,Q>>>8&255,Q>>>16&255,Q>>>24&255,w&255,w>>>8&255,w>>>16&255,w>>>24&255],N=o+24,M=(l-24)/16,G=[];for(let j=0;j<M;j++){let R=N+j*16,K=We(e,R),z=We(e,R+4),J=We(e,R+8),W=We(e,R+12);G.push({qualifiers:K&15,channelType:K>>>4&255,bitLength:(K>>>12&4095)+1,bitOffset:K>>>24&255,samplePosition:[z&255,z>>>8&255,z>>>16&255,z>>>24&255],sampleLower:J,sampleUpper:W})}return{totalSize:n,vendorId:i,descriptorType:a,versionNumber:c,descriptorBlockSize:l,colorModel:g,colorPrimaries:p,transferFunction:d,flags:f,texelBlockDimension:[I,b,D,m],bytesPlane:S,samples:G}}function dc(e,t,r){if(r===0)return[];let n=[],o=t,A=t+r;for(;o<A;){Br(e,o,4,"KV-keyAndValueByteLength");let i=We(e,o);o+=4,Br(e,o,i,"KV-payload");let a=e.slice(o,o+i),s=a.indexOf(0);s===-1&&(s=a.length);let c=gc.decode(a.slice(0,s)),l=a.slice(s+1);n.push({key:c,value:l}),o+=i;let u=o&3;u!==0&&(o+=4-u)}return n}async function Ba(e){try{if(e.length<12)return St("ktx2-parse-failed",{reason:"truncated-identifier: file shorter than 12-byte KTX2 magic"});for(let l=0;l<12;l++){let u=Mo[l];if(u===void 0||e[l]!==u)return St("ktx2-parse-failed",{reason:"invalid-identifier: not a KTX2 2.0 file"})}if(e.length<80)return St("ktx2-parse-failed",{reason:"truncated-header: file too short for KTX2 header + index (min 80 bytes)"});let t={vkFormat:We(e,12),typeSize:We(e,16),pixelWidth:We(e,20),pixelHeight:We(e,24),pixelDepth:We(e,28),layerCount:We(e,32),faceCount:We(e,36),levelCount:We(e,40),supercompressionScheme:We(e,44)},r={dfdByteOffset:We(e,48),dfdByteLength:We(e,52),kvdByteOffset:We(e,56),kvdByteLength:We(e,60),sgdByteOffset:oo(e,64),sgdByteLength:oo(e,72)},n=t.supercompressionScheme;if(n!==0&&n!==1&&n!==2)return St("ktx2-unsupported-scheme",{scheme:n});let o=Math.max(1,t.levelCount),A=80;Br(e,A,o*24,"level-index");let i=[];for(let l=0;l<o;l++){let u=A+l*24,g=oo(e,u),p=oo(e,u+8),d=oo(e,u+16);if(g+p>e.length)return St("ktx2-parse-failed",{reason:`level-index-OOB: level ${l} byteOffset=${g} byteLength=${p} exceeds file size=${e.length}`});i.push({byteOffset:g,byteLength:p,uncompressedByteLength:d})}let a=null;r.dfdByteLength>0&&(Br(e,r.dfdByteOffset,r.dfdByteLength,"DFD"),a=pc(e,r.dfdByteOffset,r.dfdByteLength));let s=[];r.kvdByteLength>0&&(Br(e,r.kvdByteOffset,r.kvdByteLength,"KVD"),s=dc(e,r.kvdByteOffset,r.kvdByteLength));let c=null;return r.sgdByteLength>0&&(Br(e,r.sgdByteOffset,r.sgdByteLength,"SGD"),c=e.slice(r.sgdByteOffset,r.sgdByteOffset+r.sgdByteLength)),{ok:!0,value:{header:t,index:r,levelIndex:i,dfd:a,kvEntries:s,sgd:c,rawBytes:e}}}catch(t){let r=t instanceof Error?t.message:String(t);return St("ktx2-parse-failed",{reason:`internal: ${r}`})}}function ba(e){return e.length>=Mo.length&&Mo.every((t,r)=>e[r]===t)}async function Ea(e){let t=await Ba(e);if(!t.ok)throw new Error(`KTX2 parse failed: ${t.error.code}`);let{pixelDepth:r,layerCount:n,faceCount:o}=t.value.header;if(r>1||n>1||o!==1)throw new Error("Only 2D KTX2 textures are supported");let A=await Ia(t.value,"rgba8unorm");if(!A.ok)throw new Error(`KTX2 transcode failed: ${A.error.code}`);let{width:i,height:a,mips:s}=A.value;if(!s.length||s.some((c,l)=>c.level!==l||c.width!==Math.max(1,i>>l)||c.height!==Math.max(1,a>>l)||c.data.length!==c.width*c.height*4))throw new Error("KTX2 transcoder returned an invalid mip chain");return{width:i,height:a,levels:s.map(c=>c.data)}}$();$();$();function Wr(e,t){return`
|
|
1151
|
-
@group(${e}) @binding(${t}) var matteTex : texture_2d<f32>;
|
|
1152
|
-
|
|
1153
|
-
fn matteCoverage(fragPos : vec2<f32>) -> f32 {
|
|
1154
|
-
let dims = vec2<f32>(textureDimensions(matteTex));
|
|
1155
|
-
let p = floor(fragPos * dims / max(cam.screenParams.xy, vec2<f32>(1.0)));
|
|
1156
|
-
return textureLoad(matteTex, vec2<i32>(clamp(p, vec2<f32>(0.0), dims - 1.0)), 0).a;
|
|
1157
|
-
}
|
|
1158
|
-
`}var ya=`
|
|
1159
|
-
${mr}
|
|
1160
|
-
|
|
1161
|
-
struct ModelUniforms {
|
|
1162
|
-
modelMatrix : mat4x4<f32>,
|
|
1163
|
-
normalMatrix : mat4x4<f32>,
|
|
1164
|
-
colorTint : vec4<f32>,
|
|
1165
|
-
params : vec4<f32>, // x = opacity, y = twoSided, z = isSkinned, w = flags (bit 0 instanced, bit 1 map UVs, bit 2 matrix instances)
|
|
1166
|
-
materialParams : vec4<f32>, // x = shininess, y = specularIntensity, z = ambientIntensity, w = materialMode (0=unlit, 1=lit, 2=toon)
|
|
1167
|
-
shade : vec4<f32>, // rgb = toon shadow-side color multiplier, a = alpha cutoff (0 = none)
|
|
1168
|
-
pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
|
|
1169
|
-
emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
|
|
1170
|
-
toonShadow : vec4<f32>, // rgb shadow-side multiplier, w diffuse modelling
|
|
1171
|
-
toonLight : vec4<f32>, // rgb lit-side multiplier, w terminator threshold
|
|
1172
|
-
toonParams : vec4<f32>, // x terminator softness, y outline participation
|
|
1173
|
-
maps : vec4<f32>, // x = normal scale (0 = no map), y = occlusion strength, z = has metallic-roughness map, w = has emissive map
|
|
1174
|
-
};
|
|
1175
|
-
|
|
1176
|
-
struct SkinningUniforms {
|
|
1177
|
-
jointMatrices : array<mat4x4<f32>>,
|
|
1178
|
-
};
|
|
1179
|
-
|
|
1180
|
-
struct InstanceData {
|
|
1181
|
-
posScale : vec4<f32>, // xyz = translation, w = scale
|
|
1182
|
-
quat : vec4<f32>, // xyzw = unit rotation quaternion
|
|
1183
|
-
color : vec4<f32>, // rgba = color multiplier
|
|
1184
|
-
emissive : vec4<f32>, // rgb = sRGB emissive color, w = emissiveIntensity
|
|
1185
|
-
};
|
|
1186
|
-
|
|
1187
|
-
@group(0) @binding(0) var<uniform> cam : CameraUniforms;
|
|
1188
|
-
@group(1) @binding(0) var<uniform> model : ModelUniforms;
|
|
1189
|
-
@group(1) @binding(1) var<storage, read> skinning : SkinningUniforms;
|
|
1190
|
-
${Wr(1,2)}@group(1) @binding(3) var backdropTex : texture_2d<f32>;
|
|
1191
|
-
@group(1) @binding(4) var<storage, read> instances : array<InstanceData>;
|
|
1192
|
-
@group(2) @binding(0) var texSampler : sampler;
|
|
1193
|
-
@group(2) @binding(1) var mainTex : texture_2d<f32>;
|
|
1194
|
-
@group(2) @binding(2) var normalTex : texture_2d<f32>;
|
|
1195
|
-
@group(2) @binding(3) var metalRoughTex : texture_2d<f32>;
|
|
1196
|
-
@group(2) @binding(4) var occlusionTex : texture_2d<f32>;
|
|
1197
|
-
@group(2) @binding(5) var emissiveTex : texture_2d<f32>;
|
|
1198
|
-
${Ir}
|
|
1199
|
-
|
|
1200
|
-
struct VertexInput {
|
|
1201
|
-
@location(0) position : vec3<f32>,
|
|
1202
|
-
@location(1) uv : vec2<f32>,
|
|
1203
|
-
@location(2) normal : vec3<f32>,
|
|
1204
|
-
@location(3) joints : vec4<f32>,
|
|
1205
|
-
@location(4) weights : vec4<f32>,
|
|
1206
|
-
@location(5) color : vec4<f32>, // vertex color (display / sRGB), white when absent
|
|
1207
|
-
@location(6) normalUv : vec2<f32>,
|
|
1208
|
-
@location(7) mrUv : vec2<f32>,
|
|
1209
|
-
@location(8) aoUv : vec2<f32>,
|
|
1210
|
-
@location(9) emissiveUv : vec2<f32>,
|
|
1211
|
-
};
|
|
1212
|
-
|
|
1213
|
-
struct VertexOutput {
|
|
1214
|
-
@builtin(position) clipPos : vec4<f32>,
|
|
1215
|
-
@location(0) uv : vec2<f32>,
|
|
1216
|
-
@location(1) worldPos : vec3<f32>,
|
|
1217
|
-
@location(2) worldNormal : vec3<f32>,
|
|
1218
|
-
@location(3) linearDepth : f32,
|
|
1219
|
-
@location(4) color : vec4<f32>,
|
|
1220
|
-
@location(5) normalUv : vec2<f32>,
|
|
1221
|
-
@location(6) mrUv : vec2<f32>,
|
|
1222
|
-
@location(7) aoUv : vec2<f32>,
|
|
1223
|
-
@location(8) emissiveUv : vec2<f32>,
|
|
1224
|
-
@location(9) emissive : vec4<f32>,
|
|
1225
|
-
};
|
|
1226
|
-
|
|
1227
|
-
fn rotateVecByQuat(v: vec3<f32>, q: vec4<f32>) -> vec3<f32> {
|
|
1228
|
-
let t = 2.0 * cross(q.xyz, v);
|
|
1229
|
-
return v + q.w * t + cross(q.xyz, t);
|
|
1230
|
-
}
|
|
1231
|
-
|
|
1232
|
-
@vertex
|
|
1233
|
-
fn vs_main(
|
|
1234
|
-
in: VertexInput,
|
|
1235
|
-
@builtin(instance_index) instanceIndex: u32,
|
|
1236
|
-
) -> VertexOutput {
|
|
1237
|
-
var out: VertexOutput;
|
|
1238
|
-
|
|
1239
|
-
var localPos = in.position;
|
|
1240
|
-
var localNorm = in.normal;
|
|
1241
|
-
|
|
1242
|
-
// Linear Blend Skinning (LBS) on GPU
|
|
1243
|
-
if (model.params.z > 0.5) {
|
|
1244
|
-
let j0 = i32(in.joints.x);
|
|
1245
|
-
let j1 = i32(in.joints.y);
|
|
1246
|
-
let j2 = i32(in.joints.z);
|
|
1247
|
-
let j3 = i32(in.joints.w);
|
|
1248
|
-
|
|
1249
|
-
let w0 = in.weights.x;
|
|
1250
|
-
let w1 = in.weights.y;
|
|
1251
|
-
let w2 = in.weights.z;
|
|
1252
|
-
let w3 = in.weights.w;
|
|
1253
|
-
|
|
1254
|
-
let totalWeight = w0 + w1 + w2 + w3;
|
|
1255
|
-
if (totalWeight > 0.001) {
|
|
1256
|
-
let skinMat = skinning.jointMatrices[j0] * w0 +
|
|
1257
|
-
skinning.jointMatrices[j1] * w1 +
|
|
1258
|
-
skinning.jointMatrices[j2] * w2 +
|
|
1259
|
-
skinning.jointMatrices[j3] * w3;
|
|
1260
|
-
|
|
1261
|
-
let pos4 = skinMat * vec4<f32>(in.position, 1.0);
|
|
1262
|
-
localPos = pos4.xyz;
|
|
1263
|
-
|
|
1264
|
-
let norm4 = skinMat * vec4<f32>(in.normal, 0.0);
|
|
1265
|
-
localNorm = normalize(norm4.xyz);
|
|
1266
|
-
}
|
|
1267
|
-
}
|
|
1268
|
-
|
|
1269
|
-
// Hardware instancing: transform local vertex by instance transform
|
|
1270
|
-
// Static read prevents Tint from dropping the storage buffer binding
|
|
1271
|
-
let dummyInst = instances[0].posScale.x;
|
|
1272
|
-
var instColor = vec4<f32>(1.0);
|
|
1273
|
-
var instEmissive = vec4<f32>(0.0);
|
|
1274
|
-
|
|
1275
|
-
if ((u32(model.params.w) & 4u) != 0u) {
|
|
1276
|
-
let a = instances[instanceIndex * 2u];
|
|
1277
|
-
let b = instances[instanceIndex * 2u + 1u];
|
|
1278
|
-
let instanceModel = mat4x4<f32>(a.posScale, a.quat, a.color, a.emissive);
|
|
1279
|
-
let instanceNormal = mat4x4<f32>(b.posScale, b.quat, b.color, b.emissive);
|
|
1280
|
-
localPos = (instanceModel * vec4<f32>(localPos, 1.0)).xyz;
|
|
1281
|
-
localNorm = (instanceNormal * vec4<f32>(localNorm, 0.0)).xyz;
|
|
1282
|
-
} else if ((u32(model.params.w) & 1u) != 0u) {
|
|
1283
|
-
let inst = instances[instanceIndex];
|
|
1284
|
-
let scaledPos = localPos * inst.posScale.w;
|
|
1285
|
-
localPos = rotateVecByQuat(scaledPos, inst.quat) + inst.posScale.xyz;
|
|
1286
|
-
localNorm = rotateVecByQuat(localNorm, inst.quat);
|
|
1287
|
-
instColor = inst.color;
|
|
1288
|
-
instEmissive = inst.emissive;
|
|
1289
|
-
} else {
|
|
1290
|
-
localPos.x += dummyInst * 0.0;
|
|
1291
|
-
}
|
|
1292
|
-
|
|
1293
|
-
let worldPos4 = model.modelMatrix * vec4<f32>(localPos, 1.0);
|
|
1294
|
-
out.worldPos = worldPos4.xyz;
|
|
1295
|
-
|
|
1296
|
-
let norm4 = model.normalMatrix * vec4<f32>(localNorm, 0.0);
|
|
1297
|
-
out.worldNormal = normalize(norm4.xyz);
|
|
1298
|
-
|
|
1299
|
-
out.clipPos = cam.viewProjMatrix * worldPos4;
|
|
1300
|
-
out.uv = in.uv;
|
|
1301
|
-
let hasMapUvs = (u32(model.params.w) & 2u) != 0u;
|
|
1302
|
-
out.normalUv = select(in.uv, in.normalUv, hasMapUvs);
|
|
1303
|
-
out.mrUv = select(in.uv, in.mrUv, hasMapUvs);
|
|
1304
|
-
out.aoUv = select(in.uv, in.aoUv, hasMapUvs);
|
|
1305
|
-
out.emissiveUv = select(in.uv, in.emissiveUv, hasMapUvs);
|
|
1306
|
-
out.color = in.color * instColor;
|
|
1307
|
-
out.emissive = instEmissive;
|
|
1308
|
-
|
|
1309
|
-
out.linearDepth = dot(worldPos4.xyz - cam.cameraPos.xyz, cam.cameraDir.xyz);
|
|
1310
|
-
return out;
|
|
1311
|
-
}
|
|
1312
|
-
|
|
1313
|
-
struct MeshFragment {
|
|
1314
|
-
color : vec4<f32>, // premultiplied display color
|
|
1315
|
-
hdr : vec4<f32>, // premultiplied scene radiance (bloom source)
|
|
1316
|
-
};
|
|
1317
|
-
|
|
1318
|
-
// Normal mapping without tangents: a cotangent frame from screen-space
|
|
1319
|
-
// derivatives (Sch\xFCler, "Followup: Normal Mapping Without Precomputed Tangents").
|
|
1320
|
-
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> {
|
|
1321
|
-
let dp2perp = cross(dp2, N);
|
|
1322
|
-
let dp1perp = cross(N, dp1);
|
|
1323
|
-
// The derivation assumes cross(dp1, dp2) points along N; with this
|
|
1324
|
-
// engine's y-down view basis it can point away, mirroring the frame.
|
|
1325
|
-
let handed = select(1.0, -1.0, dot(cross(dp1, dp2), N) < 0.0);
|
|
1326
|
-
let T = (dp2perp * duv1.x + dp1perp * duv2.x) * handed;
|
|
1327
|
-
let B = (dp2perp * duv1.y + dp1perp * duv2.y) * handed;
|
|
1328
|
-
let invmax = inverseSqrt(max(max(dot(T, T), dot(B, B)), 1e-20));
|
|
1329
|
-
// glTF maps are +Y up while v grows down the image: green points along -B.
|
|
1330
|
-
return normalize(T * (tn.x * invmax) - B * (tn.y * invmax) + N * tn.z);
|
|
1331
|
-
}
|
|
1332
|
-
|
|
1333
|
-
// Glass: what is behind the 3D batch on screen (backdrop), bent by
|
|
1334
|
-
// refraction along the surface normal with a red/blue split, frosted by a
|
|
1335
|
-
// disc blur, tinted by the color, under Fresnel-weighted reflections.
|
|
1336
|
-
// shade.rgb = (dispersion, thickness px, frost), pbr.w = ior.
|
|
1337
|
-
fn backdropAt(uv: vec2<f32>) -> vec3<f32> {
|
|
1338
|
-
return textureSampleLevel(backdropTex, texSampler, clamp(uv, vec2<f32>(0.001), vec2<f32>(0.999)), 0.0).rgb;
|
|
1339
|
-
}
|
|
1340
|
-
|
|
1341
|
-
// rimWidth: how much 1 - N\xB7V changes across this pixel (fwidth, taken in
|
|
1342
|
-
// uniform control flow by the caller). Rim effects narrower than a pixel are
|
|
1343
|
-
// faded out, or per-pixel shading turns them into stair-stepped lines that
|
|
1344
|
-
// MSAA (coverage only) cannot smooth.
|
|
1345
|
-
fn shadeGlass(in: VertexOutput, Nin: vec3<f32>, tint: vec3<f32>, alpha: f32, rimWidth: f32) -> MeshFragment {
|
|
1346
|
-
let V = normalize(cam.cameraPos.xyz - in.worldPos);
|
|
1347
|
-
var N = Nin;
|
|
1348
|
-
if (dot(N, V) < 0.0) { N = -N; }
|
|
1349
|
-
let NdotV = clamp(dot(N, V), 0.0, 1.0);
|
|
1350
|
-
// Also fade toward edge-on: a face seen at a grazing angle is a sliver
|
|
1351
|
-
// under a pixel tall (a slab's bottom), which would alias the same way.
|
|
1352
|
-
let rimAA = clamp(1.0 - rimWidth * 2.5, 0.0, 1.0) * smoothstep(0.03, 0.22, NdotV);
|
|
1353
|
-
let rim = (1.0 - NdotV) * rimAA;
|
|
1354
|
-
let ior = max(model.pbr.w, 1.0001);
|
|
1355
|
-
let screen = max(cam.screenParams.xy, vec2<f32>(1.0));
|
|
1356
|
-
let uv = in.clipPos.xy / screen;
|
|
1357
|
-
// Screen-space bend: the normal's in-plane part, stronger toward the rim.
|
|
1358
|
-
let bend = N.xy * model.shade.g * (1.0 - 1.0 / ior) * (0.6 + rim) * rimAA / screen;
|
|
1359
|
-
let disp = model.shade.r;
|
|
1360
|
-
let frost = model.shade.b * 22.0 / screen;
|
|
1361
|
-
var col = vec3<f32>(0.0);
|
|
1362
|
-
let taps = select(1, 8, model.shade.b > 0.001);
|
|
1363
|
-
for (var i = 0; i < taps; i++) {
|
|
1364
|
-
let a = f32(i) * 2.399963;
|
|
1365
|
-
let r = sqrt((f32(i) + 0.5) / f32(taps));
|
|
1366
|
-
let o = select(vec2<f32>(0.0), vec2<f32>(cos(a), sin(a)) * r * frost, taps > 1);
|
|
1367
|
-
col += vec3<f32>(
|
|
1368
|
-
backdropAt(uv - bend * (1.0 + disp * 6.0) + o).r,
|
|
1369
|
-
backdropAt(uv - bend + o).g,
|
|
1370
|
-
backdropAt(uv - bend * (1.0 - disp * 6.0) + o).b,
|
|
1371
|
-
);
|
|
1372
|
-
}
|
|
1373
|
-
col /= f32(taps);
|
|
1374
|
-
// Light travels further through the glass toward the rim: the tint
|
|
1375
|
-
// deepens and the body darkens there, which is what outlines glass.
|
|
1376
|
-
let depthTint = mix(vec3<f32>(1.0), tint, 0.55 + 0.45 * rim);
|
|
1377
|
-
let transmitted = col * depthTint * (1.0 - 0.45 * rim * rim);
|
|
1378
|
-
let f0 = pow((ior - 1.0) / (ior + 1.0), 2.0);
|
|
1379
|
-
let F = f0 + (1.0 - f0) * pow(rim, 5.0);
|
|
1380
|
-
let lit = shadeSurfaceFull(in.worldPos, N, vec3<f32>(0.0), model.materialParams, vec4<f32>(model.pbr.x, 0.0, 0.0, 0.0), vec4<f32>(0.0), model.toonShadow, model.toonLight, model.toonParams);
|
|
1381
|
-
// Grazing faces mirror the room; keep that faint so dark scenes stay dark
|
|
1382
|
-
// and the studio highlights below carry the shape.
|
|
1383
|
-
let sheen = vec3<f32>(0.9, 0.94, 1.0) * F * 0.22 + tint * 0.05 * (0.4 + rim);
|
|
1384
|
-
// A studio in the reflection: a sharp key and two strip softboxes, which
|
|
1385
|
-
// is most of what makes glass read as glass.
|
|
1386
|
-
let R = reflect(-V, N);
|
|
1387
|
-
// Tight: a flat face only flashes as it turns through the light.
|
|
1388
|
-
let key = pow(max(dot(R, normalize(vec3<f32>(-0.45, -0.75, -0.5))), 0.0), 600.0) * 1.8;
|
|
1389
|
-
// Two tall softboxes: narrow bands in the reflection, brightest above.
|
|
1390
|
-
let strips = (1.0 - smoothstep(0.03, 0.07, abs(R.x + 0.45))) * smoothstep(0.3, -0.5, R.y) * 1.1
|
|
1391
|
-
+ (1.0 - smoothstep(0.02, 0.05, abs(R.x - 0.6))) * smoothstep(0.4, -0.3, R.y) * 0.7;
|
|
1392
|
-
let studio = vec3<f32>(1.0, 0.98, 0.95) * (key + strips * (0.25 + F));
|
|
1393
|
-
// A thin bright line where the surface turns away: glass silhouettes.
|
|
1394
|
-
let edge = vec3<f32>(1.0, 0.99, 0.97) * smoothstep(0.8, 0.97, rim) * 0.55;
|
|
1395
|
-
let rgb = transmitted * (1.0 - F) + lit.display + sheen + studio + edge;
|
|
1396
|
-
var out: MeshFragment;
|
|
1397
|
-
out.color = vec4<f32>(rgb * alpha, alpha);
|
|
1398
|
-
out.hdr = vec4<f32>(srgbToLinear(transmitted * (1.0 - F)) * alpha + lit.hdr * alpha + srgbToLinear(sheen + studio + edge) * alpha, alpha);
|
|
1399
|
-
return out;
|
|
1400
|
-
}
|
|
1401
|
-
|
|
1402
|
-
fn shadeMesh(in: VertexOutput, isFront: bool) -> MeshFragment {
|
|
1403
|
-
// Every sample and derivative up front, in uniform control flow.
|
|
1404
|
-
var texColor = textureSample(mainTex, texSampler, in.uv);
|
|
1405
|
-
let normalSample = textureSample(normalTex, texSampler, in.normalUv).xyz;
|
|
1406
|
-
let mrSample = textureSample(metalRoughTex, texSampler, in.mrUv);
|
|
1407
|
-
let aoSample = textureSample(occlusionTex, texSampler, in.aoUv).r;
|
|
1408
|
-
let emissiveSample = textureSample(emissiveTex, texSampler, in.emissiveUv).rgb;
|
|
1409
|
-
let dp1 = dpdx(in.worldPos);
|
|
1410
|
-
let dp2 = dpdy(in.worldPos);
|
|
1411
|
-
let duv1 = dpdx(in.normalUv);
|
|
1412
|
-
let duv2 = dpdy(in.normalUv);
|
|
1413
|
-
let rimWidth = fwidth(1.0 - abs(dot(normalize(in.worldNormal), normalize(cam.cameraPos.xyz - in.worldPos))));
|
|
1414
|
-
|
|
1415
|
-
if (!isFront && model.params.y < 0.5) {
|
|
1416
|
-
discard;
|
|
1417
|
-
}
|
|
1418
|
-
if (texColor.a < model.shade.a) {
|
|
1419
|
-
discard;
|
|
1420
|
-
}
|
|
1421
|
-
let alpha = texColor.a * in.color.a * model.params.x * model.colorTint.a * matteCoverage(in.clipPos.xy);
|
|
1422
|
-
if (alpha <= 0.001) {
|
|
1423
|
-
discard;
|
|
1424
|
-
}
|
|
1425
|
-
|
|
1426
|
-
let baseRgb = texColor.rgb * in.color.rgb * model.colorTint.rgb;
|
|
1427
|
-
var out: MeshFragment;
|
|
1428
|
-
var N = normalize(in.worldNormal);
|
|
1429
|
-
if (model.maps.x > 0.0) {
|
|
1430
|
-
var tn = normalSample * 2.0 - 1.0;
|
|
1431
|
-
tn = vec3<f32>(tn.xy * model.maps.x, tn.z);
|
|
1432
|
-
// The frame follows the surface side the camera sees.
|
|
1433
|
-
var Nf = N;
|
|
1434
|
-
if (dot(Nf, cam.cameraPos.xyz - in.worldPos) < 0.0) {
|
|
1435
|
-
Nf = -Nf;
|
|
1436
|
-
}
|
|
1437
|
-
N = perturbNormal(Nf, in.worldPos, in.normalUv, tn, dp1, dp2, duv1, duv2);
|
|
1438
|
-
}
|
|
1439
|
-
var pbr = model.pbr;
|
|
1440
|
-
if (model.maps.z > 0.5) {
|
|
1441
|
-
pbr.x = select(pbr.x, 1.0, pbr.x < 0.0) * mrSample.g;
|
|
1442
|
-
pbr.y = pbr.y * mrSample.b;
|
|
1443
|
-
}
|
|
1444
|
-
if (model.pbr.z > 0.5) {
|
|
1445
|
-
return shadeGlass(in, N, baseRgb, alpha, rimWidth);
|
|
1446
|
-
}
|
|
1447
|
-
var material = model.materialParams;
|
|
1448
|
-
material.z = material.z * mix(1.0, aoSample, clamp(model.maps.y, 0.0, 1.0));
|
|
1449
|
-
var emissive = model.emissive;
|
|
1450
|
-
if (model.maps.w > 0.5) {
|
|
1451
|
-
// Linear multiply in display space is close enough for an 8-bit map.
|
|
1452
|
-
emissive = vec4<f32>(emissive.rgb * emissiveSample, emissive.w);
|
|
1453
|
-
}
|
|
1454
|
-
if (model.params.w > 0.5 && (in.emissive.w > 0.0 || dot(in.emissive.rgb, in.emissive.rgb) > 0.0)) {
|
|
1455
|
-
emissive = in.emissive;
|
|
1456
|
-
}
|
|
1457
|
-
let shaded = shadeSurfaceFull(in.worldPos, N, baseRgb, material, pbr, emissive, model.toonShadow, model.toonLight, model.toonParams);
|
|
1458
|
-
out.color = vec4<f32>(shaded.display * alpha, alpha);
|
|
1459
|
-
out.hdr = vec4<f32>(shaded.hdr * alpha, alpha);
|
|
1460
|
-
return out;
|
|
1461
|
-
}
|
|
1462
|
-
|
|
1463
|
-
struct MrtOutput {
|
|
1464
|
-
@location(0) color : vec4<f32>,
|
|
1465
|
-
@location(1) depth : vec4<f32>,
|
|
1466
|
-
};
|
|
1467
|
-
|
|
1468
|
-
struct BloomOutput {
|
|
1469
|
-
@location(0) color : vec4<f32>,
|
|
1470
|
-
@location(1) hdr : vec4<f32>,
|
|
1471
|
-
};
|
|
1472
|
-
|
|
1473
|
-
struct MrtBloomOutput {
|
|
1474
|
-
@location(0) color : vec4<f32>,
|
|
1475
|
-
@location(1) depth : vec4<f32>,
|
|
1476
|
-
@location(2) hdr : vec4<f32>,
|
|
1477
|
-
};
|
|
1478
|
-
|
|
1479
|
-
@fragment
|
|
1480
|
-
fn fs_single(in: VertexOutput, @builtin(front_facing) isFront: bool) -> @location(0) vec4<f32> {
|
|
1481
|
-
return shadeMesh(in, isFront).color;
|
|
1482
|
-
}
|
|
1483
|
-
|
|
1484
|
-
@fragment
|
|
1485
|
-
fn fs_mrt(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtOutput {
|
|
1486
|
-
var out: MrtOutput;
|
|
1487
|
-
out.color = shadeMesh(in, isFront).color;
|
|
1488
|
-
out.depth = geometryPixel(in.linearDepth, in.worldNormal, model.toonParams.y);
|
|
1489
|
-
return out;
|
|
1490
|
-
}
|
|
1491
|
-
|
|
1492
|
-
@fragment
|
|
1493
|
-
fn fs_single_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> BloomOutput {
|
|
1494
|
-
let f = shadeMesh(in, isFront);
|
|
1495
|
-
var out: BloomOutput;
|
|
1496
|
-
out.color = f.color;
|
|
1497
|
-
out.hdr = f.hdr;
|
|
1498
|
-
return out;
|
|
1499
|
-
}
|
|
1500
|
-
|
|
1501
|
-
@fragment
|
|
1502
|
-
fn fs_mrt_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtBloomOutput {
|
|
1503
|
-
let f = shadeMesh(in, isFront);
|
|
1504
|
-
var out: MrtBloomOutput;
|
|
1505
|
-
out.color = f.color;
|
|
1506
|
-
out.depth = geometryPixel(in.linearDepth, in.worldNormal, model.toonParams.y);
|
|
1507
|
-
out.hdr = f.hdr;
|
|
1508
|
-
return out;
|
|
1509
|
-
}
|
|
1510
|
-
`;$();function Jr(e){return{binding:e,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}}var Ca=new WeakMap;function br(e){let t=Ca.get(e);if(!t){let r=e.createTexture({label:"Matte3DFullCoverage",size:[1,1],format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST});e.queue.writeTexture({texture:r},new Uint8Array([255,255,255,255]),{bytesPerRow:4},[1,1]),t=r.createView(),Ca.set(e,t)}return t}$();$();var Qa=`
|
|
1511
|
-
${mr}
|
|
1512
|
-
// Grid cells either side a relief's normals span.
|
|
1513
|
-
const RELIEF_NORMAL_CELLS : f32 = 4.0;
|
|
1514
|
-
|
|
1515
|
-
struct ModelUniforms {
|
|
1516
|
-
modelMatrix : mat4x4<f32>,
|
|
1517
|
-
normalMatrix : mat4x4<f32>,
|
|
1518
|
-
colorTint : vec4<f32>,
|
|
1519
|
-
borderColor : vec4<f32>,
|
|
1520
|
-
params : vec4<f32>, // x = opacity, y = borderRadius, z = twoSided (1.0 = yes), w = borderWidth
|
|
1521
|
-
dimensions : vec4<f32>, // x = width, y = height, zw = texture extent the layer covers (0 = whole texture)
|
|
1522
|
-
materialParams : vec4<f32>, // x = shininess, y = specularIntensity, z = ambientIntensity, w = materialMode (0=unlit, 1=lit)
|
|
1523
|
-
pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
|
|
1524
|
-
emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
|
|
1525
|
-
toonShadow : vec4<f32>, // rgb shadow-side multiplier, w diffuse modelling
|
|
1526
|
-
toonLight : vec4<f32>, // rgb lit-side multiplier, w terminator threshold
|
|
1527
|
-
toonParams : vec4<f32>, // x terminator softness, y outline participation
|
|
1528
|
-
relief : vec4<f32>, // x = amount (px), y = on, w = grid cells per side
|
|
1529
|
-
reliefRect : vec4<f32>, // xy = where the layer's box starts in reliefTex (0..1), zw = its size
|
|
1530
|
-
reliefEye : vec4<f32>, // xyz = the eye the surface keeps its look from (the default camera)
|
|
1531
|
-
};
|
|
1532
|
-
|
|
1533
|
-
@group(0) @binding(0) var<uniform> cam : CameraUniforms;
|
|
1534
|
-
@group(1) @binding(0) var<uniform> model : ModelUniforms;
|
|
1535
|
-
${Wr(1,1)}@group(1) @binding(2) var reliefTex : texture_2d<f32>;
|
|
1536
|
-
@group(2) @binding(0) var texSampler : sampler;
|
|
1537
|
-
@group(2) @binding(1) var mainTex : texture_2d<f32>;
|
|
1538
|
-
${Ir}
|
|
1539
|
-
|
|
1540
|
-
struct VertexInput {
|
|
1541
|
-
@location(0) position : vec3<f32>,
|
|
1542
|
-
@location(1) uv : vec2<f32>,
|
|
1543
|
-
@location(2) normal : vec3<f32>,
|
|
1544
|
-
};
|
|
1545
|
-
|
|
1546
|
-
struct VertexOutput {
|
|
1547
|
-
@builtin(position) clipPos : vec4<f32>,
|
|
1548
|
-
@location(0) uv : vec2<f32>,
|
|
1549
|
-
@location(1) worldPos : vec3<f32>,
|
|
1550
|
-
@location(2) worldNormal : vec3<f32>,
|
|
1551
|
-
@location(3) linearDepth : f32,
|
|
1552
|
-
@location(4) localPos : vec2<f32>,
|
|
1553
|
-
};
|
|
1554
|
-
|
|
1555
|
-
// Relief: the layer's plane pushed toward the eye by the brightness of a
|
|
1556
|
-
// second picture, so a flat quad becomes a surface (see DrawQuad3DOpts.relief).
|
|
1557
|
-
fn reliefAt(uv: vec2<f32>) -> f32 {
|
|
1558
|
-
let dims = vec2<f32>(textureDimensions(reliefTex));
|
|
1559
|
-
let p = (model.reliefRect.xy + clamp(uv, vec2<f32>(0.0), vec2<f32>(1.0)) * model.reliefRect.zw) * dims - 0.5;
|
|
1560
|
-
let i = floor(p);
|
|
1561
|
-
let f = p - i;
|
|
1562
|
-
// Texels of the layer's own box only: past its edge the relief was never drawn.
|
|
1563
|
-
let lo = max(floor(model.reliefRect.xy * dims), vec2<f32>(0.0));
|
|
1564
|
-
let hi = min(ceil((model.reliefRect.xy + model.reliefRect.zw) * dims) - 1.0, dims - 1.0);
|
|
1565
|
-
let a = textureLoad(reliefTex, vec2<i32>(clamp(i, lo, hi)), 0).rgb;
|
|
1566
|
-
let b = textureLoad(reliefTex, vec2<i32>(clamp(i + vec2<f32>(1.0, 0.0), lo, hi)), 0).rgb;
|
|
1567
|
-
let c = textureLoad(reliefTex, vec2<i32>(clamp(i + vec2<f32>(0.0, 1.0), lo, hi)), 0).rgb;
|
|
1568
|
-
let d = textureLoad(reliefTex, vec2<i32>(clamp(i + vec2<f32>(1.0, 1.0), lo, hi)), 0).rgb;
|
|
1569
|
-
let rgb = mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
|
|
1570
|
-
return dot(rgb, vec3<f32>(0.2126, 0.7152, 0.0722));
|
|
1571
|
-
}
|
|
1572
|
-
|
|
1573
|
-
// The plane's front: the side the default camera sees.
|
|
1574
|
-
fn reliefFront() -> vec3<f32> {
|
|
1575
|
-
return normalize((model.normalMatrix * vec4<f32>(0.0, 0.0, -1.0, 0.0)).xyz);
|
|
1576
|
-
}
|
|
1577
|
-
|
|
1578
|
-
// A point of the plane lifted by its relief along the ray to the eye, so from
|
|
1579
|
-
// the eye it lands on the same pixel as the flat picture.
|
|
1580
|
-
fn reliefPoint(local: vec2<f32>, uv: vec2<f32>) -> vec3<f32> {
|
|
1581
|
-
let flat = (model.modelMatrix * vec4<f32>(local, 0.0, 1.0)).xyz;
|
|
1582
|
-
let n = reliefFront();
|
|
1583
|
-
let h = model.relief.x * reliefAt(uv);
|
|
1584
|
-
let toEye = model.reliefEye.xyz - flat;
|
|
1585
|
-
let along = dot(toEye, n);
|
|
1586
|
-
return select(flat + n * h, flat + toEye * (h / along), along > 1.0);
|
|
1587
|
-
}
|
|
1588
|
-
|
|
1589
|
-
@vertex
|
|
1590
|
-
fn vs_main(in: VertexInput) -> VertexOutput {
|
|
1591
|
-
var out: VertexOutput;
|
|
1592
|
-
|
|
1593
|
-
let hasDimensions = model.dimensions.x > 0.0 && model.dimensions.y > 0.0;
|
|
1594
|
-
let hasRelief = model.relief.y > 0.5;
|
|
1595
|
-
var pad = 0.0;
|
|
1596
|
-
if (hasDimensions && !hasRelief) {
|
|
1597
|
-
let viewPos = cam.viewMatrix * model.modelMatrix * vec4<f32>(0.0, 0.0, 0.0, 1.0);
|
|
1598
|
-
let viewDepth = max(abs(viewPos.z), 0.1);
|
|
1599
|
-
let projScale = max(cam.projMatrix[1][1], 0.001);
|
|
1600
|
-
let worldPx = (2.0 * viewDepth) / max(cam.screenParams.y * projScale, 0.001);
|
|
1601
|
-
pad = max(4.0 * worldPx, 4.0);
|
|
1602
|
-
}
|
|
1603
|
-
let scalePad = select(vec2<f32>(1.0), 1.0 + vec2<f32>(2.0 * pad) / model.dimensions.xy, hasDimensions);
|
|
1604
|
-
|
|
1605
|
-
let paddedPos = vec3<f32>(in.position.xy * scalePad, in.position.z);
|
|
1606
|
-
var worldPos4 = model.modelMatrix * vec4<f32>(paddedPos, 1.0);
|
|
1607
|
-
|
|
1608
|
-
// Normal transformed by 3x3 normal matrix
|
|
1609
|
-
let norm4 = model.normalMatrix * vec4<f32>(in.normal, 0.0);
|
|
1610
|
-
out.worldNormal = normalize(norm4.xyz);
|
|
1611
|
-
if (hasRelief) {
|
|
1612
|
-
let p = reliefPoint(in.position.xy, in.uv);
|
|
1613
|
-
// Central differences a few cells wide: an 8-bit height map steps every
|
|
1614
|
-
// level, and normals from adjacent cells would light those steps as rings.
|
|
1615
|
-
let e = RELIEF_NORMAL_CELLS / max(model.relief.w, 1.0);
|
|
1616
|
-
let dx = vec2<f32>(e, 0.0);
|
|
1617
|
-
let dy = vec2<f32>(0.0, e);
|
|
1618
|
-
let tx = reliefPoint(in.position.xy + dx, in.uv + dx) - reliefPoint(in.position.xy - dx, in.uv - dx);
|
|
1619
|
-
let ty = reliefPoint(in.position.xy + dy, in.uv + dy) - reliefPoint(in.position.xy - dy, in.uv - dy);
|
|
1620
|
-
var nrm = normalize(cross(tx, ty));
|
|
1621
|
-
if (dot(nrm, reliefFront()) < 0.0) {
|
|
1622
|
-
nrm = -nrm;
|
|
1623
|
-
}
|
|
1624
|
-
worldPos4 = vec4<f32>(p, 1.0);
|
|
1625
|
-
out.worldNormal = nrm;
|
|
1626
|
-
}
|
|
1627
|
-
out.worldPos = worldPos4.xyz;
|
|
1628
|
-
|
|
1629
|
-
out.clipPos = cam.viewProjMatrix * worldPos4;
|
|
1630
|
-
|
|
1631
|
-
out.localPos = in.position.xy * (model.dimensions.xy + vec2<f32>(2.0 * pad));
|
|
1632
|
-
// A layer of fractional size renders into a texture rounded up to whole
|
|
1633
|
-
// pixels: map the quad onto the part it covers, not the whole texture,
|
|
1634
|
-
// or the content is stretched by up to a pixel and resampled off-grid.
|
|
1635
|
-
let uvExtent = select(model.dimensions.zw, vec2<f32>(1.0), model.dimensions.zw <= vec2<f32>(0.0));
|
|
1636
|
-
out.uv = select(in.uv, (out.localPos / model.dimensions.xy + vec2<f32>(0.5)) * uvExtent, hasDimensions);
|
|
1637
|
-
|
|
1638
|
-
// Linear camera depth along optical viewing axis
|
|
1639
|
-
out.linearDepth = dot(worldPos4.xyz - cam.cameraPos.xyz, cam.cameraDir.xyz);
|
|
1640
|
-
return out;
|
|
1641
|
-
}
|
|
1642
|
-
|
|
1643
|
-
fn sdRoundedRectWithNormal(p: vec2<f32>, b: vec2<f32>, r: f32) -> vec3<f32> {
|
|
1644
|
-
let q = abs(p) - b + vec2<f32>(r);
|
|
1645
|
-
let sx = select(1.0, -1.0, p.x < 0.0);
|
|
1646
|
-
let sy = select(1.0, -1.0, p.y < 0.0);
|
|
1647
|
-
let s = vec2<f32>(sx, sy);
|
|
1648
|
-
|
|
1649
|
-
// Outside corner arc region
|
|
1650
|
-
if (q.x > 0.0 && q.y > 0.0) {
|
|
1651
|
-
let l = length(q);
|
|
1652
|
-
let n = select(vec2<f32>(0.0, 1.0), q / l, l > 0.0001);
|
|
1653
|
-
return vec3<f32>(l - r, s * n);
|
|
1654
|
-
}
|
|
1655
|
-
|
|
1656
|
-
// Straight edges or interior
|
|
1657
|
-
if (q.x > q.y) {
|
|
1658
|
-
let dist = q.x - r;
|
|
1659
|
-
return vec3<f32>(dist, s.x, 0.0);
|
|
1660
|
-
} else {
|
|
1661
|
-
let dist = q.y - r;
|
|
1662
|
-
return vec3<f32>(dist, 0.0, s.y);
|
|
1663
|
-
}
|
|
1664
|
-
}
|
|
1665
|
-
|
|
1666
|
-
struct QuadFragment {
|
|
1667
|
-
color : vec4<f32>, // premultiplied display color
|
|
1668
|
-
hdr : vec4<f32>, // premultiplied scene radiance (bloom source)
|
|
1669
|
-
};
|
|
1670
|
-
|
|
1671
|
-
fn shadeQuad(in: VertexOutput, isFront: bool) -> QuadFragment {
|
|
1672
|
-
// One-sided quads cull against their declared normal, not the hardware
|
|
1673
|
-
// winding: the Y-down view basis mirrors winding, so front_facing reads
|
|
1674
|
-
// camera-facing quads as back faces.
|
|
1675
|
-
if (model.params.z < 0.5 && dot(in.worldNormal, cam.cameraPos.xyz - in.worldPos) < 0.0) {
|
|
1676
|
-
discard;
|
|
1677
|
-
}
|
|
1678
|
-
|
|
1679
|
-
var outerAlpha = 1.0;
|
|
1680
|
-
var borderFactor = 0.0;
|
|
1681
|
-
let br = model.params.y;
|
|
1682
|
-
let borderWidth = model.params.w;
|
|
1683
|
-
let hasDimensions = model.dimensions.x > 0.0 && model.dimensions.y > 0.0;
|
|
1684
|
-
|
|
1685
|
-
if (hasDimensions) {
|
|
1686
|
-
let halfSize = model.dimensions.xy * 0.5;
|
|
1687
|
-
let normData = sdRoundedRectWithNormal(in.localPos, halfSize, br);
|
|
1688
|
-
|
|
1689
|
-
let uvDx = dpdx(in.localPos);
|
|
1690
|
-
let uvDy = dpdy(in.localPos);
|
|
1691
|
-
|
|
1692
|
-
let dPdx = normData.y * uvDx.x + normData.z * uvDx.y;
|
|
1693
|
-
let dPdy = normData.y * uvDy.x + normData.z * uvDy.y;
|
|
1694
|
-
let gradLen = max(sqrt(dPdx * dPdx + dPdy * dPdy), 0.001);
|
|
1695
|
-
|
|
1696
|
-
let distPixel = normData.x / gradLen;
|
|
1697
|
-
outerAlpha = clamp(0.5 - distPixel, 0.0, 1.0);
|
|
1698
|
-
if (outerAlpha <= 0.001) {
|
|
1699
|
-
discard;
|
|
1700
|
-
}
|
|
1701
|
-
|
|
1702
|
-
if (borderWidth > 0.0 && model.borderColor.a > 0.0) {
|
|
1703
|
-
let borderWidthPixel = max(borderWidth / gradLen, 0.0);
|
|
1704
|
-
let innerAlpha = clamp(0.5 - (distPixel + borderWidthPixel), 0.0, 1.0);
|
|
1705
|
-
borderFactor = clamp(outerAlpha - innerAlpha, 0.0, 1.0) * model.borderColor.a;
|
|
1706
|
-
}
|
|
1707
|
-
}
|
|
1708
|
-
|
|
1709
|
-
let clampedUv = clamp(in.uv, vec2<f32>(0.0), vec2<f32>(1.0));
|
|
1710
|
-
let dxUV = dpdx(in.uv);
|
|
1711
|
-
let dyUV = dpdy(in.uv);
|
|
1712
|
-
var texColor = textureSampleGrad(mainTex, texSampler, clampedUv, dxUV, dyUV);
|
|
1713
|
-
let texAlpha = texColor.a;
|
|
1714
|
-
|
|
1715
|
-
let unmultipliedRgb = select(texColor.rgb / texAlpha, texColor.rgb, texAlpha < 0.001);
|
|
1716
|
-
let baseRgb = mix(unmultipliedRgb * model.colorTint.rgb, model.borderColor.rgb, borderFactor);
|
|
1717
|
-
let alpha = mix(texAlpha, 1.0, borderFactor) * model.params.x * model.colorTint.a * outerAlpha * matteCoverage(in.clipPos.xy);
|
|
1718
|
-
if (alpha <= 0.001) {
|
|
1719
|
-
discard;
|
|
1720
|
-
}
|
|
1721
|
-
|
|
1722
|
-
let shaded = shadeSurfaceFull(in.worldPos, in.worldNormal, baseRgb, model.materialParams, model.pbr, model.emissive, model.toonShadow, model.toonLight, model.toonParams);
|
|
1723
|
-
var out: QuadFragment;
|
|
1724
|
-
out.color = vec4<f32>(shaded.display * alpha, alpha);
|
|
1725
|
-
out.hdr = vec4<f32>(shaded.hdr * alpha, alpha);
|
|
1726
|
-
return out;
|
|
1727
|
-
}
|
|
1728
|
-
|
|
1729
|
-
struct MrtOutput {
|
|
1730
|
-
@location(0) color : vec4<f32>,
|
|
1731
|
-
@location(1) depth : vec4<f32>,
|
|
1732
|
-
};
|
|
1733
|
-
|
|
1734
|
-
struct BloomOutput {
|
|
1735
|
-
@location(0) color : vec4<f32>,
|
|
1736
|
-
@location(1) hdr : vec4<f32>,
|
|
1737
|
-
};
|
|
1738
|
-
|
|
1739
|
-
struct MrtBloomOutput {
|
|
1740
|
-
@location(0) color : vec4<f32>,
|
|
1741
|
-
@location(1) depth : vec4<f32>,
|
|
1742
|
-
@location(2) hdr : vec4<f32>,
|
|
1743
|
-
};
|
|
1744
|
-
|
|
1745
|
-
@fragment
|
|
1746
|
-
fn fs_single(in: VertexOutput, @builtin(front_facing) isFront: bool) -> @location(0) vec4<f32> {
|
|
1747
|
-
return shadeQuad(in, isFront).color;
|
|
1748
|
-
}
|
|
1749
|
-
|
|
1750
|
-
@fragment
|
|
1751
|
-
fn fs_mrt(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtOutput {
|
|
1752
|
-
var out: MrtOutput;
|
|
1753
|
-
out.color = shadeQuad(in, isFront).color;
|
|
1754
|
-
out.depth = geometryPixel(in.linearDepth, in.worldNormal, model.toonParams.y);
|
|
1755
|
-
return out;
|
|
1756
|
-
}
|
|
1757
|
-
|
|
1758
|
-
@fragment
|
|
1759
|
-
fn fs_single_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> BloomOutput {
|
|
1760
|
-
let f = shadeQuad(in, isFront);
|
|
1761
|
-
var out: BloomOutput;
|
|
1762
|
-
out.color = f.color;
|
|
1763
|
-
out.hdr = f.hdr;
|
|
1764
|
-
return out;
|
|
1765
|
-
}
|
|
1766
|
-
|
|
1767
|
-
@fragment
|
|
1768
|
-
fn fs_mrt_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtBloomOutput {
|
|
1769
|
-
let f = shadeQuad(in, isFront);
|
|
1770
|
-
var out: MrtBloomOutput;
|
|
1771
|
-
out.color = f.color;
|
|
1772
|
-
out.depth = geometryPixel(in.linearDepth, in.worldNormal, model.toonParams.y);
|
|
1773
|
-
out.hdr = f.hdr;
|
|
1774
|
-
return out;
|
|
1775
|
-
}
|
|
1776
|
-
|
|
1777
|
-
// Shadow-map pass: depth only, alpha-tested so a cut-out casts its shape.
|
|
1778
|
-
@fragment
|
|
1779
|
-
fn fs_shadow(in: VertexOutput) {
|
|
1780
|
-
let clampedUv = clamp(in.uv, vec2<f32>(0.0), vec2<f32>(1.0));
|
|
1781
|
-
let a = textureSampleLevel(mainTex, texSampler, clampedUv, 0.0).a * model.params.x * model.colorTint.a;
|
|
1782
|
-
if (a < 0.5) {
|
|
1783
|
-
discard;
|
|
1784
|
-
}
|
|
1785
|
-
}
|
|
1786
|
-
`;$();var So="depth32float",qr={format:So,depthWriteEnabled:!0,depthCompare:"less-equal",depthBias:2,depthBiasSlopeScale:2.5,depthBiasClamp:.01};$();var Jt=20;function Xr(e,t,r,n){t[r]=e.roughness??-1,t[r+1]=e.metallic??0,t[r+2]=0,t[r+3]=0;let o=e.toon?.shadowColor?Mt(e.toon.shadowColor):null;t.set(o?[o.r,o.g,o.b]:n??[.5,.5,.55],r+8),t[r+11]=e.toon?.diffuse??0;let A=Mt(e.toon?.lightColor??"#ffffff");t.set([A.r,A.g,A.b,e.toon?.threshold??.075],r+12),t.set([e.toon?.softness??.25,e.outline===!1?0:1,0,0],r+16);let i=e.emissive;if(i==null){t.fill(0,r+4,r+8);return}let a;if(Array.isArray(i))a=[i[0],i[1],i[2]];else{let s=Mt(i);a=[s.r*s.a,s.g*s.a,s.b*s.a]}t[r+4]=a[0],t[r+5]=a[1],t[r+6]=a[2],t[r+7]=e.emissiveIntensity??1}function sA(e,t="Lights3DLayout"){return e.createBindGroupLayout({label:t,entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"depth",viewDimension:"2d-array"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"comparison"}},{binding:3,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"read-only-storage"}}]})}var Er=512,xa=52+Jt+12;function cA(e){let t=e.roughness!==void 0?Math.max(1,(1-e.roughness)*128):e.shininess??32,r=e.metallic!==void 0?e.metallic:e.specularIntensity??.5,n=e.ambientIntensity??1,o=e.material==="unlit"?0:e.material==="toon"?2:1;return[t,r,n,o]}var Po=class{device;pipelineSingle;pipelineMrt;bloomVariants;pipelineShadow;cameraLayout;modelLayout;textureLayout;lightsLayout;modelPool;vertexBuffer;indexBuffer;reliefGrid;modelData=new Float32Array(xa);constructor(t,r,n="depth24plus",o=1){this.device=t,this.modelPool=new Ye(xa*4,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);let A=t.createShaderModule({label:"quad3d.wgsl",code:Qa});this.cameraLayout=t.createBindGroupLayout({label:"Quad3DCameraLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.modelLayout=t.createBindGroupLayout({label:"Quad3DModelLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},Jr(1),{binding:2,visibility:GPUShaderStage.VERTEX,texture:{sampleType:"float"}}]}),this.textureLayout=t.createBindGroupLayout({label:"Quad3DTextureLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}]}),this.lightsLayout=sA(t,"Quad3DLightsLayout");let i=t.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout,this.textureLayout,this.lightsLayout]}),a={module:A,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:i,vertex:a,module:A,format:r,depthStencil:{format:n,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:o}},{single:c,mrt:l}=mt(t,s);this.pipelineSingle=c,this.pipelineMrt=l,this.bloomVariants=new lt(t,s),this.pipelineShadow=t.createRenderPipeline({label:"Quad3DPipelineShadow",layout:t.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout,this.textureLayout]}),vertex:a,fragment:{module:A,entryPoint:"fs_shadow",targets:[]},depthStencil:qr,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]),g=new Uint16Array([0,1,2,0,2,3]);this.vertexBuffer=t.createBuffer({size:u.byteLength,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),new Float32Array(this.vertexBuffer.getMappedRange()).set(u),this.vertexBuffer.unmap(),this.indexBuffer=t.createBuffer({size:g.byteLength,usage:GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),new Uint16Array(this.indexBuffer.getMappedRange()).set(g),this.indexBuffer.unmap()}resetPools(){this.modelPool.reset()}packModel(t){wo(this.modelData,t.modelMatrix,t.normalMatrix,t.colorTint);let r=t.borderColor??[0,0,0,0];this.modelData[36]=r[0],this.modelData[37]=r[1],this.modelData[38]=r[2],this.modelData[39]=r[3],this.modelData[40]=t.opacity??1,this.modelData[41]=t.borderRadius??0,this.modelData[42]=t.twoSided?1:0,this.modelData[43]=t.borderWidth??0,this.modelData[44]=t.width??0,this.modelData[45]=t.height??0,this.modelData[46]=t.textureExtent?.[0]??0,this.modelData[47]=t.textureExtent?.[1]??0,this.modelData.set(cA(t),48),Xr(t,this.modelData,52);let n=t.relief,o=52+Jt;this.modelData.set(n?[n.amount,1,0,Er]:[0,0,0,0],o),this.modelData.set(n?.uvRect??[0,0,1,1],o+4),this.modelData.set([...n?.eye??[0,0,0],0],o+8);let A=this.modelPool.getBuffer(this.device,this.modelData);return this.device.createBindGroup({layout:this.modelLayout,entries:[{binding:0,resource:{buffer:A}},{binding:1,resource:t.matte?.createView()??br(this.device)},{binding:2,resource:t.relief?.texture.createView()??br(this.device)}]})}drawGeometry(t,r){if(!r.relief){t.setVertexBuffer(0,this.vertexBuffer),t.setIndexBuffer(this.indexBuffer,"uint16"),t.drawIndexed(6);return}this.reliefGrid??=this.createReliefGrid(),t.setVertexBuffer(0,this.reliefGrid.vertices),t.setIndexBuffer(this.reliefGrid.indices,"uint32"),t.drawIndexed(this.reliefGrid.count)}createReliefGrid(){let t=Er+1,r=new Float32Array(t*t*8);for(let i=0;i<t;i++)for(let a=0;a<t;a++){let s=a/Er,c=i/Er;r.set([s-.5,c-.5,0,s,c,0,0,-1],(i*t+a)*8)}let n=new Uint32Array(Er*Er*6),o=0;for(let i=0;i<Er;i++)for(let a=0;a<Er;a++){let s=i*t+a;n.set([s,s+1,s+t+1,s,s+t+1,s+t],o),o+=6}let A=(i,a)=>{let s=this.device.createBuffer({size:i.byteLength,usage:a|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});return new i.constructor(s.getMappedRange()).set(i),s.unmap(),s};return{vertices:A(r,GPUBufferUsage.VERTEX),indices:A(n,GPUBufferUsage.INDEX),count:n.length}}textureBindGroup(t,r){return this.device.createBindGroup({layout:this.textureLayout,entries:[{binding:0,resource:r},{binding:1,resource:t.createView()}]})}draw(t,r,n,o,A,i,a=!1,s=!1){let c=this.packModel(i),l=this.textureBindGroup(o,A);t.setPipeline(s?this.bloomVariants.get(a):a?this.pipelineMrt:this.pipelineSingle),t.setBindGroup(0,r),t.setBindGroup(1,c),t.setBindGroup(2,l),t.setBindGroup(3,n),this.drawGeometry(t,i)}drawShadow(t,r,n,o,A){t.setPipeline(this.pipelineShadow),t.setBindGroup(0,r),t.setBindGroup(1,this.packModel(A)),t.setBindGroup(2,this.textureBindGroup(n,o)),this.drawGeometry(t,A)}destroy(){this.modelPool.destroy(),this.vertexBuffer.destroy(),this.indexBuffer.destroy(),this.reliefGrid?.vertices.destroy(),this.reliefGrid?.indices.destroy()}};var Go=class{device;pipelineSingle;pipelineMrt;bloomVariants;wireSingle;wireMrt;wireBloom;wireShadow;pointPipelines;transparentPointPipelines;pointShadow;transparentPipelines;transparentWirePipelines;pipelineShadow;cameraLayout;modelLayout;textureLayout;lightsLayout;modelPool;skinningPool;defaultWhiteTexture;flatNormalTexture;defaultSkinningBuffer;defaultInstanceBuffer;whiteColorBuffer=null;whiteColorCapacity=0;retiredColorBuffers=[];modelData=new Float32Array(52+Jt);constructor(t,r,n="depth24plus",o,A,i=1){this.device=t,this.modelPool=new Ye((52+Jt)*4,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.skinningPool=new Ye(64,GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST);let a=t.createShaderModule({label:"mesh3d.wgsl",code:ya});this.cameraLayout=o??t.createBindGroupLayout({label:"Mesh3DCameraLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.modelLayout=t.createBindGroupLayout({label:"Mesh3DModelLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.VERTEX,buffer:{type:"read-only-storage"}},Jr(2),Jr(3),{binding:4,visibility:GPUShaderStage.VERTEX,buffer:{type:"read-only-storage"}}]}),this.textureLayout=t.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=A??sA(t,"Mesh3DLightsLayout");let s=t.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout,this.textureLayout,this.lightsLayout]}),c={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"}]},{arrayStride:16,attributes:[{shaderLocation:5,offset:0,format:"float32x4"}]},{arrayStride:32,attributes:[{shaderLocation:6,offset:0,format:"float32x2"},{shaderLocation:7,offset:8,format:"float32x2"},{shaderLocation:8,offset:16,format:"float32x2"},{shaderLocation:9,offset:24,format:"float32x2"}]}]},l={label:"Mesh3DPipeline",layout:s,vertex:c,module:a,format:r,depthStencil:{format:n,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:i}},{single:u,mrt:g}=mt(t,l);this.pipelineSingle=u,this.pipelineMrt=g,this.bloomVariants=new lt(t,l);let p={...l,label:"Mesh3DWireframe",primitive:{topology:"line-list"}},d=mt(t,p);this.wireSingle=d.single,this.wireMrt=d.mrt,this.wireBloom=new lt(t,p);let f={...l,label:"Mesh3DTransparent",depthStencil:{...l.depthStencil,depthWriteEnabled:!1}},h={...f,label:"Mesh3DTransparentWireframe",primitive:p.primitive};this.transparentPipelines={...mt(t,f),bloom:new lt(t,f)},this.transparentWirePipelines={...mt(t,h),bloom:new lt(t,h)};let I={...l,label:"Mesh3DPoints",primitive:{topology:"point-list"}},b={...I,label:"Mesh3DTransparentPoints",depthStencil:{...l.depthStencil,depthWriteEnabled:!1}};this.pointPipelines={...mt(t,I),bloom:new lt(t,I)},this.transparentPointPipelines={...mt(t,b),bloom:new lt(t,b)},this.pointShadow=t.createRenderPipeline({label:"Mesh3DPointShadow",layout:t.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout]}),vertex:c,depthStencil:{format:qr.format,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"point-list"}}),this.wireShadow=t.createRenderPipeline({label:"Mesh3DWireframeShadow",layout:t.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout]}),vertex:c,depthStencil:{format:qr.format,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"line-list"}}),this.pipelineShadow=t.createRenderPipeline({label:"Mesh3DPipelineShadow",layout:t.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout]}),vertex:c,depthStencil:qr,primitive:{topology:"triangle-list",cullMode:"none"}}),this.defaultWhiteTexture=t.createTexture({label:"Mesh3DDefaultWhiteTexture",size:{width:1,height:1},format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST}),t.queue.writeTexture({texture:this.defaultWhiteTexture},new Uint8Array([255,255,255,255]),{bytesPerRow:4,rowsPerImage:1},{width:1,height:1}),this.flatNormalTexture=t.createTexture({label:"Mesh3DFlatNormalTexture",size:{width:1,height:1},format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST}),t.queue.writeTexture({texture:this.flatNormalTexture},new Uint8Array([128,128,255,255]),{bytesPerRow:4,rowsPerImage:1},{width:1,height:1});let D=new Float32Array(16);D[0]=D[5]=D[10]=D[15]=1,this.defaultSkinningBuffer=t.createBuffer({size:64,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),new Float32Array(this.defaultSkinningBuffer.getMappedRange()).set(D),this.defaultSkinningBuffer.unmap(),this.defaultInstanceBuffer=t.createBuffer({label:"Mesh3DDefaultInstanceBuffer",size:64,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});let m=new Float32Array(this.defaultInstanceBuffer.getMappedRange());m[0]=0,m[1]=0,m[2]=0,m[3]=1,m[4]=0,m[5]=0,m[6]=0,m[7]=1,m[8]=1,m[9]=1,m[10]=1,m[11]=1,m[12]=0,m[13]=0,m[14]=0,m[15]=0,this.defaultInstanceBuffer.unmap()}resetPools(){this.modelPool.reset(),this.skinningPool.reset()}packModel(t){wo(this.modelData,t.modelMatrix,t.normalMatrix,t.colorTint),this.modelData[36]=t.opacity??1,this.modelData[37]=t.twoSided?1:0,this.modelData[38]=t.isSkinned?1:0,this.modelData[39]=(t.isInstanced||t.instanceBuffer?1:0)+(t.hasMapUvs?2:0)+(t.matrixInstances?4:0);let r=t.roughness!==void 0?Math.max(1,(1-t.roughness)*128):t.shininess??32,n=t.metallic!==void 0?t.metallic:t.specularIntensity??.5,o=t.ambientIntensity??1,A=t.material==="unlit"?0:t.material==="toon"?2:1;this.modelData[40]=r,this.modelData[41]=n,this.modelData[42]=o,this.modelData[43]=A;let i=t.shadeColor??[1,1,1];this.modelData[44]=i[0],this.modelData[45]=i[1],this.modelData[46]=i[2],this.modelData[47]=t.alphaCutoff??0,Xr(t,this.modelData,48,t.shadeColor);let a=t.maps,s=48+Jt;this.modelData[s]=a?.normal?a.normalScale??1:0,this.modelData[s+1]=a?.occlusion?a.occlusionStrength??1:0,this.modelData[s+2]=a?.metallicRoughness?1:0,this.modelData[s+3]=a?.emissive?1:0;let c=t.glass;c&&(this.modelData[44]=c.dispersion,this.modelData[45]=c.thickness,this.modelData[46]=c.frost,this.modelData[50]=1,this.modelData[51]=c.ior);let l=this.modelPool.getBuffer(this.device,this.modelData);if(t.skinningMatrices&&t.skinningMatrices.byteLength>this.device.limits.maxStorageBufferBindingSize)throw new Error(`Skinning data requires ${t.skinningMatrices.byteLength} bytes, exceeding the device storage binding limit of ${this.device.limits.maxStorageBufferBindingSize} bytes`);let u=t.isSkinned&&t.skinningMatrices?this.skinningPool.getBuffer(this.device,t.skinningMatrices):this.defaultSkinningBuffer;return this.device.createBindGroup({layout:this.modelLayout,entries:[{binding:0,resource:{buffer:l}},{binding:1,resource:{buffer:u}},{binding:2,resource:t.matte?.createView()??br(this.device)},{binding:3,resource:t.glass&&t.backdrop?.createView()||br(this.device)},{binding:4,resource:{buffer:t.instanceBuffer??this.defaultInstanceBuffer}}]})}draw(t,r,n,o,A,i,a,s=!1,c=!1,l=1,u=0){let g=this.packModel({...a,hasMapUvs:!!o.mapUvBuffer}),p=this.defaultWhiteTexture,d=a.maps,f=this.device.createBindGroup({layout:this.textureLayout,entries:[{binding:0,resource:i},{binding:1,resource:(A??p).createView()},{binding:2,resource:(d?.normal??this.flatNormalTexture).createView()},{binding:3,resource:(d?.metallicRoughness??p).createView()},{binding:4,resource:(d?.occlusion??p).createView()},{binding:5,resource:(d?.emissive??p).createView()}]}),h=a.wireframe===!0&&(!o.topology||o.topology==="triangle-list");if(h&&!o.wireIndexBuffer)throw new Error("Wireframe requires mesh buffers with edge indices");let I=h||o.topology==="line-list",b=o.topology==="point-list"?a.transparent?this.transparentPointPipelines:this.pointPipelines:a.transparent?I?this.transparentWirePipelines:this.transparentPipelines:I?{single:this.wireSingle,mrt:this.wireMrt,bloom:this.wireBloom}:{single:this.pipelineSingle,mrt:this.pipelineMrt,bloom:this.bloomVariants};t.setPipeline(c?b.bloom.get(s):s?b.mrt:b.single),t.setBindGroup(0,r),t.setBindGroup(1,g),t.setBindGroup(2,f),t.setBindGroup(3,n),t.setVertexBuffer(0,o.vertexBuffer),t.setVertexBuffer(1,this.colorsFor(o)),t.setVertexBuffer(2,o.mapUvBuffer??o.vertexBuffer),t.setIndexBuffer(h?o.wireIndexBuffer:o.indexBuffer,o.indexFormat),l>1||a.isInstanced?t.drawIndexed(h?o.wireIndexCount:o.indexCount,l,0,0,u):t.drawIndexed(h?o.wireIndexCount:o.indexCount)}drawShadow(t,r,n,o,A=1,i=0){let a=o.wireframe===!0&&(!n.topology||n.topology==="triangle-list");if(a&&!n.wireIndexBuffer)throw new Error("Wireframe requires mesh buffers with edge indices");t.setPipeline(n.topology==="point-list"?this.pointShadow:a||n.topology==="line-list"?this.wireShadow:this.pipelineShadow),t.setBindGroup(0,r),t.setBindGroup(1,this.packModel(o)),t.setVertexBuffer(0,n.vertexBuffer),t.setVertexBuffer(1,this.colorsFor(n)),t.setVertexBuffer(2,n.mapUvBuffer??n.vertexBuffer),t.setIndexBuffer(a?n.wireIndexBuffer:n.indexBuffer,n.indexFormat),A>1||o.isInstanced?t.drawIndexed(a?n.wireIndexCount:n.indexCount,A,0,0,i):t.drawIndexed(a?n.wireIndexCount:n.indexCount)}colorsFor(t){if(t.colorBuffer)return t.colorBuffer;let r=Math.max(1,Math.ceil(t.vertexBuffer.size/64));if(!this.whiteColorBuffer||this.whiteColorCapacity<r){this.whiteColorBuffer&&this.retiredColorBuffers.push(this.whiteColorBuffer);let n=2**Math.ceil(Math.log2(r));this.whiteColorBuffer=this.device.createBuffer({label:"Mesh3DWhiteVertexColors",size:n*16,usage:GPUBufferUsage.VERTEX,mappedAtCreation:!0}),new Float32Array(this.whiteColorBuffer.getMappedRange()).fill(1),this.whiteColorBuffer.unmap(),this.whiteColorCapacity=n}return this.whiteColorBuffer}destroy(){this.whiteColorBuffer?.destroy();for(let t of this.retiredColorBuffers)t.destroy();this.modelPool.destroy(),this.skinningPool.destroy(),this.defaultWhiteTexture.destroy(),this.flatNormalTexture.destroy(),this.defaultSkinningBuffer.destroy(),this.defaultInstanceBuffer.destroy()}};$();var fc=`
|
|
1787
|
-
struct Counts { vertices: u32, targets: u32, pad0: u32, pad1: u32 };
|
|
1788
|
-
@group(0) @binding(0) var<storage, read> source: array<f32>;
|
|
1789
|
-
@group(0) @binding(1) var<storage, read> deltas: array<f32>;
|
|
1790
|
-
@group(0) @binding(2) var<storage, read> weights: array<f32>;
|
|
1791
|
-
@group(0) @binding(3) var<uniform> counts: Counts;
|
|
1792
|
-
@group(0) @binding(4) var<storage, read_write> dest: array<f32>;
|
|
1793
|
-
@compute @workgroup_size(128)
|
|
1794
|
-
fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
1795
|
-
let vertex = gid.x;
|
|
1796
|
-
if (vertex >= counts.vertices) { return; }
|
|
1797
|
-
let v = vertex * 16u;
|
|
1798
|
-
for (var c = 0u; c < 16u; c++) { dest[v + c] = source[v + c]; }
|
|
1799
|
-
var position = vec3<f32>(source[v], source[v + 1u], source[v + 2u]);
|
|
1800
|
-
var normal = vec3<f32>(source[v + 5u], source[v + 6u], source[v + 7u]);
|
|
1801
|
-
for (var t = 0u; t < counts.targets; t++) {
|
|
1802
|
-
let d = (t * counts.vertices + vertex) * 6u;
|
|
1803
|
-
let w = weights[t];
|
|
1804
|
-
position += vec3<f32>(deltas[d], deltas[d + 1u], deltas[d + 2u]) * w;
|
|
1805
|
-
normal += vec3<f32>(deltas[d + 3u], deltas[d + 4u], deltas[d + 5u]) * w;
|
|
1806
|
-
}
|
|
1807
|
-
dest[v] = position.x; dest[v + 1u] = position.y; dest[v + 2u] = position.z;
|
|
1808
|
-
dest[v + 5u] = normal.x; dest[v + 6u] = normal.y; dest[v + 7u] = normal.z;
|
|
1809
|
-
}`,Ro=class{constructor(t){this.device=t;this.layout=t.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]}),this.pipeline=t.createComputePipeline({label:"MeshMorphPipeline",layout:t.createPipelineLayout({bindGroupLayouts:[this.layout]}),compute:{module:t.createShaderModule({code:fc}),entryPoint:"main"}})}device;pipeline;layout;weights=new Ye(16,GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST);counts=new Ye(16,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);targets=new WeakMap;outputs=[];outputIndex=0;targetBuffer(t){let r=this.targets.get(t);if(r)return r;let n=t.morphTargets??[],o=t.positions.length/3,A=new Float32Array(o*n.length*6);for(let a=0;a<n.length;a++){let s=n[a];for(let c=0;c<o;c++)for(let l=0;l<3;l++)A[(a*o+c)*6+l]=s.positions?.[c*3+l]??0,A[(a*o+c)*6+3+l]=s.normals?.[c*3+l]??0}let i=this.device.createBuffer({label:"MeshMorphTargets",size:Math.max(4,A.byteLength),usage:GPUBufferUsage.STORAGE,mappedAtCreation:!0});return new Float32Array(i.getMappedRange()).set(A),i.unmap(),this.targets.set(t,i),i}execute(t,r,n,o){let A=r.positions.length/3,i=r.morphTargets?.length??0,a=Math.max(64,A*64),s=this.outputs[this.outputIndex];if(!s||s.size<a){if(s){let g=s;this.device.queue.onSubmittedWorkDone().then(()=>g.destroy())}s=this.device.createBuffer({label:"MeshMorphOutput",size:a,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.VERTEX}),this.outputs[this.outputIndex]=s}this.outputIndex++;let c=new Float32Array(Math.max(4,i));for(let g=0;g<i;g++)c[g]=o[g]??0;let l=this.device.createBindGroup({layout:this.layout,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:{buffer:this.targetBuffer(r)}},{binding:2,resource:{buffer:this.weights.getBuffer(this.device,c)}},{binding:3,resource:{buffer:this.counts.getBuffer(this.device,new Uint32Array([A,i,0,0]))}},{binding:4,resource:{buffer:s}}]}),u=t.beginComputePass({label:"MeshMorphPass"});return u.setPipeline(this.pipeline),u.setBindGroup(0,l),u.dispatchWorkgroups(Math.ceil(A/128)),u.end(),s}resetPools(){this.outputIndex=0,this.weights.reset(),this.counts.reset()}destroy(){this.weights.destroy(),this.counts.destroy();for(let t of this.outputs)t.destroy()}};$();function lA(e){let{min:t,max:r}=e;return[[t[0],t[1],t[2]],[r[0],t[1],t[2]],[t[0],r[1],t[2]],[r[0],r[1],t[2]],[t[0],t[1],r[2]],[r[0],t[1],r[2]],[t[0],r[1],r[2]],[r[0],r[1],r[2]]]}function uA(e,t){let r=[1/0,1/0,1/0],n=[-1/0,-1/0,-1/0];for(let[o,A,i]of lA(e)){let a=[t[0]*o+t[4]*A+t[8]*i+t[12],t[1]*o+t[5]*A+t[9]*i+t[13],t[2]*o+t[6]*A+t[10]*i+t[14]];for(let s=0;s<3;s++)a[s]<r[s]&&(r[s]=a[s]),a[s]>n[s]&&(n[s]=a[s])}return{min:r,max:n}}function Fo(e,t){return[e[0]*t[0]+e[4]*t[1]+e[8]*t[2]+e[12],e[1]*t[0]+e[5]*t[1]+e[9]*t[2]+e[13],e[2]*t[0]+e[6]*t[1]+e[10]*t[2]+e[14]]}function wa(e){return Math.abs(e[1])>.98?[0,0,1]:[0,-1,0]}function va(e,t,r,n){if(t.length===0)return null;let o=Z.normalize(e.direction),A=t.flatMap(lA),i=[...A,...r.flatMap(lA)];if(e.type==="directional"){let d=[0,0,0];for(let R of A)d[0]+=R[0]/A.length,d[1]+=R[1]/A.length,d[2]+=R[2]/A.length;let f=Z.subtract(d,Z.multiplyScalar(o,1)),h=Ee.lookAt(f,d,wa(o)),I=1/0,b=-1/0,D=1/0,m=-1/0;for(let R of A){let K=Fo(h,R);I=Math.min(I,K[0]),b=Math.max(b,K[0]),D=Math.min(D,K[1]),m=Math.max(m,K[1])}let Q=1/0,w=-1/0;for(let R of i){let K=Fo(h,R)[2];Q=Math.min(Q,K),w=Math.max(w,K)}let S=Math.max(b-I,m-D)*.5*1.08+4,N=(I+b)/2,M=(D+m)/2,G=Math.max(10,(w-Q)*.02),j=Ee.orthographic(N-S,N+S,M-S,M+S,Q-G,w+G);return{viewProj:Ee.multiply(j,h),texelWorldSize:2*S/n}}let a=e.position,s=Ee.lookAt(a,Z.add(a,o),wa(o)),c=1/0,l=0,u=0;for(let d of i){let f=Fo(s,d)[2];f>0&&(c=Math.min(c,f),l=Math.max(l,f))}for(let d of A)u=Math.max(u,Fo(s,d)[2]);if(!Number.isFinite(c)||l<=0)return null;c=Math.max(1,c*.9),l=l*1.05+1;let g=Math.min(170,2*(e.angle??45)+4)*Math.PI/180,p=Ee.perspective(g,1,c,l);return{viewProj:Ee.multiply(p,s),texelWorldSize:2*Math.tan(g/2)*Math.max(u,c)/n}}$();$();var Da=`
|
|
1810
|
-
${mr}
|
|
1811
|
-
|
|
1812
|
-
struct TextModelUniforms {
|
|
1813
|
-
modelMatrix : mat4x4<f32>, // paragraph px -> world
|
|
1814
|
-
normalMatrix : mat4x4<f32>,
|
|
1815
|
-
params : vec4<f32>, // x = opacity, y = slant, z = twoSided (1.0 = yes), w = pull toward the eye
|
|
1816
|
-
materialParams : vec4<f32>, // x = shininess, y = specularIntensity, z = ambientIntensity, w = materialMode (0=unlit, 1=lit)
|
|
1817
|
-
pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
|
|
1818
|
-
emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
|
|
1819
|
-
toonShadow : vec4<f32>, // rgb shadow-side multiplier, w diffuse modelling
|
|
1820
|
-
toonLight : vec4<f32>, // rgb lit-side multiplier, w terminator threshold
|
|
1821
|
-
toonParams : vec4<f32>, // x terminator softness, y outline participation
|
|
1822
|
-
};
|
|
1823
|
-
|
|
1824
|
-
@group(0) @binding(0) var<uniform> cam : CameraUniforms;
|
|
1825
|
-
@group(1) @binding(0) var<uniform> model : TextModelUniforms;
|
|
1826
|
-
${Wr(1,1)}@group(2) @binding(0) var curvesTex : texture_2d<f32>;
|
|
1827
|
-
@group(2) @binding(1) var bandsTex : texture_2d<u32>;
|
|
1828
|
-
${Ir}
|
|
1829
|
-
|
|
1830
|
-
${Ti}
|
|
1831
|
-
|
|
1832
|
-
struct VSOut {
|
|
1833
|
-
@builtin(position) pos : vec4<f32>,
|
|
1834
|
-
@location(0) uv : vec2<f32>,
|
|
1835
|
-
@location(1) @interpolate(flat) glyphScale : vec2<f32>,
|
|
1836
|
-
@location(2) @interpolate(flat) bandScale : vec2<f32>,
|
|
1837
|
-
@location(3) @interpolate(flat) bandMax : vec2<u32>,
|
|
1838
|
-
@location(4) @interpolate(flat) bandsTexCoords : vec2<u32>,
|
|
1839
|
-
@location(5) color : vec4<f32>,
|
|
1840
|
-
@location(6) @interpolate(flat) fx : vec4<f32>, // x = blur, y = chromatic shift, z = dissolve, w = vfx
|
|
1841
|
-
@location(7) worldPos : vec3<f32>,
|
|
1842
|
-
@location(8) @interpolate(flat) worldNormal : vec3<f32>,
|
|
1843
|
-
@location(9) linearDepth : f32,
|
|
1844
|
-
};
|
|
1845
|
-
|
|
1846
|
-
var<private> pos : array<vec2<f32>, 6> = array<vec2<f32>, 6>(
|
|
1847
|
-
vec2<f32>(-1.0, -1.0),
|
|
1848
|
-
vec2<f32>(1.0, 1.0),
|
|
1849
|
-
vec2<f32>(-1.0, 1.0),
|
|
1850
|
-
vec2<f32>(-1.0, -1.0),
|
|
1851
|
-
vec2<f32>(1.0, -1.0),
|
|
1852
|
-
vec2<f32>(1.0, 1.0)
|
|
1853
|
-
);
|
|
1854
|
-
|
|
1855
|
-
// Screen pixels moved per paragraph unit along the axis whose clip-space step
|
|
1856
|
-
// is dc, at clip position c: the derivative of the perspective divide.
|
|
1857
|
-
fn pixelsPerUnitAlong(c: vec4<f32>, dc: vec4<f32>) -> vec2<f32> {
|
|
1858
|
-
let w = max(c.w, 1e-4);
|
|
1859
|
-
return (dc.xy * w - c.xy * dc.w) / (w * w) * 0.5 * cam.screenParams.xy;
|
|
1860
|
-
}
|
|
1861
|
-
|
|
1862
|
-
@vertex fn vs(
|
|
1863
|
-
@builtin(vertex_index) vertex_index : u32,
|
|
1864
|
-
@location(0) aScaleBias : vec4<f32>,
|
|
1865
|
-
@location(1) aGlyphBandScale : vec4<f32>,
|
|
1866
|
-
@location(2) aBandMaxTexCoords : vec4<f32>,
|
|
1867
|
-
@location(3) aAnim : vec4<f32>, // x = rotation, y = scale_mult, zw = translation
|
|
1868
|
-
@location(4) aColor : vec4<f32>,
|
|
1869
|
-
@location(5) aExtraParams : vec4<f32>,
|
|
1870
|
-
) -> VSOut {
|
|
1871
|
-
let quad_pos = pos[vertex_index];
|
|
1872
|
-
let angle = aAnim.x;
|
|
1873
|
-
let scale_mult = aAnim.y;
|
|
1874
|
-
let origin = aScaleBias.zw + aAnim.zw;
|
|
1875
|
-
let slant = model.params.y;
|
|
1876
|
-
let rot = mat2x2<f32>(cos(angle), sin(angle), -sin(angle), cos(angle));
|
|
1877
|
-
let shear = mat2x2<f32>(1.0, 0.0, -slant, 1.0);
|
|
1878
|
-
let glyphToParagraph = rot * shear;
|
|
1879
|
-
|
|
1880
|
-
let clipFromParagraph = cam.viewProjMatrix * model.modelMatrix;
|
|
1881
|
-
|
|
1882
|
-
// Slug's dynamic dilation, under perspective: grow the quad by one screen
|
|
1883
|
-
// pixel so edge pixels whose centres fall just outside the outline's box
|
|
1884
|
-
// are still shaded. The pixel is measured at this corner through the
|
|
1885
|
-
// projection's Jacobian, along the paragraph direction that gets the fewest
|
|
1886
|
-
// pixels (its smallest singular value), so foreshortened sides are covered.
|
|
1887
|
-
let corner = origin + glyphToParagraph * (quad_pos * aScaleBias.xy * scale_mult);
|
|
1888
|
-
let cornerClip = clipFromParagraph * vec4<f32>(corner, 0.0, 1.0);
|
|
1889
|
-
let jx = pixelsPerUnitAlong(cornerClip, clipFromParagraph[0]);
|
|
1890
|
-
let jy = pixelsPerUnitAlong(cornerClip, clipFromParagraph[1]);
|
|
1891
|
-
let e = dot(jx, jx) + dot(jy, jy);
|
|
1892
|
-
let det = jx.x * jy.y - jx.y * jy.x;
|
|
1893
|
-
let minPixelsPerUnit = sqrt(max(0.5 * (e - sqrt(max(e * e - 4.0 * det * det, 0.0))), 0.0));
|
|
1894
|
-
let halfSize = max(abs(aScaleBias.xy * scale_mult), vec2<f32>(1e-4));
|
|
1895
|
-
// Bounded at three times the glyph: seen nearly edge-on a pixel spans
|
|
1896
|
-
// most of the paragraph, and the glyph is a sliver either way.
|
|
1897
|
-
let dilation = min(vec2<f32>(1.0 / max(minPixelsPerUnit, 1e-6)), halfSize * 2.0);
|
|
1898
|
-
let grow = vec2<f32>(1.0) + dilation / halfSize;
|
|
1899
|
-
|
|
1900
|
-
let paragraphPos = origin + glyphToParagraph * (quad_pos * aScaleBias.xy * scale_mult * grow);
|
|
1901
|
-
let world4 = model.modelMatrix * vec4<f32>(paragraphPos, 0.0, 1.0);
|
|
1902
|
-
// Slide toward the eye along the view ray: the same pixel, a nearer depth.
|
|
1903
|
-
// Passes stacked on one plane (shadow, stroke, fill, a backdrop) resolve
|
|
1904
|
-
// by draw order instead of z-fighting.
|
|
1905
|
-
let world = world4.xyz + (cam.cameraPos.xyz - world4.xyz) * model.params.w;
|
|
1906
|
-
|
|
1907
|
-
var out : VSOut;
|
|
1908
|
-
out.pos = cam.viewProjMatrix * vec4<f32>(world, 1.0);
|
|
1909
|
-
out.uv = vec2<f32>(
|
|
1910
|
-
quad_pos.x * grow.x * 0.5 + 0.5,
|
|
1911
|
-
1.0 - (quad_pos.y * grow.y * 0.5 + 0.5),
|
|
1912
|
-
);
|
|
1913
|
-
out.glyphScale = aGlyphBandScale.xy;
|
|
1914
|
-
out.bandScale = aGlyphBandScale.zw;
|
|
1915
|
-
out.bandMax = vec2<u32>(aBandMaxTexCoords.xy);
|
|
1916
|
-
out.bandsTexCoords = vec2<u32>(aBandMaxTexCoords.zw);
|
|
1917
|
-
out.color = aColor;
|
|
1918
|
-
out.fx = aExtraParams;
|
|
1919
|
-
out.worldPos = world4.xyz;
|
|
1920
|
-
out.worldNormal = normalize((model.normalMatrix * vec4<f32>(0.0, 0.0, -1.0, 0.0)).xyz);
|
|
1921
|
-
out.linearDepth = dot(world4.xyz - cam.cameraPos.xyz, cam.cameraDir.xyz);
|
|
1922
|
-
return out;
|
|
1923
|
-
}
|
|
1924
|
-
|
|
1925
|
-
struct TextFragment {
|
|
1926
|
-
color : vec4<f32>, // premultiplied display color; alpha 0 = discard
|
|
1927
|
-
hdr : vec4<f32>, // premultiplied scene radiance (bloom source)
|
|
1928
|
-
};
|
|
1929
|
-
|
|
1930
|
-
fn shadeText(in : VSOut, fw : vec2<f32>) -> TextFragment {
|
|
1931
|
-
var out : TextFragment;
|
|
1932
|
-
out.color = vec4<f32>(0.0);
|
|
1933
|
-
out.hdr = vec4<f32>(0.0);
|
|
1934
|
-
// One-sided text culls against its plane's normal, as one-sided quads do.
|
|
1935
|
-
if (model.params.z < 0.5 && dot(in.worldNormal, cam.cameraPos.xyz - in.worldPos) < 0.0) {
|
|
1936
|
-
return out;
|
|
1937
|
-
}
|
|
1938
|
-
let glyph = SlugGlyph(in.glyphScale, in.bandScale, in.bandMax, in.bandsTexCoords);
|
|
1939
|
-
let shaded = shadeSlugGlyph(
|
|
1940
|
-
in.uv,
|
|
1941
|
-
fw,
|
|
1942
|
-
in.pos.xy,
|
|
1943
|
-
glyph,
|
|
1944
|
-
in.color,
|
|
1945
|
-
model.params.x,
|
|
1946
|
-
in.fx.x,
|
|
1947
|
-
1.0,
|
|
1948
|
-
in.fx.y,
|
|
1949
|
-
in.fx.z,
|
|
1950
|
-
);
|
|
1951
|
-
if (shaded.a < 0.0001) {
|
|
1952
|
-
return out;
|
|
1953
|
-
}
|
|
1954
|
-
let lit = shadeSurfaceFull(in.worldPos, in.worldNormal, shaded.rgb / shaded.a, model.materialParams, model.pbr, model.emissive, model.toonShadow, model.toonLight, model.toonParams);
|
|
1955
|
-
out.color = vec4<f32>(lit.display * shaded.a, shaded.a);
|
|
1956
|
-
out.hdr = vec4<f32>(lit.hdr * shaded.a, shaded.a);
|
|
1957
|
-
return out;
|
|
1958
|
-
}
|
|
1959
|
-
|
|
1960
|
-
fn textFragment(in : VSOut) -> TextFragment {
|
|
1961
|
-
let fw = max(abs(dpdx(in.uv)) + abs(dpdy(in.uv)), vec2<f32>(0.000001));
|
|
1962
|
-
let m = matteCoverage(in.pos.xy);
|
|
1963
|
-
var f = shadeText(in, fw);
|
|
1964
|
-
f.color *= m;
|
|
1965
|
-
f.hdr *= m;
|
|
1966
|
-
if (f.color.a < 0.0001) {
|
|
1967
|
-
discard;
|
|
1968
|
-
}
|
|
1969
|
-
return f;
|
|
1970
|
-
}
|
|
1971
|
-
|
|
1972
|
-
@fragment fn fs_single(in : VSOut) -> @location(0) vec4<f32> {
|
|
1973
|
-
return textFragment(in).color;
|
|
1974
|
-
}
|
|
1975
|
-
|
|
1976
|
-
struct MrtOutput {
|
|
1977
|
-
@location(0) color : vec4<f32>,
|
|
1978
|
-
@location(1) depth : vec4<f32>,
|
|
1979
|
-
};
|
|
1980
|
-
|
|
1981
|
-
struct BloomOutput {
|
|
1982
|
-
@location(0) color : vec4<f32>,
|
|
1983
|
-
@location(1) hdr : vec4<f32>,
|
|
1984
|
-
};
|
|
1985
|
-
|
|
1986
|
-
struct MrtBloomOutput {
|
|
1987
|
-
@location(0) color : vec4<f32>,
|
|
1988
|
-
@location(1) depth : vec4<f32>,
|
|
1989
|
-
@location(2) hdr : vec4<f32>,
|
|
1990
|
-
};
|
|
1991
|
-
|
|
1992
|
-
@fragment fn fs_mrt(in : VSOut) -> MrtOutput {
|
|
1993
|
-
var out : MrtOutput;
|
|
1994
|
-
out.color = textFragment(in).color;
|
|
1995
|
-
out.depth = geometryPixel(in.linearDepth, in.worldNormal, model.toonParams.y);
|
|
1996
|
-
return out;
|
|
1997
|
-
}
|
|
1998
|
-
|
|
1999
|
-
@fragment fn fs_single_bloom(in : VSOut) -> BloomOutput {
|
|
2000
|
-
let f = textFragment(in);
|
|
2001
|
-
var out : BloomOutput;
|
|
2002
|
-
out.color = f.color;
|
|
2003
|
-
out.hdr = f.hdr;
|
|
2004
|
-
return out;
|
|
2005
|
-
}
|
|
2006
|
-
|
|
2007
|
-
@fragment fn fs_mrt_bloom(in : VSOut) -> MrtBloomOutput {
|
|
2008
|
-
let f = textFragment(in);
|
|
2009
|
-
var out : MrtBloomOutput;
|
|
2010
|
-
out.color = f.color;
|
|
2011
|
-
out.depth = geometryPixel(in.linearDepth, in.worldNormal, model.toonParams.y);
|
|
2012
|
-
out.hdr = f.hdr;
|
|
2013
|
-
return out;
|
|
2014
|
-
}
|
|
2015
|
-
`;var _a=24,Uo=class{device;pipelineSingle;pipelineMrt;bloomVariants;modelLayout;fontLayout;modelPool;instancePool;fontBindGroups=new WeakMap;modelData=new Float32Array(40+Jt);constructor(t,r,n,o,A,i=1){this.device=t,this.modelPool=new Ye((40+Jt)*4,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.instancePool=new Ye(65536,GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST);let a=t.createShaderModule({label:"slug3d.wgsl",code:Da});this.modelLayout=t.createBindGroupLayout({label:"Slug3DModelLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},Jr(1)]}),this.fontLayout=t.createBindGroupLayout({label:"Slug3DFontLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"unfilterable-float"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"uint"}}]});let s=t.createPipelineLayout({bindGroupLayouts:[o,this.modelLayout,this.fontLayout,A]}),c={module:a,entryPoint:"vs",buffers:[{arrayStride:_a*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"}]}]},p={label:"Slug3DPipeline",layout:s,vertex:c,module:a,format:r,depthStencil:{format:n,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:i}},{single:d,mrt:f}=mt(t,p);this.pipelineSingle=d,this.pipelineMrt=f,this.bloomVariants=new lt(t,p)}resetPools(){this.modelPool.reset(),this.instancePool.reset()}draw(t,r,n,o,A,i,a,s=!1,c=!1){if(i===0||!o.curvesTex||!o.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(cA(a),36),Xr(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()??br(this.device)}]}),g=this.instancePool.getBuffer(this.device,A.subarray(0,i*_a));t.setPipeline(c?this.bloomVariants.get(s):s?this.pipelineMrt:this.pipelineSingle),t.setBindGroup(0,r),t.setBindGroup(1,u),t.setBindGroup(2,this.fontBindGroup(o.curvesTex,o.bandsTex)),t.setBindGroup(3,n),t.setVertexBuffer(0,g),t.draw(6,i)}fontBindGroup(t,r){let n=this.fontBindGroups.get(t);return n||(n=this.device.createBindGroup({layout:this.fontLayout,entries:[{binding:0,resource:t.createView()},{binding:1,resource:r.createView()}]}),this.fontBindGroups.set(t,n)),n}destroy(){this.modelPool.destroy(),this.instancePool.destroy()}};$();var hc=`
|
|
2016
|
-
struct SwarmParticle3D {
|
|
2017
|
-
pos : vec3<f32>, // world-space position (px, y down)
|
|
2018
|
-
age : f32, // seconds alive
|
|
2019
|
-
vel : vec3<f32>, // world-space velocity (px/s)
|
|
2020
|
-
life : f32, // total lifetime (seconds; <= 0 means dead)
|
|
2021
|
-
quat : vec4<f32>, // unit orientation quaternion
|
|
2022
|
-
angVel : vec3<f32>, // angular velocity (rad/s)
|
|
2023
|
-
heat : f32, // smoothed kinetic/friction heat [0..1+]
|
|
2024
|
-
scale : f32, // size multiplier (for sparks: radius in px)
|
|
2025
|
-
variant : u32, // mesh variant index
|
|
2026
|
-
seed : u32, // per-particle deterministic random id
|
|
2027
|
-
contact : f32, // floor contact factor [0..1]
|
|
2028
|
-
};
|
|
2029
|
-
|
|
2030
|
-
struct InstanceData {
|
|
2031
|
-
posScale : vec4<f32>, // xyz = translation, w = mesh scale
|
|
2032
|
-
quat : vec4<f32>, // xyzw = orientation quaternion
|
|
2033
|
-
color : vec4<f32>, // rgba = color multiplier
|
|
2034
|
-
emissive : vec4<f32>, // rgb = sRGB emissive color, w = emissiveIntensity
|
|
2035
|
-
};
|
|
2036
|
-
|
|
2037
|
-
struct Params { v : array<vec4<f32>, 32> };
|
|
2038
|
-
|
|
2039
|
-
@group(0) @binding(0) var<uniform> P : Params;
|
|
2040
|
-
@group(0) @binding(1) var<storage, read_write> particles : array<SwarmParticle3D>;
|
|
2041
|
-
@group(0) @binding(2) var<storage, read_write> instances : array<InstanceData>;
|
|
2042
|
-
|
|
2043
|
-
fn pcg(v : u32) -> u32 {
|
|
2044
|
-
let state = v * 747796405u + 2891336453u;
|
|
2045
|
-
let word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;
|
|
2046
|
-
return (word >> 22u) ^ word;
|
|
2047
|
-
}
|
|
2048
|
-
|
|
2049
|
-
fn rnd(idx : u32, channel : u32, seed : u32) -> f32 {
|
|
2050
|
-
return f32(pcg(idx * 16u + channel + pcg(seed))) / 4294967295.0;
|
|
2051
|
-
}
|
|
2052
|
-
|
|
2053
|
-
fn hash3(p : vec3<f32>) -> f32 {
|
|
2054
|
-
let q = fract(p * vec3<f32>(0.1031, 0.1030, 0.0973));
|
|
2055
|
-
let r = q + dot(q, q.yzx + 33.33);
|
|
2056
|
-
return fract((r.x + r.y) * r.z);
|
|
2057
|
-
}
|
|
2058
|
-
|
|
2059
|
-
fn vnoise3(p : vec3<f32>) -> f32 {
|
|
2060
|
-
let i = floor(p);
|
|
2061
|
-
let f = fract(p);
|
|
2062
|
-
let u = f * f * (3.0 - 2.0 * f);
|
|
2063
|
-
let n000 = hash3(i);
|
|
2064
|
-
let n100 = hash3(i + vec3<f32>(1.0, 0.0, 0.0));
|
|
2065
|
-
let n010 = hash3(i + vec3<f32>(0.0, 1.0, 0.0));
|
|
2066
|
-
let n110 = hash3(i + vec3<f32>(1.0, 1.0, 0.0));
|
|
2067
|
-
let n001 = hash3(i + vec3<f32>(0.0, 0.0, 1.0));
|
|
2068
|
-
let n101 = hash3(i + vec3<f32>(1.0, 0.0, 1.0));
|
|
2069
|
-
let n011 = hash3(i + vec3<f32>(0.0, 1.0, 1.0));
|
|
2070
|
-
let n111 = hash3(i + vec3<f32>(1.0, 1.0, 1.0));
|
|
2071
|
-
return mix(
|
|
2072
|
-
mix(mix(n000, n100, u.x), mix(n010, n110, u.x), u.y),
|
|
2073
|
-
mix(mix(n001, n101, u.x), mix(n011, n111, u.x), u.y),
|
|
2074
|
-
u.z
|
|
2075
|
-
);
|
|
2076
|
-
}
|
|
2077
|
-
|
|
2078
|
-
fn fbm3(p : vec3<f32>) -> f32 {
|
|
2079
|
-
return vnoise3(p) * 0.6 + vnoise3(p * 2.02 + 13.5) * 0.3 + vnoise3(p * 4.05 + 31.7) * 0.1;
|
|
2080
|
-
}
|
|
2081
|
-
|
|
2082
|
-
fn curl3(p : vec3<f32>) -> vec3<f32> {
|
|
2083
|
-
let e = 0.02;
|
|
2084
|
-
let dx = vec3<f32>(e, 0.0, 0.0);
|
|
2085
|
-
let dy = vec3<f32>(0.0, e, 0.0);
|
|
2086
|
-
let dz = vec3<f32>(0.0, 0.0, e);
|
|
2087
|
-
|
|
2088
|
-
let p0 = p;
|
|
2089
|
-
let p1 = p + vec3<f32>(31.4, 15.9, 26.5);
|
|
2090
|
-
let p2 = p + vec3<f32>(65.3, 58.9, 79.3);
|
|
2091
|
-
|
|
2092
|
-
let dAy_dz = (fbm3(p1 + dz) - fbm3(p1 - dz)) / (2.0 * e);
|
|
2093
|
-
let dAz_dy = (fbm3(p2 + dy) - fbm3(p2 - dy)) / (2.0 * e);
|
|
2094
|
-
|
|
2095
|
-
let dAz_dx = (fbm3(p2 + dx) - fbm3(p2 - dx)) / (2.0 * e);
|
|
2096
|
-
let dAx_dz = (fbm3(p0 + dz) - fbm3(p0 - dz)) / (2.0 * e);
|
|
2097
|
-
|
|
2098
|
-
let dAx_dy = (fbm3(p0 + dy) - fbm3(p0 - dy)) / (2.0 * e);
|
|
2099
|
-
let dAy_dx = (fbm3(p1 + dx) - fbm3(p1 - dx)) / (2.0 * e);
|
|
2100
|
-
|
|
2101
|
-
return vec3<f32>(dAz_dy - dAy_dz, dAx_dz - dAz_dx, dAy_dx - dAx_dy);
|
|
2102
|
-
}
|
|
2103
|
-
|
|
2104
|
-
fn quatMul(a: vec4<f32>, b: vec4<f32>) -> vec4<f32> {
|
|
2105
|
-
return vec4<f32>(
|
|
2106
|
-
a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y,
|
|
2107
|
-
a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x,
|
|
2108
|
-
a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w,
|
|
2109
|
-
a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z,
|
|
2110
|
-
);
|
|
2111
|
-
}
|
|
2112
|
-
|
|
2113
|
-
fn spawn3D(i : u32, idx : u32, birthFrac : f32) {
|
|
2114
|
-
let baseSeed = u32(P.v[1].y);
|
|
2115
|
-
let timeSalt = u32(max(0.0, P.v[0].y + 100.0) * 997.0);
|
|
2116
|
-
let seed = baseSeed + timeSalt;
|
|
2117
|
-
let shape = u32(P.v[4].x); // 0=point, 1=box, 2=sphere, 3=shell, 4=ring, 5=disc
|
|
2118
|
-
let ex = P.v[4].y; let ey = P.v[4].z; let ez = P.v[4].w;
|
|
2119
|
-
let ew = P.v[5].x; let eh = P.v[5].y; let ed = P.v[5].z; let er = P.v[5].w;
|
|
2120
|
-
|
|
2121
|
-
let r0 = rnd(idx, 0u, seed);
|
|
2122
|
-
let r1 = rnd(idx, 1u, seed);
|
|
2123
|
-
let r2 = rnd(idx, 2u, seed);
|
|
2124
|
-
|
|
2125
|
-
var pos = vec3<f32>(ex, ey, ez);
|
|
2126
|
-
if (shape == 1u) {
|
|
2127
|
-
pos = vec3<f32>(ex + (r0 - 0.5) * ew, ey + (r1 - 0.5) * eh, ez + (r2 - 0.5) * ed);
|
|
2128
|
-
} else if (shape == 2u) {
|
|
2129
|
-
let phi = r0 * 6.2831853;
|
|
2130
|
-
let cosTheta = (r1 * 2.0) - 1.0;
|
|
2131
|
-
let sinTheta = sqrt(max(0.0, 1.0 - cosTheta * cosTheta));
|
|
2132
|
-
let rad = er * pow(r2, 0.33333);
|
|
2133
|
-
pos = vec3<f32>(ex + cos(phi) * sinTheta * rad, ey + sin(phi) * sinTheta * rad, ez + cosTheta * rad);
|
|
2134
|
-
} else if (shape == 3u) {
|
|
2135
|
-
let phi = r0 * 6.2831853;
|
|
2136
|
-
let cosTheta = (r1 * 2.0) - 1.0;
|
|
2137
|
-
let sinTheta = sqrt(max(0.0, 1.0 - cosTheta * cosTheta));
|
|
2138
|
-
pos = vec3<f32>(ex + cos(phi) * sinTheta * er, ey + sin(phi) * sinTheta * er, ez + cosTheta * er);
|
|
2139
|
-
} else if (shape == 4u || shape == 5u) {
|
|
2140
|
-
let phi = r0 * 6.2831853;
|
|
2141
|
-
let ringJitter = 1.0 + (r1 - 0.5) * 0.35;
|
|
2142
|
-
let rad = select(er * ringJitter, er * sqrt(r1), shape == 5u);
|
|
2143
|
-
pos = vec3<f32>(ex + cos(phi) * rad, ey + (r2 - 0.5) * eh, ez + sin(phi) * rad);
|
|
2144
|
-
}
|
|
2145
|
-
|
|
2146
|
-
let dir = P.v[6].xyz;
|
|
2147
|
-
let spread = P.v[6].w;
|
|
2148
|
-
let speedMin = P.v[7].x;
|
|
2149
|
-
let speedMax = P.v[7].y;
|
|
2150
|
-
let spd = mix(speedMin, speedMax, rnd(idx, 3u, seed));
|
|
2151
|
-
|
|
2152
|
-
var vDir = normalize(dir);
|
|
2153
|
-
if (length(dir) < 0.001) {
|
|
2154
|
-
vDir = vec3<f32>(0.0, -1.0, 0.0);
|
|
2155
|
-
}
|
|
2156
|
-
if (spread > 0.001) {
|
|
2157
|
-
let theta = (rnd(idx, 4u, seed) - 0.5) * spread;
|
|
2158
|
-
let phi = rnd(idx, 5u, seed) * 6.2831853;
|
|
2159
|
-
var tangent = cross(vDir, vec3<f32>(0.0, 1.0, 0.0));
|
|
2160
|
-
if (length(tangent) < 0.01) {
|
|
2161
|
-
tangent = cross(vDir, vec3<f32>(1.0, 0.0, 0.0));
|
|
2162
|
-
}
|
|
2163
|
-
tangent = normalize(tangent);
|
|
2164
|
-
let bitangent = cross(vDir, tangent);
|
|
2165
|
-
vDir = normalize(vDir + (tangent * cos(phi) + bitangent * sin(phi)) * tan(theta));
|
|
2166
|
-
}
|
|
2167
|
-
|
|
2168
|
-
// If vortex is active, give newly spawned shards an initial orbital velocity component
|
|
2169
|
-
var initVel = vDir * spd;
|
|
2170
|
-
let vortexSwirl = P.v[14].w;
|
|
2171
|
-
if (abs(vortexSwirl) > 0.001) {
|
|
2172
|
-
let vCenter = P.v[14].xyz;
|
|
2173
|
-
let vAxis = normalize(P.v[15].xyz);
|
|
2174
|
-
let r = pos - vCenter;
|
|
2175
|
-
let rPerp = r - vAxis * dot(r, vAxis);
|
|
2176
|
-
if (length(rPerp) > 1.0) {
|
|
2177
|
-
let orbTangent = normalize(cross(vAxis, rPerp));
|
|
2178
|
-
initVel += orbTangent * (spd * 0.85 * sign(vortexSwirl));
|
|
2179
|
-
}
|
|
2180
|
-
}
|
|
2181
|
-
|
|
2182
|
-
let lifeMin = P.v[7].z;
|
|
2183
|
-
let lifeMax = P.v[7].w;
|
|
2184
|
-
let life = mix(lifeMin, lifeMax, rnd(idx, 6u, seed));
|
|
2185
|
-
|
|
2186
|
-
let angSpeed = mix(P.v[8].x, P.v[8].y, rnd(idx, 7u, seed));
|
|
2187
|
-
let angAxis = normalize(vec3<f32>(
|
|
2188
|
-
rnd(idx, 8u, seed) - 0.5,
|
|
2189
|
-
rnd(idx, 9u, seed) - 0.5,
|
|
2190
|
-
rnd(idx, 10u, seed) - 0.5,
|
|
2191
|
-
));
|
|
2192
|
-
|
|
2193
|
-
let qAngle = rnd(idx, 11u, seed) * 6.2831853;
|
|
2194
|
-
let qAxis = normalize(vec3<f32>(
|
|
2195
|
-
rnd(idx, 12u, seed) - 0.5,
|
|
2196
|
-
rnd(idx, 13u, seed) - 0.5,
|
|
2197
|
-
rnd(idx, 14u, seed) - 0.5,
|
|
2198
|
-
));
|
|
2199
|
-
let initQuat = vec4<f32>(qAxis * sin(qAngle * 0.5), cos(qAngle * 0.5));
|
|
2200
|
-
|
|
2201
|
-
let sizeJitter = P.v[16].w;
|
|
2202
|
-
let pScale = max(0.25, 1.0 + (rnd(idx, 15u, seed) - 0.5) * sizeJitter * 2.0);
|
|
2203
|
-
|
|
2204
|
-
var p: SwarmParticle3D;
|
|
2205
|
-
p.pos = pos;
|
|
2206
|
-
p.age = birthFrac * P.v[0].x;
|
|
2207
|
-
p.vel = initVel;
|
|
2208
|
-
p.life = life;
|
|
2209
|
-
p.quat = initQuat;
|
|
2210
|
-
p.angVel = angAxis * angSpeed;
|
|
2211
|
-
p.heat = 0.0;
|
|
2212
|
-
p.scale = pScale;
|
|
2213
|
-
p.variant = idx % max(1u, u32(P.v[8].z));
|
|
2214
|
-
p.seed = pcg(idx + seed);
|
|
2215
|
-
p.contact = 0.0;
|
|
2216
|
-
|
|
2217
|
-
particles[i] = p;
|
|
2218
|
-
}
|
|
2219
|
-
|
|
2220
|
-
fn spawnSpark3D(i : u32, sparkIdx : u32, maxParticles : u32, birthFrac : f32) {
|
|
2221
|
-
let baseSeed = u32(P.v[1].y);
|
|
2222
|
-
let timeSalt = u32(max(0.0, P.v[0].y + 100.0) * 1319.0);
|
|
2223
|
-
let seed = baseSeed ^ timeSalt;
|
|
2224
|
-
|
|
2225
|
-
// Search up to 6 candidate shards to find a hot or scraping parent shard
|
|
2226
|
-
var parentIdx = pcg(sparkIdx * 7u + seed) % maxParticles;
|
|
2227
|
-
var parent = particles[parentIdx];
|
|
2228
|
-
let threshold = P.v[29].x;
|
|
2229
|
-
for (var attempt = 1u; attempt < 6u; attempt = attempt + 1u) {
|
|
2230
|
-
if (parent.life > 0.0 && (parent.heat >= threshold || parent.contact > 0.5)) {
|
|
2231
|
-
break;
|
|
2232
|
-
}
|
|
2233
|
-
let candIdx = pcg(sparkIdx * 13u + attempt * 37u + seed) % maxParticles;
|
|
2234
|
-
let cand = particles[candIdx];
|
|
2235
|
-
if (cand.life > 0.0 && (cand.heat > parent.heat || parent.life <= 0.0)) {
|
|
2236
|
-
parent = cand;
|
|
2237
|
-
parentIdx = candIdx;
|
|
2238
|
-
}
|
|
2239
|
-
}
|
|
2240
|
-
|
|
2241
|
-
if (parent.life <= 0.0) {
|
|
2242
|
-
return;
|
|
2243
|
-
}
|
|
2244
|
-
|
|
2245
|
-
let r0 = rnd(sparkIdx, 0u, seed) - 0.5;
|
|
2246
|
-
let r1 = rnd(sparkIdx, 1u, seed) - 0.5;
|
|
2247
|
-
let r2 = rnd(sparkIdx, 2u, seed) - 0.5;
|
|
2248
|
-
let scatterDir = normalize(vec3<f32>(r0, r1 - 0.25, r2));
|
|
2249
|
-
let sparkSpd = mix(P.v[29].w, P.v[30].w, rnd(sparkIdx, 3u, seed));
|
|
2250
|
-
|
|
2251
|
-
var p: SwarmParticle3D;
|
|
2252
|
-
p.pos = parent.pos + scatterDir * 8.0;
|
|
2253
|
-
p.age = birthFrac * P.v[0].x;
|
|
2254
|
-
p.vel = parent.vel * 0.6 + scatterDir * sparkSpd;
|
|
2255
|
-
p.life = mix(P.v[30].x, P.v[30].y, rnd(sparkIdx, 4u, seed));
|
|
2256
|
-
p.quat = parent.quat;
|
|
2257
|
-
p.angVel = vec3<f32>(r0, r1, r2) * 18.0;
|
|
2258
|
-
p.heat = max(0.75, parent.heat * 1.25);
|
|
2259
|
-
p.scale = mix(P.v[29].y, P.v[29].z, rnd(sparkIdx, 5u, seed));
|
|
2260
|
-
p.variant = 0u;
|
|
2261
|
-
p.seed = pcg(sparkIdx + seed);
|
|
2262
|
-
p.contact = 0.0;
|
|
2263
|
-
|
|
2264
|
-
particles[i] = p;
|
|
2265
|
-
}
|
|
2266
|
-
|
|
2267
|
-
@compute @workgroup_size(64)
|
|
2268
|
-
fn stepSimulation(@builtin(global_invocation_id) id : vec3<u32>) {
|
|
2269
|
-
let idx = id.x;
|
|
2270
|
-
let maxParticles = u32(P.v[1].x);
|
|
2271
|
-
let sparkMax = u32(P.v[1].w);
|
|
2272
|
-
let totalSlots = maxParticles + sparkMax;
|
|
2273
|
-
if (idx >= totalSlots) { return; }
|
|
2274
|
-
|
|
2275
|
-
let isSpark = idx >= maxParticles;
|
|
2276
|
-
|
|
2277
|
-
if (!isSpark) {
|
|
2278
|
-
let emitStart = u32(P.v[0].z);
|
|
2279
|
-
let emitCount = u32(P.v[0].w);
|
|
2280
|
-
if (emitCount > 0u) {
|
|
2281
|
-
let end = emitStart + emitCount;
|
|
2282
|
-
var spawned = false;
|
|
2283
|
-
if (end <= maxParticles) {
|
|
2284
|
-
if (idx >= emitStart && idx < end) {
|
|
2285
|
-
let birthFrac = f32(idx - emitStart) / f32(emitCount);
|
|
2286
|
-
spawn3D(idx, idx, birthFrac);
|
|
2287
|
-
spawned = true;
|
|
2288
|
-
}
|
|
2289
|
-
} else {
|
|
2290
|
-
if (idx >= emitStart || idx < (end % maxParticles)) {
|
|
2291
|
-
let slot = select(idx - emitStart, idx + (maxParticles - emitStart), idx < emitStart);
|
|
2292
|
-
let birthFrac = f32(slot) / f32(emitCount);
|
|
2293
|
-
spawn3D(idx, idx, birthFrac);
|
|
2294
|
-
spawned = true;
|
|
2295
|
-
}
|
|
2296
|
-
}
|
|
2297
|
-
if (spawned) { return; }
|
|
2298
|
-
}
|
|
2299
|
-
} else if (sparkMax > 0u) {
|
|
2300
|
-
let sparkIdx = idx - maxParticles;
|
|
2301
|
-
let sEmitStart = u32(P.v[2].w);
|
|
2302
|
-
let sEmitCount = u32(P.v[16].z);
|
|
2303
|
-
if (sEmitCount > 0u) {
|
|
2304
|
-
let end = sEmitStart + sEmitCount;
|
|
2305
|
-
var spawned = false;
|
|
2306
|
-
if (end <= sparkMax) {
|
|
2307
|
-
if (sparkIdx >= sEmitStart && sparkIdx < end) {
|
|
2308
|
-
let birthFrac = f32(sparkIdx - sEmitStart) / f32(sEmitCount);
|
|
2309
|
-
spawnSpark3D(idx, sparkIdx, maxParticles, birthFrac);
|
|
2310
|
-
spawned = true;
|
|
2311
|
-
}
|
|
2312
|
-
} else {
|
|
2313
|
-
if (sparkIdx >= sEmitStart || sparkIdx < (end % sparkMax)) {
|
|
2314
|
-
let slot = select(sparkIdx - sEmitStart, sparkIdx + (sparkMax - sEmitStart), sparkIdx < sEmitStart);
|
|
2315
|
-
let birthFrac = f32(slot) / f32(sEmitCount);
|
|
2316
|
-
spawnSpark3D(idx, sparkIdx, maxParticles, birthFrac);
|
|
2317
|
-
spawned = true;
|
|
2318
|
-
}
|
|
2319
|
-
}
|
|
2320
|
-
if (spawned) { return; }
|
|
2321
|
-
}
|
|
2322
|
-
}
|
|
2323
|
-
|
|
2324
|
-
var p = particles[idx];
|
|
2325
|
-
if (p.life <= 0.0) { return; }
|
|
2326
|
-
|
|
2327
|
-
let dt = P.v[0].x;
|
|
2328
|
-
p.age += dt;
|
|
2329
|
-
if (p.age >= p.life) {
|
|
2330
|
-
p.life = 0.0;
|
|
2331
|
-
particles[idx] = p;
|
|
2332
|
-
return;
|
|
2333
|
-
}
|
|
2334
|
-
|
|
2335
|
-
var acc = P.v[2].xyz * select(1.0, 0.55, isSpark);
|
|
2336
|
-
|
|
2337
|
-
// Linear Drag
|
|
2338
|
-
let drag = P.v[3].x * select(1.0, 2.2, isSpark);
|
|
2339
|
-
acc -= p.vel * drag;
|
|
2340
|
-
|
|
2341
|
-
// 3D Curl Noise
|
|
2342
|
-
let noiseStrength = P.v[3].y * select(1.0, 1.35, isSpark);
|
|
2343
|
-
if (noiseStrength > 0.001) {
|
|
2344
|
-
let noiseScale = max(P.v[3].z, 1.0);
|
|
2345
|
-
let noiseSpeed = P.v[3].w;
|
|
2346
|
-
let time = P.v[0].y;
|
|
2347
|
-
let noisePos = (p.pos / noiseScale) + vec3<f32>(0.0, time * noiseSpeed, 0.0);
|
|
2348
|
-
let curl = curl3(noisePos);
|
|
2349
|
-
acc += curl * noiseStrength;
|
|
2350
|
-
}
|
|
2351
|
-
|
|
2352
|
-
// Attractors (up to 5)
|
|
2353
|
-
let numAttractors = min(5u, u32(P.v[8].w));
|
|
2354
|
-
for (var a = 0u; a < numAttractors; a = a + 1u) {
|
|
2355
|
-
let attr = P.v[9u + a];
|
|
2356
|
-
let toAttr = attr.xyz - p.pos;
|
|
2357
|
-
let dist = length(toAttr);
|
|
2358
|
-
let maxRadius = attr.w;
|
|
2359
|
-
if (dist > 0.1 && (maxRadius <= 0.0 || dist < maxRadius)) {
|
|
2360
|
-
var strength = 0.0;
|
|
2361
|
-
if (a == 0u) { strength = P.v[17].x; }
|
|
2362
|
-
else if (a == 1u) { strength = P.v[17].y; }
|
|
2363
|
-
else if (a == 2u) { strength = P.v[17].z; }
|
|
2364
|
-
else if (a == 3u) { strength = P.v[17].w; }
|
|
2365
|
-
else { strength = P.v[21].w; }
|
|
2366
|
-
let factor = select(1.0, 1.0 - dist / maxRadius, maxRadius > 0.0);
|
|
2367
|
-
acc += (toAttr / dist) * (strength * factor);
|
|
2368
|
-
}
|
|
2369
|
-
}
|
|
2370
|
-
|
|
2371
|
-
// 3D Vortex / Cyclone Field with Hollow Eye & Orbital Belt Equilibrium
|
|
2372
|
-
let vortexSwirl = P.v[14].w;
|
|
2373
|
-
if (abs(vortexSwirl) > 0.001 || abs(P.v[15].w) > 0.001) {
|
|
2374
|
-
let vCenter = P.v[14].xyz;
|
|
2375
|
-
let vAxis = normalize(P.v[15].xyz);
|
|
2376
|
-
let vPull = P.v[15].w;
|
|
2377
|
-
let vAxial = P.v[16].x;
|
|
2378
|
-
let vRadius = P.v[16].y;
|
|
2379
|
-
|
|
2380
|
-
let r = p.pos - vCenter;
|
|
2381
|
-
let h = dot(r, vAxis);
|
|
2382
|
-
let rPerp = r - (vAxis * h);
|
|
2383
|
-
let dPerp = length(rPerp);
|
|
2384
|
-
|
|
2385
|
-
if (dPerp > 0.1 && (vRadius <= 0.0 || dPerp < vRadius * 1.35)) {
|
|
2386
|
-
let effRadius = select(650.0, vRadius, vRadius > 0.0);
|
|
2387
|
-
let eyeRadius = max(effRadius * 0.24, 145.0);
|
|
2388
|
-
let bandWidth = max(effRadius * 0.54, 240.0);
|
|
2389
|
-
let bandRadius = eyeRadius + rnd(idx, 13u, p.seed) * bandWidth;
|
|
2390
|
-
|
|
2391
|
-
let falloff = clamp(1.0 - (dPerp / (effRadius * 1.25)), 0.18, 1.0);
|
|
2392
|
-
let tangent = normalize(cross(vAxis, rPerp));
|
|
2393
|
-
let radialInward = -rPerp / dPerp;
|
|
2394
|
-
let vTan = dot(p.vel, tangent);
|
|
2395
|
-
let vRadOut = dot(p.vel, -radialInward);
|
|
2396
|
-
|
|
2397
|
-
// Target tangential speed for this orbital band so shards don't accelerate to infinity
|
|
2398
|
-
let targetVTan = vortexSwirl * (0.55 + 0.45 * falloff);
|
|
2399
|
-
let swirlAcc = (targetVTan - vTan) * 2.2;
|
|
2400
|
-
|
|
2401
|
-
// Centripetal balance outside the hollow eye + spring toward each shard's orbital band
|
|
2402
|
-
let eyeMask = smoothstep(eyeRadius * 0.55, eyeRadius * 1.15, dPerp);
|
|
2403
|
-
let centripetal = ((vTan * vTan) / max(dPerp, 80.0)) * eyeMask * 0.92;
|
|
2404
|
-
let bandPull = ((dPerp - bandRadius) / bandWidth) * vPull * 2.4;
|
|
2405
|
-
let eyeRepel = select(0.0, -vPull * 3.8 * (1.0 - dPerp / eyeRadius), dPerp < eyeRadius);
|
|
2406
|
-
let radialAcc = centripetal + bandPull + eyeRepel - vRadOut * 2.1;
|
|
2407
|
-
|
|
2408
|
-
acc += tangent * swirlAcc + radialInward * radialAcc + vAxis * (vAxial * falloff);
|
|
2409
|
-
}
|
|
2410
|
-
}
|
|
2411
|
-
|
|
2412
|
-
// Integrate velocity
|
|
2413
|
-
p.vel += acc * dt;
|
|
2414
|
-
|
|
2415
|
-
// Floor Collision with Coulomb Sliding Friction & Angular Roll
|
|
2416
|
-
p.contact = 0.0;
|
|
2417
|
-
if (P.v[18].w > 0.5) {
|
|
2418
|
-
let floorY = P.v[18].x;
|
|
2419
|
-
let bounce = P.v[18].y;
|
|
2420
|
-
let friction = P.v[18].z;
|
|
2421
|
-
let progress = clamp(p.age / max(p.life, 0.001), 0.0, 1.0);
|
|
2422
|
-
let shardRadius = select(mix(P.v[19].x, P.v[19].y, progress) * p.scale, p.scale, isSpark);
|
|
2423
|
-
|
|
2424
|
-
if (p.pos.y + shardRadius >= floorY) {
|
|
2425
|
-
let impactSpeed = max(0.0, p.vel.y);
|
|
2426
|
-
p.pos.y = floorY - shardRadius;
|
|
2427
|
-
p.contact = 1.0;
|
|
2428
|
-
|
|
2429
|
-
if (p.vel.y > 0.0) {
|
|
2430
|
-
p.vel.y = -p.vel.y * select(bounce, min(0.55, bounce + 0.2), isSpark);
|
|
2431
|
-
}
|
|
2432
|
-
|
|
2433
|
-
let vSlide = length(vec2<f32>(p.vel.x, p.vel.z));
|
|
2434
|
-
let fDamp = exp(-friction * dt * 0.85);
|
|
2435
|
-
p.vel.x *= fDamp;
|
|
2436
|
-
p.vel.z *= fDamp;
|
|
2437
|
-
|
|
2438
|
-
let normal = vec3<f32>(0.0, -1.0, 0.0);
|
|
2439
|
-
let vTan = vec3<f32>(p.vel.x, 0.0, p.vel.z);
|
|
2440
|
-
let rollTorque = cross(normal, vTan) / max(shardRadius, 1.0);
|
|
2441
|
-
p.angVel += rollTorque * clamp(friction * dt * 2.5, 0.0, 1.0);
|
|
2442
|
-
|
|
2443
|
-
let heatGain = P.v[25].x;
|
|
2444
|
-
let thermal = pow(rnd(idx, 14u, p.seed), 2.4);
|
|
2445
|
-
let slideHeat = max(0.0, vSlide - 180.0) * friction * dt * 0.0032;
|
|
2446
|
-
let impactHeat = smoothstep(30.0, 260.0, impactSpeed) * 0.45;
|
|
2447
|
-
p.heat = min(1.35, p.heat + (slideHeat + impactHeat) * heatGain * (0.15 + 1.35 * thermal));
|
|
2448
|
-
}
|
|
2449
|
-
}
|
|
2450
|
-
|
|
2451
|
-
// Integrate position
|
|
2452
|
-
p.pos += p.vel * dt;
|
|
2453
|
-
|
|
2454
|
-
// Angular drag & Quaternion integration
|
|
2455
|
-
let angDrag = P.v[25].y;
|
|
2456
|
-
p.angVel *= exp(-angDrag * dt);
|
|
2457
|
-
let omega = p.angVel;
|
|
2458
|
-
let dq = quatMul(vec4<f32>(omega * (0.5 * dt), 0.0), p.quat);
|
|
2459
|
-
p.quat = normalize(p.quat + dq);
|
|
2460
|
-
|
|
2461
|
-
// Heat cooldown exponential decay
|
|
2462
|
-
let heatDecay = max(P.v[25].z, 0.05);
|
|
2463
|
-
p.heat *= exp(-dt / heatDecay);
|
|
2464
|
-
|
|
2465
|
-
particles[idx] = p;
|
|
2466
|
-
}
|
|
2467
|
-
|
|
2468
|
-
@compute @workgroup_size(64)
|
|
2469
|
-
fn packInstances(@builtin(global_invocation_id) id : vec3<u32>) {
|
|
2470
|
-
let idx = id.x;
|
|
2471
|
-
let maxParticles = u32(P.v[1].x);
|
|
2472
|
-
let sparkMax = u32(P.v[1].w);
|
|
2473
|
-
let totalSlots = maxParticles + sparkMax;
|
|
2474
|
-
if (idx >= totalSlots) { return; }
|
|
2475
|
-
|
|
2476
|
-
let isSpark = idx >= maxParticles;
|
|
2477
|
-
let numVariants = max(1u, u32(P.v[8].z));
|
|
2478
|
-
let sliceCount = max(1u, u32(P.v[20].y));
|
|
2479
|
-
let meshRadius = max(0.001, P.v[20].x);
|
|
2480
|
-
|
|
2481
|
-
var outIdx = idx;
|
|
2482
|
-
if (!isSpark) {
|
|
2483
|
-
let vIdx = idx % numVariants;
|
|
2484
|
-
let localIdx = idx / numVariants;
|
|
2485
|
-
outIdx = vIdx * sliceCount + localIdx;
|
|
2486
|
-
} else {
|
|
2487
|
-
let sparkIdx = idx - maxParticles;
|
|
2488
|
-
outIdx = (numVariants * sliceCount) + sparkIdx;
|
|
2489
|
-
}
|
|
2490
|
-
|
|
2491
|
-
let p = particles[idx];
|
|
2492
|
-
var out: InstanceData;
|
|
2493
|
-
|
|
2494
|
-
if (p.life <= 0.0 || p.age >= p.life) {
|
|
2495
|
-
out.posScale = vec4<f32>(0.0, 0.0, 0.0, 0.0);
|
|
2496
|
-
out.quat = vec4<f32>(0.0, 0.0, 0.0, 1.0);
|
|
2497
|
-
out.color = vec4<f32>(0.0);
|
|
2498
|
-
out.emissive = vec4<f32>(0.0);
|
|
2499
|
-
instances[outIdx] = out;
|
|
2500
|
-
return;
|
|
2501
|
-
}
|
|
2502
|
-
|
|
2503
|
-
let progress = p.age / p.life;
|
|
2504
|
-
let fadeIn = smoothstep(0.0, max(0.001, P.v[19].z), progress);
|
|
2505
|
-
let fadeOut = 1.0 - smoothstep(max(0.0, 1.0 - P.v[19].w), 1.0, progress);
|
|
2506
|
-
|
|
2507
|
-
if (isSpark) {
|
|
2508
|
-
let sparkRadius = max(0.0, p.scale * fadeIn * fadeOut);
|
|
2509
|
-
out.posScale = vec4<f32>(p.pos, sparkRadius / meshRadius);
|
|
2510
|
-
out.quat = p.quat;
|
|
2511
|
-
let sparkCol = mix(P.v[28].rgb, P.v[31].rgb, smoothstep(0.0, 0.55, progress));
|
|
2512
|
-
out.color = vec4<f32>(sparkCol, 1.0);
|
|
2513
|
-
out.emissive = vec4<f32>(sparkCol, P.v[30].z * fadeOut);
|
|
2514
|
-
instances[outIdx] = out;
|
|
2515
|
-
return;
|
|
2516
|
-
}
|
|
2517
|
-
|
|
2518
|
-
let lifeRadius = mix(P.v[19].x, P.v[19].y, progress) * fadeIn * fadeOut;
|
|
2519
|
-
let worldRadius = max(0.0, p.scale * lifeRadius);
|
|
2520
|
-
|
|
2521
|
-
out.posScale = vec4<f32>(p.pos, worldRadius / meshRadius);
|
|
2522
|
-
out.quat = p.quat;
|
|
2523
|
-
|
|
2524
|
-
// Base color palette interpolation
|
|
2525
|
-
let numColors = u32(P.v[21].x);
|
|
2526
|
-
var baseCol = P.v[22];
|
|
2527
|
-
if (numColors > 1u) {
|
|
2528
|
-
let colorT = progress * f32(numColors - 1u);
|
|
2529
|
-
let cIdx = min(u32(floor(colorT)), numColors - 2u);
|
|
2530
|
-
let cFrac = colorT - f32(cIdx);
|
|
2531
|
-
baseCol = mix(P.v[22u + cIdx], P.v[23u + cIdx], cFrac);
|
|
2532
|
-
}
|
|
2533
|
-
|
|
2534
|
-
// Dynamic emissive from friction heat and/or speed, modulated per-shard for natural rock/glow contrast
|
|
2535
|
-
let heatSource = u32(P.v[20].z); // 0=both, 1=friction, 2=speed
|
|
2536
|
-
let maxSpd = max(P.v[20].w, 1.0);
|
|
2537
|
-
let thermal = pow(rnd(idx, 14u, p.seed), 2.2);
|
|
2538
|
-
let speedFactor = smoothstep(0.62, 1.0, length(p.vel) / maxSpd) * thermal;
|
|
2539
|
-
var heatVal = p.heat;
|
|
2540
|
-
if (heatSource == 0u) {
|
|
2541
|
-
heatVal = max(p.heat, speedFactor);
|
|
2542
|
-
} else if (heatSource == 2u) {
|
|
2543
|
-
heatVal = speedFactor;
|
|
2544
|
-
}
|
|
2545
|
-
|
|
2546
|
-
let heatCurve = P.v[21].y;
|
|
2547
|
-
let curvedHeat = pow(clamp(heatVal, 0.0, 1.0), select(1.0, heatCurve, heatCurve > 0.0));
|
|
2548
|
-
let heatRamp = mix(
|
|
2549
|
-
P.v[26].rgb,
|
|
2550
|
-
mix(P.v[27].rgb, P.v[28].rgb, smoothstep(0.55, 0.95, curvedHeat)),
|
|
2551
|
-
smoothstep(0.08, 0.55, curvedHeat),
|
|
2552
|
-
);
|
|
2553
|
-
let heatIntensity = curvedHeat * P.v[21].z * smoothstep(0.08, 0.65, curvedHeat);
|
|
2554
|
-
|
|
2555
|
-
// Blend base albedo color toward the hot color only for significantly heated shards
|
|
2556
|
-
out.color = vec4<f32>(mix(baseCol.rgb, heatRamp, smoothstep(0.12, 0.75, curvedHeat)), baseCol.a);
|
|
2557
|
-
|
|
2558
|
-
if (heatIntensity > 0.01) {
|
|
2559
|
-
out.emissive = vec4<f32>(heatRamp, heatIntensity);
|
|
2560
|
-
} else {
|
|
2561
|
-
out.emissive = vec4<f32>(0.0);
|
|
2562
|
-
}
|
|
2563
|
-
|
|
2564
|
-
instances[outIdx] = out;
|
|
2565
|
-
}
|
|
2566
|
-
`,ko=class{device;simPipeline;packPipeline;bindGroupLayout;constructor(t){this.device=t;let r=t.createShaderModule({label:"swarm3d.wgsl",code:hc});this.bindGroupLayout=t.createBindGroupLayout({label:"Swarm3DBindGroupLayout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});let n=t.createPipelineLayout({bindGroupLayouts:[this.bindGroupLayout]});this.simPipeline=t.createComputePipeline({label:"Swarm3DSimPipeline",layout:n,compute:{module:r,entryPoint:"stepSimulation"}}),this.packPipeline=t.createComputePipeline({label:"Swarm3DPackPipeline",layout:n,compute:{module:r,entryPoint:"packInstances"}})}createState(t){let r=Math.max(1,t.variants),n=Math.ceil(t.max/r),o=t.sparks?.max??0,A=t.max+o,i=n*r+o,a=A*80,s=i*64;return{device:this.device,particles:this.device.createBuffer({label:"Swarm3DParticles",size:a,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}),instances:this.device.createBuffer({label:"Swarm3DInstances",size:s,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}),ubo:this.device.createBuffer({label:"Swarm3DUbo",size:512,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),frame:-999999,emitted:0,carry:0,sparkEmitted:0,sparkCarry:0,sliceCount:n,totalParticleSlots:A,totalInstanceSlots:i,snapshots:new Map}}packParams(t,r,n,o){n.fill(0);let A=(f,h,I,b,D)=>n.set([h,I,b,D],f*4),i=t.sparks?.max??0;A(0,o.dt,o.time,o.emitStart,o.emitCount),A(1,t.max,t.seed,o.frameDt,i),A(2,r.gravity[0],r.gravity[1],r.gravity[2],o.sparkEmitStart),A(3,r.drag,r.noise.strength,r.noise.scale,r.noise.speed);let a=t.emitter.shape==="box"?1:t.emitter.shape==="sphere"?2:t.emitter.shape==="shell"?3:t.emitter.shape==="ring"?4:t.emitter.shape==="disc"?5:0,s=r.emitterPos?r.emitterPos[0]:t.emitter.x,c=r.emitterPos?r.emitterPos[1]:t.emitter.y,l=r.emitterPos?r.emitterPos[2]:t.emitter.z;A(4,a,s,c,l),A(5,t.emitter.width,t.emitter.height,t.emitter.depth,t.emitter.radius),A(6,t.direction[0],t.direction[1],t.direction[2],t.spread),A(7,t.speed[0],t.speed[1],t.lifetime[0],t.lifetime[1]);let u=r.attractors.slice(0,5);A(8,t.angularSpeed[0],t.angularSpeed[1],t.variants,u.length);let g=[0,0,0,0,0];for(let f=0;f<u.length;f++){let h=u[f];h&&(A(9+f,h.x,h.y,h.z,h.radius??0),g[f]=h.strength)}A(17,g[0],g[1],g[2],g[3]),r.vortex?(A(14,r.vortex.x,r.vortex.y,r.vortex.z,r.vortex.swirl),A(15,r.vortex.axis[0],r.vortex.axis[1],r.vortex.axis[2],r.vortex.pull),A(16,r.vortex.axial,r.vortex.radius,o.sparkEmitCount,t.sizeJitter)):A(16,0,0,o.sparkEmitCount,t.sizeJitter),r.floor?A(18,r.floor.y,r.floor.bounce,r.floor.friction,1):A(18,0,0,0,0),A(19,t.size[0],t.size[1],t.fade[0],t.fade[1]);let p=t.heat.source==="friction"?1:t.heat.source==="speed"?2:0;A(20,t.meshRadius??20,o.sliceCount,p,t.heat.maxSpeed);let d=t.colors.slice(0,3);A(21,d.length,t.heat.curve,t.heat.intensity,g[4]);for(let f=0;f<d.length;f++){let h=d[f];h&&A(22+f,h[0],h[1],h[2],h[3])}A(25,r.floor?.heatGain??1,t.angularDrag,r.floor?.heatDecay??.45,0),A(26,t.heat.colors[0][0],t.heat.colors[0][1],t.heat.colors[0][2],1),A(27,t.heat.colors[1][0],t.heat.colors[1][1],t.heat.colors[1][2],1),A(28,t.heat.colors[2][0],t.heat.colors[2][1],t.heat.colors[2][2],1),t.sparks&&(A(29,t.sparks.threshold,t.sparks.size[0],t.sparks.size[1],t.sparks.speed[0]),A(30,t.sparks.lifetime[0],t.sparks.lifetime[1],t.sparks.intensity,t.sparks.speed[1]),A(31,t.sparks.color[0],t.sparks.color[1],t.sparks.color[2],1))}advance(t,r,n,o,A){let{device:i}=t,a=Math.max(0,Math.round((r.prewarm??0)*o));if(n<t.frame||t.frame<-a-1){let b=-999999;for(let m of t.snapshots.keys())m<=n&&m>b&&(b=m);let D=i.createCommandEncoder({label:"swarm3d_restore"});if(b>=0){let m=t.snapshots.get(b);m&&(D.copyBufferToBuffer(m.buffer,0,t.particles,0,t.totalParticleSlots*80),t.emitted=m.emitted,t.carry=m.carry,t.sparkEmitted=m.sparkEmitted,t.sparkCarry=m.sparkCarry,t.frame=b)}else D.clearBuffer(t.particles),D.clearBuffer(t.instances),t.emitted=0,t.carry=0,t.sparkEmitted=0,t.sparkCarry=0,t.frame=-1-a;i.queue.submit([D.finish()])}let s=new Float32Array(128),c=Math.max(1,Math.round(r.substeps)),l=1/o,u=l/c,g=i.createBindGroup({layout:this.bindGroupLayout,entries:[{binding:0,resource:{buffer:t.ubo}},{binding:1,resource:{buffer:t.particles}},{binding:2,resource:{buffer:t.instances}}]}),p=Math.ceil(t.totalParticleSlots/64),d=r.sparks?.max??0,f=r.sparks?.rate??0;for(let b=t.frame+1;b<=n;b++){let D=A(Math.max(0,b)),m=D.rate*l+t.carry,Q=Math.floor(m);t.carry=m-Q;let w=Math.floor(Q/c),S=Q%c,N=d>0?f*l+t.sparkCarry:0,M=Math.floor(N);t.sparkCarry=N-M;let G=Math.floor(M/c),j=M%c;for(let R=0;R<c;R++){let K=w+(S>0?1:0);S>0&&S--;let z=t.emitted%r.max;t.emitted+=K;let J=G+(j>0?1:0);j>0&&j--;let W=d>0?t.sparkEmitted%d:0;t.sparkEmitted+=J,this.packParams(r,D,s,{dt:u,time:b*l+R*u,emitStart:z,emitCount:K,sparkEmitStart:W,sparkEmitCount:J,frameDt:l,sliceCount:t.sliceCount}),i.queue.writeBuffer(t.ubo,0,s);let X=i.createCommandEncoder({label:`swarm3d_step_${b}_${R}`}),Ae=X.beginComputePass();Ae.setPipeline(this.simPipeline),Ae.setBindGroup(0,g),Ae.dispatchWorkgroups(p),Ae.end(),i.queue.submit([X.finish()])}if(t.frame=b,b>=0&&b%24===0&&t.snapshots.size<64){let R=t.snapshots.get(b);R||(R={buffer:i.createBuffer({label:`swarm3d_snap_${b}`,size:t.totalParticleSlots*80,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),emitted:t.emitted,carry:t.carry,sparkEmitted:t.sparkEmitted,sparkCarry:t.sparkCarry},t.snapshots.set(b,R));let K=i.createCommandEncoder({label:`swarm3d_snap_save_${b}`});K.copyBufferToBuffer(t.particles,0,R.buffer,0,t.totalParticleSlots*80),i.queue.submit([K.finish()])}}let h=i.createCommandEncoder({label:"swarm3d_pack_instances"}),I=h.beginComputePass();I.setPipeline(this.packPipeline),I.setBindGroup(0,g),I.dispatchWorkgroups(p),I.end(),i.queue.submit([h.finish()])}destroyState(t){t.particles.destroy(),t.instances.destroy(),t.ubo.destroy();for(let r of t.snapshots.values())r.buffer.destroy();t.snapshots.clear()}};var mc={repeat:"repeat",clamp:"clamp-to-edge",mirror:"mirror-repeat"},Ic=5e-4,Ma=class{device;format;quad3dPipeline;slug3dPipeline;mesh3dPipeline;audioMeshDeformPipeline;morphPipeline;swarm3dPipeline;floorReflectionPipeline;dofPipeline;dofBindGroupLayout;cameraPool;lightsPool;directLightsPool;instancePool;cameraUniformBindGroupCache=new Ni;samplerCache=new Oi;depthTexture=null;linearDepthTexture=null;reflectionColorTexture=null;reflectionMsaaColorTexture=null;reflectionDepthTexture=null;reflectionTempTexture=null;reflectionBlurredTexture=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;shadowTextures=new Map;placeholderShadowTexture=null;shadowSampler=null;meshBounds=new WeakMap;bloomPipeline=null;outlinePipeline=null;geometryResolvePipeline=null;lastCameraBuffer=null;sampleCount;constructor(t,r,n=4){this.device=t,this.format=r,this.sampleCount=n,this.quad3dPipeline=new Po(t,r,"depth24plus",n),this.slug3dPipeline=new Uo(t,r,"depth24plus",this.quad3dPipeline.cameraLayout,this.quad3dPipeline.lightsLayout,n),this.mesh3dPipeline=new Go(t,r,"depth24plus",this.quad3dPipeline.cameraLayout,this.quad3dPipeline.lightsLayout,n),this.audioMeshDeformPipeline=new Io(t),this.morphPipeline=new Ro(t),this.swarm3dPipeline=new ko(t),this.floorReflectionPipeline=new vo(t,r,n,this.quad3dPipeline.cameraLayout,this.quad3dPipeline.lightsLayout,"depth24plus"),this.cameraPool=new Ye(320,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.lightsPool=new Ye(Wo,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.directLightsPool=new Ye(64,GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST),this.instancePool=new Ye(65536,GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST);let o=t.createShaderModule({label:"dof-bokeh.wgsl",code:da});this.dofBindGroupLayout=t.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=t.createRenderPipeline({label:"DoFBokehPipeline",layout:t.createPipelineLayout({bindGroupLayouts:[this.dofBindGroupLayout]}),vertex:{module:o,entryPoint:"vs_fullscreen"},fragment:{module:o,entryPoint:"fs_dof",targets:[{format:r}]},primitive:{topology:"triangle-list"}})}attachments=new Map;attachmentsUsed=new Set;attachment(t,r,n,o){let A=`${t}:${r}x${n}:${o.sampleCount??1}:${o.usage}`;this.attachmentsUsed.add(A);let i=this.attachments.get(A);return i||(i=this.device.createTexture({label:t,size:{width:r,height:n},...o}),this.attachments.set(A,i)),i}resetPools(){for(let[t,r]of this.attachments)this.attachmentsUsed.has(t)||(r.destroy(),this.attachments.delete(t));this.attachmentsUsed.clear(),this.outlinePipeline?.reset(),this.bloomPipeline?.resetPools(),this.cameraPool.reset(),this.lastCameraPose=null,this.lastCameraBuffer=null,this.lightsPool.reset(),this.directLightsPool.reset(),this.instancePool.reset(),this.quad3dPipeline.resetPools(),this.slug3dPipeline.resetPools(),this.mesh3dPipeline.resetPools(),this.audioMeshDeformPipeline.resetPools(),this.morphPipeline.resetPools()}getOrCreateDepthTexture(t,r){return this.depthTexture=this.attachment("Renderer3DDepthTexture",t,r,{format:"depth24plus",sampleCount:this.sampleCount,usage:GPUTextureUsage.RENDER_ATTACHMENT}),this.depthTexture}getOrCreateMsaaTexture(t,r,n,o,A,i=!1){return this.attachment(r,o,A,{format:n,sampleCount:this.sampleCount,usage:GPUTextureUsage.RENDER_ATTACHMENT|(i?GPUTextureUsage.TEXTURE_BINDING:0)})}hdrSource(){return this.hdrTexture}getOrCreateHdrTexture(t,r){return this.hdrTexture=this.attachment("Renderer3DHdrRadiance",t,r,{format:"rgba16float",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),this.hdrTexture}getOrCreateLinearDepthTexture(t,r){return this.linearDepthTexture=this.attachment("Renderer3DLinearDepthTexture",t,r,{format:"rgba16float",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),this.linearDepthTexture}getOrCreateReflectionTexture(t,r){return this.reflectionColorTexture=this.attachment("Renderer3DReflectionColor",t,r,{format:this.format,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),this.reflectionColorTexture}getOrCreateReflectionMsaaTexture(t,r){return this.reflectionMsaaColorTexture=this.attachment("Renderer3DReflectionMsaaColor",t,r,{format:this.format,sampleCount:this.sampleCount,usage:GPUTextureUsage.RENDER_ATTACHMENT}),this.reflectionMsaaColorTexture}getOrCreateReflectionDepthTexture(t,r){return this.reflectionDepthTexture=this.attachment("Renderer3DReflectionDepth",t,r,{format:"depth24plus",sampleCount:this.sampleCount,usage:GPUTextureUsage.RENDER_ATTACHMENT}),this.reflectionDepthTexture}getOrCreateReflectionTempTexture(t,r){return this.reflectionTempTexture=this.attachment("Renderer3DReflectionTemp",t,r,{format:this.format,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),this.reflectionTempTexture}getOrCreateReflectionBlurredTexture(t,r){return this.reflectionBlurredTexture=this.attachment("Renderer3DReflectionBlurred",t,r,{format:this.format,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),this.reflectionBlurredTexture}packCameraUniforms(t,r,n,o=0){if(this.lastCameraPose&&this.lastCameraBuffer&&this.lastCameraPose.eye[0]===t.eye[0]&&this.lastCameraPose.eye[1]===t.eye[1]&&this.lastCameraPose.eye[2]===t.eye[2]&&this.lastCameraPose.target[0]===t.target[0]&&this.lastCameraPose.target[1]===t.target[1]&&this.lastCameraPose.target[2]===t.target[2]&&this.lastCameraPose.up[0]===t.up[0]&&this.lastCameraPose.up[1]===t.up[1]&&this.lastCameraPose.up[2]===t.up[2]&&this.lastCameraPose.fov===t.fov&&this.lastCameraPose.near===t.near&&this.lastCameraPose.far===t.far)return this.lastCameraBuffer;let A=pr.computeViewMatrix(t),i=pr.computeProjectionMatrix(t),a=pr.computeViewProjectionMatrix(t),s=Ee.invert(a)??Ee.identity();this.cameraUniformData.set(A,0),this.cameraUniformData.set(i,16),this.cameraUniformData.set(a,32),this.cameraUniformData.set(s,48),this.cameraUniformData[64]=t.eye[0],this.cameraUniformData[65]=t.eye[1],this.cameraUniformData[66]=t.eye[2],this.cameraUniformData[67]=t.near;let c=Z.normalize(Z.subtract(t.target,t.eye));this.cameraUniformData[68]=c[0],this.cameraUniformData[69]=c[1],this.cameraUniformData[70]=c[2],this.cameraUniformData[71]=t.far,this.cameraUniformData[72]=t.focusDistance??1e3,this.cameraUniformData[73]=t.fStop??2.8,this.cameraUniformData[74]=t.maxBlurRadius??32,this.cameraUniformData[75]=t.focusDistance!==void 0?1:0,this.cameraUniformData[76]=r,this.cameraUniformData[77]=n,this.cameraUniformData[78]=o,this.cameraUniformData[79]=0;let l=this.cameraPool.getBuffer(this.device,this.cameraUniformData);return this.lastCameraPose=t,this.lastCameraBuffer=l,l}createCameraBindGroup(t){return this.cameraUniformBindGroupCache.getBindGroup(this.device,this.quad3dPipeline.cameraLayout,t)}getOrCreateLightsBuffer(t,r){let n=Qt.packLightsUniforms(t??[],r?.environment,Array.isArray(r?.shadow)?r.shadow[0]:r?.shadow);return this.lightsPool.getBuffer(this.device,n)}createLightsBindGroup(t,r,n,o){let A=Qt.packDirectLights(n,o);if(A.byteLength>this.device.limits.maxStorageBufferBindingSize)throw new Error(`Direct lights require ${A.byteLength} bytes, exceeding the device storage binding limit of ${this.device.limits.maxStorageBufferBindingSize} bytes`);let i=this.directLightsPool.getBuffer(this.device,A);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:So,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT});let a=r&&this.shadowTexture?this.shadowTexture:this.placeholderShadowTexture;return this.device.createBindGroup({label:"Lights3DBindGroup",layout:this.quad3dPipeline.lightsLayout,entries:[{binding:0,resource:{buffer:t}},{binding:1,resource:a.createView({dimension:"2d-array"})},{binding:2,resource:this.shadowSampler},{binding:3,resource:{buffer:i}}]})}meshAabb(t){let r=this.meshBounds.get(t);if(!r){let n=[1/0,1/0,1/0],o=[-1/0,-1/0,-1/0],A=t.positions;for(let i=0;i+2<A.length;i+=3)for(let a=0;a<3;a++){let s=A[i+a];s<n[a]&&(n[a]=s),s>o[a]&&(o[a]=s)}r=Number.isFinite(n[0])?{min:n,max:o}:{min:[0,0,0],max:[0,0,0]},this.meshBounds.set(t,r)}return r}worldBounds(t){return t.kind==="mesh"?t.opts.bounds?t.opts.bounds:uA(this.meshAabb(t.mesh),this.meshModelMatrix(t.opts)):uA({min:[-.5,-.5,0],max:[.5,.5,0]},this.quadModelMatrix(t.opts))}renderShadowMap(t,r,n,o,A,i={}){let a=r.lightType??r.type;if(a!=="directional"&&a!=="spot")return null;let s=Qt.processLight(r),c=[s.posType[0],s.posType[1],s.posType[2]],l=[s.dirRadius[0],s.dirRadius[1],s.dirRadius[2]],u=i.mapSize??2048,g=i.layer??0,p=i.layerCount??1;if(p>this.device.limits.maxTextureArrayLayers)throw new Error(`Shadow maps require ${p} texture layers, exceeding the device limit of ${this.device.limits.maxTextureArrayLayers}`);let d=o.map(w=>this.worldBounds(w)),f=va({type:a,position:c,direction:l,angle:r.angle},d,A,u);if(!f)return null;let h=`${u}:${p}`,I=this.shadowTextures.get(h);I||(I=this.device.createTexture({label:"ShadowMap",size:{width:u,height:u,depthOrArrayLayers:p},format:So,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),this.shadowTextures.set(h,I)),this.shadowTexture=I;let b=new Float32Array(80);b.set(f.viewProj,32),b.set(f.viewProj,0),b[5]=1,b.set(f.viewProj,16),b[64]=c[0],b[65]=c[1],b[66]=c[2],b[68]=l[0],b[69]=l[1],b[70]=l[2],b[76]=u,b[77]=u;let D=this.createCameraBindGroup(this.cameraPool.getBuffer(this.device,b)),m=t.beginRenderPass({label:"ShadowMapPass",colorAttachments:[],depthStencilAttachment:{view:this.shadowTexture.createView({dimension:"2d",baseArrayLayer:g,arrayLayerCount:1}),depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store"}}),Q=this.samplerCache.getSampler(this.device);for(let w of o)if(w.kind==="mesh"){let S=this.meshModelMatrix(w.opts);this.mesh3dPipeline.drawShadow(m,D,w.buffers??this.getOrCreateMeshBuffers(w.mesh,w.opts.wireframe),{modelMatrix:S,normalMatrix:w.opts.normalMatrix??Qt.computeNormalMatrix(S),wireframe:w.opts.wireframe,isSkinned:w.opts.isSkinned,skinningMatrices:w.opts.skinningMatrices,isInstanced:!!(w.opts.instanceBuffer||w.opts.instanceCount&&w.opts.instanceCount>1),instanceBuffer:w.opts.instanceBuffer},w.opts.instanceCount??1,w.opts.firstInstance??0)}else{let S=this.quadModelMatrix(w.opts);this.quad3dPipeline.drawShadow(m,D,w.texture,Q,{modelMatrix:S,normalMatrix:S,width:w.opts.width,height:w.opts.height,textureExtent:w.opts.textureExtent,opacity:w.opts.opacity,colorTint:w.opts.colorTint,relief:w.opts.relief})}return m.end(),{matrix:f.viewProj,lightIndex:n,mapSize:u,softness:i.softness??r.shadowSoftness??2.5,bias:a==="directional"?6e-4:8e-5,normalOffset:f.texelWorldSize*1.5,darkness:i.darkness??r.shadowDarkness??1}}beginPass(t,r,n,o,A,i="clear",a={r:0,g:0,b:0,a:0},s,c,l,u=!1){let g=this.getOrCreateDepthTexture(n,o),p=this.packCameraUniforms(A,n,o),d=this.createCameraBindGroup(p),f=this.getOrCreateLightsBuffer(c,l),h=this.createLightsBindGroup(f,!!l?.shadow,c??[],l?.shadow?Array.isArray(l.shadow)?l.shadow:[l.shadow]:[]),I=this.sampleCount>1;if(I&&i==="load")throw new Error("Renderer3D.beginPass: loadOp 'load' needs a Renderer3D built with sampleCount 1");let b=(Q,w,S,N)=>w?{view:w.createView(),resolveTarget:Q,loadOp:"clear",storeOp:"discard",clearValue:S}:{view:Q,loadOp:N,storeOp:"store",clearValue:S};I&&(this.msaaColorTexture=this.getOrCreateMsaaTexture(this.msaaColorTexture,"Renderer3DMsaaColor",this.format,n,o,!!l?.environment?.outlines));let D=[b(r,I?this.msaaColorTexture:null,a,i)];if(I&&l?.environment?.outlines&&(D[0].storeOp="store"),s){I&&(this.msaaLinearDepthTexture=this.getOrCreateMsaaTexture(this.msaaLinearDepthTexture,"Renderer3DMsaaLinearDepth","rgba16float",n,o,!0));let Q=b(s,I?this.msaaLinearDepthTexture:null,{r:Math.min(A.far,65504),g:.5,b:.5,a:0},"clear");I&&l?.environment?.outlines&&(Q.resolveTarget=void 0,Q.storeOp="store"),D.push(Q)}return this.passWritesHdr=u,u&&(this.hdrTexture=this.getOrCreateHdrTexture(n,o),I&&(this.msaaHdrTexture=this.getOrCreateMsaaTexture(this.msaaHdrTexture,"Renderer3DMsaaHdr","rgba16float",n,o)),D.push(b(this.hdrTexture.createView(),I?this.msaaHdrTexture:null,{r:0,g:0,b:0,a:0},"clear"))),{pass:t.beginRenderPass({colorAttachments:D,depthStencilAttachment:{view:g.createView(),depthClearValue:1,depthLoadOp:"clear",depthStoreOp:I?"discard":"store"}}),cameraBindGroup:d,cameraBuffer:p,lightsBindGroup:h}}beginReflectionPass(t,r,n,o,A,i){this.passWritesHdr=!1;let a=Math.max(1,Math.floor(r/2)),s=Math.max(1,Math.floor(n/2)),c=this.getOrCreateReflectionTexture(a,s),l=this.getOrCreateReflectionDepthTexture(a,s),u=this.packCameraUniforms(o,a,s),g=this.createCameraBindGroup(u),p=Qt.packLightsUniforms(A??[],i?.environment,Array.isArray(i?.shadow)?i.shadow[0]:i?.shadow,!0),d=this.lightsPool.getBuffer(this.device,p),f=this.createLightsBindGroup(d,!!i?.shadow,A??[],i?.shadow?Array.isArray(i.shadow)?i.shadow:[i.shadow]:[]),h=this.sampleCount>1,I=h?this.getOrCreateReflectionMsaaTexture(a,s):null,b=[I?{view:I.createView(),resolveTarget:c.createView(),loadOp:"clear",storeOp:"discard",clearValue:{r:0,g:0,b:0,a:0}}:{view:c.createView(),loadOp:"clear",storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}];return{pass:t.beginRenderPass({colorAttachments:b,depthStencilAttachment:{view:l.createView(),depthClearValue:1,depthLoadOp:"clear",depthStoreOp:h?"discard":"store"}}),cameraBindGroup:g,lightsBindGroup:f,reflectionTexture:c}}blurReflection(t,r,n){if(n<=.001)return r;let o=r.width,A=r.height,i=this.getOrCreateReflectionTempTexture(o,A),a=this.getOrCreateReflectionBlurredTexture(o,A);return this.floorReflectionPipeline.applyBlur(t,r,i,a,o,A,n),a}drawFloor(t,r,n,o,A,i=!1,a=!1){this.floorReflectionPipeline.draw(t,r,n,o,A,i,a)}quadModelMatrix(t){if(t.modelMatrix)return t.modelMatrix;let{position:r,width:n,height:o,rotation:A=[0,0,0],scale:i=[1,1,1],anchor:a=[.5,.5]}=t,s=Ee.identity();s=Ee.multiply(s,Ee.translate(r[0]+(a[0]-.5)*n,r[1]+(a[1]-.5)*o,r[2]));let c=A[0]*Math.PI/180,l=A[1]*Math.PI/180,u=A[2]*Math.PI/180;u!==0&&(s=Ee.multiply(s,Ee.rotateZ(u))),l!==0&&(s=Ee.multiply(s,Ee.rotateY(l))),c!==0&&(s=Ee.multiply(s,Ee.rotateX(c)));let g=n*i[0],p=o*i[1],d=i[2];s=Ee.multiply(s,Ee.scale(g,p,d));let f=.5-a[0],h=.5-a[1];return(f!==0||h!==0)&&(s=Ee.multiply(s,Ee.translate(f,h,0))),s}drawSlugText(t,r,n,o,A,i=0,a=!1){let{width:s,height:c}=A;if(!(s>0&&c>0))return;let l=this.quadModelMatrix(A),u=A.normalMatrix??Qt.computeNormalMatrix(l),g=Ee.multiply(l,Ee.multiply(Ee.translate(-.5,-.5,0),Ee.scale(1/s,1/c,1)));for(let p=0;p<o.length;p++){let d=o[p],[f,h,I,b,D,m]=d.transform,Q=[f,h,0,0,I,b,0,0,0,0,1,0,D,m,0,1];this.slug3dPipeline.draw(t,r,n,d.font,d.instances,d.instanceCount,{modelMatrix:Ee.multiply(g,Q),normalMatrix:u,opacity:d.opacity*(A.opacity??1),slant:d.slant,twoSided:A.twoSided??!0,depthPull:Ic*(i+p+1),material:A.material,shininess:A.shininess??32,roughness:A.roughness,specularIntensity:A.specularIntensity??.5,ambientIntensity:A.ambientIntensity??1,metallic:A.metallic,emissive:A.emissive,emissiveIntensity:A.emissiveIntensity,toon:A.toon,outline:A.outline,matte:A.matte},a,this.passWritesHdr)}}drawTextureQuad(t,r,n,o,A,i=!1){let{width:a,height:s,opacity:c=1,colorTint:l=[1,1,1,1],borderColor:u,borderWidth:g=0,borderRadius:p=0,twoSided:d=!0,material:f="lit",shininess:h=32,roughness:I,specularIntensity:b=.5,ambientIntensity:D=1,metallic:m}=A,Q=this.quadModelMatrix(A),w=A.normalMatrix??Qt.computeNormalMatrix(Q),S=this.samplerCache.getSampler(this.device),N;if(u)if(Array.isArray(u))N=u;else{let M=Mt(u);N=[M.r,M.g,M.b,M.a]}this.quad3dPipeline.draw(t,r,n,o,S,{modelMatrix:Q,normalMatrix:w,colorTint:l,borderColor:N,borderWidth:g,opacity:c,borderRadius:p,twoSided:d,width:a,height:s,textureExtent:A.textureExtent,material:f,shininess:h,roughness:I,specularIntensity:b,ambientIntensity:D,metallic:m,emissive:A.emissive,emissiveIntensity:A.emissiveIntensity,toon:A.toon,outline:A.outline,matte:A.matte,relief:A.relief},i,this.passWritesHdr)}meshModelMatrix(t){if(t.modelMatrix)return t.modelMatrix;let{position:r=[0,0,0],rotation:n=[0,0,0],scale:o=[1,1,1]}=t,A=Ee.translate(r[0],r[1],r[2]),i=n[0]*Math.PI/180,a=n[1]*Math.PI/180,s=n[2]*Math.PI/180;return s!==0&&(A=Ee.multiply(A,Ee.rotateZ(s))),a!==0&&(A=Ee.multiply(A,Ee.rotateY(a))),i!==0&&(A=Ee.multiply(A,Ee.rotateX(i))),Ee.multiply(A,Ee.scale(o[0],o[1],o[2]))}getOrCreateMeshBuffers(t,r=!1){let n=this.meshBuffersCache.get(t);if(n)return r&&(!t.topology||t.topology==="triangle-list")&&this.ensureWireIndices(t,n),n;let o=t.positions.length/3,A=new Float32Array(o*16);for(let p=0;p<o;p++){let d=p*16;A[d]=t.positions[p*3]??0,A[d+1]=t.positions[p*3+1]??0,A[d+2]=t.positions[p*3+2]??0,A[d+3]=t.uvs[p*2]??0,A[d+4]=t.uvs[p*2+1]??0,A[d+5]=t.normals[p*3]??0,A[d+6]=t.normals[p*3+1]??0,A[d+7]=t.normals[p*3+2]??1,t.jointIndices?(A[d+8]=t.jointIndices[p*4]??0,A[d+9]=t.jointIndices[p*4+1]??0,A[d+10]=t.jointIndices[p*4+2]??0,A[d+11]=t.jointIndices[p*4+3]??0):(A[d+8]=0,A[d+9]=0,A[d+10]=0,A[d+11]=0),t.jointWeights?(A[d+12]=t.jointWeights[p*4]??0,A[d+13]=t.jointWeights[p*4+1]??0,A[d+14]=t.jointWeights[p*4+2]??0,A[d+15]=t.jointWeights[p*4+3]??0):(A[d+12]=0,A[d+13]=0,A[d+14]=0,A[d+15]=0)}let i=Math.ceil(A.byteLength/4)*4,a=this.device.createBuffer({size:Math.max(4,i),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC,mappedAtCreation:!0});new Float32Array(a.getMappedRange()).set(A),a.unmap();let s=t.indices instanceof Uint32Array,c=Math.ceil(t.indices.byteLength/4)*4,l=this.device.createBuffer({size:Math.max(4,c),usage:GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});s?new Uint32Array(l.getMappedRange()).set(t.indices):new Uint16Array(l.getMappedRange()).set(t.indices),l.unmap();let u;t.colors&&t.colors.length>=o*4&&(u=this.device.createBuffer({label:"Mesh3DVertexColors",size:Math.max(16,o*16),usage:GPUBufferUsage.VERTEX,mappedAtCreation:!0}),new Float32Array(u.getMappedRange()).set(t.colors.subarray(0,o*4)),u.unmap());let g;if(t.mapUvs&&Object.values(t.mapUvs).some(Boolean)){let p=new Float32Array(o*8),d=[t.mapUvs.normal,t.mapUvs.metallicRoughness,t.mapUvs.occlusion,t.mapUvs.emissive];for(let f=0;f<o;f++)for(let h=0;h<d.length;h++){let I=d[h]??t.uvs;p[f*8+h*2]=I[f*2]??0,p[f*8+h*2+1]=I[f*2+1]??0}g=this.device.createBuffer({label:"Mesh3DMapUvs",size:Math.max(32,p.byteLength),usage:GPUBufferUsage.VERTEX,mappedAtCreation:!0}),new Float32Array(g.getMappedRange()).set(p),g.unmap()}return n={vertexBuffer:a,indexBuffer:l,indexCount:t.indices.length,indexFormat:s?"uint32":"uint16",topology:t.topology,colorBuffer:u,mapUvBuffer:g},this.meshBuffersCache.set(t,n),r&&(!t.topology||t.topology==="triangle-list")&&this.ensureWireIndices(t,n),n}ensureWireIndices(t,r){if(r.wireIndexBuffer)return;let n=new Set,o=[];for(let a=0;a+2<t.indices.length;a+=3){let s=[t.indices[a],t.indices[a+1],t.indices[a+2]];for(let c=0;c<3;c++){let l=s[c],u=s[(c+1)%3];if(l===u)continue;let g=l<u?`${l},${u}`:`${u},${l}`;n.has(g)||(n.add(g),o.push(l,u))}}let A=r.indexFormat==="uint32"?new Uint32Array(o):new Uint16Array(o),i=this.device.createBuffer({label:"Mesh3DWireIndices",size:Math.max(4,Math.ceil(A.byteLength/4)*4),usage:GPUBufferUsage.INDEX,mappedAtCreation:!0});A instanceof Uint32Array?new Uint32Array(i.getMappedRange()).set(A):new Uint16Array(i.getMappedRange()).set(A),i.unmap(),r.wireIndexBuffer=i,r.wireIndexCount=A.length}morphMesh(t,r,n,o=!1){let A=this.getOrCreateMeshBuffers(r,o);return!r.morphTargets?.length||!n.some(i=>i!==0)?A:{...A,vertexBuffer:this.morphPipeline.execute(t,r,A.vertexBuffer,n)}}deformMesh(t,r,n,o=!1,A){let i=A??this.getOrCreateMeshBuffers(r,o),a=r.positions.length/3;return{vertexBuffer:this.audioMeshDeformPipeline.execute(t,i.vertexBuffer,{config:n.config,audioLatentBuffer:n.latentBuffer,vertexCount:a,timeMs:n.timeMs,sampleRate:n.sampleRate}),indexBuffer:i.indexBuffer,indexCount:i.indexCount,indexFormat:i.indexFormat,topology:i.topology,colorBuffer:i.colorBuffer,mapUvBuffer:i.mapUvBuffer,wireIndexBuffer:i.wireIndexBuffer,wireIndexCount:i.wireIndexCount}}drawMesh3D(t,r,n,o,A,i={},a=!1){let s="vertexBuffer"in o?o:this.getOrCreateMeshBuffers(o,i.wireframe),{opacity:c=1,colorTint:l=[1,1,1,1],twoSided:u=!0,wireframe:g=!1,isSkinned:p=!1,skinningMatrices:d,material:f="lit",shadeColor:h,alphaCutoff:I,textureWrap:b="clamp",textureFilter:D="linear",shininess:m=32,roughness:Q,specularIntensity:w=.5,ambientIntensity:S=1,metallic:N}=i,M=this.meshModelMatrix(i),G=i.normalMatrix??Qt.computeNormalMatrix(M),j=mc[b],R=this.samplerCache.getSampler(this.device,{addressModeU:j,addressModeV:j,magFilter:D,...D==="nearest"&&{maxAnisotropy:1}}),K=f==="glass"||f==="acrylic"||f==="frosted",z=K?{ior:i.ior??(f==="acrylic"?1.49:1.5),dispersion:i.dispersion??(f==="glass"?.04:.015),thickness:i.thickness??80,frost:f==="frosted"?Q??.5:0}:void 0;this.mesh3dPipeline.draw(t,r,n,s,A,R,{glass:z,backdrop:i.backdrop,modelMatrix:M,normalMatrix:G,colorTint:l,opacity:c,twoSided:u,wireframe:g,transparent:i.transparent??(c<1||l[3]<1),isSkinned:p,skinningMatrices:d,material:f==="unlit"||f==="toon"?f:"lit",shadeColor:h,alphaCutoff:I,shininess:m,roughness:K?Math.min(Q??.05,.3):Q,specularIntensity:w,ambientIntensity:S,metallic:N,emissive:i.emissive,emissiveIntensity:i.emissiveIntensity,toon:i.toon,outline:i.outline,matte:i.matte,maps:i.maps,isInstanced:!!(i.instanceBuffer||i.instanceCount&&i.instanceCount>1),instanceBuffer:i.instanceBuffer,matrixInstances:i.matrixInstances},a,this.passWritesHdr,i.instanceCount??1,i.firstInstance??0)}loadModel(t,r="auto",n={}){if(typeof t!="string")return Sa(t,r,n);let o=`${r}|${JSON.stringify(n)}|${t}`,A=this.modelCache.get(o);return A||(A=Sa(t,r,n),this.modelCache.set(o,A)),A}async loadModelAsync(t,r="auto",n={}){if(!(r==="gltf"||r==="glb"||r==="auto"&&(typeof t=="string"?/\.(gltf|glb)$/i.test(t)||t.trimStart().startsWith("{"):hr.isGlb(t))))return this.loadModel(t,r,n);if(typeof t!="string")return oA(t,n);let A=`${r}|${JSON.stringify(n)}|${t}`,i=this.modelCache.get(A);if(i)return i;let a=await oA(t,n);return this.modelCache.set(A,a),a}materialTexture(t){let r=this.materialTextures.get(t);return r||(r=this.uploadMaterialTexture(t),this.materialTextures.set(t,r)),r}materialMaps(t){let r=this.materialMapCache.get(t);return r||(r=(async()=>{let n=t.name,[o,A,i,a]=await Promise.all([this.uploadImage(t.normalTextureBuffer,`${n}:normal`),this.uploadImage(t.metallicRoughnessTextureBuffer,`${n}:metallicRoughness`),this.uploadImage(t.occlusionTextureBuffer,`${n}:occlusion`),this.uploadImage(t.emissiveTextureBuffer,`${n}:emissive`)]);return{...o&&{normal:o,normalScale:t.normalScale??1},...A&&{metallicRoughness:A},...i&&{occlusion:i,occlusionStrength:t.occlusionStrength??1},...a&&{emissive:a}}})(),this.materialMapCache.set(t,r)),r}uploadMaterialTexture(t){return this.uploadImage(t.diffuseTextureBuffer,`Material:${t.name}`)}async uploadImage(t,r){if(!t)return;let n=t instanceof Uint8Array?t:new Uint8Array(t);if(ba(n)){let l=await Ea(n),u=this.device.createTexture({label:r,size:{width:l.width,height:l.height},mipLevelCount:l.levels.length,format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST});for(let[g,p]of l.levels.entries()){let d=Math.max(1,l.width>>g),f=Math.max(1,l.height>>g);this.device.queue.writeTexture({texture:u,mipLevel:g},p,{bytesPerRow:d*4,rowsPerImage:f},{width:d,height:f})}return u}let o=(await import("./sharp-O7VCPA7A.mjs")).default,A=Buffer.from(t instanceof Uint8Array?t:new Uint8Array(t)),i,a;try{({width:i,height:a}=await o(A).metadata())}catch(l){console.warn(`[Renderer3D] Could not decode texture "${r}"; drawing without it:`,l instanceof Error?l.message:l);return}if(!i||!a)return;let s=Math.floor(Math.log2(Math.max(i,a)))+1,c=this.device.createTexture({label:r,size:{width:i,height:a},mipLevelCount:s,format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST});for(let l=0;l<s;l++){let u=Math.max(1,i>>l),g=Math.max(1,a>>l),p=await o(A).ensureAlpha().resize(u,g,{fit:"fill"}).raw().toBuffer();this.device.queue.writeTexture({texture:c,mipLevel:l},p,{bytesPerRow:u*4,rowsPerImage:g},{width:u,height:g})}return c}applyBloom(t,r,n,o={},A){this.bloomPipeline??=new xo(this.device),this.bloomPipeline.apply(t,r,n,o,A??void 0)}resolveGeometry(t,r){this.sampleCount<=1||!this.msaaLinearDepthTexture||(this.geometryResolvePipeline??=new _o(this.device),this.geometryResolvePipeline.render(t,this.msaaLinearDepthTexture,r.createView()))}applyOutlines(t,r,n,o,A,i,a){let s=r,c=n;if(this.sampleCount>1){if(!this.msaaColorTexture||!this.msaaLinearDepthTexture)throw new Error("Geometry outlines require the scene's retained MSAA color and geometry samples");s=this.msaaColorTexture,c=this.msaaLinearDepthTexture}this.outlinePipeline??=new Do(this.device,this.format,this.sampleCount),this.outlinePipeline.render(t,s,c,o,A,i,a)}applyDepthOfField(t,r,n,o,A){let i=this.samplerCache.getSampler(this.device),a=this.device.createBindGroup({layout:this.dofBindGroupLayout,entries:[{binding:0,resource:{buffer:A}},{binding:1,resource:i},{binding:2,resource:r.createView()},{binding:3,resource:n.createView()}]}),s=t.beginRenderPass({colorAttachments:[{view:o,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()}uploadInstanceData(t){return this.instancePool.getBuffer(this.device,t)}drawMesh3DInstanced(t,r,n,o,A,i,a=void 0,s={},c=!1){this.drawMesh3D(t,r,n,o,a,{...s,instanceBuffer:A,instanceCount:i},c)}destroy(){for(let t of this.attachments.values())t.destroy();this.attachments.clear(),this.bloomPipeline?.destroy(),this.outlinePipeline?.destroy(),this.depthTexture?.destroy();for(let t of this.shadowTextures.values())t.destroy();this.shadowTextures.clear(),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.morphPipeline.destroy(),this.floorReflectionPipeline.destroy(),this.reflectionColorTexture?.destroy(),this.reflectionMsaaColorTexture?.destroy(),this.reflectionDepthTexture?.destroy(),this.reflectionTempTexture?.destroy(),this.reflectionBlurredTexture?.destroy(),this.cameraPool.destroy(),this.lightsPool.destroy(),this.directLightsPool.destroy(),this.instancePool.destroy(),this.cameraUniformBindGroupCache.destroy()}};function Sa(e,t="auto",r={}){if(t==="gltf"||t==="glb")return Eo(e,r);if(t==="stl")return $n(e,r);if(t==="ply")return eo(e,r);if(t==="vox")return yo(e,r);if(t==="3ds")return Co(e,r);if(t==="off")return Qo(e,r);if(t==="fbx")return Xn(e,r);if(t==="obj")return Wn(e,void 0,r);let n=typeof e!="string",o=typeof e=="string"?e.trim():"",A=o.toLowerCase();if(A.endsWith(".glb")||A.endsWith(".gltf"))return Eo(e,r);if(A.endsWith(".stl"))return $n(e,r);if(A.endsWith(".ply"))return eo(e,r);if(A.endsWith(".vox"))return yo(e,r);if(A.endsWith(".3ds"))return Co(e,r);if(A.endsWith(".off"))return Qo(e,r);if(A.endsWith(".fbx"))return Xn(e,r);if(A.endsWith(".obj"))return Wn(e,void 0,r);if(n){let i=e instanceof Uint8Array?e:new Uint8Array(e);return hr.isGlb(i)?pa(i,r):Vr.isBinary(i)?Xn(i,r):to.isVox(i)?yo(i,r):ro.is3DS(i)?Co(i,r):i.length>=3&&i[0]===112&&i[1]===108&&i[2]===121?eo(i,r):Zn.isBinary(i)?$n(i,r):Wn(i,void 0,r)}return o.startsWith("{")&&(o.includes('"asset"')||o.includes('"meshes"'))?Eo(o,r):o.startsWith("ply")||o.startsWith("PLY")?eo(o,r):o.startsWith("OFF")||o.startsWith("NOFF")||o.startsWith("COFF")?Qo(o,r):o.includes("FBXHeaderExtension")||o.includes("Kaydara FBX")?Xn(o,r):o.startsWith("solid")&&o.includes("facet")?$n(o,r):Wn(e,void 0,r)}$();var{cbrt:gA,sqrt:pA,PI:Zr}=Math,Bc=(e,t,r,n,o)=>{let A=t+r*e,i=A**2+n;if(i>0){let l=pA(i);return gA(A+l)+gA(A-l)-o}let a=gA(pA(A*A-i)),s=A?Math.atan(pA(-i)/A):-Zr/2,c;return r<0?c=(A>0?2*Zr:Zr)-s:o<0?c=(A>0?2*Zr:-3*Zr)+s:c=(A>0?0:Zr)+s,2*a*Math.cos(c/3)-o},bc=(e,t,r,n)=>((t*e+3*r)*e+n)*e,dA=e=>e;function Pa(e,t,r,n){if(!(0<=e&&e<=1&&0<=r&&r<=1))throw new Error("bezier x values must be in [0, 1] range");if(e===t&&r===n)return dA;let o=6*(3*e-3*r+1),A=6*(r-2*e),i=3*e,a=o*o,s=A*A,c=A/o,l=3*A*i/a-s*A/(a*o),u=2*i/o-s/a,g=u*u*u,p=3/o,d=3*t-3*n+1,f=n-2*t,h=3*t,I=o?Bc:dA;return function(D){return D===0||D===1?D:bc(I(D,l,p,g,c),d,f,h)}}var dd={linear:dA,ease:Pa(.25,.1,.25,1),quad:e=>e*e,cubic:e=>e*e*e,poly:e=>t=>t**e,sin:e=>1-Math.cos(e*Math.PI/2),circle:e=>1-Math.sqrt(1-e*e),exp:e=>2**(10*(e-1)),elastic:(e=1)=>{let t=e*Math.PI;return r=>1-Math.cos(r*Math.PI/2)**3*Math.cos(r*t)},back:(e=1.70158)=>t=>t*t*((e+1)*t-e),bounce:e=>{if(e<1/2.75)return 7.5625*e*e;if(e<2/2.75){let r=e-.5454545454545454;return 7.5625*r*r+.75}if(e<2.5/2.75){let r=e-.8181818181818182;return 7.5625*r*r+.9375}let t=e-2.625/2.75;return 7.5625*t*t+.984375},bezier:Pa,in:e=>e,out:e=>t=>1-e(1-t),inOut:e=>t=>t<.5?e(t*2)/2:1-e((1-t)*2)/2};function Ga(e,t,r,n){let o=n?.extrapolateLeft??"extend",A=n?.extrapolateRight??"extend";if(t.length!==r.length)throw new Error("inputRange and outputRange must have the same length");if(t.length<2)throw new Error("inputRange must have at least 2 elements");let i=t[0],a=t[t.length-1];if(e<i){if(o==="clamp")return r[0];if(o==="identity")return e}if(e>a){if(A==="clamp")return r[r.length-1];if(A==="identity")return e}let s=1;for(;s<t.length-1&&!(e<t[s]);s++);let c=t[s-1],l=t[s],u=r[s-1],g=r[s];if(c===l)return u;let p=(e-c)/(l-c);return n?.easing&&(p=n.easing(p)),u+p*(g-u)}$();var Ec={damping:10,mass:1,stiffness:100,overshootClamping:!1},fA={};function yc({animation:e,now:t,config:r}){let{toValue:n,lastTimestamp:o,current:A,velocity:i}=e,a=Math.min(t-o,64);if(r.damping<=0)throw new Error("Spring damping must be greater than 0, otherwise the spring() animation will never end, causing an infinite loop.");if(r.stiffness<=0)throw new Error("Spring stiffness must be greater than 0.");if(r.mass<=0)throw new Error("Spring mass must be greater than 0.");let s=r.damping,c=r.mass,l=r.stiffness,u=[n,o,A,i,s,c,l,t].join("-");if(fA[u])return fA[u];let g=-i,p=n-A,d=s/(2*Math.sqrt(l*c)),f=Math.sqrt(l/c),h=f*Math.sqrt(1-d**2),I=a/1e3,b=Math.sin(h*I),D=Math.cos(h*I),m=Math.exp(-d*f*I),Q=m*(b*((g+d*f*p)/h)+p*D),w=n-Q,S=d*f*Q-m*(D*(g+d*f*p)-h*p*b),N=Math.exp(-f*I),M=n-N*(p+(g+f*p)*I),G=N*(g*(I*f-1)+I*p*f*f),j={toValue:n,prevPosition:A,lastTimestamp:t,current:d<1?w:M,velocity:d<1?S:G};return fA[u]=j,j}var hA={};function Ra({frame:e,fps:t,config:r={}}){let A=[e,t,r.damping,r.mass,r.overshootClamping,r.stiffness].join("-");if(hA[A])return hA[A];let i={lastTimestamp:0,current:0,toValue:1,velocity:0,prevPosition:0},a=Math.max(0,e),s=a%1;for(let c=0;c<=Math.floor(a);c++){c===Math.floor(a)&&(c+=s);let l=c/t*1e3;i=yc({animation:i,now:l,config:{...Ec,...r}})}return hA[A]=i,i}var mA=new Map;function Cc({fps:e,config:t={},threshold:r=.005}){if(typeof r!="number")throw new TypeError(`threshold must be a number, got ${r}`);if(r===0)return 1/0;if(r===1)return 0;if(Number.isNaN(r))throw new TypeError("Threshold is NaN");if(!Number.isFinite(r))throw new TypeError("Threshold is not finite");if(r<0)throw new TypeError("Threshold is below 0");let n=[e,t.damping,t.mass,t.overshootClamping,t.stiffness,r].join("-");if(mA.has(n))return mA.get(n);let o=0,A=0,i=()=>Ra({fps:e,frame:o,config:t}),a=i(),s=()=>Math.abs(a.current-a.toValue),c=s();for(;c>=r;)o++,a=i(),c=s();A=o;for(let l=0;l<20;l++)o++,a=i(),c=s(),c>=r&&(l=0,A=o+1);return mA.set(n,A),A}function Id({frame:e,fps:t,config:r={},from:n=0,to:o=1,durationInFrames:A,durationRestThreshold:i,delay:a=0,reverse:s=!1}){let c=s||typeof A<"u",l=c?Cc({fps:t,config:r,threshold:i}):void 0,u=c?{get:()=>l}:{get:()=>{throw new Error("did not calculate natural duration")}},p=(s?(A??u.get())-e:e)+(s?a:-a),d=A===void 0?p:p/(A/u.get());if(A&&p>A)return o;let f=Ra({fps:t,frame:d,config:r}),h=r.overshootClamping?o>=n?Math.min(f.current,o):Math.max(f.current,o):f.current;return n===0&&o===1?h:Ga(h,[0,1],[n,o])}$();$();$();var Ta=Ko(Ua(),1);function yr(e){let t=Mt(e);return t.a>0||e.trim().toLowerCase()==="transparent"?[t.r,t.g,t.b,t.a]:[1,1,1,1]}function Kt(e){let t=0,r=e.length;for(let n=0;n<r;n++){let o=(n+1)%r;t+=e[n].x*e[o].y-e[o].x*e[n].y}return t/2}function To(e,t){let r=!1,n=t.length;for(let o=0,A=n-1;o<n;A=o++){let i=t[o].x,a=t[o].y,s=t[A].x,c=t[A].y;a>e.y!=c>e.y&&e.x<(s-i)*(e.y-a)/(c-a)+i&&(r=!r)}return r}var Qc=.1,xc=64;function La(e,t){if(t.segments!==void 0)return t.segments;let r=Math.ceil(Math.sqrt(e/(8*t.tolerance)));return Math.min(xc,Math.max(1,r))}function wc(e,t,r,n,o){let A=La(2*Math.hypot(e.x-2*t.x+r.x,e.y-2*t.y+r.y),n);for(let i=1;i<=A;i++){let a=i/A,s=1-a;o.push({x:s*s*e.x+2*s*a*t.x+a*a*r.x,y:s*s*e.y+2*s*a*t.y+a*a*r.y})}}function vc(e,t,r,n,o,A){let i=La(6*Math.max(Math.hypot(e.x-2*t.x+r.x,e.y-2*t.y+r.y),Math.hypot(t.x-2*r.x+n.x,t.y-2*r.y+n.y)),o);for(let a=1;a<=i;a++){let s=a/i,c=1-s;A.push({x:c*c*c*e.x+3*c*c*s*t.x+3*c*s*s*r.x+s*s*s*n.x,y:c*c*c*e.y+3*c*c*s*t.y+3*c*s*s*r.y+s*s*s*n.y})}}function Dc(e){try{let t=new Ta.Path2D(e).simplify().edges;return Array.isArray(t)?t:null}catch{return null}}function _c(e,t,r,n,o){let A=e.path?.toSVG();if(!A)return{contours:[],simplified:!0};let i=Dc(A),a=i!==null;i??=(e.path?.commands??[]).map(g=>[g.command,...g.args]);let s=[],c={x:0,y:0},l=[],u=()=>{if(l.length>=3){let g=l[0],p=l[l.length-1];Math.hypot(p.x-g.x,p.y-g.y)<1e-4&&l.pop(),l.length>=3&&s.push(l)}l=[]};for(let g of i){let p=g[0],d=g.slice(1);if(p==="moveTo")u(),c={x:(t+d[0])*n,y:-(r+d[1])*n},l=[c];else if(p==="lineTo")c={x:(t+d[0])*n,y:-(r+d[1])*n},l.push(c);else if(p==="quadraticCurveTo"){let f={x:(t+d[0])*n,y:-(r+d[1])*n},h={x:(t+d[2])*n,y:-(r+d[3])*n};wc(c,f,h,o,l),c=h}else if(p==="bezierCurveTo"){let f={x:(t+d[0])*n,y:-(r+d[1])*n},h={x:(t+d[2])*n,y:-(r+d[3])*n},I={x:(t+d[4])*n,y:-(r+d[5])*n};vc(c,f,h,I,o,l),c=I}else p==="closePath"&&u()}return u(),{contours:s,simplified:a}}var Mc=Math.cos(30*Math.PI/180);function BA({contours:e,simplified:t}){if(!t)return Gc(e);let r=e.map(i=>({contour:i,area:Math.abs(Kt(i))}));r.sort((i,a)=>a.area-i.area);let n=r.map(()=>[]);for(let i=0;i<r.length;i++){let a=r[i].contour,s=a[Math.floor(a.length/2)];for(let c=0;c<i;c++){if(r[c].area<=r[i].area)continue;let l=r[c].contour;(To(a[0],l)||To(s,l))&&n[i].push(c)}}let o=[],A=new Map;for(let i=0;i<r.length;i++){let a=n[i];if(a.length%2===0){let s={outer:r[i].contour,holes:[]};o.push(s),A.set(i,s)}else A.get(a[a.length-1])?.holes.push(r[i].contour)}return o}function Sc(e,t,r,n){let o=t.x-e.x,A=t.y-e.y,i=n.x-r.x,a=n.y-r.y,s=o*a-A*i;if(Math.abs(s)<1e-12)return null;let c=((r.x-e.x)*a-(r.y-e.y)*i)/s,l=((r.x-e.x)*A-(r.y-e.y)*o)/s,u=1e-9;return c<=u||c>=1-u||l<=u||l>=1-u?null:{x:e.x+o*c,y:e.y+A*c}}function IA(e,t=0){let r=e.length;if(r<3)return[];if(t>64)return[e];for(let n=0;n<r;n++){let o=e[n],A=e[(n+1)%r];for(let i=n+2;i<r;i++){if(n===0&&i===r-1)continue;let a=Sc(o,A,e[i],e[(i+1)%r]);if(!a)continue;let s=[a,...e.slice(n+1,i+1)],c=[a,...e.slice(i+1),...e.slice(0,n+1)];return[...IA(s,t+1),...IA(c,t+1)]}}return Math.abs(Kt(e))>1e-9?[e]:[]}function Pc(e,t){let r=0;for(let n of t)for(let o=0;o<n.length;o++){let A=n[o],i=n[(o+1)%n.length],a=(i.x-A.x)*(e.y-A.y)-(e.x-A.x)*(i.y-A.y);A.y<=e.y?i.y>e.y&&a>0&&r++:i.y<=e.y&&a<0&&r--}return r}function ka(e){let t=0,r=-1;for(let u=0;u<e.length;u++){let g=e[u],p=e[(u+1)%e.length],d=Math.hypot(p.x-g.x,p.y-g.y);d>r&&(r=d,t=u)}let n=e[t],o=e[(t+1)%e.length],A=(n.x+o.x)/2,i=(n.y+o.y)/2,a=Math.max(1e-4,Math.min(.01,r*.001)),s=-(o.y-n.y)/r*a,c=(o.x-n.x)/r*a,l={x:A+s,y:i+c};return To(l,e)?l:{x:A-s,y:i-c}}function Gc(e){let t=e.flatMap(o=>IA(o)),r=[],n=[];for(let o of t)Pc(ka(o),e)!==0?r.push({outer:o,holes:[]}):n.push(o);for(let o of n){let A=Math.abs(Kt(o)),i=ka(o),a,s=Number.POSITIVE_INFINITY;for(let c of r){let l=Math.abs(Kt(c.outer));l>A&&l<s&&To(i,c.outer)&&(a=c,s=l)}a?.holes.push(o)}return r}var Na=new WeakMap;function Rc(e,t,r,n,o,A){let i=Na.get(e);i||(i=new Map,Na.set(e,i));let a=`${t.id}|${o}|${A.segments??""}|${A.tolerance}`,s=i.get(a);s||(s=BA(_c(t,0,0,o,A)),i.set(a,s));let c=r*o,l=-n*o,u=g=>g.map(p=>({x:p.x+c,y:p.y+l}));return s.map(g=>({outer:u(g.outer),holes:g.holes.map(u)}))}function wd(e){let t=e.font,r=e.fontSize??48,n=e.depth??20,o=n/2,A={segments:e.curveSegments!==void 0?Math.max(2,e.curveSegments):void 0,tolerance:Math.max(.001,e.curveTolerance??Qc)},i=t.unitsPerEm||1e3,a=r/i,s=Ui(t,e.text.replace(/\n/g," "),{direction:e.direction,letterSpacing:e.letterSpacing?e.letterSpacing/a:0}),c=[];for(let oe of s.glyphs){let ne=t.getGlyph(oe.glyphId),ie=Rc(t,ne,oe.x,oe.y,a,A);for(let he of ie)c.push(he)}let l=Number.POSITIVE_INFINITY,u=Number.NEGATIVE_INFINITY,g=Number.POSITIVE_INFINITY,p=Number.NEGATIVE_INFINITY;for(let oe of c){for(let ne of oe.outer)ne.x<l&&(l=ne.x),ne.x>u&&(u=ne.x),ne.y<g&&(g=ne.y),ne.y>p&&(p=ne.y);for(let ne of oe.holes)for(let ie of ne)ie.x<l&&(l=ie.x),ie.x>u&&(u=ie.x),ie.y<g&&(g=ie.y),ie.y>p&&(p=ie.y)}Number.isFinite(l)||(l=0,u=0,g=0,p=0);let d=u-l,f=p-g,h=(s.baseLevel&1)===1,I=e.align==="start"?h?"right":"left":e.align==="end"?h?"left":"right":e.align,b=(l+u)/2;I==="left"&&(b=l),I==="right"&&(b=u);let D=(g+p)/2;e.verticalAlign==="top"&&(D=g),e.verticalAlign==="bottom"&&(D=p);for(let oe of c){for(let ne of oe.outer)ne.x-=b,ne.y-=D;for(let ne of oe.holes)for(let ie of ne)ie.x-=b,ie.y-=D}l-=b,u-=b,g-=D,p-=D;let m=[],Q=[],w=[],S=[],N=[],M=[],G=[],j=[],R=(oe,ne,ie)=>{let he=N.length/3;return N.push(oe.x,oe.y,o,oe.x,oe.y,-o),M.push(ne.x,ne.y,0,ne.x,ne.y,0),G.push(ie,0,ie,1),he},K=oe=>{let ne=oe.filter((y,ye)=>{let Qe=oe[(ye+1)%oe.length];return Math.hypot(Qe.x-y.x,Qe.y-y.y)>=1e-6}),ie=ne.length;if(ie<2)return;let he=[],F=ne.map((y,ye)=>{let Qe=ne[(ye+1)%ie],xe=Math.hypot(Qe.x-y.x,Qe.y-y.y);return he.push(xe),{x:(Qe.y-y.y)/xe,y:-(Qe.x-y.x)/xe}}),Be=he.reduce((y,ye)=>y+ye,0),Se=[],Pe=[],Ie=0;for(let y=0;y<ie;y++){let ye=F[(y-1+ie)%ie],Qe=F[y],xe=Ie/Be,le=ye.x+Qe.x,ge=ye.y+Qe.y,we=ye.x*Qe.x+ye.y*Qe.y>=Mc?{x:le/Math.hypot(le,ge),y:ge/Math.hypot(le,ge)}:null;we&&y>0?Se[y]=Pe[y]=R(ne[y],we,xe):(Pe[y]=R(ne[y],we??ye,y===0?1:xe),Se[y]=R(ne[y],we??Qe,xe)),Ie+=he[y]}for(let y=0;y<ie;y++){let ye=Se[y],Qe=Pe[(y+1)%ie];j.push(ye,Qe+1,Qe),j.push(ye,ye+1,Qe+1)}};for(let oe of c){let ne=oe.outer;Kt(ne)<0&&ne.reverse();for(let Ie of oe.holes)Kt(Ie)>0&&Ie.reverse();let ie=[],he=[];for(let Ie of ne)ie.push(Ie.x,Ie.y);for(let Ie of oe.holes){he.push(ie.length/2);for(let y of Ie)ie.push(y.x,y.y)}let F=co(ie,he,2),Be=ie.length/2,Se=m.length/3;for(let Ie=0;Ie<Be;Ie++){let y=ie[Ie*2],ye=ie[Ie*2+1];m.push(y,ye,-o),Q.push(0,0,-1),w.push((y-l)/(d||1),(ye-g)/(f||1))}for(let Ie=0;Ie<F.length;Ie+=3)S.push(Se+F[Ie],Se+F[Ie+2],Se+F[Ie+1]);let Pe=m.length/3;for(let Ie=0;Ie<Be;Ie++){let y=ie[Ie*2],ye=ie[Ie*2+1];m.push(y,ye,o),Q.push(0,0,1),w.push((y-l)/(d||1),(ye-g)/(f||1))}for(let Ie=0;Ie<F.length;Ie+=3)S.push(Pe+F[Ie],Pe+F[Ie+1],Pe+F[Ie+2]);K(ne);for(let Ie of oe.holes)K(Ie)}let z=yr(e.fill??"#ffffff"),J=yr(e.bevelColor??e.fill??"#ffffff"),W={name:"front-material",diffuseColor:z,shading:e.material??"lit",shininess:e.shininess??32,roughness:e.roughness,metallic:e.metallic,twoSided:!0},X={name:"side-material",diffuseColor:J,shading:e.material??"lit",shininess:e.shininess??32,roughness:e.roughness,metallic:e.metallic,twoSided:!0},Ae=[];return S.length>0&&Ae.push({id:"text-front-mesh",name:"front",positions:new Float32Array(m),normals:new Float32Array(Q),uvs:new Float32Array(w),indices:m.length/3>65535?new Uint32Array(S):new Uint16Array(S),materialName:"front-material"}),j.length>0&&Ae.push({id:"text-side-mesh",name:"side",positions:new Float32Array(N),normals:new Float32Array(M),uvs:new Float32Array(G),indices:N.length/3>65535?new Uint32Array(j):new Uint16Array(j),materialName:"side-material"}),{modelData:{name:`extruded-text-${e.text}`,meshes:Ae,materials:{"front-material":W,"side-material":X},animations:[],bounds:{min:[l,g,-o],max:[u,p,o],center:[(l+u)/2,(g+p)/2,0],size:[d,f,n],boundingSphereRadius:Math.hypot(d,f,n)/2}},bounds:{minX:l,maxX:u,minY:g,maxY:p,width:d,height:f,depth:n}}}var $r=class{positions=[];normals=[];uvs=[];colors=[];indices=[];topology;vertex(t,r,n,o){return this.positions.push(t[0],t[1],t[2]),this.normals.push(r[0],r[1],r[2]),this.uvs.push(n[0],n[1]),o&&this.colors.push(o[0],o[1],o[2],o[3]),this.positions.length/3-1}grid(t,r,n,o=!1){for(let A=0;A<n;A++)for(let i=0;i<r;i++){let a=t+A*(r+1)+i,s=a+1,c=a+r+1,l=c+1;o?this.indices.push(a,s,c,s,l,c):this.indices.push(a,c,s,s,c,l)}}build(t){let r=this.positions.length/3,n={id:`${t}-mesh`,name:t,positions:new Float32Array(this.positions),normals:new Float32Array(this.normals),uvs:new Float32Array(this.uvs),indices:r>65535?new Uint32Array(this.indices):new Uint16Array(this.indices),materialName:`${t}-material`};return this.topology&&(n.topology=this.topology),this.colors.length===r*4&&this.colors.length>0&&(n.colors=new Float32Array(this.colors)),n}};function $e(e){let t=Math.hypot(e[0],e[1],e[2]);return t>1e-12?[e[0]/t,e[1]/t,e[2]/t]:[0,0,0]}function It(e,t){return[e[0]-t[0],e[1]-t[1],e[2]-t[2]]}function wt(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function Cr(e,t){return[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]]}function bA(e,t,r){if(t<=0)return[-e,e];let n=e-t,o=[];for(let A=0;A<=r;A++)o.push(-n-t*Math.cos(A/r*Math.PI/2));for(let A=n>1e-9?0:1;A<=r;A++)o.push(n+t*Math.sin(A/r*Math.PI/2));return o}function Fc(e,t){let r=e.width/2,n=e.height/2,o=e.depth/2,A=Math.max(0,Math.min(e.radius??0,r,n,o)),i=Math.max(1,Math.round(e.segments??4)),a=e.taper??1,s=r-A,c=n-A,l=o-A,u=bA(r,A,i),g=bA(n,A,i),p=bA(o,A,i),d=e.height>0?(1-a)/e.height:0,f=m=>a+d*(m+n),h=(m,Q)=>{let w=[Math.max(-s,Math.min(s,m[0])),Math.max(-c,Math.min(c,m[1])),Math.max(-l,Math.min(l,m[2]))],S=A>0?$e([m[0]-w[0],m[1]-w[1],m[2]-w[2]]):Q;S[0]===0&&S[1]===0&&S[2]===0&&(S=Q);let N=[w[0]+S[0]*A,w[1]+S[1]*A,w[2]+S[2]*A];if(a===1)return{p:N,n:S};let M=f(N[1]);return{p:[N[0]*M,N[1],N[2]*M],n:$e([S[0]/M,S[1]-N[0]*d*S[0]/M-N[2]*d*S[2]/M,S[2]/M])}},I=[{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}],b=[r,n,o],D=[u,g,p];for(let m of I){let Q=D[m.u],w=D[m.v],S=[0,0,0];S[m.axis]=m.sign;let N=t.positions.length/3;for(let G=0;G<w.length;G++)for(let j=0;j<Q.length;j++){let R=[0,0,0];R[m.axis]=m.sign*b[m.axis],R[m.u]=Q[j],R[m.v]=w[G];let{p:K,n:z}=h(R,S);t.vertex(K,z,[(Q[j]/b[m.u]+1)/2,(w[G]/b[m.v]+1)/2])}let M=(m.v+1)%3===m.u;t.grid(N,Q.length-1,w.length-1,(M?1:-1)!==m.sign)}}function Uc(e,t){let r=Math.max(3,Math.round(e.segments??32)),n=Math.max(2,Math.round(r/2));for(let o=0;o<=n;o++){let A=o/n*Math.PI;for(let i=0;i<=r;i++){let a=i/r*Math.PI*2,s=[Math.sin(A)*Math.cos(a),-Math.cos(A),Math.sin(A)*Math.sin(a)];t.vertex([s[0]*e.radius,s[1]*e.radius,s[2]*e.radius],s,[i/r,o/n])}}t.grid(0,r,n)}function kc(e,t){let r=Math.max(3,Math.round(e.segments??32)),n=Math.max(0,e.radiusTop??e.radius??50),o=Math.max(0,e.radiusBottom??e.radius??50),A=e.height/2;if(e.flatShaded)for(let i=0;i<r;i++){let a=i/r*Math.PI*2,s=(i+1)/r*Math.PI*2,c=Math.cos(a),l=Math.sin(a),u=Math.cos(s),g=Math.sin(s),p=[c*n,-A,l*n],d=[u*n,-A,g*n],f=[c*o,A,l*o],h=[u*o,A,g*o],I=It(f,p),b=o>=n?It(h,f):It(d,p),D=$e(Cr(I,b)),m=i/r,Q=(i+1)/r;if(n<=1e-6){let w=t.vertex([0,-A,0],D,[(m+Q)/2,0]),S=t.vertex(f,D,[m,1]),N=t.vertex(h,D,[Q,1]);t.indices.push(w,S,N)}else if(o<=1e-6){let w=t.vertex(p,D,[m,0]),S=t.vertex(d,D,[Q,0]),N=t.vertex([0,A,0],D,[(m+Q)/2,1]);t.indices.push(w,N,S)}else{let w=t.vertex(p,D,[m,0]);t.vertex(d,D,[Q,0]),t.vertex(f,D,[m,1]),t.vertex(h,D,[Q,1]),t.indices.push(w,w+2,w+1,w+1,w+2,w+3)}}else{let i=e.height>0?(o-n)/e.height:0;for(let a=0;a<=1;a++){let s=a===0?n:o,c=a===0?-A:A;for(let l=0;l<=r;l++){let u=l/r*Math.PI*2,g=Math.cos(u),p=Math.sin(u);t.vertex([g*s,c,p*s],$e([g,-i,p]),[l/r,a])}}t.grid(0,r,1)}if(!e.openEnded)for(let[i,a,s]of[[-A,n,-1],[A,o,1]]){if(a<=1e-6)continue;let c=t.vertex([0,i,0],[0,s,0],[.5,.5]),l=t.positions.length/3;for(let u=0;u<=r;u++){let g=u/r*Math.PI*2,p=Math.cos(g),d=Math.sin(g);t.vertex([p*a,i,d*a],[0,s,0],[(p+1)/2,(d+1)/2])}for(let u=0;u<r;u++)s<0?t.indices.push(c,l+u,l+u+1):t.indices.push(c,l+u+1,l+u)}}function Nc(e,t){let r=Math.max(.001,e.radius??60),n=Math.max(.001,e.tube??20),o=Math.max(3,Math.round(e.radialSegments??24)),A=Math.max(3,Math.round(e.tubularSegments??48)),a=(e.arc??360)*Math.PI/180,s=t.positions.length/3;for(let c=0;c<=o;c++){let l=c/o*Math.PI*2,u=Math.cos(l),g=Math.sin(l);for(let p=0;p<=A;p++){let d=p/A*a,f=Math.cos(d),h=Math.sin(d),I=(r+n*u)*f,b=(r+n*u)*h,D=n*g,m=u*f,Q=u*h,w=g;t.vertex([I,b,D],$e([m,Q,w]),[p/A,c/o])}}if(t.grid(s,A,o,!0),Math.abs(a)<Math.PI*2-1e-4)for(let[c,l]of[[0,-1],[a,1]]){let u=Math.cos(c),g=Math.sin(c),p=[-g*l,u*l,0],d=t.vertex([r*u,r*g,0],p,[.5,.5]),f=t.positions.length/3;for(let h=0;h<=o;h++){let I=h/o*Math.PI*2,b=Math.cos(I),D=Math.sin(I);t.vertex([(r+n*b)*u,(r+n*b)*g,n*D],p,[(b+1)/2,(D+1)/2])}for(let h=0;h<o;h++)l<0?t.indices.push(d,f+h,f+h+1):t.indices.push(d,f+h+1,f+h)}}function Tc(e,t){let r=Math.max(.001,e.radius??30),n=Math.max(0,e.length??60),o=n/2,A=Math.max(2,Math.round(e.capSegments??12)),i=Math.max(3,Math.round(e.radialSegments??32)),a=[],s=Math.PI*r+n;for(let l=0;l<=A;l++){let u=l/A*Math.PI/2,g=Math.sin(u),p=Math.cos(u);a.push({y:-o-r*p,rRing:r*g,ny:-p,nr:g,v:u*r/(s||1)})}for(let l=0;l<=A;l++){if(l===0&&n<=1e-6)continue;let u=Math.PI/2+l/A*Math.PI/2,g=Math.sin(u),p=Math.cos(u);a.push({y:o-r*p,rRing:r*g,ny:-p,nr:g,v:(Math.PI/2*r+n+(u-Math.PI/2)*r)/(s||1)})}let c=t.positions.length/3;for(let l of a)for(let u=0;u<=i;u++){let g=u/i*Math.PI*2,p=Math.cos(g),d=Math.sin(g),f=$e([l.nr*p,l.ny,l.nr*d]);t.vertex([l.rRing*p,l.y,l.rRing*d],f,[u/i,l.v])}t.grid(c,i,a.length-1,!1)}function Lc(e,t){let r=Math.max(0,e.innerRadius??30),n=Math.max(r+.001,e.outerRadius??60),o=Math.max(0,e.depth??0)/2,A=Math.max(3,Math.round(e.thetaSegments??48)),i=Math.max(1,Math.round(e.phiSegments??1)),a=(e.thetaStart??0)*Math.PI/180,s=(e.thetaLength??360)*Math.PI/180;for(let[c,l,u]of[[-o,-1,!1],[o,1,!0]]){let g=t.positions.length/3;for(let p=0;p<=i;p++){let d=r+(n-r)*p/i;for(let f=0;f<=A;f++){let h=a+f/A*s,I=Math.cos(h),b=Math.sin(h),D=d*I,m=d*b;t.vertex([D,m,c],[0,0,l],[(D/n+1)/2,(m/n+1)/2])}}t.grid(g,A,i,!u)}if(o>0){let c=t.positions.length/3;for(let[l,u]of[[-o,0],[o,1]])for(let g=0;g<=A;g++){let p=a+g/A*s,d=Math.cos(p),f=Math.sin(p);t.vertex([n*d,n*f,l],[d,f,0],[g/A,u])}if(t.grid(c,A,1,!0),r>1e-6){let l=t.positions.length/3;for(let[u,g]of[[-o,0],[o,1]])for(let p=0;p<=A;p++){let d=a+p/A*s,f=Math.cos(d),h=Math.sin(d);t.vertex([r*f,r*h,u],[-f,-h,0],[p/A,g])}t.grid(l,A,1,!1)}if(Math.abs(s)<Math.PI*2-1e-4)for(let[l,u]of[[a,-1],[a+s,1]]){let g=Math.cos(l),p=Math.sin(l),d=[-p*u,g*u,0],f=t.vertex([r*g,r*p,-o],d,[0,0]),h=t.vertex([n*g,n*p,-o],d,[1,0]),I=t.vertex([r*g,r*p,o],d,[0,1]),b=t.vertex([n*g,n*p,o],d,[1,1]);u>0?t.indices.push(f,I,h,h,I,b):t.indices.push(f,h,I,h,b,I)}}}function Oa(e,t){let r=e.shape??"icosahedron",n=Math.max(.001,e.radius??50),o=Math.max(0,Math.min(5,Math.round(e.detail??(r==="icosphere"?2:0)))),A=e.flatShaded??r!=="icosphere",i=[],a=[];if(r==="tetrahedron")i=[[1,1,1],[-1,-1,1],[-1,1,-1],[1,-1,-1]],a=[[2,1,0],[0,3,2],[1,3,0],[2,3,1]];else if(r==="octahedron")i=[[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]],a=[[0,2,4],[0,4,3],[0,3,5],[0,5,2],[1,2,5],[1,5,3],[1,3,4],[1,4,2]];else if(r==="dodecahedron"){let u=(1+Math.sqrt(5))/2,g=1/u;i=[[-1,-1,-1],[-1,-1,1],[-1,1,-1],[-1,1,1],[1,-1,-1],[1,-1,1],[1,1,-1],[1,1,1],[0,-g,-u],[0,-g,u],[0,g,-u],[0,g,u],[-g,-u,0],[-g,u,0],[g,-u,0],[g,u,0],[-u,0,-g],[u,0,-g],[-u,0,g],[u,0,g]];let p=[[3,11,7,15,13],[7,19,17,6,15],[17,4,8,10,6],[8,0,16,2,10],[0,12,1,18,16],[6,10,2,13,15],[2,16,18,3,13],[18,1,9,11,3],[4,14,12,0,8],[11,9,5,19,7],[19,5,14,4,17],[1,12,14,5,9]];if(o===0&&A){let d=i.map(f=>$e(f));for(let f of p){let h=f.map(m=>d[m]),I=[h.reduce((m,Q)=>m+Q[0],0)/5,h.reduce((m,Q)=>m+Q[1],0)/5,h.reduce((m,Q)=>m+Q[2],0)/5],b=$e(Cr(It(h[1],h[0]),It(h[2],h[0])));wt(b,I)<0&&(h.reverse(),b=[-b[0],-b[1],-b[2]]);let D=t.positions.length/3;for(let m of h){let Q=.5+Math.atan2(m[2],m[0])/(2*Math.PI),w=Math.acos(Math.max(-1,Math.min(1,-m[1])))/Math.PI;t.vertex([m[0]*n,m[1]*n,m[2]*n],b,[Q,w])}for(let m=1;m<h.length-1;m++)t.indices.push(D,D+m,D+m+1)}return}for(let d of p)a.push([d[0],d[1],d[2]],[d[0],d[2],d[3]],[d[0],d[3],d[4]])}else{let u=(1+Math.sqrt(5))/2;i=[[-1,u,0],[1,u,0],[-1,-u,0],[1,-u,0],[0,-1,u],[0,1,u],[0,-1,-u],[0,1,-u],[u,0,-1],[u,0,1],[-u,0,-1],[-u,0,1]],a=[[0,11,5],[0,5,1],[0,1,7],[0,7,10],[0,10,11],[1,5,9],[5,11,4],[11,10,2],[10,7,6],[7,1,8],[3,9,4],[3,4,2],[3,2,6],[3,6,8],[3,8,9],[4,9,5],[2,4,11],[6,2,10],[8,6,7],[9,8,1]]}let s=i.map(u=>$e(u)),c=a.map(u=>[u[0],u[1],u[2]]);for(let u=0;u<o;u++){let g=new Map,p=(f,h)=>{let I=f<h?`${f}_${h}`:`${h}_${f}`,b=g.get(I);if(b!==void 0)return b;let D=s[f],m=s[h],Q=s.length;return s.push($e([D[0]+m[0],D[1]+m[1],D[2]+m[2]])),g.set(I,Q),Q},d=[];for(let[f,h,I]of c){let b=p(f,h),D=p(h,I),m=p(I,f);d.push([f,b,m],[h,D,b],[I,m,D],[b,D,m])}c=d}let l=u=>[.5+Math.atan2(u[2],u[0])/(2*Math.PI),Math.acos(Math.max(-1,Math.min(1,-u[1])))/Math.PI];if(A)for(let[u,g,p]of c){let d=s[u],f=s[g],h=s[p],I=[(d[0]+f[0]+h[0])/3,(d[1]+f[1]+h[1])/3,(d[2]+f[2]+h[2])/3],b=$e(Cr(It(f,d),It(h,d)));if(wt(b,I)<0){let m=f;f=h,h=m,b=[-b[0],-b[1],-b[2]]}let D=t.positions.length/3;t.vertex([d[0]*n,d[1]*n,d[2]*n],b,l(d)),t.vertex([f[0]*n,f[1]*n,f[2]*n],b,l(f)),t.vertex([h[0]*n,h[1]*n,h[2]*n],b,l(h)),t.indices.push(D,D+1,D+2)}else{let u=t.positions.length/3;for(let g of s)t.vertex([g[0]*n,g[1]*n,g[2]*n],g,l(g));for(let[g,p,d]of c){let f=s[g],h=s[p],I=s[d],b=[(f[0]+h[0]+I[0])/3,(f[1]+h[1]+I[1])/3,(f[2]+h[2]+I[2])/3],D=Cr(It(h,f),It(I,f));wt(D,b)<0?t.indices.push(u+g,u+d,u+p):t.indices.push(u+g,u+p,u+d)}}}function Ha(e,t){let r=[];if(!e||typeof e!="string")return r;let n=[],o=/([a-df-z])|([-+]?(?:\d*\.\d+|\d+)(?:[eE][-+]?\d+)?)/gi,A=o.exec(e);for(;A!==null;)A[1]?n.push(A[1]):A[2]&&n.push(Number.parseFloat(A[2])),A=o.exec(e);let i=0,a={x:0,y:0},s={x:0,y:0},c=null,l=null,u=[],g=()=>{if(u.length>=2){let I=u[0],b=u[u.length-1];Math.hypot(b.x-I.x,b.y-I.y)<1e-4&&u.pop(),u.length>=2&&r.push(u)}u=[]},p=I=>{if(t.segments!==void 0)return Math.max(1,t.segments);let b=Math.ceil(Math.sqrt(I/(8*Math.max(.001,t.tolerance))));return Math.min(64,Math.max(1,b))},d=(I,b,D)=>{let m=p(2*Math.hypot(I.x-2*b.x+D.x,I.y-2*b.y+D.y));for(let Q=1;Q<=m;Q++){let w=Q/m,S=1-w;u.push({x:S*S*I.x+2*S*w*b.x+w*w*D.x,y:S*S*I.y+2*S*w*b.y+w*w*D.y})}},f=(I,b,D,m)=>{let Q=p(6*Math.max(Math.hypot(I.x-2*b.x+D.x,I.y-2*b.y+D.y),Math.hypot(b.x-2*D.x+m.x,b.y-2*D.y+m.y)));for(let w=1;w<=Q;w++){let S=w/Q,N=1-S;u.push({x:N*N*N*I.x+3*N*N*S*b.x+3*N*S*S*D.x+S*S*S*m.x,y:N*N*N*I.y+3*N*N*S*b.y+3*N*S*S*D.y+S*S*S*m.y})}},h=()=>i<n.length&&typeof n[i]=="number"?n[i++]:0;for(;i<n.length;){let I=n[i++];if(typeof I!="string")continue;let b=I===I.toLowerCase();switch(I.toUpperCase()){case"M":{g();let m=!0;for(;i<n.length&&typeof n[i]=="number";){let Q=h(),w=h();b&&(Q+=a.x,w+=a.y),a={x:Q,y:w},m?(s=a,u=[a],m=!1):u.push(a)}c=null,l=null;break}case"L":{for(;i<n.length&&typeof n[i]=="number";){let m=h(),Q=h();b&&(m+=a.x,Q+=a.y),a={x:m,y:Q},u.push(a)}c=null,l=null;break}case"H":{for(;i<n.length&&typeof n[i]=="number";){let m=h();b&&(m+=a.x),a={x:m,y:a.y},u.push(a)}c=null,l=null;break}case"V":{for(;i<n.length&&typeof n[i]=="number";){let m=h();b&&(m+=a.y),a={x:a.x,y:m},u.push(a)}c=null,l=null;break}case"C":{for(;i<n.length&&typeof n[i]=="number";){let m=h(),Q=h(),w=h(),S=h(),N=h(),M=h();b&&(m+=a.x,Q+=a.y,w+=a.x,S+=a.y,N+=a.x,M+=a.y);let G={x:m,y:Q},j={x:w,y:S},R={x:N,y:M};f(a,G,j,R),a=R,c=j}l=null;break}case"S":{for(;i<n.length&&typeof n[i]=="number";){let m=h(),Q=h(),w=h(),S=h();b&&(m+=a.x,Q+=a.y,w+=a.x,S+=a.y);let N=c?{x:2*a.x-c.x,y:2*a.y-c.y}:a,M={x:m,y:Q},G={x:w,y:S};f(a,N,M,G),a=G,c=M}l=null;break}case"Q":{for(;i<n.length&&typeof n[i]=="number";){let m=h(),Q=h(),w=h(),S=h();b&&(m+=a.x,Q+=a.y,w+=a.x,S+=a.y);let N={x:m,y:Q},M={x:w,y:S};d(a,N,M),a=M,l=N}c=null;break}case"T":{for(;i<n.length&&typeof n[i]=="number";){let m=h(),Q=h();b&&(m+=a.x,Q+=a.y);let w=l?{x:2*a.x-l.x,y:2*a.y-l.y}:a,S={x:m,y:Q};d(a,w,S),a=S,l=w}c=null;break}case"A":{for(;i<n.length&&typeof n[i]=="number";){let m=h(),Q=h(),w=h(),S=h()!==0,N=h()!==0,M=h(),G=h();b&&(M+=a.x,G+=a.y);let j={x:M,y:G},R=Li(a,m,Q,w,S,N,j);for(let K of R)u.push(K.p1);a=j}c=null,l=null;break}case"Z":{g(),a=s,c=null,l=null;break}}}return g(),r}function Oo(e){return Array.isArray(e)?{x:e[0],y:e[1]}:{x:e.x,y:e.y}}function Oc(e,t){let r=e.shape??e.d??e.contour,n=[];if(typeof r=="string")n=Ha(r,t).filter(o=>o.length>=3);else if(Array.isArray(r)&&r.length>0){let o=r[0];if(Array.isArray(o)&&o.length>0&&(Array.isArray(o[0])||typeof o[0]=="object"&&o[0]!==null&&"x"in o[0]))n=r.map(i=>i.map(Oo)).filter(i=>i.length>=3);else{let i=r.map(Oo);i.length>=3&&(n=[i])}}if(Array.isArray(e.holes))for(let o of e.holes){let A=o.map(Oo);A.length>=3&&n.push(A)}return n}var ja=Math.cos(30*Math.PI/180);function Hc(e){let r=Math.max(.001,e.depth??20)/2,n=Math.max(0,Math.min(r*.49,e.bevelThickness??0)),o=Math.max(0,e.bevelSize??n),A=n>0||o>0?Math.max(1,Math.round(e.bevelSegments??2)):0,i={segments:e.curveSegments,tolerance:Math.max(.001,e.curveTolerance??.25)},a=Oc(e,i),s=BA({contours:a,simplified:!1}),c=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=Number.POSITIVE_INFINITY,g=Number.NEGATIVE_INFINITY;for(let N of s){for(let M of N.outer)M.x<c&&(c=M.x),M.x>l&&(l=M.x),M.y<u&&(u=M.y),M.y>g&&(g=M.y);for(let M of N.holes)for(let G of M)G.x<c&&(c=G.x),G.x>l&&(l=G.x),G.y<u&&(u=G.y),G.y>g&&(g=G.y)}if(Number.isFinite(c)||(c=l=u=g=0),e.center??!0){let N=(c+l)/2,M=(u+g)/2;for(let G of s){for(let j of G.outer)j.x-=N,j.y-=M;for(let j of G.holes)for(let R of j)R.x-=N,R.y-=M}c-=N,l-=N,u-=M,g-=M}let p=l-c,d=g-u,f=new $r,h=new $r,I=e.bevelColor!==void 0&&e.bevelColor!==e.color,b=I?h:f,D=N=>{let M=N.filter((z,J)=>{let W=N[(J+1)%N.length];return Math.hypot(W.x-z.x,W.y-z.y)>=1e-5}),G=M.length;if(G<3)return null;let j=[],R=M.map((z,J)=>{let W=M[(J+1)%G],X=Math.hypot(W.x-z.x,W.y-z.y);return j.push(X),{x:(W.y-z.y)/X,y:-(W.x-z.x)/X}}),K=M.map((z,J)=>{let W=R[(J-1+G)%G],X=R[J],Ae=W.x+X.x,re=W.y+X.y,oe=Math.hypot(Ae,re);if(oe<1e-6)return X;let ne=Ae/oe*X.x+re/oe*X.y,ie=Math.min(2,1/Math.max(.35,ne));return{x:Ae/oe*ie,y:re/oe*ie}});return{pts:M,edgeLengths:j,edgeNormals:R,miterNormals:K}},m=N=>{let M=D(N);if(!M)return;let{pts:G,edgeLengths:j,edgeNormals:R,miterNormals:K}=M,z=G.length,J=j.reduce((ie,he)=>ie+he,0)||1,W=[];if(A<=0)W.push({z:-r,inset:0,nr:1,nz:0,v:0},{z:r,inset:0,nr:1,nz:0,v:1});else{let ie=A*2+1,he=0;for(let F=0;F<=A;F++){let Be=F/A*Math.PI/2;W.push({z:-r+n*(1-Math.cos(Be)),inset:-o*(1-Math.sin(Be)),nr:Math.sin(Be),nz:-Math.cos(Be),v:he++/ie})}for(let F=0;F<=A;F++){let Be=F/A*Math.PI/2;W.push({z:r-n*(1-Math.sin(Be)),inset:-o*(1-Math.cos(Be)),nr:Math.cos(Be),nz:Math.sin(Be),v:he++/ie})}}let X=W.length,Ae=(ie,he,F,Be)=>{let Se=b.positions.length/3;for(let Pe of W){let Ie=ie.x+he.x*Pe.inset,y=ie.y+he.y*Pe.inset,ye=$e([F.x*Pe.nr,F.y*Pe.nr,Pe.nz]);b.vertex([Ie,y,Pe.z],ye,[Be,Pe.v])}return Se},re=[],oe=[],ne=0;for(let ie=0;ie<z;ie++){let he=R[(ie-1+z)%z],F=R[ie],Be=K[ie],Se=ne/J,Pe=he.x+F.x,Ie=he.y+F.y,ye=he.x*F.x+he.y*F.y>=ja?{x:Pe/Math.hypot(Pe,Ie),y:Ie/Math.hypot(Pe,Ie)}:null;ye&&ie>0?re[ie]=oe[ie]=Ae(G[ie],Be,ye,Se):(oe[ie]=Ae(G[ie],Be,ye??he,ie===0?1:Se),re[ie]=Ae(G[ie],Be,ye??F,Se)),ne+=j[ie]}for(let ie=0;ie<z;ie++){let he=re[ie],F=oe[(ie+1)%z];for(let Be=0;Be<X-1;Be++){let Se=he+Be,Pe=he+Be+1,Ie=F+Be,y=F+Be+1;b.indices.push(Se,Ie,Pe,Ie,y,Pe)}}};for(let N of s){let M=N.outer;Kt(M)<0&&M.reverse();for(let re of N.holes)Kt(re)>0&&re.reverse();let G=D(M);if(!G)continue;let j=N.holes.map(D).filter(re=>re!==null),R=-o,K=[],z=[];for(let re=0;re<G.pts.length;re++){let oe=G.pts[re],ne=G.miterNormals[re];K.push(oe.x+ne.x*R,oe.y+ne.y*R)}for(let re of j){z.push(K.length/2);for(let oe=0;oe<re.pts.length;oe++){let ne=re.pts[oe],ie=re.miterNormals[oe];K.push(ne.x+ie.x*R,ne.y+ie.y*R)}}let J=co(K,z,2),W=K.length/2,X=f.positions.length/3;for(let re=0;re<W;re++){let oe=K[re*2],ne=K[re*2+1];f.vertex([oe,ne,-r],[0,0,-1],[(oe-c)/(p||1),(ne-u)/(d||1)])}for(let re=0;re<J.length;re+=3)f.indices.push(X+J[re],X+J[re+2],X+J[re+1]);let Ae=f.positions.length/3;for(let re=0;re<W;re++){let oe=K[re*2],ne=K[re*2+1];f.vertex([oe,ne,r],[0,0,1],[(oe-c)/(p||1),(ne-u)/(d||1)])}for(let re=0;re<J.length;re+=3)f.indices.push(Ae+J[re],Ae+J[re+1],Ae+J[re+2]);m(M);for(let re of N.holes)m(re)}let Q=[],w={},S=f.build("extrude-front");if(S.materialName="extrude-front-material",Q.push(S),w["extrude-front-material"]={name:"extrude-front-material",diffuseColor:yr(e.color??"#ffffff"),shading:e.material??"lit",shininess:e.shininess??32,roughness:e.roughness,metallic:e.metallic},I&&h.indices.length>0){let N=h.build("extrude-side");N.materialName="extrude-side-material",Q.push(N),w["extrude-side-material"]={name:"extrude-side-material",diffuseColor:yr(e.bevelColor??e.color??"#ffffff"),shading:e.material??"lit",shininess:e.shininess??32,roughness:e.roughness,metallic:e.metallic}}return Ka("extrude",Q,w)}function jc(e,t){let r=typeof e.points=="string"?Ha(e.points,{tolerance:.25})[0]??[]:e.points.map(Oo);if(r.length<2)return;let n=r.map(d=>({x:Math.max(0,d.x),y:d.y})),o=n.length>=3&&Math.hypot(n[n.length-1].x-n[0].x,n[n.length-1].y-n[0].y)<1e-4;o?Kt(n)<0&&n.reverse():n[0].y>n[n.length-1].y&&n.reverse();let A=Math.max(3,Math.round(e.segments??32)),i=(e.phiStart??0)*Math.PI/180,a=(e.phiLength??360)*Math.PI/180,s=n.length,c=[],l=[],u=0;for(let d=0;d<s-1;d++){let f=n[d],h=n[d+1],I=h.x-f.x,b=h.y-f.y,D=Math.hypot(I,b);c.push(D),u+=D,l.push(D>1e-8?{x:b/D,y:-I/D}:{x:1,y:0})}let g=[0],p=0;for(let d of c)p+=d,g.push(u>0?p/u:0);if(e.flatShaded)for(let d=0;d<s-1;d++){let f=n[d],h=n[d+1],I=l[d];for(let b=0;b<A;b++){let D=i+b/A*a,m=i+(b+1)/A*a,Q=(D+m)/2,w=$e([I.x*Math.cos(Q),I.y,I.x*Math.sin(Q)]),S=Math.cos(D),N=Math.sin(D),M=Math.cos(m),G=Math.sin(m),j=t.positions.length/3;t.vertex([f.x*S,f.y,f.x*N],w,[b/A,g[d]]),t.vertex([f.x*M,f.y,f.x*G],w,[(b+1)/A,g[d]]),t.vertex([h.x*S,h.y,h.x*N],w,[b/A,g[d+1]]),t.vertex([h.x*M,h.y,h.x*G],w,[(b+1)/A,g[d+1]]),t.indices.push(j,j+2,j+1,j+1,j+2,j+3)}}else{let d=(h,I)=>{if(h.x*I.x+h.y*I.y<ja)return h;let b=h.x+I.x,D=h.y+I.y,m=Math.hypot(b,D);return m>1e-8?{x:b/m,y:D/m}:h},f=(h,I,b)=>{for(let D=0;D<=A;D++){let m=i+D/A*a,Q=Math.cos(m),w=Math.sin(m),S=h.x<=1e-5&&Math.abs(I.y)>1e-5?[0,I.y<0?-1:1,0]:$e([I.x*Q,I.y,I.x*w]);t.vertex([h.x*Q,h.y,h.x*w],S,[D/A,b])}};for(let h=0;h<s-1;h++){let I=n[h],b=n[h+1],D=l[h],m=h>0?l[h-1]:o?l[s-2]:D,Q=h+1<s-1?l[h+1]:o?l[0]:D,w=d(D,m),S=d(D,Q),N=t.positions.length/3;f(I,w,g[h]),f(b,S,g[h+1]),t.grid(N,A,1,!1)}}if((e.capped??e.closed)&&!o){let d=n[0],f=n[s-1];for(let[h,I]of[[d,-1],[f,1]]){if(h.x<=1e-5)continue;let b=t.vertex([0,h.y,0],[0,I,0],[.5,.5]),D=t.positions.length/3;for(let m=0;m<=A;m++){let Q=i+m/A*a,w=Math.cos(Q),S=Math.sin(Q);t.vertex([h.x*w,h.y,h.x*S],[0,I,0],[(w+1)/2,(S+1)/2])}for(let m=0;m<A;m++)I<0?t.indices.push(b,D+m,D+m+1):t.indices.push(b,D+m+1,D+m)}}}function Va(e,t=!1){if(Array.isArray(e)){if(e.length<2)throw new Error("3D path requires at least 2 points");return dr.catmullRom(e,{closed:t})}return e.kind==="catmullRom"?dr.catmullRom(e.points,{tension:e.tension,closed:e.closed??t,samplesPerSegment:e.samplesPerSegment}):e.kind==="bezier"?dr.bezier(e.segments,e.samplesPerSegment):e.kind==="helix"?dr.helix({center:e.center??[0,0,0],radius:e.radius,pitch:e.pitch,turns:e.turns,axis:e.axis,samplesPerTurn:e.samplesPerTurn}):dr.circle({center:e.center??[0,0,0],radius:e.radius,startAngleDeg:e.startAngleDeg,endAngleDeg:e.endAngleDeg,samples:e.samples})}function Vc(e,t){let r=e.closed??(!Array.isArray(e.path)&&e.path.kind==="catmullRom"&&!!e.path.closed),n=Va(e.path,r),o=Math.max(2,Math.round(e.tubularSegments??64)),A=Math.max(3,Math.round(e.radialSegments??16)),i=Math.max(.001,e.radius??12),a=e.radiusTaper?Math.max(0,e.radiusTaper[0]):i,s=e.radiusTaper?Math.max(0,e.radiusTaper[1]):i,c=Math.max(0,Math.min(i-.001,e.innerRadius??0)),l=e.capped??!0,u=[];for(let p=0;p<=o;p++)u.push(n.getPointAt(p/o));let g=t.positions.length/3;for(let p=0;p<=o;p++){let d=p/o,f=a+(s-a)*d,h=u[p],[I,b,D]=h.position,[m,Q,w]=h.normal,[S,N,M]=h.binormal;for(let G=0;G<=A;G++){let j=G/A,R=j*Math.PI*2,K=Math.cos(R),z=Math.sin(R),J=K*m+z*S,W=K*Q+z*N,X=K*w+z*M;t.vertex([I+f*J,b+f*W,D+f*X],$e([J,W,X]),[d,j])}}if(t.grid(g,A,o,!0),c>1e-6){let p=c/i,d=t.positions.length/3;for(let f=0;f<=o;f++){let h=f/o,I=(a+(s-a)*h)*p,b=u[f],[D,m,Q]=b.position,[w,S,N]=b.normal,[M,G,j]=b.binormal;for(let R=0;R<=A;R++){let K=R/A,z=K*Math.PI*2,J=Math.cos(z),W=Math.sin(z),X=J*w+W*M,Ae=J*S+W*G,re=J*N+W*j;t.vertex([D+I*X,m+I*Ae,Q+I*re],$e([-X,-Ae,-re]),[h,K])}}if(t.grid(d,A,o,!1),!r&&l)for(let[f,h]of[[0,-1],[o,1]]){let I=f/o,b=a+(s-a)*I,D=b*p,m=u[f],[Q,w,S]=m.position,[N,M,G]=m.normal,[j,R,K]=m.binormal,z=$e([m.tangent[0]*h,m.tangent[1]*h,m.tangent[2]*h]),J=t.positions.length/3;for(let W of[D,b])for(let X=0;X<=A;X++){let Ae=X/A*Math.PI*2,re=Math.cos(Ae),oe=Math.sin(Ae),ne=re*N+oe*j,ie=re*M+oe*R,he=re*G+oe*K;t.vertex([Q+W*ne,w+W*ie,S+W*he],z,[(re*(W/b)+1)/2,(oe*(W/b)+1)/2])}t.grid(J,A,1,h<0)}}else if(!r&&l)for(let[p,d]of[[0,-1],[o,1]]){let f=p/o,h=a+(s-a)*f;if(h<=1e-6)continue;let I=u[p],[b,D,m]=I.position,[Q,w,S]=I.normal,[N,M,G]=I.binormal,j=$e([I.tangent[0]*d,I.tangent[1]*d,I.tangent[2]*d]),R=t.vertex([b,D,m],j,[.5,.5]),K=t.positions.length/3;for(let z=0;z<=A;z++){let J=z/A*Math.PI*2,W=Math.cos(J),X=Math.sin(J),Ae=W*Q+X*N,re=W*w+X*M,oe=W*S+X*G;t.vertex([b+h*Ae,D+h*re,m+h*oe],j,[(W+1)/2,(X+1)/2])}for(let z=0;z<A;z++)d>0?t.indices.push(R,K+z,K+z+1):t.indices.push(R,K+z+1,K+z)}}function Ja(e){if(Array.isArray(e))return e;let t=Va(e),r=96,n=[];for(let o=0;o<=r;o++)n.push(t.getPointAt(o/r).position);return n}function Jc(e,t){t.topology="line-list";let r=Ja(e.points);if(r.length<2)return;let n=e.colors?.map(A=>yr(A)),o=e.mode??"strip";if(e.dashSize&&e.dashSize>0&&o==="strip"){let A=e.dashSize,i=e.gapSize??A,a=A+i,s=e.closed?[...r,r[0]]:r,c=0;for(let l=0;l<s.length-1;l++){let u=s[l],g=s[l+1],p=Math.hypot(g[0]-u[0],g[1]-u[1],g[2]-u[2]);if(p<1e-6)continue;let d=[(g[0]-u[0])/p,(g[1]-u[1])/p,(g[2]-u[2])/p],f=n?.[l%n.length],h=0;for(;h<p;){let I=(c+h)%a;if(I<A){let b=Math.min(A-I,p-h),D=[u[0]+d[0]*h,u[1]+d[1]*h,u[2]+d[2]*h],m=[u[0]+d[0]*(h+b),u[1]+d[1]*(h+b),u[2]+d[2]*(h+b)],Q=t.vertex(D,[0,-1,0],[0,0],f),w=t.vertex(m,[0,-1,0],[1,0],f);t.indices.push(Q,w),h+=b}else h+=a-I}c+=p}return}for(let A=0;A<r.length;A++){let i=r.length>1?A/(r.length-1):0;t.vertex(r[A],[0,-1,0],[i,0],n?n[A%n.length]:void 0)}if(o==="segments")for(let A=0;A+1<r.length;A+=2)t.indices.push(A,A+1);else{for(let A=0;A<r.length-1;A++)t.indices.push(A,A+1);e.closed&&r.length>=3&&t.indices.push(r.length-1,0)}}function Kc(e,t){let r=Ja(e.points);if(r.length===0)return;let n=e.colors?.map(A=>yr(A)),o=e.pointSize??0;if(o>0){let A=new $r;Oa({type:"polyhedron",shape:"icosphere",radius:o,detail:1,flatShaded:!1},A);let i=A.positions.length/3;for(let a=0;a<r.length;a++){let[s,c,l]=r[a],u=n?n[a%n.length]:void 0,g=t.positions.length/3;for(let p=0;p<i;p++)t.vertex([s+A.positions[p*3],c+A.positions[p*3+1],l+A.positions[p*3+2]],[A.normals[p*3],A.normals[p*3+1],A.normals[p*3+2]],[A.uvs[p*2],A.uvs[p*2+1]],u);for(let p of A.indices)t.indices.push(g+p)}return}t.topology="point-list";for(let A=0;A<r.length;A++){let i=r.length>1?A/(r.length-1):0,a=t.vertex(r[A],[0,-1,0],[i,0],n?n[A%n.length]:void 0);t.indices.push(a)}}function zc(e,t){let r=e.radius??50,n=(e.size?e.size[0]:r)||50,o=(e.size?e.size[1]:r)||50,A=(e.size?e.size[2]:r)||50,i=Math.max(n,o,A),a=Math.max(4,Math.min(64,Math.round(e.facets??14))),s=Math.round(e.seed??1)>>>0,c=Math.max(0,Math.min(.85,e.irregularity??.35)),l=BigInt(s)*6364136223846793005n+1442695040888963407n,u=()=>{l=l*6364136223846793005n+1442695040888963407n;let Q=Number((l>>18n^l)>>27n)>>>0,w=Number(l>>59n)>>>0;return((Q>>>w|Q<<(32-w&31))>>>0)/4294967296},g=[[[-n,-o,-A],[n,-o,-A],[n,o,-A],[-n,o,-A]],[[n,-o,A],[-n,-o,A],[-n,o,A],[n,o,A]],[[-n,-o,A],[-n,-o,-A],[-n,o,-A],[-n,o,A]],[[n,-o,-A],[n,-o,A],[n,o,A],[n,o,-A]],[[-n,-o,A],[n,-o,A],[n,-o,-A],[-n,-o,-A]],[[-n,o,-A],[n,o,-A],[n,o,A],[-n,o,A]]],p=(1+Math.sqrt(5))/2;for(let Q=0;Q<a;Q++){let w=2*Math.PI*Q/p+(u()-.5)*.4,S=1-2*(Q+.5)/a,N=Math.sqrt(Math.max(0,1-S*S)),M=[Math.cos(w)*N,Math.sin(w)*N,S];M[0]+=(u()-.5)*.2,M[1]+=(u()-.5)*.2,M[2]+=(u()-.5)*.2;let G=Math.hypot(M[0],M[1],M[2]);if(G<1e-6)continue;M=[M[0]/G,M[1]/G,M[2]/G];let R=Math.hypot(M[0]*n,M[1]*o,M[2]*A)*(1-c*(.2+.8*u())),K=[],z=[];for(let J of g){let W=[],X=J.length;for(let Ae=0;Ae<X;Ae++){let re=J[Ae],oe=J[(Ae+1)%X],ne=wt(M,re)-R,ie=wt(M,oe)-R;if(ne<=1e-5&&W.push(re),ne>1e-5&&ie<-1e-5||ne<-1e-5&&ie>1e-5){let he=ne/(ne-ie),F=[re[0]+(oe[0]-re[0])*he,re[1]+(oe[1]-re[1])*he,re[2]+(oe[2]-re[2])*he];W.push(F),z.push(F)}}W.length>=3&&K.push(W)}if(z.length>=3){let J=[];for(let W of z){let X=!1;for(let Ae of J)if(Math.hypot(W[0]-Ae[0],W[1]-Ae[1],W[2]-Ae[2])<.001){X=!0;break}X||J.push(W)}if(J.length>=3){let W=0,X=0,Ae=0;for(let he of J)W+=he[0],X+=he[1],Ae+=he[2];let re=[W/J.length,X/J.length,Ae/J.length],oe=Math.abs(M[1])<.9?[0,1,0]:[1,0,0],ne=$e(Cr(oe,M)),ie=Cr(M,ne);J.sort((he,F)=>{let Be=Math.atan2(wt(It(he,re),ie),wt(It(he,re),ne)),Se=Math.atan2(wt(It(F,re),ie),wt(It(F,re),ne));return Be-Se}),K.push(J)}}K.length>=4&&(g=K)}let d=Number.POSITIVE_INFINITY,f=Number.POSITIVE_INFINITY,h=Number.POSITIVE_INFINITY,I=Number.NEGATIVE_INFINITY,b=Number.NEGATIVE_INFINITY,D=Number.NEGATIVE_INFINITY;for(let Q of g)for(let w of Q)w[0]<d&&(d=w[0]),w[0]>I&&(I=w[0]),w[1]<f&&(f=w[1]),w[1]>b&&(b=w[1]),w[2]<h&&(h=w[2]),w[2]>D&&(D=w[2]);let m=[(d+I)/2,(f+b)/2,(h+D)/2];for(let Q of g)for(let w=0;w<Q.length;w++){let S=Q[w];Q[w]=[S[0]-m[0],S[1]-m[1],S[2]-m[2]]}for(let Q of g){if(Q.length<3)continue;let w=[0,0,0];for(let z=0;z<Q.length;z++){let J=Q[z],W=Q[(z+1)%Q.length];w[0]+=(J[1]-W[1])*(J[2]+W[2]),w[1]+=(J[2]-W[2])*(J[0]+W[0]),w[2]+=(J[0]-W[0])*(J[1]+W[1])}let S=Math.hypot(w[0],w[1],w[2]);if(S<1e-6)continue;w=[w[0]/S,w[1]/S,w[2]/S];let N=[Q.reduce((z,J)=>z+J[0],0)/Q.length,Q.reduce((z,J)=>z+J[1],0)/Q.length,Q.reduce((z,J)=>z+J[2],0)/Q.length];wt(w,N)<0&&(Q.reverse(),w=[-w[0],-w[1],-w[2]]);let M=Math.abs(w[1])<.9?[0,1,0]:[1,0,0],G=$e(Cr(M,w)),j=Cr(w,G),R=Q.map(z=>[.5+wt(z,G)/(2*i),.5+wt(z,j)/(2*i)]),K=t.positions.length/3;for(let z=0;z<Q.length;z++)t.vertex(Q[z],w,R[z]);for(let z=1;z<Q.length-1;z++)t.indices.push(K,K+z,K+z+1)}}function Ka(e,t,r){let n=[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY],o=[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY];for(let i of t){let a=i.positions;for(let s=0;s<a.length;s+=3)for(let c=0;c<3;c++){let l=a[s+c];l<n[c]&&(n[c]=l),l>o[c]&&(o[c]=l)}}Number.isFinite(n[0])||(n[0]=n[1]=n[2]=0,o[0]=o[1]=o[2]=0);let A=[o[0]-n[0],o[1]-n[1],o[2]-n[2]];return{name:`primitive-${e}`,meshes:t,materials:r,animations:[],bounds:{min:n,max:o,center:[(n[0]+o[0])/2,(n[1]+o[1])/2,(n[2]+o[2])/2],size:A,boundingSphereRadius:Math.hypot(...A)/2}}}function Yc(e){if(e.type==="extrude")return Hc(e);let t=new $r;if(e.type==="roundedBox")Fc(e,t);else if(e.type==="sphere")Uc(e,t);else if(e.type==="cylinder")kc(e,t);else if(e.type==="torus")Nc(e,t);else if(e.type==="capsule")Tc(e,t);else if(e.type==="ring")Lc(e,t);else if(e.type==="polyhedron")Oa(e,t);else if(e.type==="lathe")jc(e,t);else if(e.type==="tube")Vc(e,t);else if(e.type==="line3d")Jc(e,t);else if(e.type==="points3d")Kc(e,t);else if(e.type==="shard")zc(e,t);else throw new Error(`Unknown 3D primitive: ${e.type}`);let r=e.type,n=t.build(r),o=e.type==="line3d"||e.type==="points3d"&&(e.pointSize??0)<=0?"unlit":"lit",A={name:`${r}-material`,diffuseColor:yr(e.color??"#ffffff"),shading:e.material??o,shininess:e.shininess??32,roughness:e.roughness,metallic:e.metallic};return Ka(r,[n],{[A.name]:A})}var Lo=new Map;function Gd(e){let t=JSON.stringify(e),r=Lo.get(t);return r||(r=Yc(e),Lo.size>512&&Lo.clear(),Lo.set(t,r)),r}var EA=new Map;function Wc(e,t){return JSON.stringify({text:e,...t})}function yA(e,t){let r=e?String(e):" ",n=Wc(r,t),o=EA.get(n);if(o)return o;let A=t.fontSize??48,i=t.fontFamily??"Inter";gr.isFailed(i)&&(i="Inter");let a=t.letterSpacing??0,s=t.lineHeight!==void 0&&t.lineHeight<10?t.lineHeight*A:t.lineHeight??A*1.2,c=gr.getFont(i,t.fontWeight,null,void 0,A),l=t.padding??0;if(!c){gr.isFailed(i)||gr.preloadSlugFont(null,i,zo(i)).catch(()=>{});let p=r.split(`
|
|
2567
|
-
`),d=0,f=t.width!==void 0?Math.max(10,t.width-l*2):0;for(let b of p)if(f>0){let D=b.length*A*.55+a*b.length,m=Math.max(1,Math.ceil(D/f));d+=m}else d+=1;let h=Math.max(0,r.length-1),I={width:t.width!==void 0?t.width:Math.ceil(r.length*A*.6+a*h)+l*2,height:t.height!==void 0?t.height:Math.ceil(d*s)+l*2};return EA.set(n,I),I}let u=ki.measure(r,c,A,a,s,t.width!==void 0?Math.max(0,t.width-l*2):void 0,t.spans,t.direction),g={width:t.width!==void 0&&!t.keepNaturalWidth?t.width:Math.ceil(u.width)+l*2,height:t.height!==void 0?t.height:Math.ceil(u.height)+l*2};return EA.set(n,g),g}function Nd(e,t){let r=t.fontFamily??"Inter";return gr.isFailed(r)&&(r="Inter"),gr.isFailed(r)?Promise.resolve(yA(e,t)):gr.preloadSlugFont(null,r,zo(r)).then(()=>yA(e,t)).catch(()=>yA(e,t))}$();$();$();var qc=(()=>{var e=import.meta.url;return(function(t){t=t||{};var r;r||(r=typeof t<"u"?t:{});var n,o;r.ready=new Promise(function(C,x){n=C,o=x});var A=Object.assign({},r),i="";typeof document<"u"&&document.currentScript&&(i=document.currentScript.src),e&&(i=e),i.indexOf("blob:")!==0?i=i.substr(0,i.replace(/[?#].*/,"").lastIndexOf("/")+1):i="";var a=r.print||console.log.bind(console),s=r.printErr||console.warn.bind(console);Object.assign(r,A),A=null;var c;r.wasmBinary&&(c=r.wasmBinary);var l=r.noExitRuntime||!0;typeof WebAssembly!="object"&&W("no native wasm support detected");var u,g=!1;function p(C,x,k){k=x+k;for(var V="";!(x>=k);){var q=C[x++];if(!q)break;if(q&128){var te=C[x++]&63;if((q&224)==192)V+=String.fromCharCode((q&31)<<6|te);else{var ae=C[x++]&63;q=(q&240)==224?(q&15)<<12|te<<6|ae:(q&7)<<18|te<<12|ae<<6|C[x++]&63,65536>q?V+=String.fromCharCode(q):(q-=65536,V+=String.fromCharCode(55296|q>>10,56320|q&1023))}}else V+=String.fromCharCode(q)}return V}var d,f,h,I,b,D,m,Q,w;function S(){var C=u.buffer;d=C,r.HEAP8=f=new Int8Array(C),r.HEAP16=I=new Int16Array(C),r.HEAP32=D=new Int32Array(C),r.HEAPU8=h=new Uint8Array(C),r.HEAPU16=b=new Uint16Array(C),r.HEAPU32=m=new Uint32Array(C),r.HEAPF32=Q=new Float32Array(C),r.HEAPF64=w=new Float64Array(C)}var N,M=[],G=[],j=[];function R(){var C=r.preRun.shift();M.unshift(C)}var K=0,z=null,J=null;function W(C){throw r.onAbort&&r.onAbort(C),C="Aborted("+C+")",s(C),g=!0,C=new WebAssembly.RuntimeError(C+". Build with -sASSERTIONS for more info."),o(C),C}function X(C){return C.startsWith("data:application/octet-stream;base64,")}var Ae;if(Ae="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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",!X(Ae)){var re=Ae;Ae=r.locateFile?r.locateFile(re,i):i+re}function oe(){var C=Ae;try{if(C==Ae&&c)return new Uint8Array(c);if(X(C))try{var x=Nr(C.slice(37)),k=new Uint8Array(x.length);for(C=0;C<x.length;++C)k[C]=x.charCodeAt(C);var V=k}catch{throw Error("Converting base64 string to bytes failed.")}else V=void 0;var q=V;if(q)return q;throw"both async and sync fetching of the wasm failed"}catch(te){W(te)}}function ne(){return c||typeof fetch!="function"?Promise.resolve().then(function(){return oe()}):fetch(Ae,{credentials:"same-origin"}).then(function(C){if(!C.ok)throw"failed to load wasm binary file at '"+Ae+"'";return C.arrayBuffer()}).catch(function(){return oe()})}function ie(C){for(;0<C.length;)C.shift()(r)}function he(C){if(C===void 0)return"_unknown";C=C.replace(/[^a-zA-Z0-9_]/g,"$");var x=C.charCodeAt(0);return 48<=x&&57>=x?"_"+C:C}function F(C,x){return C=he(C),function(){return x.apply(this,arguments)}}var Be=[{},{value:void 0},{value:null},{value:!0},{value:!1}],Se=[];function Pe(C){var x=Error,k=F(C,function(V){this.name=C,this.message=V,V=Error(V).stack,V!==void 0&&(this.stack=this.toString()+`
|
|
2568
|
-
`+V.replace(/^Error(:[^\n]*)?\n/,""))});return k.prototype=Object.create(x.prototype),k.prototype.constructor=k,k.prototype.toString=function(){return this.message===void 0?this.name:this.name+": "+this.message},k}var Ie=void 0;function y(C){throw new Ie(C)}var ye=C=>(C||y("Cannot use deleted val. handle = "+C),Be[C].value),Qe=C=>{switch(C){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:var x=Se.length?Se.pop():Be.length;return Be[x]={ga:1,value:C},x}},xe=void 0,le=void 0;function ge(C){for(var x="";h[C];)x+=le[h[C++]];return x}var be=[];function we(){for(;be.length;){var C=be.pop();C.M.$=!1,C.delete()}}var Me=void 0,Ge={};function Ue(C,x){for(x===void 0&&y("ptr should not be undefined");C.R;)x=C.ba(x),C=C.R;return x}var _e={};function He(C){C=sr(C);var x=ge(C);return st(C),x}function Te(C,x){var k=_e[C];return k===void 0&&y(x+" has unknown type "+He(C)),k}function je(){}var Le=!1;function Je(C){--C.count.value,C.count.value===0&&(C.T?C.U.W(C.T):C.P.N.W(C.O))}function tt(C,x,k){return x===k?C:k.R===void 0?null:(C=tt(C,x,k.R),C===null?null:k.na(C))}var qe={};function Bt(C,x){return x=Ue(C,x),Ge[x]}var ze=void 0;function Ve(C){throw new ze(C)}function bt(C,x){return x.P&&x.O||Ve("makeClassHandle requires ptr and ptrType"),!!x.U!=!!x.T&&Ve("Both smartPtrType and smartPtr must be specified"),x.count={value:1},ut(Object.create(C,{M:{value:x}}))}function ut(C){return typeof FinalizationRegistry>"u"?(ut=x=>x,C):(Le=new FinalizationRegistry(x=>{Je(x.M)}),ut=x=>{var k=x.M;return k.T&&Le.register(x,{M:k},x),x},je=x=>{Le.unregister(x)},ut(C))}var Et={};function gt(C){for(;C.length;){var x=C.pop();C.pop()(x)}}function Xe(C){return this.fromWireType(D[C>>2])}var ht={},Rt={};function pt(C,x,k){function V(se){se=k(se),se.length!==C.length&&Ve("Mismatched type converter count");for(var pe=0;pe<C.length;++pe)it(C[pe],se[pe])}C.forEach(function(se){Rt[se]=x});var q=Array(x.length),te=[],ae=0;x.forEach((se,pe)=>{_e.hasOwnProperty(se)?q[pe]=_e[se]:(te.push(se),ht.hasOwnProperty(se)||(ht[se]=[]),ht[se].push(()=>{q[pe]=_e[se],++ae,ae===te.length&&V(q)}))}),te.length===0&&V(q)}function zt(C){switch(C){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+C)}}function it(C,x,k={}){if(!("argPackAdvance"in x))throw new TypeError("registerType registeredInstance requires argPackAdvance");var V=x.name;if(C||y('type "'+V+'" must have a positive integer typeid pointer'),_e.hasOwnProperty(C)){if(k.ua)return;y("Cannot register type '"+V+"' twice")}_e[C]=x,delete Rt[C],ht.hasOwnProperty(C)&&(x=ht[C],delete ht[C],x.forEach(q=>q()))}function Ft(C){y(C.M.P.N.name+" instance already deleted")}function dt(){}function vt(C,x,k){if(C[x].S===void 0){var V=C[x];C[x]=function(){return C[x].S.hasOwnProperty(arguments.length)||y("Function '"+k+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+C[x].S+")!"),C[x].S[arguments.length].apply(this,arguments)},C[x].S=[],C[x].S[V.Z]=V}}function Qr(C,x){r.hasOwnProperty(C)?(y("Cannot register public name '"+C+"' twice"),vt(r,C,C),r.hasOwnProperty(void 0)&&y("Cannot register multiple overloads of a function with the same number of arguments (undefined)!"),r[C].S[void 0]=x):r[C]=x}function rr(C,x,k,V,q,te,ae,se){this.name=C,this.constructor=x,this.X=k,this.W=V,this.R=q,this.pa=te,this.ba=ae,this.na=se,this.ja=[]}function Ut(C,x,k){for(;x!==k;)x.ba||y("Expected null or instance of "+k.name+", got an instance of "+x.name),C=x.ba(C),x=x.R;return C}function nr(C,x){return x===null?(this.ea&&y("null is not a valid "+this.name),0):(x.M||y('Cannot pass "'+Zt(x)+'" as a '+this.name),x.M.O||y("Cannot pass deleted object as a pointer of type "+this.name),Ut(x.M.O,x.M.P.N,this.N))}function yt(C,x){if(x===null){if(this.ea&&y("null is not a valid "+this.name),this.da){var k=this.fa();return C!==null&&C.push(this.W,k),k}return 0}if(x.M||y('Cannot pass "'+Zt(x)+'" as a '+this.name),x.M.O||y("Cannot pass deleted object as a pointer of type "+this.name),!this.ca&&x.M.P.ca&&y("Cannot convert argument of type "+(x.M.U?x.M.U.name:x.M.P.name)+" to parameter type "+this.name),k=Ut(x.M.O,x.M.P.N,this.N),this.da)switch(x.M.T===void 0&&y("Passing raw pointer to smart pointer is illegal"),this.Ba){case 0:x.M.U===this?k=x.M.T:y("Cannot convert argument of type "+(x.M.U?x.M.U.name:x.M.P.name)+" to parameter type "+this.name);break;case 1:k=x.M.T;break;case 2:if(x.M.U===this)k=x.M.T;else{var V=x.clone();k=this.xa(k,Qe(function(){V.delete()})),C!==null&&C.push(this.W,k)}break;default:y("Unsupporting sharing policy")}return k}function xr(C,x){return x===null?(this.ea&&y("null is not a valid "+this.name),0):(x.M||y('Cannot pass "'+Zt(x)+'" as a '+this.name),x.M.O||y("Cannot pass deleted object as a pointer of type "+this.name),x.M.P.ca&&y("Cannot convert argument of type "+x.M.P.name+" to parameter type "+this.name),Ut(x.M.O,x.M.P.N,this.N))}function at(C,x,k,V){this.name=C,this.N=x,this.ea=k,this.ca=V,this.da=!1,this.W=this.xa=this.fa=this.ka=this.Ba=this.wa=void 0,x.R!==void 0?this.toWireType=yt:(this.toWireType=V?nr:xr,this.V=null)}function Yt(C,x){r.hasOwnProperty(C)||Ve("Replacing nonexistant public symbol"),r[C]=x,r[C].Z=void 0}function or(C,x){var k=[];return function(){if(k.length=0,Object.assign(k,arguments),C.includes("j")){var V=r["dynCall_"+C];V=k&&k.length?V.apply(null,[x].concat(k)):V.call(null,x)}else V=N.get(x).apply(null,k);return V}}function ot(C,x){C=ge(C);var k=C.includes("j")?or(C,x):N.get(x);return typeof k!="function"&&y("unknown function pointer with signature "+C+": "+x),k}var Ct=void 0;function kt(C,x){function k(te){q[te]||_e[te]||(Rt[te]?Rt[te].forEach(k):(V.push(te),q[te]=!0))}var V=[],q={};throw x.forEach(k),new Ct(C+": "+V.map(He).join([", "]))}function Wt(C,x,k,V,q){var te=x.length;2>te&&y("argTypes array size mismatch! Must at least get return value and 'this' types!");var ae=x[1]!==null&&k!==null,se=!1;for(k=1;k<x.length;++k)if(x[k]!==null&&x[k].V===void 0){se=!0;break}var pe=x[0].name!=="void",ue=te-2,fe=Array(ue),ve=[],Fe=[];return function(){if(arguments.length!==ue&&y("function "+C+" called with "+arguments.length+" arguments, expected "+ue+" args!"),Fe.length=0,ve.length=ae?2:1,ve[0]=q,ae){var Ke=x[1].toWireType(Fe,this);ve[1]=Ke}for(var Ne=0;Ne<ue;++Ne)fe[Ne]=x[Ne+2].toWireType(Fe,arguments[Ne]),ve.push(fe[Ne]);if(Ne=V.apply(null,ve),se)gt(Fe);else for(var et=ae?1:2;et<x.length;et++){var At=et===1?Ke:fe[et-2];x[et].V!==null&&x[et].V(At)}return Ke=pe?x[0].fromWireType(Ne):void 0,Ke}}function qt(C,x){for(var k=[],V=0;V<C;V++)k.push(m[x+4*V>>2]);return k}function Xt(C){4<C&&--Be[C].ga===0&&(Be[C]=void 0,Se.push(C))}function Zt(C){if(C===null)return"null";var x=typeof C;return x==="object"||x==="array"||x==="function"?C.toString():""+C}function wr(C,x){switch(x){case 2:return function(k){return this.fromWireType(Q[k>>2])};case 3:return function(k){return this.fromWireType(w[k>>3])};default:throw new TypeError("Unknown float type: "+C)}}function vr(C,x,k){switch(x){case 0:return k?function(V){return f[V]}:function(V){return h[V]};case 1:return k?function(V){return I[V>>1]}:function(V){return b[V>>1]};case 2:return k?function(V){return D[V>>2]}:function(V){return m[V>>2]};default:throw new TypeError("Unknown integer type: "+C)}}function Dr(C,x){for(var k="",V=0;!(V>=x/2);++V){var q=I[C+2*V>>1];if(q==0)break;k+=String.fromCharCode(q)}return k}function _r(C,x,k){if(k===void 0&&(k=2147483647),2>k)return 0;k-=2;var V=x;k=k<2*C.length?k/2:C.length;for(var q=0;q<k;++q)I[x>>1]=C.charCodeAt(q),x+=2;return I[x>>1]=0,x-V}function Mr(C){return 2*C.length}function Sr(C,x){for(var k=0,V="";!(k>=x/4);){var q=D[C+4*k>>2];if(q==0)break;++k,65536<=q?(q-=65536,V+=String.fromCharCode(55296|q>>10,56320|q&1023)):V+=String.fromCharCode(q)}return V}function Pr(C,x,k){if(k===void 0&&(k=2147483647),4>k)return 0;var V=x;k=V+k-4;for(var q=0;q<C.length;++q){var te=C.charCodeAt(q);if(55296<=te&&57343>=te){var ae=C.charCodeAt(++q);te=65536+((te&1023)<<10)|ae&1023}if(D[x>>2]=te,x+=4,x+4>k)break}return D[x>>2]=0,x-V}function Gr(C){for(var x=0,k=0;k<C.length;++k){var V=C.charCodeAt(k);55296<=V&&57343>=V&&++k,x+=4}return x}var Rr={};function Ar(C){var x=Rr[C];return x===void 0?ge(C):x}var Nt=[];function Fr(C){var x=Nt.length;return Nt.push(C),x}function Ur(C,x){for(var k=Array(C),V=0;V<C;++V)k[V]=Te(m[x+4*V>>2],"parameter "+V);return k}var ir=[],kr=[null,[],[]];Ie=r.BindingError=Pe("BindingError"),r.count_emval_handles=function(){for(var C=0,x=5;x<Be.length;++x)Be[x]!==void 0&&++C;return C},r.get_first_emval=function(){for(var C=5;C<Be.length;++C)if(Be[C]!==void 0)return Be[C];return null},xe=r.PureVirtualError=Pe("PureVirtualError");for(var ar=Array(256),Tt=0;256>Tt;++Tt)ar[Tt]=String.fromCharCode(Tt);le=ar,r.getInheritedInstanceCount=function(){return Object.keys(Ge).length},r.getLiveInheritedInstances=function(){var C=[],x;for(x in Ge)Ge.hasOwnProperty(x)&&C.push(Ge[x]);return C},r.flushPendingDeletes=we,r.setDelayFunction=function(C){Me=C,be.length&&Me&&Me(we)},ze=r.InternalError=Pe("InternalError"),dt.prototype.isAliasOf=function(C){if(!(this instanceof dt&&C instanceof dt))return!1;var x=this.M.P.N,k=this.M.O,V=C.M.P.N;for(C=C.M.O;x.R;)k=x.ba(k),x=x.R;for(;V.R;)C=V.ba(C),V=V.R;return x===V&&k===C},dt.prototype.clone=function(){if(this.M.O||Ft(this),this.M.aa)return this.M.count.value+=1,this;var C=ut,x=Object,k=x.create,V=Object.getPrototypeOf(this),q=this.M;return C=C(k.call(x,V,{M:{value:{count:q.count,$:q.$,aa:q.aa,O:q.O,P:q.P,T:q.T,U:q.U}}})),C.M.count.value+=1,C.M.$=!1,C},dt.prototype.delete=function(){this.M.O||Ft(this),this.M.$&&!this.M.aa&&y("Object already scheduled for deletion"),je(this),Je(this.M),this.M.aa||(this.M.T=void 0,this.M.O=void 0)},dt.prototype.isDeleted=function(){return!this.M.O},dt.prototype.deleteLater=function(){return this.M.O||Ft(this),this.M.$&&!this.M.aa&&y("Object already scheduled for deletion"),be.push(this),be.length===1&&Me&&Me(we),this.M.$=!0,this},at.prototype.qa=function(C){return this.ka&&(C=this.ka(C)),C},at.prototype.ha=function(C){this.W&&this.W(C)},at.prototype.argPackAdvance=8,at.prototype.readValueFromPointer=Xe,at.prototype.deleteObject=function(C){C!==null&&C.delete()},at.prototype.fromWireType=function(C){function x(){return this.da?bt(this.N.X,{P:this.wa,O:k,U:this,T:C}):bt(this.N.X,{P:this,O:C})}var k=this.qa(C);if(!k)return this.ha(C),null;var V=Bt(this.N,k);if(V!==void 0)return V.M.count.value===0?(V.M.O=k,V.M.T=C,V.clone()):(V=V.clone(),this.ha(C),V);if(V=this.N.pa(k),V=qe[V],!V)return x.call(this);V=this.ca?V.la:V.pointerType;var q=tt(k,this.N,V.N);return q===null?x.call(this):this.da?bt(V.N.X,{P:V,O:q,U:this,T:C}):bt(V.N.X,{P:V,O:q})},Ct=r.UnboundTypeError=Pe("UnboundTypeError");var Nr=typeof atob=="function"?atob:function(C){var x="",k=0;C=C.replace(/[^A-Za-z0-9\+\/=]/g,"");do{var V="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(C.charAt(k++)),q="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(C.charAt(k++)),te="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(C.charAt(k++)),ae="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(C.charAt(k++));V=V<<2|q>>4,q=(q&15)<<4|te>>2;var se=(te&3)<<6|ae;x+=String.fromCharCode(V),te!==64&&(x+=String.fromCharCode(q)),ae!==64&&(x+=String.fromCharCode(se))}while(k<C.length);return x},Tr={l:function(C,x,k,V){W("Assertion failed: "+(C?p(h,C):"")+", at: "+[x?x?p(h,x):"":"unknown filename",k,V?V?p(h,V):"":"unknown function"])},q:function(C,x,k){C=ge(C),x=Te(x,"wrapper"),k=ye(k);var V=[].slice,q=x.N,te=q.X,ae=q.R.X,se=q.R.constructor;C=F(C,function(){q.R.ja.forEach(function(ue){if(this[ue]===ae[ue])throw new xe("Pure virtual function "+ue+" must be implemented in JavaScript")}.bind(this)),Object.defineProperty(this,"__parent",{value:te}),this.__construct.apply(this,V.call(arguments))}),te.__construct=function(){this===te&&y("Pass correct 'this' to __construct");var ue=se.implement.apply(void 0,[this].concat(V.call(arguments)));je(ue);var fe=ue.M;ue.notifyOnDestruction(),fe.aa=!0,Object.defineProperties(this,{M:{value:fe}}),ut(this),ue=fe.O,ue=Ue(q,ue),Ge.hasOwnProperty(ue)?y("Tried to register registered instance: "+ue):Ge[ue]=this},te.__destruct=function(){this===te&&y("Pass correct 'this' to __destruct"),je(this);var ue=this.M.O;ue=Ue(q,ue),Ge.hasOwnProperty(ue)?delete Ge[ue]:y("Tried to unregister unregistered instance: "+ue)},C.prototype=Object.create(te);for(var pe in k)C.prototype[pe]=k[pe];return Qe(C)},j:function(C){var x=Et[C];delete Et[C];var k=x.fa,V=x.W,q=x.ia,te=q.map(ae=>ae.ta).concat(q.map(ae=>ae.za));pt([C],te,ae=>{var se={};return q.forEach((pe,ue)=>{var fe=ae[ue],ve=pe.ra,Fe=pe.sa,Ke=ae[ue+q.length],Ne=pe.ya,et=pe.Aa;se[pe.oa]={read:At=>fe.fromWireType(ve(Fe,At)),write:(At,Dt)=>{var ct=[];Ne(et,At,Ke.toWireType(ct,Dt)),gt(ct)}}}),[{name:x.name,fromWireType:function(pe){var ue={},fe;for(fe in se)ue[fe]=se[fe].read(pe);return V(pe),ue},toWireType:function(pe,ue){for(var fe in se)if(!(fe in ue))throw new TypeError('Missing field: "'+fe+'"');var ve=k();for(fe in se)se[fe].write(ve,ue[fe]);return pe!==null&&pe.push(V,ve),ve},argPackAdvance:8,readValueFromPointer:Xe,V}]})},v:function(){},B:function(C,x,k,V,q){var te=zt(k);x=ge(x),it(C,{name:x,fromWireType:function(ae){return!!ae},toWireType:function(ae,se){return se?V:q},argPackAdvance:8,readValueFromPointer:function(ae){if(k===1)var se=f;else if(k===2)se=I;else if(k===4)se=D;else throw new TypeError("Unknown boolean type size: "+x);return this.fromWireType(se[ae>>te])},V:null})},f:function(C,x,k,V,q,te,ae,se,pe,ue,fe,ve,Fe){fe=ge(fe),te=ot(q,te),se&&(se=ot(ae,se)),ue&&(ue=ot(pe,ue)),Fe=ot(ve,Fe);var Ke=he(fe);Qr(Ke,function(){kt("Cannot construct "+fe+" due to unbound types",[V])}),pt([C,x,k],V?[V]:[],function(Ne){if(Ne=Ne[0],V)var et=Ne.N,At=et.X;else At=dt.prototype;Ne=F(Ke,function(){if(Object.getPrototypeOf(this)!==Dt)throw new Ie("Use 'new' to construct "+fe);if(ct.Y===void 0)throw new Ie(fe+" has no accessible constructor");var ur=ct.Y[arguments.length];if(ur===void 0)throw new Ie("Tried to invoke ctor of "+fe+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(ct.Y).toString()+") parameters instead!");return ur.apply(this,arguments)});var Dt=Object.create(At,{constructor:{value:Ne}});Ne.prototype=Dt;var ct=new rr(fe,Ne,Dt,Fe,et,te,se,ue);et=new at(fe,ct,!0,!1),At=new at(fe+"*",ct,!1,!1);var lr=new at(fe+" const*",ct,!1,!0);return qe[C]={pointerType:At,la:lr},Yt(Ke,Ne),[et,At,lr]})},d:function(C,x,k,V,q,te,ae){var se=qt(k,V);x=ge(x),te=ot(q,te),pt([],[C],function(pe){function ue(){kt("Cannot call "+fe+" due to unbound types",se)}pe=pe[0];var fe=pe.name+"."+x;x.startsWith("@@")&&(x=Symbol[x.substring(2)]);var ve=pe.N.constructor;return ve[x]===void 0?(ue.Z=k-1,ve[x]=ue):(vt(ve,x,fe),ve[x].S[k-1]=ue),pt([],se,function(Fe){return Fe=Wt(fe,[Fe[0],null].concat(Fe.slice(1)),null,te,ae),ve[x].S===void 0?(Fe.Z=k-1,ve[x]=Fe):ve[x].S[k-1]=Fe,[]}),[]})},p:function(C,x,k,V,q,te){0<x||W();var ae=qt(x,k);q=ot(V,q),pt([],[C],function(se){se=se[0];var pe="constructor "+se.name;if(se.N.Y===void 0&&(se.N.Y=[]),se.N.Y[x-1]!==void 0)throw new Ie("Cannot register multiple constructors with identical number of parameters ("+(x-1)+") for class '"+se.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!");return se.N.Y[x-1]=()=>{kt("Cannot construct "+se.name+" due to unbound types",ae)},pt([],ae,function(ue){return ue.splice(1,0,null),se.N.Y[x-1]=Wt(pe,ue,null,q,te),[]}),[]})},a:function(C,x,k,V,q,te,ae,se){var pe=qt(k,V);x=ge(x),te=ot(q,te),pt([],[C],function(ue){function fe(){kt("Cannot call "+ve+" due to unbound types",pe)}ue=ue[0];var ve=ue.name+"."+x;x.startsWith("@@")&&(x=Symbol[x.substring(2)]),se&&ue.N.ja.push(x);var Fe=ue.N.X,Ke=Fe[x];return Ke===void 0||Ke.S===void 0&&Ke.className!==ue.name&&Ke.Z===k-2?(fe.Z=k-2,fe.className=ue.name,Fe[x]=fe):(vt(Fe,x,ve),Fe[x].S[k-2]=fe),pt([],pe,function(Ne){return Ne=Wt(ve,Ne,ue,te,ae),Fe[x].S===void 0?(Ne.Z=k-2,Fe[x]=Ne):Fe[x].S[k-2]=Ne,[]}),[]})},A:function(C,x){x=ge(x),it(C,{name:x,fromWireType:function(k){var V=ye(k);return Xt(k),V},toWireType:function(k,V){return Qe(V)},argPackAdvance:8,readValueFromPointer:Xe,V:null})},n:function(C,x,k){k=zt(k),x=ge(x),it(C,{name:x,fromWireType:function(V){return V},toWireType:function(V,q){return q},argPackAdvance:8,readValueFromPointer:wr(x,k),V:null})},e:function(C,x,k,V,q){x=ge(x),q===-1&&(q=4294967295),q=zt(k);var te=se=>se;if(V===0){var ae=32-8*k;te=se=>se<<ae>>>ae}k=x.includes("unsigned")?function(se,pe){return pe>>>0}:function(se,pe){return pe},it(C,{name:x,fromWireType:te,toWireType:k,argPackAdvance:8,readValueFromPointer:vr(x,q,V!==0),V:null})},b:function(C,x,k){function V(te){te>>=2;var ae=m;return new q(d,ae[te+1],ae[te])}var q=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][x];k=ge(k),it(C,{name:k,fromWireType:V,argPackAdvance:8,readValueFromPointer:V},{ua:!0})},o:function(C,x){x=ge(x);var k=x==="std::string";it(C,{name:x,fromWireType:function(V){var q=m[V>>2],te=V+4;if(k)for(var ae=te,se=0;se<=q;++se){var pe=te+se;if(se==q||h[pe]==0){if(ae=ae?p(h,ae,pe-ae):"",ue===void 0)var ue=ae;else ue+="\0",ue+=ae;ae=pe+1}}else{for(ue=Array(q),se=0;se<q;++se)ue[se]=String.fromCharCode(h[te+se]);ue=ue.join("")}return st(V),ue},toWireType:function(V,q){q instanceof ArrayBuffer&&(q=new Uint8Array(q));var te,ae=typeof q=="string";if(ae||q instanceof Uint8Array||q instanceof Uint8ClampedArray||q instanceof Int8Array||y("Cannot pass non-string to std::string"),k&&ae){var se=0;for(te=0;te<q.length;++te){var pe=q.charCodeAt(te);127>=pe?se++:2047>=pe?se+=2:55296<=pe&&57343>=pe?(se+=4,++te):se+=3}te=se}else te=q.length;if(se=$t(4+te+1),pe=se+4,m[se>>2]=te,k&&ae){if(ae=pe,pe=te+1,te=h,0<pe){pe=ae+pe-1;for(var ue=0;ue<q.length;++ue){var fe=q.charCodeAt(ue);if(55296<=fe&&57343>=fe){var ve=q.charCodeAt(++ue);fe=65536+((fe&1023)<<10)|ve&1023}if(127>=fe){if(ae>=pe)break;te[ae++]=fe}else{if(2047>=fe){if(ae+1>=pe)break;te[ae++]=192|fe>>6}else{if(65535>=fe){if(ae+2>=pe)break;te[ae++]=224|fe>>12}else{if(ae+3>=pe)break;te[ae++]=240|fe>>18,te[ae++]=128|fe>>12&63}te[ae++]=128|fe>>6&63}te[ae++]=128|fe&63}}te[ae]=0}}else if(ae)for(ae=0;ae<te;++ae)ue=q.charCodeAt(ae),255<ue&&(st(pe),y("String has UTF-16 code units that do not fit in 8 bits")),h[pe+ae]=ue;else for(ae=0;ae<te;++ae)h[pe+ae]=q[ae];return V!==null&&V.push(st,se),se},argPackAdvance:8,readValueFromPointer:Xe,V:function(V){st(V)}})},i:function(C,x,k){if(k=ge(k),x===2)var V=Dr,q=_r,te=Mr,ae=()=>b,se=1;else x===4&&(V=Sr,q=Pr,te=Gr,ae=()=>m,se=2);it(C,{name:k,fromWireType:function(pe){for(var ue=m[pe>>2],fe=ae(),ve,Fe=pe+4,Ke=0;Ke<=ue;++Ke){var Ne=pe+4+Ke*x;(Ke==ue||fe[Ne>>se]==0)&&(Fe=V(Fe,Ne-Fe),ve===void 0?ve=Fe:(ve+="\0",ve+=Fe),Fe=Ne+x)}return st(pe),ve},toWireType:function(pe,ue){typeof ue!="string"&&y("Cannot pass non-string to C++ string type "+k);var fe=te(ue),ve=$t(4+fe+x);return m[ve>>2]=fe>>se,q(ue,ve+4,fe+x),pe!==null&&pe.push(st,ve),ve},argPackAdvance:8,readValueFromPointer:Xe,V:function(pe){st(pe)}})},k:function(C,x,k,V,q,te){Et[C]={name:ge(x),fa:ot(k,V),W:ot(q,te),ia:[]}},h:function(C,x,k,V,q,te,ae,se,pe,ue){Et[C].ia.push({oa:ge(x),ta:k,ra:ot(V,q),sa:te,za:ae,ya:ot(se,pe),Aa:ue})},C:function(C,x){x=ge(x),it(C,{va:!0,name:x,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},s:function(C,x,k,V,q){C=Nt[C],x=ye(x),k=Ar(k);var te=[];return m[V>>2]=Qe(te),C(x,k,te,q)},t:function(C,x,k,V){C=Nt[C],x=ye(x),k=Ar(k),C(x,k,null,V)},g:Xt,m:function(C,x){var k=Ur(C,x),V=k[0];x=V.name+"_$"+k.slice(1).map(function(ae){return ae.name}).join("_")+"$";var q=ir[x];if(q!==void 0)return q;var te=Array(C-1);return q=Fr((ae,se,pe,ue)=>{for(var fe=0,ve=0;ve<C-1;++ve)te[ve]=k[ve+1].readValueFromPointer(ue+fe),fe+=k[ve+1].argPackAdvance;for(ae=ae[se].apply(ae,te),ve=0;ve<C-1;++ve)k[ve+1].ma&&k[ve+1].ma(te[ve]);if(!V.va)return V.toWireType(pe,ae)}),ir[x]=q},D:function(C){4<C&&(Be[C].ga+=1)},r:function(C){var x=ye(C);gt(x),Xt(C)},c:function(){W("")},x:function(C,x,k){h.copyWithin(C,x,x+k)},w:function(C){var x=h.length;if(C>>>=0,2147483648<C)return!1;for(var k=1;4>=k;k*=2){var V=x*(1+.2/k);V=Math.min(V,C+100663296);var q=Math;V=Math.max(C,V),q=q.min.call(q,2147483648,V+(65536-V%65536)%65536);e:{try{u.grow(q-d.byteLength+65535>>>16),S();var te=1;break e}catch{}te=void 0}if(te)return!0}return!1},z:function(){return 52},u:function(){return 70},y:function(C,x,k,V){for(var q=0,te=0;te<k;te++){var ae=m[x>>2],se=m[x+4>>2];x+=8;for(var pe=0;pe<se;pe++){var ue=h[ae+pe],fe=kr[C];ue===0||ue===10?((C===1?a:s)(p(fe,0)),fe.length=0):fe.push(ue)}q+=se}return m[V>>2]=q,0}};(function(){function C(q){r.asm=q.exports,u=r.asm.E,S(),N=r.asm.J,G.unshift(r.asm.F),K--,r.monitorRunDependencies&&r.monitorRunDependencies(K),K==0&&(z!==null&&(clearInterval(z),z=null),J&&(q=J,J=null,q()))}function x(q){C(q.instance)}function k(q){return ne().then(function(te){return WebAssembly.instantiate(te,V)}).then(function(te){return te}).then(q,function(te){s("failed to asynchronously prepare wasm: "+te),W(te)})}var V={a:Tr};if(K++,r.monitorRunDependencies&&r.monitorRunDependencies(K),r.instantiateWasm)try{return r.instantiateWasm(V,C)}catch(q){s("Module.instantiateWasm callback failed with error: "+q),o(q)}return(function(){return c||typeof WebAssembly.instantiateStreaming!="function"||X(Ae)||typeof fetch!="function"?k(x):fetch(Ae,{credentials:"same-origin"}).then(function(q){return WebAssembly.instantiateStreaming(q,V).then(x,function(te){return s("wasm streaming compile failed: "+te),s("falling back to ArrayBuffer instantiation"),k(x)})})})().catch(o),{}})(),r.___wasm_call_ctors=function(){return(r.___wasm_call_ctors=r.asm.F).apply(null,arguments)};var sr=r.___getTypeName=function(){return(sr=r.___getTypeName=r.asm.G).apply(null,arguments)};r.__embind_initialize_bindings=function(){return(r.__embind_initialize_bindings=r.asm.H).apply(null,arguments)};var $t=r._malloc=function(){return($t=r._malloc=r.asm.I).apply(null,arguments)},st=r._free=function(){return(st=r._free=r.asm.K).apply(null,arguments)};r.dynCall_jiji=function(){return(r.dynCall_jiji=r.asm.L).apply(null,arguments)};var Lt;J=function C(){Lt||cr(),Lt||(J=C)};function cr(){function C(){if(!Lt&&(Lt=!0,r.calledRun=!0,!g)){if(ie(G),n(r),r.onRuntimeInitialized&&r.onRuntimeInitialized(),r.postRun)for(typeof r.postRun=="function"&&(r.postRun=[r.postRun]);r.postRun.length;){var x=r.postRun.shift();j.unshift(x)}ie(j)}}if(!(0<K)){if(r.preRun)for(typeof r.preRun=="function"&&(r.preRun=[r.preRun]);r.preRun.length;)R();ie(M),0<K||(r.setStatus?(r.setStatus("Running..."),setTimeout(function(){setTimeout(function(){r.setStatus("")},1),C()},1)):C())}}if(r.preInit)for(typeof r.preInit=="function"&&(r.preInit=[r.preInit]);0<r.preInit.length;)r.preInit.pop()();return cr(),t.ready})})(),za=qc;$();$();var er=(function(e){return e[e.Auto=0]="Auto",e[e.FlexStart=1]="FlexStart",e[e.Center=2]="Center",e[e.FlexEnd=3]="FlexEnd",e[e.Stretch=4]="Stretch",e[e.Baseline=5]="Baseline",e[e.SpaceBetween=6]="SpaceBetween",e[e.SpaceAround=7]="SpaceAround",e[e.SpaceEvenly=8]="SpaceEvenly",e})({}),Ya=(function(e){return e[e.BorderBox=0]="BorderBox",e[e.ContentBox=1]="ContentBox",e})({}),Wa=(function(e){return e[e.Width=0]="Width",e[e.Height=1]="Height",e})({}),Ao=(function(e){return e[e.Inherit=0]="Inherit",e[e.LTR=1]="LTR",e[e.RTL=2]="RTL",e})({}),CA=(function(e){return e[e.Flex=0]="Flex",e[e.None=1]="None",e[e.Contents=2]="Contents",e})({}),tr=(function(e){return e[e.Left=0]="Left",e[e.Top=1]="Top",e[e.Right=2]="Right",e[e.Bottom=3]="Bottom",e[e.Start=4]="Start",e[e.End=5]="End",e[e.Horizontal=6]="Horizontal",e[e.Vertical=7]="Vertical",e[e.All=8]="All",e})({}),en=(function(e){return e[e.None=0]="None",e[e.StretchFlexBasis=1]="StretchFlexBasis",e[e.AbsolutePositionWithoutInsetsExcludesPadding=2]="AbsolutePositionWithoutInsetsExcludesPadding",e[e.AbsolutePercentAgainstInnerSize=4]="AbsolutePercentAgainstInnerSize",e[e.All=2147483647]="All",e[e.Classic=2147483646]="Classic",e})({}),Xc=(function(e){return e[e.WebFlexBasis=0]="WebFlexBasis",e})({}),Ho=(function(e){return e[e.Column=0]="Column",e[e.ColumnReverse=1]="ColumnReverse",e[e.Row=2]="Row",e[e.RowReverse=3]="RowReverse",e})({}),QA=(function(e){return e[e.Column=0]="Column",e[e.Row=1]="Row",e[e.All=2]="All",e})({}),tn=(function(e){return e[e.FlexStart=0]="FlexStart",e[e.Center=1]="Center",e[e.FlexEnd=2]="FlexEnd",e[e.SpaceBetween=3]="SpaceBetween",e[e.SpaceAround=4]="SpaceAround",e[e.SpaceEvenly=5]="SpaceEvenly",e})({}),rn=(function(e){return e[e.Error=0]="Error",e[e.Warn=1]="Warn",e[e.Info=2]="Info",e[e.Debug=3]="Debug",e[e.Verbose=4]="Verbose",e[e.Fatal=5]="Fatal",e})({}),xA=(function(e){return e[e.Undefined=0]="Undefined",e[e.Exactly=1]="Exactly",e[e.AtMost=2]="AtMost",e})({}),qa=(function(e){return e[e.Default=0]="Default",e[e.Text=1]="Text",e})({}),wA=(function(e){return e[e.Visible=0]="Visible",e[e.Hidden=1]="Hidden",e[e.Scroll=2]="Scroll",e})({}),vA=(function(e){return e[e.Static=0]="Static",e[e.Relative=1]="Relative",e[e.Absolute=2]="Absolute",e})({}),Gt=(function(e){return e[e.Undefined=0]="Undefined",e[e.Point=1]="Point",e[e.Percent=2]="Percent",e[e.Auto=3]="Auto",e})({}),DA=(function(e){return e[e.NoWrap=0]="NoWrap",e[e.Wrap=1]="Wrap",e[e.WrapReverse=2]="WrapReverse",e})({}),Zc={ALIGN_AUTO:er.Auto,ALIGN_FLEX_START:er.FlexStart,ALIGN_CENTER:er.Center,ALIGN_FLEX_END:er.FlexEnd,ALIGN_STRETCH:er.Stretch,ALIGN_BASELINE:er.Baseline,ALIGN_SPACE_BETWEEN:er.SpaceBetween,ALIGN_SPACE_AROUND:er.SpaceAround,ALIGN_SPACE_EVENLY:er.SpaceEvenly,BOX_SIZING_BORDER_BOX:Ya.BorderBox,BOX_SIZING_CONTENT_BOX:Ya.ContentBox,DIMENSION_WIDTH:Wa.Width,DIMENSION_HEIGHT:Wa.Height,DIRECTION_INHERIT:Ao.Inherit,DIRECTION_LTR:Ao.LTR,DIRECTION_RTL:Ao.RTL,DISPLAY_FLEX:CA.Flex,DISPLAY_NONE:CA.None,DISPLAY_CONTENTS:CA.Contents,EDGE_LEFT:tr.Left,EDGE_TOP:tr.Top,EDGE_RIGHT:tr.Right,EDGE_BOTTOM:tr.Bottom,EDGE_START:tr.Start,EDGE_END:tr.End,EDGE_HORIZONTAL:tr.Horizontal,EDGE_VERTICAL:tr.Vertical,EDGE_ALL:tr.All,ERRATA_NONE:en.None,ERRATA_STRETCH_FLEX_BASIS:en.StretchFlexBasis,ERRATA_ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING:en.AbsolutePositionWithoutInsetsExcludesPadding,ERRATA_ABSOLUTE_PERCENT_AGAINST_INNER_SIZE:en.AbsolutePercentAgainstInnerSize,ERRATA_ALL:en.All,ERRATA_CLASSIC:en.Classic,EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS:Xc.WebFlexBasis,FLEX_DIRECTION_COLUMN:Ho.Column,FLEX_DIRECTION_COLUMN_REVERSE:Ho.ColumnReverse,FLEX_DIRECTION_ROW:Ho.Row,FLEX_DIRECTION_ROW_REVERSE:Ho.RowReverse,GUTTER_COLUMN:QA.Column,GUTTER_ROW:QA.Row,GUTTER_ALL:QA.All,JUSTIFY_FLEX_START:tn.FlexStart,JUSTIFY_CENTER:tn.Center,JUSTIFY_FLEX_END:tn.FlexEnd,JUSTIFY_SPACE_BETWEEN:tn.SpaceBetween,JUSTIFY_SPACE_AROUND:tn.SpaceAround,JUSTIFY_SPACE_EVENLY:tn.SpaceEvenly,LOG_LEVEL_ERROR:rn.Error,LOG_LEVEL_WARN:rn.Warn,LOG_LEVEL_INFO:rn.Info,LOG_LEVEL_DEBUG:rn.Debug,LOG_LEVEL_VERBOSE:rn.Verbose,LOG_LEVEL_FATAL:rn.Fatal,MEASURE_MODE_UNDEFINED:xA.Undefined,MEASURE_MODE_EXACTLY:xA.Exactly,MEASURE_MODE_AT_MOST:xA.AtMost,NODE_TYPE_DEFAULT:qa.Default,NODE_TYPE_TEXT:qa.Text,OVERFLOW_VISIBLE:wA.Visible,OVERFLOW_HIDDEN:wA.Hidden,OVERFLOW_SCROLL:wA.Scroll,POSITION_TYPE_STATIC:vA.Static,POSITION_TYPE_RELATIVE:vA.Relative,POSITION_TYPE_ABSOLUTE:vA.Absolute,UNIT_UNDEFINED:Gt.Undefined,UNIT_POINT:Gt.Point,UNIT_PERCENT:Gt.Percent,UNIT_AUTO:Gt.Auto,WRAP_NO_WRAP:DA.NoWrap,WRAP_WRAP:DA.Wrap,WRAP_WRAP_REVERSE:DA.WrapReverse},Xa=Zc;function _A(e){function t(o,A,i){let a=o[A];o[A]=function(){for(var s=arguments.length,c=new Array(s),l=0;l<s;l++)c[l]=arguments[l];return i.call(this,a,...c)}}for(let o of["setPosition","setMargin","setFlexBasis","setWidth","setHeight","setMinWidth","setMinHeight","setMaxWidth","setMaxHeight","setPadding","setGap"]){let A={[Gt.Point]:e.Node.prototype[o],[Gt.Percent]:e.Node.prototype[`${o}Percent`],[Gt.Auto]:e.Node.prototype[`${o}Auto`]};t(e.Node.prototype,o,function(i){for(var a=arguments.length,s=new Array(a>1?a-1:0),c=1;c<a;c++)s[c-1]=arguments[c];let l=s.pop(),u,g;if(l==="auto")u=Gt.Auto,g=void 0;else if(typeof l=="object")u=l.unit,g=l.valueOf();else if(u=typeof l=="string"&&l.endsWith("%")?Gt.Percent:Gt.Point,g=parseFloat(l),l!==void 0&&!Number.isNaN(l)&&Number.isNaN(g))throw new Error(`Invalid value ${l} for ${o}`);if(!A[u])throw new Error(`Failed to execute "${o}": Unsupported unit '${l}'`);return g!==void 0?A[u].call(this,...s,g):A[u].call(this,...s)})}function r(o){return e.MeasureCallback.implement({measure:function(){let{width:A,height:i}=o(...arguments);return{width:A??NaN,height:i??NaN}}})}t(e.Node.prototype,"setMeasureFunc",function(o,A){return A?o.call(this,r(A)):this.unsetMeasureFunc()});function n(o){return e.DirtiedCallback.implement({dirtied:o})}return t(e.Node.prototype,"setDirtiedFunc",function(o,A){o.call(this,n(A))}),t(e.Config.prototype,"free",function(){e.Config.destroy(this)}),t(e.Node,"create",(o,A)=>A?e.Node.createWithConfig(A):e.Node.createDefault()),t(e.Node.prototype,"free",function(){e.Node.destroy(this)}),t(e.Node.prototype,"freeRecursive",function(){for(let o=0,A=this.getChildCount();o<A;++o)this.getChild(0).freeRecursive();this.free()}),t(e.Node.prototype,"calculateLayout",function(o){let A=arguments.length>1&&arguments[1]!==void 0?arguments[1]:NaN,i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:NaN,a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:Ao.LTR;return o.call(this,A,i,a)}),{Config:e.Config,Node:e.Node,...Xa}}async function Za(){return _A(await za())}var jo=null;async function $c(){return jo||(jo=await Za(),jo)}function el(e,t){switch(t){case"center":return e.JUSTIFY_CENTER;case"end":return e.JUSTIFY_FLEX_END;case"space-between":return e.JUSTIFY_SPACE_BETWEEN;case"space-around":return e.JUSTIFY_SPACE_AROUND;default:return e.JUSTIFY_FLEX_START}}function tl(e,t){switch(t){case"center":return e.ALIGN_CENTER;case"end":return e.ALIGN_FLEX_END;case"stretch":return e.ALIGN_STRETCH;default:return e.ALIGN_FLEX_START}}function rl(e,t){switch(t){case"start":return e.ALIGN_FLEX_START;case"center":return e.ALIGN_CENTER;case"end":return e.ALIGN_FLEX_END;case"stretch":return e.ALIGN_STRETCH;case"baseline":return e.ALIGN_BASELINE;default:return e.ALIGN_AUTO}}function Kr(e){if(e!=null){if(typeof e=="number"||typeof e=="string")return e;if(typeof e=="object"){if("unit"in e&&typeof e.unit=="number")return e;let t=Number(e);if(!Number.isNaN(t))return t}}}function nl(e){switch(e.kind){case"flex":return e.dir??"row";case"block":return"column";case"box":return e.children&&e.children.length>0?"column":null;default:return null}}function ol(e){if(e.kind==="block")return"fill"}function Al(e){let t=0;if(e.kind==="flex"||e.kind==="block"){let i=Kr(e.gap);t=typeof i=="number"?i:0}let r=0;if(e.kind==="flex"||e.kind==="block"||e.kind==="box"||e.kind==="text"){let i=Kr(e.padding);r=typeof i=="number"?i:0}let n="start";e.kind==="flex"&&(n=e.justify??"start");let o="start";(e.kind==="flex"||e.kind==="block")&&(o=e.align??"start");let A=!1;return e.kind==="flex"&&(A=typeof e.wrap=="boolean"?e.wrap:!1),{gap:t,padding:r,justify:n,align:o,wrap:A}}function io(e){let t=e;return t.position==="absolute"||t.position===void 0&&(t.x!==void 0||t.y!==void 0)}function il(e){return"children"in e&&e.children?e.children.filter(t=>!io(t)):[]}function al(e){return"children"in e&&e.children?e.children.filter(t=>io(t)):[]}function es(e,t,r,n,o){let A=t,i=e.Node.create(),a=nl(A),s=a!==null,c=[];if(io(A)){i.setPositionType(e.POSITION_TYPE_ABSOLUTE);let I=Kr(A.x),b=Kr(A.y);I!==void 0&&i.setPosition(e.EDGE_LEFT,I),b!==void 0&&i.setPosition(e.EDGE_TOP,b)}else i.setPositionType(e.POSITION_TYPE_RELATIVE);let u=Kr(A.grow);u!==void 0&&i.setFlexGrow(typeof u=="number"?u:parseFloat(u));let g=Kr(A.flexShrink);g!==void 0?i.setFlexShrink(typeof g=="number"?g:parseFloat(g)):i.setFlexShrink(o!==null?1:0),A.flexBasis!==void 0&&i.setFlexBasis(A.flexBasis),A.alignSelf!==void 0&&i.setAlignSelf(rl(e,A.alignSelf));let p=A.width??ol(A),d=A.height,f=o==="row",h=o==="column";if($a(i,"width",p,r?.width,f),$a(i,"height",d,r?.height,h),s){let I=Al(A);i.setFlexDirection(a==="row"?e.FLEX_DIRECTION_ROW:e.FLEX_DIRECTION_COLUMN),i.setJustifyContent(el(e,I.justify)),i.setAlignItems(tl(e,I.align)),i.setFlexWrap(I.wrap?e.WRAP_WRAP:e.WRAP_NO_WRAP),I.padding>0&&i.setPadding(e.EDGE_ALL,I.padding),I.gap>0&&i.setGap(e.GUTTER_ALL,I.gap);let b=il(A),D=al(A),m=[...b,...D];for(let Q=0;Q<m.length;Q++){let w=es(e,m[Q],void 0,n,io(A)?null:a);i.insertChild(w.yogaNode,Q),c.push(w)}}else if(A.kind==="text"||A.kind==="media"&&A.dataType==="Caption")i.setMeasureFunc((I,b,D,m)=>{let Q;(b===1||b===2)&&(Q=I);let w=n?.(A,Q)??{width:0,height:0},S=w.width,N=w.height;return b===1&&(S=I),m===1&&(N=D),{width:S,height:N}});else{let I=n?.(A)??null;if(I){let b=A.aspectRatio!==void 0,D=A.kind==="media"&&A.dataType==="Caption",m=I.height>0?I.width/I.height:1;A.kind==="media"&&!D&&!b&&i.setAspectRatio(m);let Q=p===void 0||p==="auto"||p==="fit",w=d===void 0||d==="auto"||d==="fit";if(Q&&w){let S=A.aspectRatio??(A.kind==="media"?m:void 0)??1;i.setMeasureFunc((N,M,G,j)=>{let R=I.width,K=I.height;if(M===1&&j===1)R=N,K=G;else if(M===1)R=N,K=S>0?Math.round(N/S):I.height;else if(j===1)K=G,R=S>0?Math.round(G*S):I.width;else if(M===2&&j===2){let z=Math.min(1,N/I.width,G/I.height);R=Math.round(I.width*z),K=Math.round(I.height*z)}else M===2?I.width>N&&(R=N,K=S>0?Math.round(N/S):I.height):j===2&&I.height>G&&(K=G,R=S>0?Math.round(G*S):I.width);return{width:R,height:K}})}else if(Q){let S=A.aspectRatio??(A.kind==="media"?m:void 0);(S===void 0||S<=0)&&i.setWidth(I.width)}else if(w){let S=A.aspectRatio??(A.kind==="media"?m:void 0);(S===void 0||S<=0)&&i.setHeight(I.height)}}}return{yogaNode:i,layoutNode:A,children:c}}function $a(e,t,r,n,o){if(r===void 0||r==="auto"||r==="fit")return;let A=Kr(r);if(typeof A=="number"){t==="width"?e.setWidth(A):e.setHeight(A);return}if(A==="fill"){if(o){e.getFlexGrow()===0&&e.setFlexGrow(1),e.setFlexBasis(0);return}n!==void 0?t==="width"?e.setWidth(n):e.setHeight(n):t==="width"?e.setWidthPercent(100):e.setHeightPercent(100)}}function ts(e,t,r,n,o){let A=e.yogaNode.getComputedLayout(),i=t+A.left,a=r+A.top,s=A.width,c=A.height,l=e.layoutNode;io(l)||(i+=Number(l.x??0),a+=Number(l.y??0)),n[e.layoutNode.id]={x:Math.round(i*1e3)/1e3,y:Math.round(a*1e3)/1e3,width:Math.round(s*1e3)/1e3,height:Math.round(c*1e3)/1e3},o[e.layoutNode.id]={width:Math.round(s*1e3)/1e3,height:Math.round(c*1e3)/1e3};for(let u of e.children)ts(u,i,a,n,o)}function rs(e){for(let t of e.children)rs(t);e.yogaNode.free()}function sl(e,t){let{layout:r,viewport:n,measure:o}=t,A={},i={};for(let a of r){let s=e.Node.create();s.setWidth(n.width),s.setHeight(n.height),s.setFlexDirection(e.FLEX_DIRECTION_COLUMN);let c=es(e,a,{width:n.width,height:n.height},o,null);s.insertChild(c.yogaNode,0),s.calculateLayout(n.width,n.height);let l=c.yogaNode.getComputedLayout(),u=a.position==="absolute"||a.position===void 0&&(a.x!==void 0||a.y!==void 0),g=u?l.left:Number(a.x??0),p=u?l.top:Number(a.y??0);A[a.id]={x:Math.round(g*1e3)/1e3,y:Math.round(p*1e3)/1e3,width:Math.round(l.width*1e3)/1e3,height:Math.round(l.height*1e3)/1e3},i[a.id]={width:Math.round(l.width*1e3)/1e3,height:Math.round(l.height*1e3)/1e3};for(let d of c.children)ts(d,g,p,A,i);rs(c),s.free()}return{rects:A,sizes:i}}async function tf(e){let t=await $c();return sl(t,e)}$();$();var cl=/-?(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?/gi,ll=/([MmLlHhVvCcSsQqTtAaZz])([^MmLlHhVvCcSsQqTtAaZz]*)/g;function ns(e){let t=[],r=[],n=0,o=0,A=0,i=0,a=0,s=0,c="",l=u=>{r.length>1&&t.push({pts:r,closed:u}),r=[]};for(let u of e.matchAll(ll)){let g=u[1],p=(u[2].match(cl)??[]).map(Number),d=g===g.toLowerCase(),f=g.toUpperCase(),h=0,I=m=>{let Q=p.slice(h,h+m);return h+=m,Q},b=m=>h+m<=p.length;if(f==="Z"){n=A,o=i,l(!0),r=[[n,o]],c=f;continue}let D=!0;for(;b(f==="H"||f==="V"?1:f==="A"?7:f==="C"?6:f==="S"||f==="Q"?4:2);){if(f==="M"){let[m,Q]=I(2);n=d?n+m:m,o=d?o+Q:Q,D?(l(!1),A=n,i=o,r=[[n,o]]):r.push([n,o])}else if(f==="L"||f==="T"){let[m,Q]=I(2),w=d?n+m:m,S=d?o+Q:Q;if(f==="T"){let N=c==="Q"||c==="T"?2*n-a:n,M=c==="Q"||c==="T"?2*o-s:o;os(r,n,o,N,M,w,S),a=N,s=M}else r.push([w,S]);n=w,o=S}else if(f==="H"){let[m]=I(1);n=d?n+m:m,r.push([n,o])}else if(f==="V"){let[m]=I(1);o=d?o+m:m,r.push([n,o])}else if(f==="C"||f==="S"){let m,Q;if(f==="C"){let[z,J]=I(2);m=d?n+z:z,Q=d?o+J:J}else m=c==="C"||c==="S"?2*n-a:n,Q=c==="C"||c==="S"?2*o-s:o;let[w,S,N,M]=I(4),G=d?n+w:w,j=d?o+S:S,R=d?n+N:N,K=d?o+M:M;for(let z=1;z<=16;z++){let J=z/16,W=1-J;r.push([W*W*W*n+3*W*W*J*m+3*W*J*J*G+J*J*J*R,W*W*W*o+3*W*W*J*Q+3*W*J*J*j+J*J*J*K])}a=G,s=j,n=R,o=K}else if(f==="Q"){let[m,Q,w,S]=I(4),N=d?n+m:m,M=d?o+Q:Q,G=d?n+w:w,j=d?o+S:S;os(r,n,o,N,M,G,j),a=N,s=M,n=G,o=j}else if(f==="A"){let[m,Q,w,S,N,M,G]=I(7),j=d?n+M:M,R=d?o+G:G;ul(r,n,o,m,Q,w,S!==0,N!==0,j,R),n=j,o=R}D=!1,c=f,f==="M"&&(c="L")}c=f}return l(!1),t}function os(e,t,r,n,o,A,i){for(let a=1;a<=16;a++){let s=a/16,c=1-s;e.push([c*c*t+2*c*s*n+s*s*A,c*c*r+2*c*s*o+s*s*i])}}function ul(e,t,r,n,o,A,i,a,s,c){let l=Math.abs(n),u=Math.abs(o);if(l===0||u===0){e.push([s,c]);return}let g=A*Math.PI/180,p=Math.cos(g),d=Math.sin(g),f=(t-s)/2,h=(r-c)/2,I=p*f+d*h,b=-d*f+p*h,D=I*I/(l*l)+b*b/(u*u);D>1&&(l*=Math.sqrt(D),u*=Math.sqrt(D));let m=l*l*u*u-l*l*b*b-u*u*I*I,Q=l*l*b*b+u*u*I*I,w=Math.sqrt(Math.max(0,m/Q));i===a&&(w=-w);let S=w*l*b/u,N=-w*u*I/l,M=p*S-d*N+(t+s)/2,G=d*S+p*N+(r+c)/2,j=(J,W,X,Ae)=>Math.atan2(J*Ae-W*X,J*X+W*Ae),R=j(1,0,(I-S)/l,(b-N)/u),K=j((I-S)/l,(b-N)/u,(-I-S)/l,(-b-N)/u);!a&&K>0&&(K-=2*Math.PI),a&&K<0&&(K+=2*Math.PI);let z=Math.max(4,Math.ceil(Math.abs(K)/(Math.PI/2)*16));for(let J=1;J<=z;J++){let W=R+K*J/z,X=l*Math.cos(W),Ae=u*Math.sin(W);e.push([p*X-d*Ae+M,d*X+p*Ae+G])}}function As(e,t){let r=e.closed?[...e.pts,e.pts[0]]:e.pts,n=[0];for(let s=1;s<r.length;s++)n.push(n[s-1]+Math.hypot(r[s][0]-r[s-1][0],r[s][1]-r[s-1][1]));let o=n[n.length-1],A=[];if(o<=0){for(let s=0;s<t;s++)A.push([r[0][0],r[0][1]]);return A}let i=e.closed?t:t-1,a=0;for(let s=0;s<t;s++){let c=o*s/i;for(;a<n.length-2&&n[a+1]<c;)a++;let l=n[a+1]-n[a],u=l>0?(c-n[a])/l:0;A.push([r[a][0]+(r[a+1][0]-r[a][0])*u,r[a][1]+(r[a+1][1]-r[a][1])*u])}return A}function is(e){let t=0;for(let r=0;r<e.length;r++){let n=e[(r+1)%e.length];t+=e[r][0]*n[1]-n[0]*e[r][1]}return t/2}function as(e){let t=0,r=0;for(let n of e)t+=n[0],r+=n[1];return[t/e.length,r/e.length]}function gl(e,t,r){if(!r){let s=Math.hypot(e[0][0]-t[0][0],e[0][1]-t[0][1]);return Math.hypot(e[0][0]-t[t.length-1][0],e[0][1]-t[t.length-1][1])<s?[...t].reverse():t}let n=Math.sign(is(e))!==Math.sign(is(t))?[...t].reverse():t,o=e.length,A=0,i=Number.POSITIVE_INFINITY,a=s=>{let c=0;for(let l=0;l<o;l+=2){let u=n[(l+s)%o];c+=(e[l][0]-u[0])**2+(e[l][1]-u[1])**2}return c};for(let s=0;s<o;s+=4){let c=a(s);c<i&&(i=c,A=s)}for(let s=A-3;s<=A+3;s++){let c=(s+o)%o,l=a(c);l<i&&(i=l,A=c)}return e.map((s,c)=>n[(c+A)%o])}var Vo=new Map;function pl(e,t){let r=`${e}\0${t}`,n=Vo.get(r);if(n)return n;let o=ns(e),A=ns(t),i=Math.max(o.length,A.length),a={a:[],b:[],closed:[]};for(let s=0;s<i;s++){let c=o[s],l=A[s],u=(c?.closed??!0)&&(l?.closed??!0),g=c?As(c,128):void 0,p=l?As(l,128):void 0;if(!g&&p){let d=as(p);g=p.map(()=>[d[0],d[1]])}if(!p&&g){let d=as(g);p=g.map(()=>[d[0],d[1]])}!g||!p||(a.a.push(g),a.b.push(gl(g,p,u)),a.closed.push(u))}return Vo.size>256&&Vo.clear(),Vo.set(r,a),a}var ss=e=>(Math.round(e*100)/100).toString();function cs(e,t,r){if(r<=0)return e;if(r===1)return t;let n=pl(e,t),o=[];for(let A=0;A<n.a.length;A++){let i=n.a[A],a=n.b[A],s="";for(let c=0;c<i.length;c++){let l=i[c][0]+(a[c][0]-i[c][0])*r,u=i[c][1]+(a[c][1]-i[c][1])*r;s+=`${c===0?"M":"L"}${ss(l)} ${ss(u)}`}o.push(n.closed[A]?`${s}Z`:s)}return o.join("")}function ls(e,t){let r=Math.floor(e)^t*1013|0;return r=Math.imul(r^r>>>15,r|1),r^=r+Math.imul(r^r>>>7,r|61),((r^r>>>14)>>>0)/4294967295*2-1}function dl(e,t){let r=Math.floor(e),n=r+1,o=e-r,A=o*o*(3-2*o),i=ls(r,t),a=ls(n,t),s=i*o,c=a*(o-1);return(s*(1-A)+c*A)*2}function fl(e,t,r=0){let n=e.frequency??2,o=e.amplitude??50,A=Math.max(1,Math.min(4,e.octaves??1)),i=e.seed??1234,a=0,s=0,c=1,l=n;for(let g=0;g<A;g++){let p=dl(t*l,i+g*7919);a+=p*c,s+=c,c*=.5,l*=2}let u=s>0?a/s:0;return r+u*o}function hl(e,t,r,n){if(t<=0)return r;let o=Math.max(.001,e.mass??1),A=Math.max(.001,e.stiffness??180),i=Math.max(.001,e.damping??12),a=Math.sqrt(A/o),s=i/(2*Math.sqrt(A*o)),c=1;if(s<1){let l=a*Math.sqrt(1-s*s),u=-1,g=-s*a/l;c=1+Math.exp(-s*a*t)*(u*Math.cos(l*t)+g*Math.sin(l*t))}else if(Math.abs(s-1)<1e-4)c=1+Math.exp(-a*t)*(-1-a*t);else{let l=Math.sqrt(s*s-1),u=-a*(s-l),g=-a*(s+l),p=-1/(1-u/g),d=-1-p;c=1+p*Math.exp(u*t)+d*Math.exp(g*t)}return r+(n-r)*c}function ft(e,t,r){if(e==null)return 0;if(typeof e=="number")return e;if(typeof e=="function")return Number(e(t,r))||0;if(Array.isArray(e)||ArrayBuffer.isView(e)){let n=e;if(n.length===0)return 0;let o=Math.max(0,Math.min(n.length-1,Math.round(t)));return Number(n[o])||0}if(typeof e=="object"){let n=e;if(typeof n.get=="function")return Number(n.get({frame:t,fps:r,time:r>0?t/r:0}))||0;if(n.type==="Signal"&&n.data)return ft(n.data,t,r);let o=n.samples??(typeof n.channel=="string"&&n[n.channel]!==void 0?n[n.channel]:void 0);if(Array.isArray(o)||ArrayBuffer.isView(o)){let A=o;if(A.length===0)return 0;let i=Number(n.fps)||24,a=r>0?r:24,s=t/a,c=Math.max(0,Math.min(A.length-1,Math.round(s*i)));return Number(A[c])||0}if(n.type==="audio_extractor"||n.extractionMode!==void 0){let A=n.nodeId;if(A){let i=n.channel??"primary",a=Fi.getChannelSamples(A,i);if(a&&a.length>0){let s=Number(n.fps)||24,c=r>0?r:24,l=t/c,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 A=typeof n.amplitude=="number"?n.amplitude:1,i=typeof n.frequency=="number"?n.frequency:1;if(n.syncToBpm&&typeof n.bpm=="number"&&n.bpm>0){let I=typeof n.bars=="number"&&n.bars>0?n.bars:1;i=n.bpm/60/I}let a=typeof n.phase=="number"?n.phase:0,s=typeof n.offset=="number"?n.offset:0,c=t/(r>0?r:24),l=n.baseType??"sine",u=!!n.fmEnabled,g=c;if(u){let I=Number(n.fmAmplitude)||1,b=Number(n.fmFrequency)||.5;g=c+Math.sin(c*b*Math.PI*2)*I}let p=0,d=(g*i+a/(Math.PI*2))%1,f=d<0?d+1:d,h=I=>(I%1+1)%1;switch(l){case"triangle":p=4*Math.abs(f-.5)-1;break;case"sawtooth":p=2*f-1;break;case"square":p=f<.5?1:-1;break;case"constant":p=1;break;case"noise_smooth":{let I=g*i+a,b=Math.floor(I),D=I-b,m=D*D*(3-2*D),Q=h(Math.sin(b*12.9898)*43758.5453),w=h(Math.sin((b+1)*12.9898)*43758.5453);p=(Q*(1-m)+w*m)*2-1;break}case"noise_white":p=h(Math.sin(g*12.9898+a)*43758.5453)*2-1;break;case"pulse":{let I=a===0?.5:Math.max(.01,Math.min(.99,a));p=h(g*i)<I?1:-1;break}case"bounce":p=Math.abs(Math.sin(g*i*Math.PI+a));break;case"staircase":p=Math.floor(f*8)/7*2-1;break;default:p=Math.sin(g*i*Math.PI*2+a);break}return p*A+s}if(n.type==="gate"){let A=n.sourceSignal??n.signal,i=typeof n.threshold=="number"?n.threshold:.5,a=n.mode??"gate",s=!!n.invert,c=typeof n.debounceMs=="number"?n.debounceMs:0,l=Math.max(1,Math.round(c/1e3*r)),u=Math.max(1,Number(n.holdFrames)||4),g=0;if(a==="gate")g=ft(A,t,r)>=i?1:0;else if(a==="trigger"){let p=-1/0,d=Math.max(0,t-300);for(let f=d;f<=t;f++){let h=ft(A,f,r),I=f>0?ft(A,f-1,r):0;h>=i&&I<i&&f-p>=l&&(p=f)}g=t>=p&&t<p+u?1:0}else if(a==="toggle"){let p=0,d=-1/0;for(let f=0;f<=t;f++){let h=ft(A,f,r),I=f>0?ft(A,f-1,r):0;h>=i&&I<i&&f-d>=l&&(p++,d=f)}g=p%2===1?1:0}return s?1-g:g}if(n.type==="signal_math"){let A=ft(n.signalA,t,r),a=n.signalB!==void 0?ft(n.signalB,t,r):Number(n.bValue)||0;switch(n.operation){case"add":return A+a;case"subtract":return A-a;case"multiply":return A*a;case"divide":return a!==0?A/a:0;case"min":return Math.min(A,a);case"max":return Math.max(A,a);case"clamp":{let s=Number(n.clampMin)||0,c=Number(n.clampMax)||1;return Math.max(s,Math.min(c,A))}case"abs":return Math.abs(A);case"negate":return-A;case"invert":return 1-A;case"power":return A**(Number(n.exponent)||2);case"modulo":return a!==0?A%a:0;case"remap":{let s=Number(n.inMin)||0,c=Number(n.inMax)||1,l=Number(n.outMin)||0,u=Number(n.outMax)||1,g=c-s,p=g!==0?(A-s)/g:0;return l+p*(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,(A-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,(A-s)/l)):0;return u*u*(3-2*u)}case"custom":return A;default:return A}}if(typeof n.value=="number")return n.value}return 0}function ml(e,t,r,n=.15,o=2){if(t<0||!e)return 0;let A=e,i=0,a=-1/0;for(let s=0;s<=t;s++){let c=ft(A,s,r),l=s>0?ft(A,s-1,r):0;c>=n&&l<n&&s-a>=o&&(i++,a=s)}return i}function Il(e,t,r,n={}){let o=n[e.inputHandleId];if(o===void 0&&n){let g=Object.keys(n);if(g.length===1)o=n[g[0]];else if(g.length>1){let p=g.find(d=>d===e.inputHandleId);o=p?n[p]:n[g[0]]}}if(e.channel&&o&&typeof o=="object"){let g=o[e.channel];g!==void 0?o=g:typeof o.get!="function"&&(o={...o,channel:e.channel})}if(e.signalMode==="accumulate"){let g=e.threshold??e.accumulateThreshold??.15,p=e.debounceFrames??2,d=ml(o,t,r,g,p),f=e.multiplier??1,h=e.offset??0;return d*f+h}let A=e.multiplier??1,i=e.offset??0,a=Math.max(0,Math.round(e.smoothingWindowFrames??0));if(a<=1)return ft(o,t,r)*A+i;let s=0,c=0,l=Math.max(0,t-a+1);for(let g=l;g<=t;g++)s+=ft(o,g,r),c++;return(c>0?s/c:0)*A+i}function Bl(e,t,r){return e+(t-e)*r}function bl(e){let t=e.trim().replace("#","");if(t.length===3&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]),t.length===6){let r=parseInt(t,16);return[r>>16&255,r>>8&255,r&255,1]}if(t.length===8){let r=parseInt(t,16);return[r>>24&255,r>>16&255,r>>8&255,(r&255)/255]}return[255,255,255,1]}function us(e,t,r){return Gi(e,t,r)}function MA(e,t,r){let n=r;return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+(t-e)*6*n:n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function El(e,t){let[r,n,o,A]=bl(e),i=r/255,a=n/255,s=o/255,c=Math.max(i,a,s),l=Math.min(i,a,s),u=0,g=0,p=(c+l)/2;if(c!==l){let b=c-l;switch(g=p>.5?b/(2-c-l):b/(c+l),c){case i:u=(a-s)/b+(a<s?6:0);break;case a:u=(s-i)/b+2;break;case s:u=(i-a)/b+4;break}u/=6}u=(u+t%1+1)%1;let d=p,f=p,h=p;if(g!==0){let b=p<.5?p*(1+g):p+g-p*g,D=2*p-b;d=MA(D,b,u+1/3),f=MA(D,b,u),h=MA(D,b,u-1/3)}let I=b=>Math.round(Math.max(0,Math.min(255,b*255))).toString(16).padStart(2,"0");return A>=.999?`#${I(d)}${I(f)}${I(h)}`:`rgba(${Math.round(d*255)}, ${Math.round(f*255)}, ${Math.round(h*255)}, ${Math.round(A*100)/100})`}var yl=new Set(["fill","fillColor","strokeColor","textBackgroundColor","color"]);function Cl(e,t,r,n){let o=e.repeat??0,A=n-r,i=e.durationFrames!==void 0&&e.durationFrames>0?e.durationFrames:A;if(o===0||i<=0){if(t>=n){let g=e.keyframes??[];return{completedValue:g[g.length-1].value}}return{frame:t}}let a=t-r,s=Math.floor(a/i);if(o>0&&s>=1+o){let g=!!e.yoyo&&o%2===1,p=e.keyframes??[];return{completedValue:g?p[0].value:p[p.length-1].value}}let c=a-s*i;return!!e.yoyo&&s%2===1?{frame:c>=A?r:n-c}:{frame:c>=A?n:r+c}}function SA(e,t,r){let n=e.keyframes??[];if(n.length===0)return 0;if(n.length===1)return n[0].value;let o=n[0].frame;if(t<=o)return n[0].value;let A=n[n.length-1].frame,i=Cl(e,t,o,A);if("completedValue"in i)return i.completedValue;let a=i.frame;for(let s=0;s<n.length-1;s++){let c=n[s],l=n[s+1];if(a>=c.frame&&a<=l.frame){let u=l.frame-c.frame,g=u>0?(a-c.frame)/u:0,p=r?r(l.ease??c.ease,u,g):g;if(typeof c.value=="boolean")return g>=1?l.value:c.value;if(typeof c.value=="string"&&typeof l.value=="string")return e.prop==="d"?cs(c.value,l.value,p):us(c.value,l.value,p);let d=Number(c.value)||0,f=Number(l.value)||0;return Bl(d,f,p)}}return n[n.length-1].value}function Ql(e,t,r=24,n={}){let o=n.startFrame??0,A=t-o,i=e.source??{type:"keyframe"},a=n.baseValues?.[e.prop];switch(i.type){case"keyframe":return SA(e,A);case"wiggle":{let s=typeof a=="number"?a:0,c=e.keyframes&&e.keyframes.length>0?Number(SA(e,A))||0:s,l=A/(r>0?r:24);return fl(i,l,c)}case"springOvershoot":{let s=0,c=1;e.keyframes&&e.keyframes.length>=2?(s=Number(e.keyframes[0].value)||0,c=Number(e.keyframes[1].value)||1):e.keyframes&&e.keyframes.length===1?(s=Number(a)||0,c=Number(e.keyframes[0].value)||0):typeof a=="number"&&(s=a,c=a);let l=A/(r>0?r:24);return hl(i,l,s,c)}case"signal":{let s=i.clock==="layer"?A:t,c=Il(i,s,r,n.signals);if(yl.has(e.prop)){let l=i,u=l.colorA??"#ffffff",g=l.colorB??"#ffffff",p=l.colorMode??"interpolate";if(p==="threshold"){let f=l.colorThreshold??.5;return c>=f?g:u}if(p==="hueRotate")return El(u,c);let d=Math.max(0,Math.min(1,c));return us(u,g,d)}return c}default:return SA(e,A)}}function lf(e,t,r=24,n={}){let o={};if(!e?.tracks)return o;for(let A of e.tracks)o[A.prop]=Ql(A,t,r,n);return o}$();var gs=["x","y","width","height"];function ps(e,t,r,n){let o=t.id??`${String(e.id)}__${r}`,A={position:"absolute",...t,id:o,...n};if(gs.every(a=>t[a]===void 0))for(let a of gs)typeof e[a]=="number"&&(A[a]=e[a]);let i=typeof e.startFrame=="number"?e.startFrame:0;return A.startFrame=i+(typeof t.startFrame=="number"?t.startFrame:0),t.durationFrames===void 0&&e.durationFrames!==void 0&&(A.durationFrames=e.durationFrames),Array.isArray(A.children)&&(A.children=Jo(A.children)),A}function xl(e){let t=e.matte,r=e.relief,{matte:n,relief:o,...A}=e,i={...A};Array.isArray(i.children)&&(i.children=Jo(i.children));let a=[i];if(t?.node){let s=ps(e,t.node,"matte",{matteOf:String(e.id),matteMode:t.mode??"alpha"});i.matteId=s.id,a.push(s)}if(r?.node){let s=ps(e,r.node,"relief",{reliefOf:String(e.id),is3D:!1,z:0});i.reliefId=s.id,i.reliefAmount=r.amount??0,a.push(s)}return a}function Jo(e){return e.flatMap(t=>xl(t))}$();function PA(e,t,r,n="forward"){if(r<=0||t<=1)return 0;switch(n){case"reverse":return(t-1-e)*r;case"center-out":{let o=(t-1)/2,A=Math.abs(e-o);return Math.round(A*r)}case"forward":return e*r;default:return Si(n)}}function hf(e,t,r="forward",n=0){return!e||e.length===0?[]:t<=0&&n===0?[...e]:e.map((o,A)=>{let i=PA(A,e.length,t,r),a=o.startFrame??0;return{...o,startFrame:a+i+n}})}$();$();var fs=Symbol.for("framefields.inlineSignal"),ds=new WeakMap,wl=0;function vl(e){let t=ds.get(e);return t===void 0&&(t=`inline_signal_${wl++}`,ds.set(e,t)),t}function Bf(e){if(typeof e=="string")return{handleId:e};if(e===null||typeof e!="object"&&typeof e!="function")throw new TypeError(`LayerAnimation.signal: expected a signal object or a signal name, got ${String(e)}. Pass a signal (Signal.fromArray / Signal.builder / an audio channel \u2026) or register it with comp.addSignal(name, signal) and pass the name.`);let t=e;return typeof t.inputHandleId=="string"?{handleId:t.inputHandleId}:typeof t.gpuBinding?.nodeId=="string"?typeof t.get=="function"?{handleId:t.gpuBinding.nodeId,inline:e}:{handleId:t.gpuBinding.nodeId}:{handleId:vl(e),inline:e}}function bf(e,t){Object.defineProperty(e,fs,{value:t,enumerable:!1,configurable:!0,writable:!0})}function Dl(e){if(!(!e||typeof e!="object"))return e[fs]}function GA(e,t={}){for(let r of e){if(!r||typeof r!="object")continue;let{animation:n,children:o}=r,A=n?.tracks;if(Array.isArray(A))for(let i of A){let a=i?.source,s=Dl(a);s&&typeof a?.inputHandleId=="string"&&(t[a.inputHandleId]=s)}Array.isArray(o)&&GA(o,t)}return t}$();function _l(e,t){let{fps:r,compositionDurationFrames:n}=t;if(!Number.isInteger(n)||n<=0)throw new Error("A signal timeRemap needs the composition duration (durationFrames or durationMs)");let o=typeof e.signal=="string"?t.signals?.[e.signal]:e.signal;if(o===void 0)throw new Error(`timeRemap signal '${String(e.signal)}' is not a composition signal`);return Qi(o)?A=>Number(o.get(wi(A,r,n))):A=>ft(o,A,r)}function hs(e,t,r){let n=_l(e,r);return{kind:"sampled",history:xi({mode:e.mode,fps:r.fps,startFrame:t.startFrame,durationFrames:t.durationFrames,sourceStartSec:e.sourceStartSec,sample:n})}}function ms(e){if(e.kind!=="box"&&e.kind!=="flex"&&e.kind!=="block"||typeof e.width!="number"||typeof e.height!="number"||!Array.isArray(e.children))return!1;let t=e.children;return t.some(r=>r.kind==="camera")&&t.some(r=>r.kind!=="camera"&&r.kind!=="light")}function Is(e,t,r,n=0,o,A,i){if(e.kind==="media"&&e.timeRemap!==void 0){let m=vi.safeParse(e.timeRemap);if(!m.success)throw new Error(`Invalid timeRemap on '${e.id}': ${m.error.message}`);let Q=Di(m.data,e.durationFrames??0);if(Q)throw new Error(`Invalid timeRemap on '${e.id}': ${Q}`);if(e.trimStartSec!==void 0||e.dataType!=="Video"&&e.dataType!=="Audio")throw new Error(`Invalid timeRemap on '${e.id}': use audio or video without trimStartSec`)}let a=[],s=e.kind==="media"?e.src??e.inputHandleId:"inputHandleId"in e?e.inputHandleId:void 0,c=m=>typeof m=="string"&&(m.startsWith("http://")||m.startsWith("https://")||m.startsWith("file://")||m.startsWith("/")||m.startsWith("./")||m.startsWith("blob:")||m.startsWith("data:")||/\.(png|jpe?g|webp|gif|svg|mp4|webm|mov|mkv|mp3|wav|ogg|m4a|srt|vtt|json|lottie)$/i.test(m)),l;if(e.kind==="media"){if(t&&e.inputHandleId&&(l=t(e.inputHandleId)),!l&&s&&(c(s)||e.src)&&(l=_i(s,e.dataType??"Video")),!l&&!t&&s&&(s.includes(".")||s.includes("/"))&&console.warn(`[Compositor] Media layer '${e.id??"?"}' source '${s}' could not be resolved.`),l&&e.crop){let m=e.crop,Q=typeof m.toOperation=="function"?m.toOperation():m;l={metadata:{...l.metadata},operation:{op:"Crop",...Q,dataType:l.operation.dataType},children:[l]}}if(l&&Array.isArray(e.effects)){let m=l;for(let Q of e.effects){let w=Q&&typeof Q.toOperation=="function"?Q.toOperation():Q;m={metadata:{...m.metadata},operation:{op:String(w.op??"effect"),id:e.id?`${e.id}-${w.op??"effect"}`:void 0,effect:Q,...w,dataType:m.operation.dataType},children:[m]}}l=m}if(l&&e.vision){let m=e.vision,Q=typeof m.toOperation=="function"?m.toOperation():m;l={metadata:{...l.metadata},operation:{op:"Vision",id:e.id,effect:m,...Q,dataType:l.operation.dataType},children:[l]}}}if(e.kind==="media")a=l?[l]:[];else if("children"in e&&e.children){let m=e.kind==="flex"&&typeof e.staggerFrames=="number"?e.staggerFrames:0,Q=e.kind==="flex"&&typeof e.staggerDirection=="string"?e.staggerDirection:"forward",w=typeof e.startFrame=="number"&&Number.isFinite(e.startFrame)?Math.round(e.startFrame):0,S=typeof e.durationFrames=="number"&&Number.isFinite(e.durationFrames)?Math.round(e.durationFrames):A,N=e.children,M=ms(e);if(a=N.map((G,j)=>{let R=PA(j,N.length,m,Q),K=M?R:n+w+R;return Is(G,t,r,K,o,G.durationFrames===void 0?S:void 0,i)}),M){let j=(S??Math.round((o??1e4)/1e3*r))/r*1e3;l={metadata:{width:e.width,height:e.height,fps:r,durationMs:j},operation:{op:"Compositor",width:e.width,height:e.height,fps:r,mode:"Video",dataType:"Video",volume:1,...typeof e.background=="string"&&{backgroundColor:e.background}},children:a},a=[l]}}let u="Image",g;if(l){u=l.operation?.dataType??"Image";let Q=u==="Image"||u==="SVG"?void 0:Mi(l)?.durationMs;Q!=null&&(g=Math.max(1,Math.round(Q/1e3*r)))}let p=l?.operation?.dataType==="Caption",d=e.kind==="flex"||e.kind==="block"||e.kind==="box",f=(typeof e.startFrame=="number"&&Number.isFinite(e.startFrame)&&e.startFrame>=0?Math.round(e.startFrame):0)+n,h=typeof e.durationFrames=="number"&&Number.isFinite(e.durationFrames)&&e.durationFrames>0?Math.round(e.durationFrames):void 0,I=A??Math.round((o??1e4)/1e3*r);if(d&&a.length>0){if(h===void 0){let m=a.map(Q=>(Q.operation.startFrame??0)+(Q.operation.durationFrames??I));h=Math.max(1,Math.max(...m)-f)}}else p&&g!==void 0&&g>0?h=g:h!==void 0?(u==="Video"||u==="Audio")&&!(e.kind==="media"&&e.timeRemap)&&g!==void 0&&g>0&&(h=Math.min(h,g)):h=g??A??Math.round((o??1e4)/1e3*r);let b=h/r*1e3;if(e.kind==="media"&&l){let m=l;for(;m;)(!m.metadata?.durationMs||m.metadata.durationMs<=0)&&(m.metadata||(m.metadata={}),m.metadata.durationMs=b),m.operation?.sourceMeta&&!m.operation.sourceMeta.durationMs&&(m.operation.sourceMeta.durationMs=b),m=m.children?.[0]}let D=e.kind==="media"&&e.timeRemap?.kind==="signal"?e.timeRemap:void 0;if(D&&!i)throw new Error(`Signal timeRemap on '${e.id}' has no resolver`);return{metadata:{durationMs:b},operation:{op:"CompositorLayer",...e,...ms(e)&&{kind:"media",background:void 0,children:void 0},startFrame:f,durationFrames:h,dataType:u,...D&&i&&{timeRemap:i(D,{id:e.id,startFrame:f,durationFrames:h})}},children:a}}function Pf(e,t){let{isVideoMode:r,fps:n,durationMs:o,resolveMedia:A,signals:i}=t,a={...GA(e.layout),...i??e.signals??{}},s=t.resolveMediaSignal??((g,p)=>hs(g,p,{fps:n,compositionDurationFrames:Math.round((o??0)/1e3*n),signals:a})),c={metadata:{width:e.width,height:e.height,fps:n,...o!==void 0&&{durationMs:o}},operation:{op:"Compositor",width:e.width,height:e.height,fps:n,mode:e.mode??"Video",backgroundColor:e.backgroundColor,...e.antialias3d!==void 0&&{antialias3d:e.antialias3d},volume:e.volume??1,dataType:r?"Video":"Image",layout:e.layout,signals:a,...e.onRequestFrame||t.onRequestFrame?{onRequestFrame:e.onRequestFrame??t.onRequestFrame}:{}},children:Jo(e.layout).map(g=>Is(g,A,n,0,o,void 0,s))};Bs(c.children??[],a);let l=Array.isArray(t.effects)?t.effects:Array.isArray(e.effects)?e.effects:[];for(let g of l){let p=g&&typeof g.toOperation=="function"?g.toOperation():g;c={metadata:{...c.metadata},operation:{...p,dataType:c.operation.dataType},children:[c]}}let u=e.vision??t.vision;if(u){let g=typeof u.toOperation=="function"?u.toOperation():u;c={metadata:{...c.metadata},operation:{op:"Vision",...g,dataType:c.operation.dataType},children:[c]}}return c}function Bs(e,t){for(let r of e)r?.operation?.op==="Compositor"&&(r.operation.signals=t),Bs(r?.children??[],t)}function Gf(e){let t=[],r=n=>{if(n?.operation?.op!=="Compositor"){n?.operation?.op==="CompositorLayer"&&t.push(n);for(let o of n?.children??[])r(o)}};for(let n of e)r(n);return t}export{uo as a,Hi as b,Z as c,Ee as d,pr as e,Es as f,Hr as g,zi as h,Yi as i,Wo as j,Yo as k,Qt as l,dr as m,iu as n,au as o,Wn as p,hu as q,ho as r,mu as s,wu as t,Xn as u,Io as v,wo as w,Ua as x,wd as y,Gd as z,Ma as A,Sa as B,Pa as C,dd as D,Ga as E,Ra as F,Cc as G,Id as H,yA as I,Nd as J,$c as K,sl as L,tf as M,Bf as N,bf as O,SA as P,Ql as Q,lf as R,Jo as S,_l as T,hs as U,PA as V,hf as W,Pf as X,Gf as Y};
|