framefields 2.9.2 → 2.10.0-canary.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 +18 -0
- package/README.md +10 -7
- package/dist/audio/index.d.mts +5 -4
- package/dist/audio/index.mjs +13 -13
- package/dist/{audio-Ccpl9mjV.d.mts → audio-1X5qNNmk.d.mts} +4 -3
- package/dist/audio-1X5qNNmk.d.mts.map +1 -0
- package/dist/{audio-a0MFkK6J.mjs → audio-KHBadECb.mjs} +1 -1
- package/dist/{audio-a0MFkK6J.mjs.map → audio-KHBadECb.mjs.map} +1 -1
- package/dist/{audio-BfQg37MW.mjs → audio-YpBRdI7r.mjs} +4 -4
- package/dist/{audio-BfQg37MW.mjs.map → audio-YpBRdI7r.mjs.map} +1 -1
- package/dist/{check-result-C3jlgV2i.mjs → check-result-Culfu7Nx.mjs} +1 -1
- package/dist/{check-result-C3jlgV2i.mjs.map → check-result-Culfu7Nx.mjs.map} +1 -1
- package/dist/cli/check-worker.mjs +50 -50
- package/dist/cli.mjs +179 -3
- package/dist/cli.mjs.map +1 -1
- package/dist/cloud/index.d.mts +118 -0
- package/dist/cloud/index.d.mts.map +1 -0
- package/dist/cloud/index.mjs +3 -0
- package/dist/cloud-xcfV4J03.mjs +233 -0
- package/dist/cloud-xcfV4J03.mjs.map +1 -0
- package/dist/components/index.d.mts +14 -11
- package/dist/components/index.mjs +47 -47
- package/dist/dist-2_lT3Dwc.mjs +1434 -0
- package/dist/dist-2_lT3Dwc.mjs.map +1 -0
- package/dist/{dist-Buaaj-Ul.mjs → dist-BIE8fvlv.mjs} +1 -1
- package/dist/{dist-Buaaj-Ul.mjs.map → dist-BIE8fvlv.mjs.map} +1 -1
- package/dist/{dist-BlIrsfcn.mjs → dist-Bf2_efYP.mjs} +1 -1
- package/dist/{dist-BlIrsfcn.mjs.map → dist-Bf2_efYP.mjs.map} +1 -1
- package/dist/dist-BwtxciN4.mjs +3 -0
- package/dist/{dist-C1cCW7Bt.mjs → dist-C4Vxgm0Q.mjs} +275 -78
- package/dist/dist-C4Vxgm0Q.mjs.map +1 -0
- package/dist/{dist-C8Xq3zgx.mjs → dist-Cu1fZ9Uy.mjs} +4 -4
- package/dist/{dist-C8Xq3zgx.mjs.map → dist-Cu1fZ9Uy.mjs.map} +1 -1
- package/dist/{dist-DVMepKaO.mjs → dist-CySGkG54.mjs} +2 -2
- package/dist/dist-CySGkG54.mjs.map +1 -0
- package/dist/effects/index.d.mts +6 -4
- package/dist/effects/index.mjs +36 -36
- package/dist/{effects-CemgqEPv.mjs → effects-DiWYouOK.mjs} +3 -3
- package/dist/{effects-CemgqEPv.mjs.map → effects-DiWYouOK.mjs.map} +1 -1
- package/dist/fonts/index.d.mts +1 -1
- package/dist/fonts/index.mjs +3 -3
- package/dist/{fonts-BW0pPcvJ.mjs → fonts-BnV-GB1o.mjs} +2 -2
- package/dist/{fonts-BW0pPcvJ.mjs.map → fonts-BnV-GB1o.mjs.map} +1 -1
- package/dist/{gpu-CMaa63nz.mjs → gpu-Bw35AMwY.mjs} +11 -3
- package/dist/gpu-Bw35AMwY.mjs.map +1 -0
- package/dist/{index-D5UDyVMb.d.mts → index-B7WqFBZA.d.mts} +35 -2401
- package/dist/index-B7WqFBZA.d.mts.map +1 -0
- package/dist/{index-BfDFmIBE.d.mts → index-BW0Q1ygn.d.mts} +1 -1
- package/dist/{index-BfDFmIBE.d.mts.map → index-BW0Q1ygn.d.mts.map} +1 -1
- package/dist/{index-CQ-bbZk3.d.mts → index-Bbv0VtxJ.d.mts} +7 -1165
- package/dist/index-Bbv0VtxJ.d.mts.map +1 -0
- package/dist/{index-CFoAmh7q.d.mts → index-CDQrdZ0J.d.mts} +3 -3
- package/dist/{index-CFoAmh7q.d.mts.map → index-CDQrdZ0J.d.mts.map} +1 -1
- package/dist/index-COYNQ_mf.d.mts +2402 -0
- package/dist/index-COYNQ_mf.d.mts.map +1 -0
- package/dist/{index-BIjMAW1h.d.mts → index-CdCrae-I.d.mts} +2 -2
- package/dist/{index-BIjMAW1h.d.mts.map → index-CdCrae-I.d.mts.map} +1 -1
- package/dist/index-DQa7mhzq.d.mts +330 -0
- package/dist/index-DQa7mhzq.d.mts.map +1 -0
- package/dist/{index-Bnh42ouE.d.mts → index-Dyt4yS-x.d.mts} +376 -287
- package/dist/index-Dyt4yS-x.d.mts.map +1 -0
- package/dist/index-WwuuX8ZJ.d.mts +1165 -0
- package/dist/index-WwuuX8ZJ.d.mts.map +1 -0
- package/dist/{index-CJL0JAU8.d.mts → index-gOVtTm-P.d.mts} +125 -3
- package/dist/index-gOVtTm-P.d.mts.map +1 -0
- package/dist/{index-7Z9_a_iB.d.mts → index-h7m8QgcL.d.mts} +3 -3
- package/dist/{index-7Z9_a_iB.d.mts.map → index-h7m8QgcL.d.mts.map} +1 -1
- package/dist/index.d.mts +16 -13
- package/dist/index.mjs +59 -58
- package/dist/preview/index.d.mts +4 -3
- package/dist/preview/index.mjs +12 -12
- package/dist/{preview-DvP8AZuV.mjs → preview-BW7ilNWk.mjs} +3 -3
- package/dist/{preview-DvP8AZuV.mjs.map → preview-BW7ilNWk.mjs.map} +1 -1
- package/dist/preview-engine/audio.mjs +1 -1
- package/dist/preview-engine/chunk-44V4V5LD.mjs +1 -0
- package/dist/preview-engine/{chunk-5AWAOMBR.mjs → chunk-4BWBX2HM.mjs} +1 -1
- package/dist/preview-engine/{chunk-BEYA25UZ.mjs → chunk-4DSOZ5QG.mjs} +1 -1
- package/dist/preview-engine/{chunk-VVE2QHVG.mjs → chunk-4FACCLLE.mjs} +1 -1
- package/dist/preview-engine/{chunk-DMSZXG56.mjs → chunk-4N25ZU43.mjs} +1 -1
- package/dist/preview-engine/{chunk-FTCEG3SF.mjs → chunk-4RLKHFV6.mjs} +1 -1
- package/dist/preview-engine/chunk-4TPXZNVR.mjs +483 -0
- package/dist/preview-engine/chunk-4YT5YJIF.mjs +1 -0
- package/dist/preview-engine/{chunk-CC4NNNIY.mjs → chunk-57WXGYEV.mjs} +1 -1
- package/dist/preview-engine/{chunk-C4M3B2Q2.mjs → chunk-5SLBE2FX.mjs} +1 -1
- package/dist/preview-engine/{chunk-PM2W4VLT.mjs → chunk-5Y7SO37Q.mjs} +1 -1
- package/dist/preview-engine/{chunk-BJXNKMSY.mjs → chunk-64L4GUOF.mjs} +20 -6
- package/dist/preview-engine/{chunk-Y5K5LVOR.mjs → chunk-6BE3IL7L.mjs} +1 -1
- package/dist/preview-engine/{chunk-GA4HNR44.mjs → chunk-6LBFSGCI.mjs} +1 -1
- package/dist/preview-engine/{chunk-IB6GZJOL.mjs → chunk-6O55UROD.mjs} +1 -1
- package/dist/preview-engine/{chunk-SPJPM43P.mjs → chunk-6SLCECHG.mjs} +1 -1
- package/dist/preview-engine/chunk-77MT33VR.mjs +1 -0
- package/dist/preview-engine/{chunk-QCSVT73T.mjs → chunk-7A3BNAWY.mjs} +84 -25
- package/dist/preview-engine/{chunk-CN2VLYLB.mjs → chunk-7HW7GA76.mjs} +1 -1
- package/dist/preview-engine/chunk-A6OAPDIA.mjs +1 -0
- package/dist/preview-engine/chunk-ADLIF544.mjs +39 -0
- package/dist/preview-engine/{chunk-LVYVXVZO.mjs → chunk-C2GX5L5S.mjs} +1 -1
- package/dist/preview-engine/{chunk-4WYM72ZN.mjs → chunk-CHXR5XZK.mjs} +1 -1
- package/dist/preview-engine/chunk-CSLSWUUT.mjs +1 -0
- package/dist/preview-engine/{chunk-JSYG6OWZ.mjs → chunk-D7OMXGIZ.mjs} +1 -1
- package/dist/preview-engine/{chunk-RJIAES3X.mjs → chunk-EKEKYGXE.mjs} +1 -1
- package/dist/preview-engine/{chunk-TNJEZKXM.mjs → chunk-FH72KTSM.mjs} +1 -1
- package/dist/preview-engine/{chunk-P5FKRQFU.mjs → chunk-FW2UDDUT.mjs} +1 -1
- package/dist/preview-engine/{chunk-S2ABWY5G.mjs → chunk-GTMZOMAN.mjs} +1 -1
- package/dist/preview-engine/{chunk-6R3UJBL5.mjs → chunk-HGWT3RVQ.mjs} +10 -10
- package/dist/preview-engine/{chunk-34RJ7GAS.mjs → chunk-HKYENGC5.mjs} +1 -1
- package/dist/preview-engine/{chunk-7U34VKNO.mjs → chunk-HO7FXISJ.mjs} +1 -1
- package/dist/preview-engine/{chunk-73CNXGAK.mjs → chunk-HPQDCC4S.mjs} +1 -1
- package/dist/preview-engine/{chunk-ZY47XIRK.mjs → chunk-IVAA5X5H.mjs} +1 -1
- package/dist/preview-engine/chunk-JAAFSVAG.mjs +1 -0
- package/dist/preview-engine/{chunk-UXYM2G6J.mjs → chunk-JFBSNFN6.mjs} +1 -1
- package/dist/preview-engine/{chunk-GIICZZQI.mjs → chunk-JSKEVYKD.mjs} +1 -1
- package/dist/preview-engine/{chunk-EJJITH6U.mjs → chunk-K3TJJXVC.mjs} +1 -1
- package/dist/preview-engine/{chunk-GZWA5QJS.mjs → chunk-L2NTIWW5.mjs} +1 -1
- package/dist/preview-engine/{chunk-VN36PRVD.mjs → chunk-LBP7E7SJ.mjs} +1 -1
- package/dist/preview-engine/{chunk-34DL53D5.mjs → chunk-LTR5FXGU.mjs} +1 -1
- package/dist/preview-engine/{chunk-GRJJVSOV.mjs → chunk-ML7WO27M.mjs} +1 -1
- package/dist/preview-engine/{chunk-GN3NDRLI.mjs → chunk-NCQHOGZK.mjs} +1 -1
- package/dist/preview-engine/{chunk-OH5W5EL6.mjs → chunk-NTTEGJD6.mjs} +1 -1
- package/dist/preview-engine/{chunk-2B722GXM.mjs → chunk-OD4CSXZL.mjs} +15 -15
- package/dist/preview-engine/{chunk-AHQCDTD6.mjs → chunk-OOUDE4XL.mjs} +1 -1
- package/dist/preview-engine/chunk-PH3UUX6A.mjs +138 -0
- package/dist/preview-engine/chunk-PIHG6HJO.mjs +1 -0
- package/dist/preview-engine/{chunk-ZJ5SWTCW.mjs → chunk-RAW2I27S.mjs} +1 -1
- package/dist/preview-engine/{chunk-BJV2LBII.mjs → chunk-RMHL4XZ3.mjs} +1 -1
- package/dist/preview-engine/chunk-T6L3DO3H.mjs +1 -0
- package/dist/preview-engine/{chunk-2PYTDN2C.mjs → chunk-V5HU6NIW.mjs} +1 -1
- package/dist/preview-engine/{chunk-DVZITDQS.mjs → chunk-VRJBOFFY.mjs} +1 -1
- package/dist/preview-engine/{chunk-SF37HXAH.mjs → chunk-WVIDORLK.mjs} +1 -1
- package/dist/preview-engine/{chunk-35HMRW4I.mjs → chunk-XCQ7KN4S.mjs} +1 -1
- package/dist/preview-engine/{chunk-KHJZMTOS.mjs → chunk-Y2SWIWIU.mjs} +1 -1
- package/dist/preview-engine/{chunk-H7BSN7V7.mjs → chunk-YS3ROS25.mjs} +1 -1
- package/dist/preview-engine/{chunk-2DWY7UBV.mjs → chunk-YXCTOCQ2.mjs} +1 -1
- package/dist/preview-engine/{chunk-BVDWS3D2.mjs → chunk-ZA5LWHRM.mjs} +1 -1
- package/dist/preview-engine/chunk-ZGEKF34E.mjs +1974 -0
- 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 +1 -1
- package/dist/preview-engine/renderers-33PIDDZC.mjs +1 -0
- package/dist/preview-engine/{renderers-ZACSHGNZ.mjs → renderers-36P2TKPC.mjs} +1 -1
- package/dist/preview-engine/{renderers-TSBV4KPE.mjs → renderers-37Y5LR2S.mjs} +1 -1
- package/dist/preview-engine/renderers-3AZ3HY53.mjs +1 -0
- package/dist/preview-engine/renderers-3FGKW52B.mjs +1 -0
- package/dist/preview-engine/renderers-4A2FBS3Y.mjs +1 -0
- package/dist/preview-engine/{renderers-5TO2SXFR.mjs → renderers-4MW4NW6O.mjs} +1 -1
- package/dist/preview-engine/{renderers-ENMY4DKF.mjs → renderers-4SNAK77B.mjs} +1 -1
- package/dist/preview-engine/{renderers-Y22VSOXF.mjs → renderers-4WFRXGMR.mjs} +1 -1
- package/dist/preview-engine/{renderers-5KANN7XF.mjs → renderers-5K3BSBI6.mjs} +1 -1
- package/dist/preview-engine/renderers-65DU2F5W.mjs +1 -0
- package/dist/preview-engine/renderers-6CTPYQR6.mjs +1 -0
- package/dist/preview-engine/{renderers-NUAI4TO5.mjs → renderers-6RRWA33X.mjs} +1 -1
- package/dist/preview-engine/{renderers-4F7WLQD5.mjs → renderers-6RYIPQ7W.mjs} +1 -1
- package/dist/preview-engine/{renderers-U4M7ZCV4.mjs → renderers-AUYCQNSS.mjs} +1 -1
- package/dist/preview-engine/renderers-AWODRI3B.mjs +1 -0
- package/dist/preview-engine/renderers-BO6HHGMZ.mjs +1 -0
- package/dist/preview-engine/renderers-BSXYDEV7.mjs +1 -0
- package/dist/preview-engine/{renderers-FSI5KNGZ.mjs → renderers-CMBI4JOC.mjs} +1 -1
- package/dist/preview-engine/{renderers-6Z7DWAPH.mjs → renderers-CQIPHCIW.mjs} +1 -1
- package/dist/preview-engine/renderers-DU7KPFVV.mjs +1 -0
- package/dist/preview-engine/renderers-ECW2CGNU.mjs +1 -0
- package/dist/preview-engine/renderers-EEX22FUO.mjs +1 -0
- package/dist/preview-engine/{renderers-MOEC2XZZ.mjs → renderers-EILFSWSJ.mjs} +1 -1
- package/dist/preview-engine/{renderers-NCGH2WWJ.mjs → renderers-G2FL3IFD.mjs} +1 -1
- package/dist/preview-engine/{renderers-5XRKZHVT.mjs → renderers-GCQKGJ7W.mjs} +1 -1
- package/dist/preview-engine/{renderers-77PDUMYI.mjs → renderers-HXNSDJBY.mjs} +1 -1
- package/dist/preview-engine/renderers-HZBXLDKG.mjs +1 -0
- package/dist/preview-engine/renderers-IOXNQPQK.mjs +1 -0
- package/dist/preview-engine/renderers-IR44E4ZZ.mjs +1 -0
- package/dist/preview-engine/{renderers-TGJSOKDY.mjs → renderers-JALV3B3A.mjs} +1 -1
- package/dist/preview-engine/{renderers-IHGAWLUF.mjs → renderers-JMSAW7VY.mjs} +1 -1
- package/dist/preview-engine/{renderers-CUMVIVHI.mjs → renderers-JZYHX4XI.mjs} +1 -1
- package/dist/preview-engine/renderers-JZZ3ODOZ.mjs +1 -0
- package/dist/preview-engine/renderers-K37YL3Z7.mjs +1 -0
- package/dist/preview-engine/{renderers-RN2MHIFK.mjs → renderers-KICDB5Y6.mjs} +1 -1
- package/dist/preview-engine/renderers-KUJQV3K6.mjs +1 -0
- package/dist/preview-engine/renderers-KXVKLSSX.mjs +1 -0
- package/dist/preview-engine/{renderers-WEYAHOBK.mjs → renderers-LF6U4MR5.mjs} +1 -1
- package/dist/preview-engine/renderers-N4RVFX3G.mjs +1 -0
- package/dist/preview-engine/{renderers-PPZK6VEW.mjs → renderers-NQC4DPX4.mjs} +1 -1
- package/dist/preview-engine/renderers-NZWWEAYA.mjs +1 -0
- package/dist/preview-engine/{renderers-5UZ3YFBD.mjs → renderers-OPRXVIGT.mjs} +1 -1
- package/dist/preview-engine/{renderers-7C5RA3R5.mjs → renderers-OZKPOUMW.mjs} +1 -1
- package/dist/preview-engine/renderers-P4JJEDZB.mjs +1 -0
- package/dist/preview-engine/{renderers-V3AQO7AR.mjs → renderers-PGZDFDSC.mjs} +1 -1
- package/dist/preview-engine/renderers-Q4572F5C.mjs +1 -0
- package/dist/preview-engine/{renderers-PIIEUKFE.mjs → renderers-Q5YCUPYE.mjs} +1 -1
- package/dist/preview-engine/renderers-QAX2QWWQ.mjs +1 -0
- package/dist/preview-engine/{renderers-SEIAUKJF.mjs → renderers-RQ3JZE3L.mjs} +1 -1
- package/dist/preview-engine/renderers-SRFIEVWL.mjs +1 -0
- package/dist/preview-engine/renderers-SYC6WFTM.mjs +1 -0
- package/dist/preview-engine/{renderers-QA2HKUJJ.mjs → renderers-TKHQRERE.mjs} +1 -1
- package/dist/preview-engine/{renderers-A24KZK2Q.mjs → renderers-U4S577ON.mjs} +1 -1
- package/dist/preview-engine/{renderers-KC6ZSKCW.mjs → renderers-UBIFSF37.mjs} +1 -1
- package/dist/preview-engine/renderers-UH4WN3QN.mjs +1 -0
- package/dist/preview-engine/renderers-V4FFCAS7.mjs +1 -0
- package/dist/preview-engine/renderers-VGDEOZUU.mjs +1 -0
- package/dist/preview-engine/renderers-VJJKBX5K.mjs +1 -0
- package/dist/preview-engine/renderers-VJOKVDYW.mjs +1 -0
- package/dist/preview-engine/renderers-VUUWZUOH.mjs +1 -0
- package/dist/preview-engine/renderers-WG756VF3.mjs +228 -0
- package/dist/preview-engine/renderers-WOP5GOZP.mjs +1 -0
- package/dist/preview-engine/{renderers-T74CQCEN.mjs → renderers-XZ3XDQIN.mjs} +1 -1
- package/dist/preview-engine/renderers-Y4MGN2FR.mjs +1 -0
- package/dist/preview-engine/renderers-YAMYH7IK.mjs +1 -0
- package/dist/preview-engine/{renderers-MD3PRFZL.mjs → renderers-YJ4PJEPG.mjs} +1 -1
- package/dist/preview-engine/renderers-ZNLSAWW3.mjs +1 -0
- package/dist/preview-engine/{renderers-L6YDX6GS.mjs → renderers-ZQVKE5AO.mjs} +1 -1
- package/dist/preview-engine/signals.mjs +1 -1
- package/dist/preview-engine/{src-4IUYUKIZ.mjs → src-GPF7RIBU.mjs} +1 -1
- package/dist/{program-CKpKkllV.mjs → program-BUjUTdxq.mjs} +44 -17
- package/dist/program-BUjUTdxq.mjs.map +1 -0
- package/dist/registry/focus-zoom.json +9 -2
- package/dist/renderer/index.d.mts +4 -3
- package/dist/renderer/index.mjs +4 -4
- package/dist/{renderer-BF0hx_iJ.mjs → renderer--f8JHHyT.mjs} +5 -5
- package/dist/{renderer-BF0hx_iJ.mjs.map → renderer--f8JHHyT.mjs.map} +1 -1
- package/dist/{renderer-CHr7MiYW.mjs → renderer-1KgHl_ls.mjs} +5 -5
- package/dist/{renderer-CHr7MiYW.mjs.map → renderer-1KgHl_ls.mjs.map} +1 -1
- package/dist/renderer-6sNr6ZRJ.mjs +6 -0
- package/dist/{renderer-BgO6BA_z.mjs → renderer-7c0ecb-L.mjs} +74 -21
- package/dist/renderer-7c0ecb-L.mjs.map +1 -0
- package/dist/{renderer-D61B9bXF.mjs → renderer-7w9PZmWJ.mjs} +4 -4
- package/dist/{renderer-D61B9bXF.mjs.map → renderer-7w9PZmWJ.mjs.map} +1 -1
- package/dist/{renderer-DVCJjVn7.mjs → renderer-B3WHDQeB.mjs} +5 -5
- package/dist/{renderer-DVCJjVn7.mjs.map → renderer-B3WHDQeB.mjs.map} +1 -1
- package/dist/{renderer-C7eFJf0_.mjs → renderer-B84T5I98.mjs} +5 -5
- package/dist/{renderer-C7eFJf0_.mjs.map → renderer-B84T5I98.mjs.map} +1 -1
- package/dist/{renderer-EaLUCobW.mjs → renderer-B8i4d1Rc.mjs} +4 -4
- package/dist/{renderer-EaLUCobW.mjs.map → renderer-B8i4d1Rc.mjs.map} +1 -1
- package/dist/renderer-BDHGxD6p.mjs +5 -0
- package/dist/{renderer-WCZu2Rf5.mjs → renderer-BFmVDdVs.mjs} +4 -4
- package/dist/{renderer-WCZu2Rf5.mjs.map → renderer-BFmVDdVs.mjs.map} +1 -1
- package/dist/{renderer-bAKUeHF3.mjs → renderer-BG_cnGbF.mjs} +5 -5
- package/dist/{renderer-bAKUeHF3.mjs.map → renderer-BG_cnGbF.mjs.map} +1 -1
- package/dist/{renderer-BPWDsufX.mjs → renderer-BIToh0CA.mjs} +3 -3
- package/dist/{renderer-BPWDsufX.mjs.map → renderer-BIToh0CA.mjs.map} +1 -1
- package/dist/{renderer-mNSyac1V.mjs → renderer-BOg8i8eF.mjs} +11 -2
- package/dist/{renderer-mNSyac1V.mjs.map → renderer-BOg8i8eF.mjs.map} +1 -1
- package/dist/{renderer-BlPqTEii.mjs → renderer-BSW4CGZF.mjs} +4 -4
- package/dist/{renderer-BlPqTEii.mjs.map → renderer-BSW4CGZF.mjs.map} +1 -1
- package/dist/{renderer-D7Al3_-5.mjs → renderer-BT4im6c0.mjs} +5 -5
- package/dist/{renderer-D7Al3_-5.mjs.map → renderer-BT4im6c0.mjs.map} +1 -1
- package/dist/renderer-BT9dvpk2.mjs +5 -0
- package/dist/{renderer-BpIF1QIE.mjs → renderer-BTLZBD63.mjs} +5 -5
- package/dist/{renderer-BpIF1QIE.mjs.map → renderer-BTLZBD63.mjs.map} +1 -1
- package/dist/{renderer-CcvvoKiZ.mjs → renderer-Bb_HHUQ0.mjs} +5 -5
- package/dist/{renderer-CcvvoKiZ.mjs.map → renderer-Bb_HHUQ0.mjs.map} +1 -1
- package/dist/renderer-Bd-NuU3M.mjs +3 -0
- package/dist/{renderer-sCovEubT.mjs → renderer-BdRwbLLV.mjs} +4 -4
- package/dist/{renderer-sCovEubT.mjs.map → renderer-BdRwbLLV.mjs.map} +1 -1
- package/dist/{renderer-DNQvOrkY.mjs → renderer-BeJoW-nG.mjs} +5 -5
- package/dist/{renderer-DNQvOrkY.mjs.map → renderer-BeJoW-nG.mjs.map} +1 -1
- package/dist/renderer-BfaRh0qy.mjs +5 -0
- package/dist/{renderer-B522Dkdk.mjs → renderer-BhNZn2DU.mjs} +4 -4
- package/dist/{renderer-B522Dkdk.mjs.map → renderer-BhNZn2DU.mjs.map} +1 -1
- package/dist/{renderer-D47AEJE_.mjs → renderer-Bif8bwCq.mjs} +3 -3
- package/dist/{renderer-D47AEJE_.mjs.map → renderer-Bif8bwCq.mjs.map} +1 -1
- package/dist/renderer-BlwXKV7Y.mjs +5 -0
- package/dist/{renderer-CwFqqpWY.mjs → renderer-Bm91Xv6l.mjs} +4 -4
- package/dist/{renderer-CwFqqpWY.mjs.map → renderer-Bm91Xv6l.mjs.map} +1 -1
- package/dist/{renderer-SSBL4M1o.mjs → renderer-BnN3JH9u.mjs} +20 -7
- package/dist/renderer-BnN3JH9u.mjs.map +1 -0
- package/dist/{renderer-8QIwXh7O.mjs → renderer-Bo5GwErU.mjs} +6 -6
- package/dist/{renderer-8QIwXh7O.mjs.map → renderer-Bo5GwErU.mjs.map} +1 -1
- package/dist/{renderer-DF-yvIrV.mjs → renderer-Br_aJ_b7.mjs} +4 -4
- package/dist/{renderer-DF-yvIrV.mjs.map → renderer-Br_aJ_b7.mjs.map} +1 -1
- package/dist/{renderer-DmkWrWAk.mjs → renderer-BvRaVByi.mjs} +3 -3
- package/dist/{renderer-DmkWrWAk.mjs.map → renderer-BvRaVByi.mjs.map} +1 -1
- package/dist/renderer-C40yZK3x.mjs +5 -0
- package/dist/renderer-C5MjQ7L8.mjs +5 -0
- package/dist/renderer-C8LjKYnS.mjs +5 -0
- package/dist/renderer-C9q9H_qa.mjs +5 -0
- package/dist/renderer-CC4fhNup.mjs +3 -0
- package/dist/{renderer-GBmWjBvy.mjs → renderer-CDfCaqV4.mjs} +3 -3
- package/dist/{renderer-GBmWjBvy.mjs.map → renderer-CDfCaqV4.mjs.map} +1 -1
- package/dist/renderer-CF9ta9Rm.mjs +5 -0
- package/dist/{renderer-DkRSZg5g.mjs → renderer-CKlNHDKI.mjs} +5 -5
- package/dist/{renderer-DkRSZg5g.mjs.map → renderer-CKlNHDKI.mjs.map} +1 -1
- package/dist/{renderer-CYC32bDW.mjs → renderer-CLRrcT_3.mjs} +5 -5
- package/dist/{renderer-CYC32bDW.mjs.map → renderer-CLRrcT_3.mjs.map} +1 -1
- package/dist/{renderer-DpruWmZU.mjs → renderer-CO1PwItH.mjs} +4 -4
- package/dist/{renderer-DpruWmZU.mjs.map → renderer-CO1PwItH.mjs.map} +1 -1
- package/dist/renderer-CO205Gr9.mjs +5 -0
- package/dist/renderer-CSm8UXLP.mjs +5 -0
- package/dist/renderer-CSy8HRtF.mjs +5 -0
- package/dist/{renderer-pHWEHDnM.mjs → renderer-CTSvHf6g.mjs} +5 -5
- package/dist/{renderer-pHWEHDnM.mjs.map → renderer-CTSvHf6g.mjs.map} +1 -1
- package/dist/{renderer-hSCfnvaK.mjs → renderer-CWmlfdLb.mjs} +5 -5
- package/dist/{renderer-hSCfnvaK.mjs.map → renderer-CWmlfdLb.mjs.map} +1 -1
- package/dist/{renderer--fkmiVjl.mjs → renderer-CanNjQuL.mjs} +4 -4
- package/dist/{renderer--fkmiVjl.mjs.map → renderer-CanNjQuL.mjs.map} +1 -1
- package/dist/renderer-CdNRWDsA.mjs +5 -0
- package/dist/{renderer-DFzI3yI_.mjs → renderer-CeNAgCE2.mjs} +3 -3
- package/dist/{renderer-DFzI3yI_.mjs.map → renderer-CeNAgCE2.mjs.map} +1 -1
- package/dist/{renderer-BdyopiLC.mjs → renderer-Ch1qZ2PT.mjs} +4 -4
- package/dist/{renderer-BdyopiLC.mjs.map → renderer-Ch1qZ2PT.mjs.map} +1 -1
- package/dist/{renderer-CQvmbRQ5.mjs → renderer-Chfo4G9t.mjs} +5 -5
- package/dist/{renderer-CQvmbRQ5.mjs.map → renderer-Chfo4G9t.mjs.map} +1 -1
- package/dist/{renderer-DEmYyaqj.mjs → renderer-Ck-NLzz0.mjs} +4 -4
- package/dist/{renderer-DEmYyaqj.mjs.map → renderer-Ck-NLzz0.mjs.map} +1 -1
- package/dist/renderer-CkAjiGRB.mjs +5 -0
- package/dist/renderer-CmryuPBm.mjs +5 -0
- package/dist/renderer-CnEwne4L.mjs +5 -0
- package/dist/{renderer-BlvGcyAN.mjs → renderer-CsRuEpR2.mjs} +3 -3
- package/dist/{renderer-BlvGcyAN.mjs.map → renderer-CsRuEpR2.mjs.map} +1 -1
- package/dist/{renderer-SWr3vbrV.mjs → renderer-CtulmkqT.mjs} +3 -3
- package/dist/{renderer-SWr3vbrV.mjs.map → renderer-CtulmkqT.mjs.map} +1 -1
- package/dist/{renderer-DTqDy2m9.mjs → renderer-CwAuWLWm.mjs} +3 -3
- package/dist/{renderer-DTqDy2m9.mjs.map → renderer-CwAuWLWm.mjs.map} +1 -1
- package/dist/{renderer-B2jjxsjO.mjs → renderer-CxabOSkk.mjs} +4 -4
- package/dist/{renderer-B2jjxsjO.mjs.map → renderer-CxabOSkk.mjs.map} +1 -1
- package/dist/{renderer-DPAD6fL1.mjs → renderer-CybBR8AL.mjs} +425 -115
- package/dist/renderer-CybBR8AL.mjs.map +1 -0
- package/dist/{renderer-DO-KbpYZ.mjs → renderer-D1tDMuD0.mjs} +5 -5
- package/dist/{renderer-DO-KbpYZ.mjs.map → renderer-D1tDMuD0.mjs.map} +1 -1
- package/dist/renderer-D4QDoqOG.mjs +5 -0
- package/dist/{renderer-Bfk6A7UO.mjs → renderer-D7DlNOVi.mjs} +5 -5
- package/dist/{renderer-Bfk6A7UO.mjs.map → renderer-D7DlNOVi.mjs.map} +1 -1
- package/dist/renderer-D7cS2a8z.mjs +5 -0
- package/dist/{renderer-g_vrrAQU.mjs → renderer-D7lApyWZ.mjs} +3 -3
- package/dist/{renderer-g_vrrAQU.mjs.map → renderer-D7lApyWZ.mjs.map} +1 -1
- package/dist/renderer-D85CNC-b.mjs +5 -0
- package/dist/{renderer-DqvoMLca.mjs → renderer-DAfCcnCz.mjs} +5 -5
- package/dist/{renderer-DqvoMLca.mjs.map → renderer-DAfCcnCz.mjs.map} +1 -1
- package/dist/{renderer-D7r6onRT.mjs → renderer-DAug14gu.mjs} +4 -4
- package/dist/{renderer-D7r6onRT.mjs.map → renderer-DAug14gu.mjs.map} +1 -1
- package/dist/{renderer-DMvmf3T2.mjs → renderer-DBfx6QX1.mjs} +3 -3
- package/dist/renderer-DC9IoJNz.mjs +5 -0
- package/dist/renderer-DCMoBppL.mjs +1062 -0
- package/dist/renderer-DCMoBppL.mjs.map +1 -0
- package/dist/renderer-DIDh0gFm.mjs +5 -0
- package/dist/{renderer-DKgPVOLL.d.mts → renderer-DJuVX3c5.d.mts} +2 -2
- package/dist/{renderer-DKgPVOLL.d.mts.map → renderer-DJuVX3c5.d.mts.map} +1 -1
- package/dist/{renderer-sYSkIUfo.mjs → renderer-DKptrHeL.mjs} +5 -5
- package/dist/{renderer-sYSkIUfo.mjs.map → renderer-DKptrHeL.mjs.map} +1 -1
- package/dist/renderer-DLmJ9GWE.mjs +5 -0
- package/dist/renderer-DM7PUWP9.mjs +5 -0
- package/dist/{renderer-C41U1tK6.mjs → renderer-DMtzPqYo.mjs} +211 -72
- package/dist/renderer-DMtzPqYo.mjs.map +1 -0
- package/dist/renderer-DPWFDxIO.mjs +5 -0
- package/dist/renderer-DUCByhAk.mjs +5 -0
- package/dist/renderer-DVOtnCKH.mjs +5 -0
- package/dist/renderer-DVrN2bW8.mjs +5 -0
- package/dist/{renderer-zXPVLRlD.mjs → renderer-D_rEtJAH.mjs} +5 -5
- package/dist/{renderer-zXPVLRlD.mjs.map → renderer-D_rEtJAH.mjs.map} +1 -1
- package/dist/{renderer-BIGFP1cF.mjs → renderer-Dak_wVh9.mjs} +2 -2
- package/dist/{renderer-BIGFP1cF.mjs.map → renderer-Dak_wVh9.mjs.map} +1 -1
- package/dist/{renderer-DX41niRU.mjs → renderer-Dd2XrdqA.mjs} +4 -4
- package/dist/{renderer-DX41niRU.mjs.map → renderer-Dd2XrdqA.mjs.map} +1 -1
- package/dist/renderer-DdOVwfG4.mjs +5 -0
- package/dist/{renderer-1r-Uq-Ae.mjs → renderer-Dih1rtT6.mjs} +3 -3
- package/dist/{renderer-1r-Uq-Ae.mjs.map → renderer-Dih1rtT6.mjs.map} +1 -1
- package/dist/{renderer-BXJXziIt.mjs → renderer-DjiebKHO.mjs} +3 -3
- package/dist/{renderer-BXJXziIt.mjs.map → renderer-DjiebKHO.mjs.map} +1 -1
- package/dist/{renderer-DIw3UtEU.mjs → renderer-DkAFIpzB.mjs} +5 -5
- package/dist/{renderer-DIw3UtEU.mjs.map → renderer-DkAFIpzB.mjs.map} +1 -1
- package/dist/{renderer-DDEkFbVI.mjs → renderer-DlbSqOJR.mjs} +5 -5
- package/dist/{renderer-DDEkFbVI.mjs.map → renderer-DlbSqOJR.mjs.map} +1 -1
- package/dist/{renderer-C7L8Ceqr.mjs → renderer-DrExCXnp.mjs} +4 -4
- package/dist/{renderer-C7L8Ceqr.mjs.map → renderer-DrExCXnp.mjs.map} +1 -1
- package/dist/{renderer-_iMAO698.mjs → renderer-DsPLMzy1.mjs} +2 -2
- package/dist/{renderer-_iMAO698.mjs.map → renderer-DsPLMzy1.mjs.map} +1 -1
- package/dist/{renderer-BAYTI6jj.mjs → renderer-Dswrn-yi.mjs} +4 -4
- package/dist/{renderer-BAYTI6jj.mjs.map → renderer-Dswrn-yi.mjs.map} +1 -1
- package/dist/renderer-DtCe9ouu.mjs +5 -0
- package/dist/{renderer-DXEWbnRF.mjs → renderer-DtCmG-tT.mjs} +4 -4
- package/dist/{renderer-DXEWbnRF.mjs.map → renderer-DtCmG-tT.mjs.map} +1 -1
- package/dist/{renderer-B39I6CQw.mjs → renderer-DxiF4O6X.mjs} +4 -4
- package/dist/{renderer-B39I6CQw.mjs.map → renderer-DxiF4O6X.mjs.map} +1 -1
- package/dist/{renderer-BAusZ6Vu.mjs → renderer-DxkvDAA6.mjs} +4 -4
- package/dist/{renderer-BAusZ6Vu.mjs.map → renderer-DxkvDAA6.mjs.map} +1 -1
- package/dist/{renderer-ktWXVYka.mjs → renderer-FFLnACY-.mjs} +6 -6
- package/dist/{renderer-ktWXVYka.mjs.map → renderer-FFLnACY-.mjs.map} +1 -1
- package/dist/{renderer-Lth37j17.mjs → renderer-H4CZt3Z5.mjs} +3 -3
- package/dist/{renderer-B-ur0Ej8.mjs → renderer-JASAZUyY.mjs} +4 -4
- package/dist/{renderer-B-ur0Ej8.mjs.map → renderer-JASAZUyY.mjs.map} +1 -1
- package/dist/renderer-Mg0kr9Fm.mjs +5 -0
- package/dist/{renderer-CCycwCEB.mjs → renderer-R2kLaNuR.mjs} +3 -3
- package/dist/{renderer-CCycwCEB.mjs.map → renderer-R2kLaNuR.mjs.map} +1 -1
- package/dist/renderer-T35PsSw5.mjs +5 -0
- package/dist/{renderer-cod5Ona9.mjs → renderer-fWW0bsVl.mjs} +3 -3
- package/dist/renderer-iSZ5NT-J.mjs +5 -0
- package/dist/{renderer-oKRF4A0M.mjs → renderer-jBKpX3Xg.mjs} +4 -4
- package/dist/{renderer-oKRF4A0M.mjs.map → renderer-jBKpX3Xg.mjs.map} +1 -1
- package/dist/{renderer-Xv6GfNUI.mjs → renderer-kFx1_MmK.mjs} +3 -3
- package/dist/{renderer-Xv6GfNUI.mjs.map → renderer-kFx1_MmK.mjs.map} +1 -1
- package/dist/{renderer-DbRZe0Re.mjs → renderer-muB4slsV.mjs} +5 -5
- package/dist/{renderer-DbRZe0Re.mjs.map → renderer-muB4slsV.mjs.map} +1 -1
- package/dist/renderer-nEmMjQ1a.mjs +5 -0
- package/dist/{renderer-CpUJBOfb.mjs → renderer-oiDoNzhv.mjs} +3 -3
- package/dist/renderer-pG1nyfjE.mjs +5 -0
- package/dist/{renderer-BX7jS14r.d.mts → renderer-tcypOFaB.d.mts} +23 -4
- package/dist/renderer-tcypOFaB.d.mts.map +1 -0
- package/dist/{renderer-CiQhD8Gg.mjs → renderer-vPxMXiv8.mjs} +5 -5
- package/dist/{renderer-CiQhD8Gg.mjs.map → renderer-vPxMXiv8.mjs.map} +1 -1
- package/dist/renderer-vbb9e3E3.mjs +5 -0
- package/dist/{renderer-D8bBHrWC.mjs → renderer-vpsU_4XW.mjs} +5 -5
- package/dist/{renderer-D8bBHrWC.mjs.map → renderer-vpsU_4XW.mjs.map} +1 -1
- package/dist/{renderer-DiY70S8S.mjs → renderer-w7mlMSC-.mjs} +4 -4
- package/dist/{renderer-DiY70S8S.mjs.map → renderer-w7mlMSC-.mjs.map} +1 -1
- package/dist/{renderers-CP8CFWDs-DH2oktaC.mjs → renderers-CP8CFWDs-OgyUiyrr.mjs} +4 -4
- package/dist/{renderers-CP8CFWDs-DH2oktaC.mjs.map → renderers-CP8CFWDs-OgyUiyrr.mjs.map} +1 -1
- package/dist/sam/index.d.mts +4 -0
- package/dist/sam/index.mjs +3 -0
- package/dist/signals/index.d.mts +7 -6
- package/dist/signals/index.mjs +8 -8
- package/dist/{signals-CXwgAUp-.mjs → signals-BfJ1aqpT.mjs} +4 -4
- package/dist/{signals-CXwgAUp-.mjs.map → signals-BfJ1aqpT.mjs.map} +1 -1
- package/dist/{renderer-B2P1vgb7.mjs → src-BU6vm9sP-DFJ3phW0.mjs} +81 -1016
- package/dist/src-BU6vm9sP-DFJ3phW0.mjs.map +1 -0
- package/dist/{src-DFEqficI.mjs → src-C3f3zXYg.mjs} +251 -37
- package/dist/src-C3f3zXYg.mjs.map +1 -0
- package/package.json +75 -69
- package/dist/audio-Ccpl9mjV.d.mts.map +0 -1
- package/dist/dist-C1cCW7Bt.mjs.map +0 -1
- package/dist/dist-DVMepKaO.mjs.map +0 -1
- package/dist/gpu-CMaa63nz.mjs.map +0 -1
- package/dist/index-Bnh42ouE.d.mts.map +0 -1
- package/dist/index-CJL0JAU8.d.mts.map +0 -1
- package/dist/index-CQ-bbZk3.d.mts.map +0 -1
- package/dist/index-D5UDyVMb.d.mts.map +0 -1
- package/dist/preview-engine/chunk-4FY4TNST.mjs +0 -1
- package/dist/preview-engine/chunk-7LDSMOO3.mjs +0 -1
- package/dist/preview-engine/chunk-AGAZJZWI.mjs +0 -1
- package/dist/preview-engine/chunk-BXPM5SJ3.mjs +0 -1
- package/dist/preview-engine/chunk-D73ZKPFN.mjs +0 -138
- package/dist/preview-engine/chunk-FKG27DVO.mjs +0 -4
- package/dist/preview-engine/chunk-KOVN277Z.mjs +0 -1
- package/dist/preview-engine/chunk-KXLXP66K.mjs +0 -1974
- package/dist/preview-engine/chunk-MIEH74UH.mjs +0 -480
- package/dist/preview-engine/chunk-XYGDTPO7.mjs +0 -39
- package/dist/preview-engine/chunk-YGKO4NIU.mjs +0 -1
- package/dist/preview-engine/renderers-3BOQOUEU.mjs +0 -1
- package/dist/preview-engine/renderers-3M2FESR2.mjs +0 -1
- package/dist/preview-engine/renderers-6LHIWKMZ.mjs +0 -1
- package/dist/preview-engine/renderers-7XHO6M3B.mjs +0 -228
- package/dist/preview-engine/renderers-A43VCJ7X.mjs +0 -1
- package/dist/preview-engine/renderers-AKY464RY.mjs +0 -1
- package/dist/preview-engine/renderers-C5UO6PL5.mjs +0 -1
- package/dist/preview-engine/renderers-C64QSZO4.mjs +0 -1
- package/dist/preview-engine/renderers-CIRCR6NG.mjs +0 -1
- package/dist/preview-engine/renderers-CIWOPETY.mjs +0 -1
- package/dist/preview-engine/renderers-CZEZCELP.mjs +0 -1
- package/dist/preview-engine/renderers-FSQMWHQM.mjs +0 -1
- package/dist/preview-engine/renderers-FZEW5C23.mjs +0 -1
- package/dist/preview-engine/renderers-HCET2IML.mjs +0 -1
- package/dist/preview-engine/renderers-IUOOC6K7.mjs +0 -1
- package/dist/preview-engine/renderers-KYYJLVIJ.mjs +0 -1
- package/dist/preview-engine/renderers-L4GE7WV3.mjs +0 -1
- package/dist/preview-engine/renderers-LRAFWKCO.mjs +0 -1
- package/dist/preview-engine/renderers-LU3XZWEB.mjs +0 -1
- package/dist/preview-engine/renderers-MDHPQY6D.mjs +0 -1
- package/dist/preview-engine/renderers-ND2WV4K3.mjs +0 -1
- package/dist/preview-engine/renderers-NJ5CWVVH.mjs +0 -1
- package/dist/preview-engine/renderers-NKXYPR3V.mjs +0 -1
- package/dist/preview-engine/renderers-NWR66CGK.mjs +0 -1
- package/dist/preview-engine/renderers-O22WTBRM.mjs +0 -1
- package/dist/preview-engine/renderers-PBBA7LQB.mjs +0 -1
- package/dist/preview-engine/renderers-Q6LJRZ7R.mjs +0 -1
- package/dist/preview-engine/renderers-RMEACSRL.mjs +0 -1
- package/dist/preview-engine/renderers-SP42LCSI.mjs +0 -1
- package/dist/preview-engine/renderers-T7SZA3BX.mjs +0 -1
- package/dist/preview-engine/renderers-VADTDAHD.mjs +0 -1
- package/dist/preview-engine/renderers-VNNWI5C3.mjs +0 -1
- package/dist/preview-engine/renderers-WZ75MLP3.mjs +0 -1
- package/dist/preview-engine/renderers-XB5R4UQA.mjs +0 -1
- package/dist/preview-engine/renderers-YBIUZDGQ.mjs +0 -1
- package/dist/preview-engine/renderers-YESJR4O7.mjs +0 -1
- package/dist/preview-engine/renderers-YKSRZRRT.mjs +0 -1
- package/dist/program-CKpKkllV.mjs.map +0 -1
- package/dist/renderer--Ac-dg4A.mjs +0 -5
- package/dist/renderer--N7TMqzU.mjs +0 -5
- package/dist/renderer-2ecmdOae.mjs +0 -5
- package/dist/renderer-B2P1vgb7.mjs.map +0 -1
- package/dist/renderer-B5RJp5g-.mjs +0 -5
- package/dist/renderer-B7xyT1Vb.mjs +0 -5
- package/dist/renderer-BBeArN_x.mjs +0 -5
- package/dist/renderer-BCAZDu-r.mjs +0 -5
- package/dist/renderer-BJnhik7Y.mjs +0 -5
- package/dist/renderer-BX7jS14r.d.mts.map +0 -1
- package/dist/renderer-BgO6BA_z.mjs.map +0 -1
- package/dist/renderer-BxRW8MZO.mjs +0 -5
- package/dist/renderer-C-lfsEAN.mjs +0 -5
- package/dist/renderer-C41U1tK6.mjs.map +0 -1
- package/dist/renderer-C6nOFN4-.mjs +0 -5
- package/dist/renderer-C84TSQmS.mjs +0 -5
- package/dist/renderer-C8_6YofT.mjs +0 -5
- package/dist/renderer-COb3tOPG.mjs +0 -5
- package/dist/renderer-CSCIzaLy.mjs +0 -5
- package/dist/renderer-CmI4c8MS.mjs +0 -5
- package/dist/renderer-CqVltdX9.mjs +0 -5
- package/dist/renderer-D-FpMzLY.mjs +0 -5
- package/dist/renderer-D-Oyn9mG.mjs +0 -5
- package/dist/renderer-D2QrkA8_.mjs +0 -5
- package/dist/renderer-D5bjOx83.mjs +0 -3
- package/dist/renderer-D64r4iN-.mjs +0 -5
- package/dist/renderer-DCq6YkgP.mjs +0 -5
- package/dist/renderer-DDHG3GdR.mjs +0 -5
- package/dist/renderer-DMdNfcud.mjs +0 -6
- package/dist/renderer-DPAD6fL1.mjs.map +0 -1
- package/dist/renderer-DZQXZ4lK.mjs +0 -5
- package/dist/renderer-DczJJLA1.mjs +0 -5
- package/dist/renderer-DfqJj9oe.mjs +0 -5
- package/dist/renderer-DgO9ihVJ.mjs +0 -5
- package/dist/renderer-DhgnQZYb.mjs +0 -5
- package/dist/renderer-DjxKjHMf.mjs +0 -5
- package/dist/renderer-DnRDW2Oz.mjs +0 -3
- package/dist/renderer-DqLA5cdR.mjs +0 -5
- package/dist/renderer-Dudp6ZlH.mjs +0 -5
- package/dist/renderer-SSBL4M1o.mjs.map +0 -1
- package/dist/renderer-_jC5KIT1.mjs +0 -5
- package/dist/renderer-cTgAuVmJ.mjs +0 -5
- package/dist/renderer-nVKDvDLO.mjs +0 -5
- package/dist/renderer-pZ6_pUo1.mjs +0 -5
- package/dist/src-DFEqficI.mjs.map +0 -1
- /package/dist/{chunk-BcJoO4Nm.mjs → chunk-W71TSjRM.mjs} +0 -0
- /package/dist/{renderer-COqFNSfV.mjs → renderer-B6rZUBwE.mjs} +0 -0
|
@@ -0,0 +1,1062 @@
|
|
|
1
|
+
import { n as defineRenderer } from "./renderer-BOg8i8eF.mjs";
|
|
2
|
+
import { A as setVisionDevice, C as matchPoseToTracks, D as readTexturePixels, a as PoseSkeletonRenderer, c as TemporalObjectTracker, f as VisionRunner, t as CLIP_SUBJECT, w as mergeSubjectMask, x as maskBounds } from "./src-BU6vm9sP-DFJ3phW0.mjs";
|
|
3
|
+
|
|
4
|
+
//#region ../../nodes/node-vision/dist/renderers-DF17E3A-.mjs
|
|
5
|
+
let scratchValues = new Uint8Array(0);
|
|
6
|
+
let scratchLengths = new Uint32Array(0);
|
|
7
|
+
function encodeMask(mask, width, height) {
|
|
8
|
+
if (scratchValues.length < mask.length) {
|
|
9
|
+
scratchValues = new Uint8Array(mask.length);
|
|
10
|
+
scratchLengths = new Uint32Array(mask.length);
|
|
11
|
+
}
|
|
12
|
+
const values = scratchValues;
|
|
13
|
+
const lengths = scratchLengths;
|
|
14
|
+
let runs = 0;
|
|
15
|
+
let start = 0;
|
|
16
|
+
for (let i = 1; i <= mask.length; i++) if (i === mask.length || mask[i] !== mask[start]) {
|
|
17
|
+
values[runs] = mask[start];
|
|
18
|
+
lengths[runs] = i - start;
|
|
19
|
+
runs++;
|
|
20
|
+
start = i;
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
width,
|
|
24
|
+
height,
|
|
25
|
+
values: values.slice(0, runs),
|
|
26
|
+
lengths: lengths.slice(0, runs)
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function decodeMask(rle) {
|
|
30
|
+
const out = new Uint8Array(rle.width * rle.height);
|
|
31
|
+
let at = 0;
|
|
32
|
+
for (let r = 0; r < rle.values.length; r++) {
|
|
33
|
+
const end = at + rle.lengths[r];
|
|
34
|
+
if (rle.values[r] !== 0) out.fill(rle.values[r], at, end);
|
|
35
|
+
at = end;
|
|
36
|
+
}
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
function rleBytes(rle) {
|
|
40
|
+
return rle.values.byteLength + rle.lengths.byteLength;
|
|
41
|
+
}
|
|
42
|
+
function toCachedMask(mask) {
|
|
43
|
+
const { mask: data, ...rest } = mask;
|
|
44
|
+
return {
|
|
45
|
+
...rest,
|
|
46
|
+
rle: encodeMask(data, mask.width, mask.height)
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function fromCachedMask(mask) {
|
|
50
|
+
const { rle, ...rest } = mask;
|
|
51
|
+
return {
|
|
52
|
+
...rest,
|
|
53
|
+
mask: decodeMask(rle)
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function resultBytes(result) {
|
|
57
|
+
let bytes = 512 + result.detections.length * 128 + result.objects.length * 256;
|
|
58
|
+
for (const m of result.masks ?? []) bytes += rleBytes(m.rle);
|
|
59
|
+
if (result.subject) bytes += rleBytes(result.subject.mask.rle);
|
|
60
|
+
return bytes;
|
|
61
|
+
}
|
|
62
|
+
/** Results by source (node + inference settings) and frame, least recently used out first. */
|
|
63
|
+
var VisionFrameCache = class {
|
|
64
|
+
entries = /* @__PURE__ */ new Map();
|
|
65
|
+
bytes = 0;
|
|
66
|
+
constructor(maxBytes = 256 * 1024 * 1024) {
|
|
67
|
+
this.maxBytes = maxBytes;
|
|
68
|
+
}
|
|
69
|
+
get(source, frame) {
|
|
70
|
+
const key = `${source}#${frame}`;
|
|
71
|
+
const hit = this.entries.get(key);
|
|
72
|
+
if (hit) {
|
|
73
|
+
this.entries.delete(key);
|
|
74
|
+
this.entries.set(key, hit);
|
|
75
|
+
}
|
|
76
|
+
return hit;
|
|
77
|
+
}
|
|
78
|
+
set(source, frame, result) {
|
|
79
|
+
const key = `${source}#${frame}`;
|
|
80
|
+
const old = this.entries.get(key);
|
|
81
|
+
if (old) {
|
|
82
|
+
this.bytes -= resultBytes(old);
|
|
83
|
+
this.entries.delete(key);
|
|
84
|
+
}
|
|
85
|
+
this.entries.set(key, result);
|
|
86
|
+
this.bytes += resultBytes(result);
|
|
87
|
+
for (const [k, v] of this.entries) {
|
|
88
|
+
if (this.bytes <= this.maxBytes) break;
|
|
89
|
+
this.entries.delete(k);
|
|
90
|
+
this.bytes -= resultBytes(v);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
clear() {
|
|
94
|
+
this.entries.clear();
|
|
95
|
+
this.bytes = 0;
|
|
96
|
+
}
|
|
97
|
+
get size() {
|
|
98
|
+
return this.entries.size;
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* GPU composite for the mask-family modes: the picture times the subject mask,
|
|
103
|
+
* in one full-screen pass. Replaces building the RGBA result on the CPU and
|
|
104
|
+
* uploading it; only the 8-bit mask goes to the GPU.
|
|
105
|
+
*
|
|
106
|
+
* - matte: picture × mask (premultiplied, so the background is transparent)
|
|
107
|
+
* - mask: white silhouette (rgb = mask, a = 1)
|
|
108
|
+
* - crop: matte, with the subject's bounding box stretched to the frame
|
|
109
|
+
*/
|
|
110
|
+
const WGSL = `
|
|
111
|
+
struct Params {
|
|
112
|
+
mode: u32, // 0 matte, 1 mask, 2 crop
|
|
113
|
+
_pad: u32,
|
|
114
|
+
cropMin: vec2<f32>, // uv of the subject bounds (crop)
|
|
115
|
+
cropMax: vec2<f32>,
|
|
116
|
+
_pad2: vec2<f32>,
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
@group(0) @binding(0) var<uniform> params: Params;
|
|
120
|
+
@group(0) @binding(1) var picture: texture_2d<f32>;
|
|
121
|
+
@group(0) @binding(2) var mask: texture_2d<f32>;
|
|
122
|
+
@group(0) @binding(3) var samp: sampler;
|
|
123
|
+
|
|
124
|
+
struct VSOut {
|
|
125
|
+
@builtin(position) pos: vec4<f32>,
|
|
126
|
+
@location(0) uv: vec2<f32>,
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
@vertex fn vs(@builtin(vertex_index) i: u32) -> VSOut {
|
|
130
|
+
var p = array<vec2<f32>, 3>(vec2(-1.0, -1.0), vec2(3.0, -1.0), vec2(-1.0, 3.0));
|
|
131
|
+
var out: VSOut;
|
|
132
|
+
out.pos = vec4(p[i], 0.0, 1.0);
|
|
133
|
+
out.uv = vec2(p[i].x * 0.5 + 0.5, 0.5 - p[i].y * 0.5);
|
|
134
|
+
return out;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {
|
|
138
|
+
var uv = in.uv;
|
|
139
|
+
if (params.mode == 2u) {
|
|
140
|
+
uv = mix(params.cropMin, params.cropMax, uv);
|
|
141
|
+
}
|
|
142
|
+
let m = textureSampleLevel(mask, samp, uv, 0.0).r;
|
|
143
|
+
if (params.mode == 1u) {
|
|
144
|
+
return vec4(m, m, m, 1.0);
|
|
145
|
+
}
|
|
146
|
+
return textureSampleLevel(picture, samp, uv, 0.0) * m;
|
|
147
|
+
}
|
|
148
|
+
`;
|
|
149
|
+
var MatteCompositor = class {
|
|
150
|
+
pipeline;
|
|
151
|
+
sampler;
|
|
152
|
+
uniforms = [];
|
|
153
|
+
uniformIndex = 0;
|
|
154
|
+
/** One 8-bit mask texture per node, rewritten each frame. */
|
|
155
|
+
masks = /* @__PURE__ */ new Map();
|
|
156
|
+
constructor(device, format) {
|
|
157
|
+
this.device = device;
|
|
158
|
+
const module = device.createShaderModule({
|
|
159
|
+
label: "vision_matte_composite",
|
|
160
|
+
code: WGSL
|
|
161
|
+
});
|
|
162
|
+
this.pipeline = device.createRenderPipeline({
|
|
163
|
+
label: "vision_matte_composite",
|
|
164
|
+
layout: "auto",
|
|
165
|
+
vertex: {
|
|
166
|
+
module,
|
|
167
|
+
entryPoint: "vs"
|
|
168
|
+
},
|
|
169
|
+
fragment: {
|
|
170
|
+
module,
|
|
171
|
+
entryPoint: "fs",
|
|
172
|
+
targets: [{ format }]
|
|
173
|
+
},
|
|
174
|
+
primitive: { topology: "triangle-list" }
|
|
175
|
+
});
|
|
176
|
+
this.sampler = device.createSampler({
|
|
177
|
+
magFilter: "linear",
|
|
178
|
+
minFilter: "linear"
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
/** Uploads a frame-sized 0..255 mask for `key` and returns its texture. */
|
|
182
|
+
uploadMask(key, mask, width, height) {
|
|
183
|
+
let tex = this.masks.get(key);
|
|
184
|
+
if (!tex || tex.width !== width || tex.height !== height) {
|
|
185
|
+
tex?.destroy();
|
|
186
|
+
tex = this.device.createTexture({
|
|
187
|
+
label: `vision_mask_${key}`,
|
|
188
|
+
size: [width, height],
|
|
189
|
+
format: "r8unorm",
|
|
190
|
+
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST
|
|
191
|
+
});
|
|
192
|
+
this.masks.set(key, tex);
|
|
193
|
+
}
|
|
194
|
+
const aligned = Math.ceil(width / 256) * 256;
|
|
195
|
+
let bytes = mask;
|
|
196
|
+
if (aligned !== width) {
|
|
197
|
+
bytes = new Uint8Array(aligned * height);
|
|
198
|
+
for (let y = 0; y < height; y++) bytes.set(mask.subarray(y * width, (y + 1) * width), y * aligned);
|
|
199
|
+
}
|
|
200
|
+
this.device.queue.writeTexture({ texture: tex }, bytes.buffer, {
|
|
201
|
+
offset: bytes.byteOffset,
|
|
202
|
+
bytesPerRow: aligned,
|
|
203
|
+
rowsPerImage: height
|
|
204
|
+
}, {
|
|
205
|
+
width,
|
|
206
|
+
height
|
|
207
|
+
});
|
|
208
|
+
return tex;
|
|
209
|
+
}
|
|
210
|
+
/** Clears `target` and draws `picture` through `mask` into it. */
|
|
211
|
+
draw(encoder, target, picture, mask, mode, bounds) {
|
|
212
|
+
const w = mask.width;
|
|
213
|
+
const h = mask.height;
|
|
214
|
+
const data = new Float32Array(8);
|
|
215
|
+
const view = new Uint32Array(data.buffer);
|
|
216
|
+
view[0] = mode === "matte" ? 0 : mode === "mask" ? 1 : 2;
|
|
217
|
+
if (mode === "crop" && bounds) {
|
|
218
|
+
data[2] = bounds.x0 / w;
|
|
219
|
+
data[3] = bounds.y0 / h;
|
|
220
|
+
data[4] = (bounds.x1 + 1) / w;
|
|
221
|
+
data[5] = (bounds.y1 + 1) / h;
|
|
222
|
+
} else {
|
|
223
|
+
data[2] = 0;
|
|
224
|
+
data[3] = 0;
|
|
225
|
+
data[4] = 1;
|
|
226
|
+
data[5] = 1;
|
|
227
|
+
if (mode === "crop") view[0] = 0;
|
|
228
|
+
}
|
|
229
|
+
if (this.uniformIndex >= this.uniforms.length) this.uniforms.push(this.device.createBuffer({
|
|
230
|
+
size: data.byteLength,
|
|
231
|
+
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
|
|
232
|
+
}));
|
|
233
|
+
const uniform = this.uniforms[this.uniformIndex];
|
|
234
|
+
this.uniformIndex = (this.uniformIndex + 1) % 16;
|
|
235
|
+
this.device.queue.writeBuffer(uniform, 0, data);
|
|
236
|
+
const bindGroup = this.device.createBindGroup({
|
|
237
|
+
layout: this.pipeline.getBindGroupLayout(0),
|
|
238
|
+
entries: [
|
|
239
|
+
{
|
|
240
|
+
binding: 0,
|
|
241
|
+
resource: { buffer: uniform }
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
binding: 1,
|
|
245
|
+
resource: picture.createView()
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
binding: 2,
|
|
249
|
+
resource: mask.createView()
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
binding: 3,
|
|
253
|
+
resource: this.sampler
|
|
254
|
+
}
|
|
255
|
+
]
|
|
256
|
+
});
|
|
257
|
+
const pass = encoder.beginRenderPass({
|
|
258
|
+
label: "vision_matte_composite",
|
|
259
|
+
colorAttachments: [{
|
|
260
|
+
view: target,
|
|
261
|
+
loadOp: "clear",
|
|
262
|
+
storeOp: "store",
|
|
263
|
+
clearValue: {
|
|
264
|
+
r: 0,
|
|
265
|
+
g: 0,
|
|
266
|
+
b: 0,
|
|
267
|
+
a: 0
|
|
268
|
+
}
|
|
269
|
+
}]
|
|
270
|
+
});
|
|
271
|
+
pass.setPipeline(this.pipeline);
|
|
272
|
+
pass.setBindGroup(0, bindGroup);
|
|
273
|
+
pass.draw(3);
|
|
274
|
+
pass.end();
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
/**
|
|
278
|
+
* Runners by model options (variant, models dir, mirror), each with the runners
|
|
279
|
+
* derived from it by decode options — layers that differ only in classes or
|
|
280
|
+
* confidence share sessions instead of reloading the models.
|
|
281
|
+
*/
|
|
282
|
+
const sharedRunners = /* @__PURE__ */ new Map();
|
|
283
|
+
const MAX_SHARED_RUNNERS = 4;
|
|
284
|
+
let sharedSkeletonRenderer = null;
|
|
285
|
+
let sharedCompositor = null;
|
|
286
|
+
let sharedCompositorFormat = null;
|
|
287
|
+
/** Analysed frames, shared by every vision node in the process. */
|
|
288
|
+
const frameCache = new VisionFrameCache();
|
|
289
|
+
/** The frame each node's child texture holds (drawn on its last call). */
|
|
290
|
+
const heldFrameByNode = /* @__PURE__ */ new Map();
|
|
291
|
+
/** Per node: a copy of the held frame, the frame being analysed, and the composited matte. */
|
|
292
|
+
const heldTextures = /* @__PURE__ */ new Map();
|
|
293
|
+
const analysisTextures = /* @__PURE__ */ new Map();
|
|
294
|
+
const matteTextures = /* @__PURE__ */ new Map();
|
|
295
|
+
/** One tracker per vision node — track ids must not mix across nodes/sources. */
|
|
296
|
+
const objectTrackers = /* @__PURE__ */ new Map();
|
|
297
|
+
/**
|
|
298
|
+
* Persistent per-node child textures. The shared frame encoder is submitted at
|
|
299
|
+
* the END of the frame, so a node renderer cannot read back the child it just
|
|
300
|
+
* drew. We keep the texture around and read back the PREVIOUS frame's pixels at
|
|
301
|
+
* the start of the next call — a stable one-frame delay instead of the
|
|
302
|
+
* unpredictable multi-frame lag you get from pooled textures.
|
|
303
|
+
*
|
|
304
|
+
* Keyed on the stable Vision `Effect` instance (render ids change every frame),
|
|
305
|
+
* with a size-keyed fallback for raw operation nodes.
|
|
306
|
+
*/
|
|
307
|
+
const childTexturesByEffect = /* @__PURE__ */ new WeakMap();
|
|
308
|
+
const childTexturesByKey = /* @__PURE__ */ new Map();
|
|
309
|
+
/**
|
|
310
|
+
* Last successful subject mask, reused for a few frames when the model misses —
|
|
311
|
+
* a transient miss then holds the silhouette instead of flashing the raw plate.
|
|
312
|
+
* Keyed per node/effect so multiple vision nodes do not collide.
|
|
313
|
+
*/
|
|
314
|
+
const lastSubjectByNode = /* @__PURE__ */ new Map();
|
|
315
|
+
const SUBJECT_HOLD_FRAMES = 3;
|
|
316
|
+
/** A per-node texture shaped like `like`, recreated when the size changes. */
|
|
317
|
+
function nodeTexture(textures, device, key, like, usage, label) {
|
|
318
|
+
let tex = textures.get(key);
|
|
319
|
+
if (!tex || tex.width !== like.width || tex.height !== like.height || tex.format !== like.format) {
|
|
320
|
+
tex?.destroy();
|
|
321
|
+
tex = device.createTexture({
|
|
322
|
+
size: [like.width, like.height],
|
|
323
|
+
format: like.format,
|
|
324
|
+
usage,
|
|
325
|
+
label
|
|
326
|
+
});
|
|
327
|
+
textures.set(key, tex);
|
|
328
|
+
}
|
|
329
|
+
return tex;
|
|
330
|
+
}
|
|
331
|
+
const heldTexture = (device, key, like) => nodeTexture(heldTextures, device, key, like, GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING, "vision_held_frame");
|
|
332
|
+
const analysisTexture = (device, key, like) => nodeTexture(analysisTextures, device, key, like, GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC, "vision_analysis_frame");
|
|
333
|
+
const matteTexture = (device, key, like) => nodeTexture(matteTextures, device, key, like, GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC, "vision_matte");
|
|
334
|
+
/** Everything that decides a frame's results besides the frame itself. */
|
|
335
|
+
function cacheSource(nodeKey, child, op, width, height) {
|
|
336
|
+
const c = child;
|
|
337
|
+
return JSON.stringify([
|
|
338
|
+
nodeKey,
|
|
339
|
+
c?.operation?.id ?? c?.id ?? null,
|
|
340
|
+
width,
|
|
341
|
+
height,
|
|
342
|
+
op.mode ?? "passthrough",
|
|
343
|
+
op.variant,
|
|
344
|
+
op.confidence,
|
|
345
|
+
op.classes,
|
|
346
|
+
op.maskThreshold,
|
|
347
|
+
op.featherRadius,
|
|
348
|
+
op.matteSource,
|
|
349
|
+
op.keyBackground === true,
|
|
350
|
+
op.maxMissedFrames
|
|
351
|
+
]);
|
|
352
|
+
}
|
|
353
|
+
/** The background-key threshold at `frame` (it may be animated). */
|
|
354
|
+
function backgroundKeyThreshold(op, frame, fps) {
|
|
355
|
+
const raw = op.backgroundKeyThreshold;
|
|
356
|
+
if (typeof raw === "number") return raw;
|
|
357
|
+
if (typeof raw?.get === "function") return Number(raw.get({
|
|
358
|
+
frame,
|
|
359
|
+
fps
|
|
360
|
+
}));
|
|
361
|
+
if (typeof raw?._value === "number") return Number(raw._value);
|
|
362
|
+
return 70;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* The model's subject, or the last one through brief misses: a transient miss
|
|
366
|
+
* then holds the silhouette instead of flashing the raw plate.
|
|
367
|
+
*/
|
|
368
|
+
function selectSubject(selected, nodeKey, frame) {
|
|
369
|
+
if (selected) {
|
|
370
|
+
lastSubjectByNode.set(nodeKey, {
|
|
371
|
+
mask: selected,
|
|
372
|
+
frame
|
|
373
|
+
});
|
|
374
|
+
return selected;
|
|
375
|
+
}
|
|
376
|
+
const last = lastSubjectByNode.get(nodeKey);
|
|
377
|
+
if (last && frame - last.frame <= SUBJECT_HOLD_FRAMES) return last.mask;
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Lazy shared runner — `create()` is a pure constructor (zero I/O); the first frame that
|
|
381
|
+
* requests a task triggers that task's model download at inference time (never at init).
|
|
382
|
+
* Nodes with the same model options share sessions; decode options (classes,
|
|
383
|
+
* confidence, …) get a derived runner over the same sessions.
|
|
384
|
+
*/
|
|
385
|
+
function getSharedRunner(op) {
|
|
386
|
+
const modelOptions = {
|
|
387
|
+
variant: op.variant,
|
|
388
|
+
modelsDir: op.modelsDir,
|
|
389
|
+
baseUrl: op.baseUrl
|
|
390
|
+
};
|
|
391
|
+
const modelKey = JSON.stringify(modelOptions);
|
|
392
|
+
let entry = sharedRunners.get(modelKey);
|
|
393
|
+
if (!entry) {
|
|
394
|
+
if (sharedRunners.size >= MAX_SHARED_RUNNERS) {
|
|
395
|
+
const [oldestKey, oldest] = sharedRunners.entries().next().value;
|
|
396
|
+
oldest.runner.close();
|
|
397
|
+
sharedRunners.delete(oldestKey);
|
|
398
|
+
}
|
|
399
|
+
entry = {
|
|
400
|
+
runner: VisionRunner.create(modelOptions),
|
|
401
|
+
derived: /* @__PURE__ */ new Map()
|
|
402
|
+
};
|
|
403
|
+
sharedRunners.set(modelKey, entry);
|
|
404
|
+
}
|
|
405
|
+
const decodeOptions = {
|
|
406
|
+
confidence: op.confidence,
|
|
407
|
+
classes: op.classes,
|
|
408
|
+
maskThreshold: op.maskThreshold,
|
|
409
|
+
featherRadius: op.featherRadius
|
|
410
|
+
};
|
|
411
|
+
const decodeKey = JSON.stringify(decodeOptions);
|
|
412
|
+
let runner = entry.derived.get(decodeKey);
|
|
413
|
+
if (!runner) {
|
|
414
|
+
runner = entry.runner.derive(decodeOptions);
|
|
415
|
+
entry.derived.set(decodeKey, runner);
|
|
416
|
+
}
|
|
417
|
+
return runner;
|
|
418
|
+
}
|
|
419
|
+
function getObjectTracker(nodeKey, op) {
|
|
420
|
+
let tracker = objectTrackers.get(nodeKey);
|
|
421
|
+
if (!tracker) {
|
|
422
|
+
tracker = new TemporalObjectTracker({ maxMissedFrames: op.maxMissedFrames ?? 15 });
|
|
423
|
+
objectTrackers.set(nodeKey, tracker);
|
|
424
|
+
}
|
|
425
|
+
return tracker;
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Normalizes the runner's pose keypoints (plate pixel space) to [0, 1] landmarks, which is
|
|
429
|
+
* the contract the signal bundle and the skeleton pipeline expect.
|
|
430
|
+
*/
|
|
431
|
+
function normalizePoseKeypoints(result, width, height) {
|
|
432
|
+
if (width <= 0 || height <= 0) return result;
|
|
433
|
+
return { people: result.people.map((person) => ({
|
|
434
|
+
...person,
|
|
435
|
+
keypoints: person.keypoints.map((k) => ({
|
|
436
|
+
x: k.x / width,
|
|
437
|
+
y: k.y / height,
|
|
438
|
+
visibility: k.visibility
|
|
439
|
+
}))
|
|
440
|
+
})) };
|
|
441
|
+
}
|
|
442
|
+
/** Case-insensitive class filter, as the runner's decode applies it. */
|
|
443
|
+
function matchesClasses(category, classes) {
|
|
444
|
+
if (!classes) return true;
|
|
445
|
+
const c = category.toLowerCase();
|
|
446
|
+
return classes.some((k) => k.toLowerCase() === c);
|
|
447
|
+
}
|
|
448
|
+
/** Assigns each decoded instance mask to the temporal track whose box center is nearest the mask's centroid. */
|
|
449
|
+
function assignMasksToTracks(masks, tracked) {
|
|
450
|
+
return masks.map((mask) => {
|
|
451
|
+
const { cx, cy } = maskCentroid(mask);
|
|
452
|
+
let best = null;
|
|
453
|
+
for (const obj of tracked) {
|
|
454
|
+
const dx = obj.centerX - cx;
|
|
455
|
+
const dy = obj.centerY - cy;
|
|
456
|
+
const distance = dx * dx + dy * dy;
|
|
457
|
+
if (!best || distance < best.distance) best = {
|
|
458
|
+
trackId: obj.trackId,
|
|
459
|
+
distance
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
return best ? {
|
|
463
|
+
...mask,
|
|
464
|
+
trackId: best.trackId
|
|
465
|
+
} : mask;
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Grows a subject mask into connected foreground pixels — seeding a flood fill
|
|
470
|
+
* from the subject through pixels that differ from the sampled backdrop recovers
|
|
471
|
+
* thin or fast-moving edges (hair, fabric) without adding a near-uniform studio
|
|
472
|
+
* wall or its soft grey shadow.
|
|
473
|
+
*/
|
|
474
|
+
function fillInternalHoles(mask, width, height) {
|
|
475
|
+
const n = width * height;
|
|
476
|
+
const exterior = new Uint8Array(n);
|
|
477
|
+
const queue = new Int32Array(n);
|
|
478
|
+
let tail = 0;
|
|
479
|
+
const seed = (i) => {
|
|
480
|
+
if (exterior[i] || mask[i] > 0) return;
|
|
481
|
+
exterior[i] = 1;
|
|
482
|
+
queue[tail++] = i;
|
|
483
|
+
};
|
|
484
|
+
for (let x = 0; x < width; x++) {
|
|
485
|
+
seed(x);
|
|
486
|
+
seed((height - 1) * width + x);
|
|
487
|
+
}
|
|
488
|
+
for (let y = 0; y < height; y++) {
|
|
489
|
+
seed(y * width);
|
|
490
|
+
seed(y * width + width - 1);
|
|
491
|
+
}
|
|
492
|
+
let head = 0;
|
|
493
|
+
while (head < tail) {
|
|
494
|
+
const i = queue[head++];
|
|
495
|
+
const x = i % width;
|
|
496
|
+
let j = i + 1;
|
|
497
|
+
if (x + 1 < width && !exterior[j] && mask[j] === 0) {
|
|
498
|
+
exterior[j] = 1;
|
|
499
|
+
queue[tail++] = j;
|
|
500
|
+
}
|
|
501
|
+
j = i - 1;
|
|
502
|
+
if (x > 0 && !exterior[j] && mask[j] === 0) {
|
|
503
|
+
exterior[j] = 1;
|
|
504
|
+
queue[tail++] = j;
|
|
505
|
+
}
|
|
506
|
+
j = i + width;
|
|
507
|
+
if (j < n && !exterior[j] && mask[j] === 0) {
|
|
508
|
+
exterior[j] = 1;
|
|
509
|
+
queue[tail++] = j;
|
|
510
|
+
}
|
|
511
|
+
j = i - width;
|
|
512
|
+
if (j >= 0 && !exterior[j] && mask[j] === 0) {
|
|
513
|
+
exterior[j] = 1;
|
|
514
|
+
queue[tail++] = j;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
for (let i = 0; i < n; i++) if (mask[i] === 0 && exterior[i] === 0) mask[i] = 255;
|
|
518
|
+
}
|
|
519
|
+
function smoothMaskBoundary(mask, width, height, radius = 2) {
|
|
520
|
+
if (radius <= 0) return mask;
|
|
521
|
+
const temp = new Uint8Array(width * height);
|
|
522
|
+
const out = new Uint8Array(width * height);
|
|
523
|
+
const div = 2 * radius + 1;
|
|
524
|
+
for (let y = 0; y < height; y++) {
|
|
525
|
+
const row = y * width;
|
|
526
|
+
let sum = 0;
|
|
527
|
+
for (let k = -radius; k <= radius; k++) {
|
|
528
|
+
const x = Math.max(0, Math.min(width - 1, k));
|
|
529
|
+
sum += mask[row + x];
|
|
530
|
+
}
|
|
531
|
+
for (let x = 0; x < width; x++) {
|
|
532
|
+
temp[row + x] = Math.round(sum / div);
|
|
533
|
+
const xOut = Math.max(0, x - radius);
|
|
534
|
+
const xIn = Math.min(width - 1, x + radius + 1);
|
|
535
|
+
sum += mask[row + xIn] - mask[row + xOut];
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
const sums = new Float64Array(width);
|
|
539
|
+
for (let k = -radius; k <= radius; k++) {
|
|
540
|
+
const row = Math.max(0, Math.min(height - 1, k)) * width;
|
|
541
|
+
for (let x = 0; x < width; x++) sums[x] += temp[row + x];
|
|
542
|
+
}
|
|
543
|
+
for (let y = 0; y < height; y++) {
|
|
544
|
+
const row = y * width;
|
|
545
|
+
const rowOut = Math.max(0, y - radius) * width;
|
|
546
|
+
const rowIn = Math.min(height - 1, y + radius + 1) * width;
|
|
547
|
+
for (let x = 0; x < width; x++) {
|
|
548
|
+
out[row + x] = Math.round(sums[x] / div);
|
|
549
|
+
sums[x] += temp[rowIn + x] - temp[rowOut + x];
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
return out;
|
|
553
|
+
}
|
|
554
|
+
function growMaskIntoForeground(mask, width, height, pixels, threshold, featherRadius) {
|
|
555
|
+
let br = 0;
|
|
556
|
+
let bg = 0;
|
|
557
|
+
let bb = 0;
|
|
558
|
+
let count = 0;
|
|
559
|
+
const sample = (x, y) => {
|
|
560
|
+
const i = y * width + x;
|
|
561
|
+
if (mask[i]) return;
|
|
562
|
+
const p = i * 4;
|
|
563
|
+
br += pixels[p];
|
|
564
|
+
bg += pixels[p + 1];
|
|
565
|
+
bb += pixels[p + 2];
|
|
566
|
+
count++;
|
|
567
|
+
};
|
|
568
|
+
for (let x = 0; x < width; x += 4) {
|
|
569
|
+
sample(x, 0);
|
|
570
|
+
sample(x, height - 1);
|
|
571
|
+
}
|
|
572
|
+
for (let y = 0; y < height; y += 4) {
|
|
573
|
+
sample(0, y);
|
|
574
|
+
sample(width - 1, y);
|
|
575
|
+
}
|
|
576
|
+
if (count === 0) return mask;
|
|
577
|
+
br /= count;
|
|
578
|
+
bg /= count;
|
|
579
|
+
bb /= count;
|
|
580
|
+
const n = width * height;
|
|
581
|
+
const fg = new Uint8Array(n);
|
|
582
|
+
for (let i = 0, p = 0; i < n; i++, p += 4) fg[i] = Math.max(Math.abs(pixels[p] - br), Math.abs(pixels[p + 1] - bg), Math.abs(pixels[p + 2] - bb)) > threshold ? 1 : 0;
|
|
583
|
+
const queue = new Int32Array(n);
|
|
584
|
+
let tail = 0;
|
|
585
|
+
for (let i = 0; i < n; i++) if (mask[i] > 0) {
|
|
586
|
+
if (fg[i]) mask[i] = 255;
|
|
587
|
+
queue[tail++] = i;
|
|
588
|
+
}
|
|
589
|
+
let head = 0;
|
|
590
|
+
while (head < tail) {
|
|
591
|
+
const i = queue[head++];
|
|
592
|
+
const x = i % width;
|
|
593
|
+
let j = i + 1;
|
|
594
|
+
if (x + 1 < width && mask[j] !== 255 && fg[j]) {
|
|
595
|
+
mask[j] = 255;
|
|
596
|
+
queue[tail++] = j;
|
|
597
|
+
}
|
|
598
|
+
j = i - 1;
|
|
599
|
+
if (x > 0 && mask[j] !== 255 && fg[j]) {
|
|
600
|
+
mask[j] = 255;
|
|
601
|
+
queue[tail++] = j;
|
|
602
|
+
}
|
|
603
|
+
j = i + width;
|
|
604
|
+
if (j < n && mask[j] !== 255 && fg[j]) {
|
|
605
|
+
mask[j] = 255;
|
|
606
|
+
queue[tail++] = j;
|
|
607
|
+
}
|
|
608
|
+
j = i - width;
|
|
609
|
+
if (j >= 0 && mask[j] !== 255 && fg[j]) {
|
|
610
|
+
mask[j] = 255;
|
|
611
|
+
queue[tail++] = j;
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
fillInternalHoles(mask, width, height);
|
|
615
|
+
return smoothMaskBoundary(mask, width, height, featherRadius !== void 0 && featherRadius > 0 ? Math.max(1, Math.min(8, Math.round(featherRadius * 50))) : 2);
|
|
616
|
+
}
|
|
617
|
+
function maskCentroid(mask) {
|
|
618
|
+
const { mask: data, width, height } = mask;
|
|
619
|
+
let sumX = 0;
|
|
620
|
+
let sumY = 0;
|
|
621
|
+
let count = 0;
|
|
622
|
+
for (let y = 0; y < height; y++) {
|
|
623
|
+
const row = y * width;
|
|
624
|
+
for (let x = 0; x < width; x++) if (data[row + x] > 0) {
|
|
625
|
+
sumX += x;
|
|
626
|
+
sumY += y;
|
|
627
|
+
count++;
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
if (count === 0) return {
|
|
631
|
+
cx: 0,
|
|
632
|
+
cy: 0
|
|
633
|
+
};
|
|
634
|
+
return {
|
|
635
|
+
cx: sumX / count,
|
|
636
|
+
cy: sumY / count
|
|
637
|
+
};
|
|
638
|
+
}
|
|
639
|
+
const VisionWebGPURenderer = async (args) => {
|
|
640
|
+
const { ctx, encoder, pass, targetView, targetWidth, targetHeight, props, drawChild } = args;
|
|
641
|
+
const { virtualMedia } = props;
|
|
642
|
+
setVisionDevice(ctx.device);
|
|
643
|
+
const rawOp = virtualMedia?.operation;
|
|
644
|
+
if (rawOp?.op !== "Vision") return;
|
|
645
|
+
const op = rawOp;
|
|
646
|
+
pass.end();
|
|
647
|
+
const childMedia = virtualMedia?.children?.[0];
|
|
648
|
+
if (!childMedia) return;
|
|
649
|
+
if (op.mode === "depth") {
|
|
650
|
+
drawClipDepth(ctx, encoder, targetView, targetWidth, targetHeight, op.effect, props.sourceTimeSec === void 0 ? props.frame ?? 0 : props.sourceTimeSec * (props.fps ?? 24), props.fps ?? 24);
|
|
651
|
+
return;
|
|
652
|
+
}
|
|
653
|
+
const effectKey = op.effect;
|
|
654
|
+
const hasEffectKey = effectKey !== void 0 && effectKey !== null;
|
|
655
|
+
const nodeKeyStr = virtualMedia?.id ?? rawOp?.id ?? `${targetWidth}x${targetHeight}_${op.mode}_${op.variant}_${op.keyBackground}_${op.backgroundKeyThreshold}`;
|
|
656
|
+
const fallbackKey = `vision-${nodeKeyStr}`;
|
|
657
|
+
let childTex = hasEffectKey ? childTexturesByEffect.get(effectKey) : childTexturesByKey.get(fallbackKey);
|
|
658
|
+
if (childTex && (childTex.width !== targetWidth || childTex.height !== targetHeight)) {
|
|
659
|
+
childTex.destroy();
|
|
660
|
+
childTex = void 0;
|
|
661
|
+
if (hasEffectKey) childTexturesByEffect.delete(effectKey);
|
|
662
|
+
else childTexturesByKey.delete(fallbackKey);
|
|
663
|
+
}
|
|
664
|
+
const hasPreviousFrame = childTex !== void 0;
|
|
665
|
+
if (!childTex) {
|
|
666
|
+
childTex = ctx.device.createTexture({
|
|
667
|
+
size: [targetWidth, targetHeight],
|
|
668
|
+
format: ctx.renderer.format,
|
|
669
|
+
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC,
|
|
670
|
+
label: "vision_child_persistent"
|
|
671
|
+
});
|
|
672
|
+
if (hasEffectKey) childTexturesByEffect.set(effectKey, childTex);
|
|
673
|
+
else childTexturesByKey.set(fallbackKey, childTex);
|
|
674
|
+
if (childTexturesByKey.size > 4) {
|
|
675
|
+
const oldest = childTexturesByKey.keys().next().value;
|
|
676
|
+
if (oldest && oldest !== fallbackKey) {
|
|
677
|
+
childTexturesByKey.get(oldest)?.destroy();
|
|
678
|
+
childTexturesByKey.delete(oldest);
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
const frameIdx = props.frame ?? 0;
|
|
683
|
+
const compositionFrame = props.compositionFrame ?? frameIdx;
|
|
684
|
+
const fps = props.fps ?? 24;
|
|
685
|
+
const mode = op.mode ?? "passthrough";
|
|
686
|
+
const isMatteMode = mode === "mask" || mode === "matte" || mode === "crop";
|
|
687
|
+
const visionBundle = op.visionBundle ?? virtualMedia.visionBundle;
|
|
688
|
+
const wantsDetection = op.enableDetection !== false || mode === "boxes" || mode === "tracking";
|
|
689
|
+
const wantsSegmentation = op.enableSegmentation === true || isMatteMode && op.matteSource !== "selfie";
|
|
690
|
+
const wantsSelfie = op.enableMatte === true || isMatteMode && op.matteSource === "selfie";
|
|
691
|
+
const wantsPose = op.enablePose === true || mode === "skeleton";
|
|
692
|
+
const clipSubject = isMatteMode && !visionBundle && !wantsPose && !wantsSelfie && op.keyBackground !== true ? clipSubjectFor(effectKey, props.sourceTimeSec === void 0 ? frameIdx : props.sourceTimeSec * fps, fps, targetWidth, targetHeight) : void 0;
|
|
693
|
+
const clipPose = mode === "skeleton" && !visionBundle ? clipPoseFor(effectKey, props.sourceTimeSec === void 0 ? frameIdx : props.sourceTimeSec * fps, fps, targetWidth, targetHeight) : void 0;
|
|
694
|
+
const fromClip = clipSubject !== void 0 || clipPose !== void 0;
|
|
695
|
+
const cacheable = !fromClip && !wantsSelfie && !wantsPose && (wantsDetection || wantsSegmentation);
|
|
696
|
+
const source = cacheable ? cacheSource(nodeKeyStr, childMedia, op, targetWidth, targetHeight) : "";
|
|
697
|
+
const keyThresholdAt = (frame$1) => op.keyBackground === true ? backgroundKeyThreshold(op, compositionFrame - (frameIdx - frame$1), fps) : void 0;
|
|
698
|
+
const lookup = (frame$1) => {
|
|
699
|
+
if (!cacheable || frame$1 === void 0) return void 0;
|
|
700
|
+
const hit = frameCache.get(source, frame$1);
|
|
701
|
+
if (!hit || hit.keyThreshold !== keyThresholdAt(frame$1)) return void 0;
|
|
702
|
+
if (wantsSegmentation && visionBundle && !hit.masks) return void 0;
|
|
703
|
+
return hit;
|
|
704
|
+
};
|
|
705
|
+
const heldFrame = hasPreviousFrame ? heldFrameByNode.get(nodeKeyStr) : void 0;
|
|
706
|
+
let cached = lookup(frameIdx);
|
|
707
|
+
const exact = fromClip || cached !== void 0;
|
|
708
|
+
if (!cached) cached = lookup(heldFrame);
|
|
709
|
+
let heldTex;
|
|
710
|
+
if (isMatteMode && hasPreviousFrame && !exact) {
|
|
711
|
+
heldTex = heldTexture(ctx.device, nodeKeyStr, childTex);
|
|
712
|
+
encoder.copyTextureToTexture({ texture: childTex }, { texture: heldTex }, [
|
|
713
|
+
targetWidth,
|
|
714
|
+
targetHeight,
|
|
715
|
+
1
|
|
716
|
+
]);
|
|
717
|
+
}
|
|
718
|
+
let frame;
|
|
719
|
+
let framePixels = null;
|
|
720
|
+
if (hasPreviousFrame && !cached && !fromClip) {
|
|
721
|
+
const analysis = analysisTexture(ctx.device, nodeKeyStr, childTex);
|
|
722
|
+
const copy = ctx.device.createCommandEncoder({ label: "vision_analysis_copy" });
|
|
723
|
+
copy.copyTextureToTexture({ texture: childTex }, { texture: analysis }, [
|
|
724
|
+
targetWidth,
|
|
725
|
+
targetHeight,
|
|
726
|
+
1
|
|
727
|
+
]);
|
|
728
|
+
ctx.device.queue.submit([copy.finish()]);
|
|
729
|
+
frame = {
|
|
730
|
+
texture: analysis,
|
|
731
|
+
device: ctx.device,
|
|
732
|
+
width: targetWidth,
|
|
733
|
+
height: targetHeight
|
|
734
|
+
};
|
|
735
|
+
if (isMatteMode && op.keyBackground === true) framePixels = (await readTexturePixels(frame)).data;
|
|
736
|
+
}
|
|
737
|
+
const childView = childTex.createView();
|
|
738
|
+
ctx.renderer.beginFrame(encoder, childView, {
|
|
739
|
+
r: 0,
|
|
740
|
+
g: 0,
|
|
741
|
+
b: 0,
|
|
742
|
+
a: 0
|
|
743
|
+
}, targetWidth, targetHeight, "clear").end();
|
|
744
|
+
await drawChild(childMedia, { ...props }, childView, childTex, targetWidth, targetHeight);
|
|
745
|
+
heldFrameByNode.set(nodeKeyStr, frameIdx);
|
|
746
|
+
let frameObjects = [];
|
|
747
|
+
let frameMasks = [];
|
|
748
|
+
let personMatte;
|
|
749
|
+
let currentPoseRes;
|
|
750
|
+
let subject;
|
|
751
|
+
if (fromClip) {
|
|
752
|
+
subject = clipSubject ?? void 0;
|
|
753
|
+
if (subject) lastSubjectByNode.set(nodeKeyStr, {
|
|
754
|
+
mask: subject,
|
|
755
|
+
frame: frameIdx
|
|
756
|
+
});
|
|
757
|
+
else lastSubjectByNode.delete(nodeKeyStr);
|
|
758
|
+
} else if (cached) {
|
|
759
|
+
frameObjects = cached.objects;
|
|
760
|
+
if (wantsDetection) visionBundle?.setObjectResult(frameIdx, {
|
|
761
|
+
objects: cached.objects,
|
|
762
|
+
rawDetections: cached.detections
|
|
763
|
+
});
|
|
764
|
+
if (wantsSegmentation && visionBundle && cached.masks) {
|
|
765
|
+
frameMasks = cached.masks.map(fromCachedMask);
|
|
766
|
+
visionBundle.setMaskResult(frameIdx, frameMasks);
|
|
767
|
+
}
|
|
768
|
+
if (cached.subject) {
|
|
769
|
+
subject = fromCachedMask(cached.subject.mask);
|
|
770
|
+
lastSubjectByNode.set(nodeKeyStr, {
|
|
771
|
+
mask: subject,
|
|
772
|
+
frame: frameIdx
|
|
773
|
+
});
|
|
774
|
+
}
|
|
775
|
+
} else if (frame) {
|
|
776
|
+
const runner = getSharedRunner(op);
|
|
777
|
+
const image = frame;
|
|
778
|
+
let detections = [];
|
|
779
|
+
if (wantsDetection) {
|
|
780
|
+
detections = await runner.detect(image);
|
|
781
|
+
const tracker = getObjectTracker(nodeKeyStr, op);
|
|
782
|
+
if (frameIdx === 0) tracker.reset();
|
|
783
|
+
frameObjects = tracker.update(detections, frameIdx, fps);
|
|
784
|
+
visionBundle?.setObjectResult(frameIdx, {
|
|
785
|
+
objects: frameObjects,
|
|
786
|
+
rawDetections: detections
|
|
787
|
+
});
|
|
788
|
+
}
|
|
789
|
+
let subjectMasks = [];
|
|
790
|
+
if (wantsSegmentation) {
|
|
791
|
+
const subjectFromAllClasses = isMatteMode && op.matteSource !== "selfie" && op.classes !== void 0;
|
|
792
|
+
const segRes = await (subjectFromAllClasses ? getSharedRunner({
|
|
793
|
+
...op,
|
|
794
|
+
classes: void 0
|
|
795
|
+
}) : runner).segment(image);
|
|
796
|
+
frameMasks = assignMasksToTracks(subjectFromAllClasses ? segRes.masks.filter((m) => matchesClasses(m.category, op.classes)) : segRes.masks, frameObjects);
|
|
797
|
+
subjectMasks = subjectFromAllClasses ? segRes.masks : frameMasks;
|
|
798
|
+
visionBundle?.setMaskResult(frameIdx, frameMasks);
|
|
799
|
+
}
|
|
800
|
+
if (wantsSelfie) {
|
|
801
|
+
personMatte = await runner.matte(image);
|
|
802
|
+
visionBundle?.setMatteResult(frameIdx, personMatte);
|
|
803
|
+
}
|
|
804
|
+
if (wantsPose) {
|
|
805
|
+
currentPoseRes = { people: matchPoseToTracks(normalizePoseKeypoints(await runner.pose(image), image.width, image.height).people, frameObjects) };
|
|
806
|
+
visionBundle?.setPoseResult(frameIdx, currentPoseRes);
|
|
807
|
+
}
|
|
808
|
+
if (isMatteMode) {
|
|
809
|
+
subject = selectSubject(op.matteSource === "selfie" ? personMatteAsMask(personMatte) : mergeSubjectMask(subjectMasks.length > 0 ? subjectMasks : visionBundle?.getMaskResult(frameIdx) ?? [], { classes: op.classes }), nodeKeyStr, frameIdx);
|
|
810
|
+
const threshold = keyThresholdAt(heldFrame ?? frameIdx);
|
|
811
|
+
if (subject && threshold !== void 0 && framePixels) subject = {
|
|
812
|
+
...subject,
|
|
813
|
+
mask: growMaskIntoForeground(subject.mask, subject.width, subject.height, framePixels, threshold, op.featherRadius)
|
|
814
|
+
};
|
|
815
|
+
}
|
|
816
|
+
if (cacheable && heldFrame !== void 0) frameCache.set(source, heldFrame, {
|
|
817
|
+
detections,
|
|
818
|
+
objects: frameObjects,
|
|
819
|
+
masks: visionBundle ? frameMasks.map(toCachedMask) : null,
|
|
820
|
+
subject: subject ? { mask: toCachedMask(subject) } : null,
|
|
821
|
+
keyThreshold: keyThresholdAt(heldFrame)
|
|
822
|
+
});
|
|
823
|
+
}
|
|
824
|
+
if (isMatteMode) {
|
|
825
|
+
const picture = exact ? childTex : heldTex;
|
|
826
|
+
if (!subject || !picture) {
|
|
827
|
+
ctx.renderer.beginFrame(encoder, targetView, {
|
|
828
|
+
r: 0,
|
|
829
|
+
g: 0,
|
|
830
|
+
b: 0,
|
|
831
|
+
a: 0
|
|
832
|
+
}, targetWidth, targetHeight, "clear").end();
|
|
833
|
+
return;
|
|
834
|
+
}
|
|
835
|
+
if (!sharedCompositor || sharedCompositorFormat !== ctx.renderer.format) {
|
|
836
|
+
sharedCompositor = new MatteCompositor(ctx.device, ctx.renderer.format);
|
|
837
|
+
sharedCompositorFormat = ctx.renderer.format;
|
|
838
|
+
}
|
|
839
|
+
const maskTex = sharedCompositor.uploadMask(nodeKeyStr, subject.mask, subject.width, subject.height);
|
|
840
|
+
const matteTex = matteTexture(ctx.device, nodeKeyStr, childTex);
|
|
841
|
+
sharedCompositor.draw(encoder, matteTex.createView(), picture, maskTex, mode, mode === "crop" ? maskBounds(subject) ?? void 0 : void 0);
|
|
842
|
+
visionBundle?.setStencilTexture(matteTex);
|
|
843
|
+
const outPass$1 = ctx.renderer.beginFrame(encoder, targetView, {
|
|
844
|
+
r: 0,
|
|
845
|
+
g: 0,
|
|
846
|
+
b: 0,
|
|
847
|
+
a: 0
|
|
848
|
+
}, targetWidth, targetHeight, "clear");
|
|
849
|
+
ctx.renderer.drawTexture(outPass$1, matteTex, {
|
|
850
|
+
x: 0,
|
|
851
|
+
y: 0,
|
|
852
|
+
width: targetWidth,
|
|
853
|
+
height: targetHeight
|
|
854
|
+
});
|
|
855
|
+
outPass$1.end();
|
|
856
|
+
return;
|
|
857
|
+
}
|
|
858
|
+
if (mode === "skeleton") {
|
|
859
|
+
if (!sharedSkeletonRenderer) sharedSkeletonRenderer = new PoseSkeletonRenderer(ctx.device);
|
|
860
|
+
const keypoints = clipPose !== void 0 ? clipPose : (visionBundle?.getPoseResult(frameIdx) ?? currentPoseRes)?.people[0]?.keypoints;
|
|
861
|
+
const skelPass = ctx.renderer.beginFrame(encoder, targetView, {
|
|
862
|
+
r: 0,
|
|
863
|
+
g: 0,
|
|
864
|
+
b: 0,
|
|
865
|
+
a: 0
|
|
866
|
+
}, targetWidth, targetHeight, "clear");
|
|
867
|
+
if (keypoints && keypoints.length > 0) {
|
|
868
|
+
const skelTex = sharedSkeletonRenderer.renderToTexture(keypoints, {
|
|
869
|
+
width: targetWidth,
|
|
870
|
+
height: targetHeight
|
|
871
|
+
});
|
|
872
|
+
ctx.renderer.drawTexture(skelPass, skelTex, {
|
|
873
|
+
x: 0,
|
|
874
|
+
y: 0,
|
|
875
|
+
width: targetWidth,
|
|
876
|
+
height: targetHeight
|
|
877
|
+
});
|
|
878
|
+
}
|
|
879
|
+
skelPass.end();
|
|
880
|
+
return;
|
|
881
|
+
}
|
|
882
|
+
if (mode === "boxes" || mode === "tracking") {
|
|
883
|
+
const outPass$1 = ctx.renderer.beginFrame(encoder, targetView, {
|
|
884
|
+
r: 0,
|
|
885
|
+
g: 0,
|
|
886
|
+
b: 0,
|
|
887
|
+
a: 0
|
|
888
|
+
}, targetWidth, targetHeight, "clear");
|
|
889
|
+
ctx.renderer.drawTexture(outPass$1, childTex, {
|
|
890
|
+
x: 0,
|
|
891
|
+
y: 0,
|
|
892
|
+
width: targetWidth,
|
|
893
|
+
height: targetHeight
|
|
894
|
+
});
|
|
895
|
+
const objects = frameObjects.length > 0 ? frameObjects : visionBundle?.getObjectResult(frameIdx).objects ?? [];
|
|
896
|
+
if (objects.length > 0) {
|
|
897
|
+
const boxColor = "#38bdf8";
|
|
898
|
+
const stroke = 2;
|
|
899
|
+
for (const obj of objects) {
|
|
900
|
+
if (!obj.active) continue;
|
|
901
|
+
const b = obj.boundingBox;
|
|
902
|
+
ctx.renderer.drawRect(outPass$1, {
|
|
903
|
+
x: b.originX,
|
|
904
|
+
y: b.originY,
|
|
905
|
+
width: b.width,
|
|
906
|
+
height: stroke
|
|
907
|
+
}, boxColor);
|
|
908
|
+
ctx.renderer.drawRect(outPass$1, {
|
|
909
|
+
x: b.originX,
|
|
910
|
+
y: b.originY + b.height - stroke,
|
|
911
|
+
width: b.width,
|
|
912
|
+
height: stroke
|
|
913
|
+
}, boxColor);
|
|
914
|
+
ctx.renderer.drawRect(outPass$1, {
|
|
915
|
+
x: b.originX,
|
|
916
|
+
y: b.originY,
|
|
917
|
+
width: stroke,
|
|
918
|
+
height: b.height
|
|
919
|
+
}, boxColor);
|
|
920
|
+
ctx.renderer.drawRect(outPass$1, {
|
|
921
|
+
x: b.originX + b.width - stroke,
|
|
922
|
+
y: b.originY,
|
|
923
|
+
width: stroke,
|
|
924
|
+
height: b.height
|
|
925
|
+
}, boxColor);
|
|
926
|
+
const cornerLen = Math.min(16, b.width / 4, b.height / 4);
|
|
927
|
+
ctx.renderer.drawRect(outPass$1, {
|
|
928
|
+
x: b.originX,
|
|
929
|
+
y: b.originY,
|
|
930
|
+
width: cornerLen,
|
|
931
|
+
height: stroke * 2
|
|
932
|
+
}, "#ffffff");
|
|
933
|
+
ctx.renderer.drawRect(outPass$1, {
|
|
934
|
+
x: b.originX,
|
|
935
|
+
y: b.originY,
|
|
936
|
+
width: stroke * 2,
|
|
937
|
+
height: cornerLen
|
|
938
|
+
}, "#ffffff");
|
|
939
|
+
if (mode === "tracking") ctx.renderer.drawRect(outPass$1, {
|
|
940
|
+
x: obj.centerX - 3,
|
|
941
|
+
y: obj.centerY - 3,
|
|
942
|
+
width: 6,
|
|
943
|
+
height: 6
|
|
944
|
+
}, "#ef4444", 3);
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
outPass$1.end();
|
|
948
|
+
return;
|
|
949
|
+
}
|
|
950
|
+
const outPass = ctx.renderer.beginFrame(encoder, targetView, {
|
|
951
|
+
r: 0,
|
|
952
|
+
g: 0,
|
|
953
|
+
b: 0,
|
|
954
|
+
a: 0
|
|
955
|
+
}, targetWidth, targetHeight, "clear");
|
|
956
|
+
ctx.renderer.drawTexture(outPass, childTex, {
|
|
957
|
+
x: 0,
|
|
958
|
+
y: 0,
|
|
959
|
+
width: targetWidth,
|
|
960
|
+
height: targetHeight
|
|
961
|
+
});
|
|
962
|
+
outPass.end();
|
|
963
|
+
};
|
|
964
|
+
/**
|
|
965
|
+
* The subject a linked `comp.vision` clip holds for a source frame (see
|
|
966
|
+
* CLIP_SUBJECT). Its mask is in source pixels; the composite samples it by
|
|
967
|
+
* uv, so it fits any target of the same aspect. Other shapes fall back.
|
|
968
|
+
*/
|
|
969
|
+
function clipSubjectFor(effect, frame, fps, width, height) {
|
|
970
|
+
const source = linkedClip(effect);
|
|
971
|
+
const subject = source?.subject(frame, fps);
|
|
972
|
+
if (!subject || !source) return subject;
|
|
973
|
+
return fitsTarget(source, subject.width / subject.height, width / height) ? subject : void 0;
|
|
974
|
+
}
|
|
975
|
+
/**
|
|
976
|
+
* The pose a linked `comp.vision` clip matched to its subject for a source
|
|
977
|
+
* frame, normalized to the source; it fits targets of the same aspect.
|
|
978
|
+
*/
|
|
979
|
+
function clipPoseFor(effect, frame, fps, width, height) {
|
|
980
|
+
const source = linkedClip(effect);
|
|
981
|
+
const pose = source?.pose?.(frame, fps);
|
|
982
|
+
if (!pose || !source) return pose === null ? null : void 0;
|
|
983
|
+
return fitsTarget(source, pose.width / pose.height, width / height) ? pose.keypoints : void 0;
|
|
984
|
+
}
|
|
985
|
+
/** Per-node upload target for depth frames (the depth model's resolution). */
|
|
986
|
+
const depthTextures = /* @__PURE__ */ new WeakMap();
|
|
987
|
+
/**
|
|
988
|
+
* Depth mode: the linked `comp.vision` clip's depth for this source frame as
|
|
989
|
+
* gray (white = near), stretched over the layer. Depth is analysed ahead of
|
|
990
|
+
* the render, so it belongs to this frame's pixels, never the previous one's.
|
|
991
|
+
*/
|
|
992
|
+
function drawClipDepth(ctx, encoder, targetView, width, height, effect, frame, fps) {
|
|
993
|
+
const source = linkedClip(effect);
|
|
994
|
+
if (!source?.depth) throw new Error("A depth layer reads its clip's depth: add the video to the composition (framefields links it to a `comp.vision(src, { depth: true })` clip).");
|
|
995
|
+
const depth = source.depth(frame, fps);
|
|
996
|
+
const pass = ctx.renderer.beginFrame(encoder, targetView, {
|
|
997
|
+
r: 0,
|
|
998
|
+
g: 0,
|
|
999
|
+
b: 0,
|
|
1000
|
+
a: 0
|
|
1001
|
+
}, width, height, "clear");
|
|
1002
|
+
if (depth) {
|
|
1003
|
+
if (Math.abs(depth.width / depth.height / (width / height) - 1) > .02) throw new Error(`A depth layer keeps its clip's aspect ratio (${depth.width}×${depth.height} source vs a ${width}×${height} layer); crop after the depth layer instead.`);
|
|
1004
|
+
let tex = effect ? depthTextures.get(effect) : void 0;
|
|
1005
|
+
if (!tex || tex.width !== depth.width || tex.height !== depth.height) {
|
|
1006
|
+
tex?.destroy();
|
|
1007
|
+
tex = ctx.device.createTexture({
|
|
1008
|
+
size: [depth.width, depth.height],
|
|
1009
|
+
format: "rgba8unorm",
|
|
1010
|
+
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,
|
|
1011
|
+
label: "vision_depth"
|
|
1012
|
+
});
|
|
1013
|
+
if (effect) depthTextures.set(effect, tex);
|
|
1014
|
+
}
|
|
1015
|
+
const gray = new Uint8Array(depth.width * depth.height * 4);
|
|
1016
|
+
for (let i = 0; i < depth.data.length; i++) {
|
|
1017
|
+
const v = Math.round(depth.data[i] * 255);
|
|
1018
|
+
gray.set([
|
|
1019
|
+
v,
|
|
1020
|
+
v,
|
|
1021
|
+
v,
|
|
1022
|
+
255
|
|
1023
|
+
], i * 4);
|
|
1024
|
+
}
|
|
1025
|
+
ctx.device.queue.writeTexture({ texture: tex }, gray, { bytesPerRow: depth.width * 4 }, [depth.width, depth.height]);
|
|
1026
|
+
ctx.renderer.drawTexture(pass, tex, {
|
|
1027
|
+
x: 0,
|
|
1028
|
+
y: 0,
|
|
1029
|
+
width,
|
|
1030
|
+
height
|
|
1031
|
+
});
|
|
1032
|
+
}
|
|
1033
|
+
pass.end();
|
|
1034
|
+
}
|
|
1035
|
+
function linkedClip(effect) {
|
|
1036
|
+
return effect?.[CLIP_SUBJECT];
|
|
1037
|
+
}
|
|
1038
|
+
/** Source results map onto a target of the same aspect; a prompted clip must not fall back. */
|
|
1039
|
+
function fitsTarget(source, sourceAspect, targetAspect) {
|
|
1040
|
+
if (Math.abs(sourceAspect / targetAspect - 1) < .01) return true;
|
|
1041
|
+
if (source.exact) throw new Error("A prompted clip matte requires the source aspect ratio. Apply layout cropping after the source matte.");
|
|
1042
|
+
return false;
|
|
1043
|
+
}
|
|
1044
|
+
/** Adapts a Selfie Segmenter matte to the instance-mask shape the composite path takes. */
|
|
1045
|
+
function personMatteAsMask(matte) {
|
|
1046
|
+
if (!matte || matte.coverage <= 0) return void 0;
|
|
1047
|
+
const area = Math.round(matte.coverage * matte.width * matte.height);
|
|
1048
|
+
return {
|
|
1049
|
+
category: "person",
|
|
1050
|
+
mask: matte.mask,
|
|
1051
|
+
width: matte.width,
|
|
1052
|
+
height: matte.height,
|
|
1053
|
+
area,
|
|
1054
|
+
coverage: matte.coverage,
|
|
1055
|
+
detectionIndex: -1
|
|
1056
|
+
};
|
|
1057
|
+
}
|
|
1058
|
+
var renderers_default = defineRenderer({ WebGPURenderer: VisionWebGPURenderer });
|
|
1059
|
+
|
|
1060
|
+
//#endregion
|
|
1061
|
+
export { renderers_default as t };
|
|
1062
|
+
//# sourceMappingURL=renderer-DCMoBppL.mjs.map
|