framefields 2.8.1 → 2.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -1
- package/dist/audio/index.mjs +10 -10
- package/dist/{audio-vatRe308.mjs → audio-BfQg37MW.mjs} +3 -3
- package/dist/{audio-vatRe308.mjs.map → audio-BfQg37MW.mjs.map} +1 -1
- package/dist/cli/check-worker.mjs +44 -44
- package/dist/components/index.d.mts +2 -2
- package/dist/components/index.mjs +43 -43
- package/dist/{dist-CFe1fC9l.mjs → dist-C1cCW7Bt.mjs} +8 -1
- package/dist/{dist-CFe1fC9l.mjs.map → dist-C1cCW7Bt.mjs.map} +1 -1
- package/dist/{dist-BbwtlSZO.mjs → dist-C8Xq3zgx.mjs} +2 -2
- package/dist/{dist-BbwtlSZO.mjs.map → dist-C8Xq3zgx.mjs.map} +1 -1
- package/dist/effects/index.d.mts +1 -1
- package/dist/effects/index.mjs +35 -35
- package/dist/{effects-CCyfjbhZ.mjs → effects-CemgqEPv.mjs} +2 -2
- package/dist/{effects-CCyfjbhZ.mjs.map → effects-CemgqEPv.mjs.map} +1 -1
- package/dist/fonts/index.mjs +2 -2
- package/dist/{fonts-C1mgtkCa.mjs → fonts-BW0pPcvJ.mjs} +2 -2
- package/dist/{fonts-C1mgtkCa.mjs.map → fonts-BW0pPcvJ.mjs.map} +1 -1
- package/dist/{gpu-CU2tEKJJ.mjs → gpu-CMaa63nz.mjs} +2 -2
- package/dist/{gpu-CU2tEKJJ.mjs.map → gpu-CMaa63nz.mjs.map} +1 -1
- package/dist/{index-BwRrsP_V.d.mts → index-Bnh42ouE.d.mts} +71 -10
- package/dist/index-Bnh42ouE.d.mts.map +1 -0
- package/dist/index-CFoAmh7q.d.mts.map +1 -1
- package/dist/{index-UDDAfHAF.d.mts → index-CQ-bbZk3.d.mts} +64 -13
- package/dist/index-CQ-bbZk3.d.mts.map +1 -0
- package/dist/index-D5UDyVMb.d.mts.map +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +50 -50
- package/dist/preview/index.mjs +10 -10
- package/dist/{preview-WXbsf6Dv.mjs → preview-DvP8AZuV.mjs} +2 -2
- package/dist/{preview-WXbsf6Dv.mjs.map → preview-DvP8AZuV.mjs.map} +1 -1
- package/dist/preview-engine/audio.mjs +1 -1
- package/dist/preview-engine/{chunk-JGDZQCNU.mjs → chunk-2B722GXM.mjs} +1 -1
- package/dist/preview-engine/{chunk-GFW3D464.mjs → chunk-2DWY7UBV.mjs} +1 -1
- package/dist/preview-engine/{chunk-72DYOIMP.mjs → chunk-2PYTDN2C.mjs} +1 -1
- package/dist/preview-engine/{chunk-PF3SXQNV.mjs → chunk-34DL53D5.mjs} +1 -1
- package/dist/preview-engine/{chunk-GLXJOXBE.mjs → chunk-34RJ7GAS.mjs} +1 -1
- package/dist/preview-engine/{chunk-6OY4YLTC.mjs → chunk-35HMRW4I.mjs} +1 -1
- package/dist/preview-engine/{chunk-W26U6BP2.mjs → chunk-4WYM72ZN.mjs} +1 -1
- package/dist/preview-engine/{chunk-EQ4VBUWM.mjs → chunk-5AWAOMBR.mjs} +1 -1
- package/dist/preview-engine/{chunk-J4SHMCTG.mjs → chunk-6R3UJBL5.mjs} +1 -1
- package/dist/preview-engine/{chunk-VHGC72XP.mjs → chunk-73CNXGAK.mjs} +1 -1
- package/dist/preview-engine/{chunk-KYOPOCO5.mjs → chunk-AHQCDTD6.mjs} +1 -1
- package/dist/preview-engine/{chunk-ADV2TIKA.mjs → chunk-BEYA25UZ.mjs} +1 -1
- package/dist/preview-engine/{chunk-RBDIRBEI.mjs → chunk-BJV2LBII.mjs} +1 -1
- package/dist/preview-engine/{chunk-LBJBBEKP.mjs → chunk-BVDWS3D2.mjs} +1 -1
- package/dist/preview-engine/chunk-BXPM5SJ3.mjs +1 -0
- package/dist/preview-engine/{chunk-NIPWL6Z5.mjs → chunk-C4M3B2Q2.mjs} +1 -1
- package/dist/preview-engine/{chunk-LLUFOFF4.mjs → chunk-CC4NNNIY.mjs} +1 -1
- package/dist/preview-engine/{chunk-NX66555S.mjs → chunk-CN2VLYLB.mjs} +1 -1
- package/dist/preview-engine/chunk-D73ZKPFN.mjs +138 -0
- package/dist/preview-engine/{chunk-SK7PUBTC.mjs → chunk-DMSZXG56.mjs} +1 -1
- package/dist/preview-engine/{chunk-WC257OBY.mjs → chunk-DVZITDQS.mjs} +1 -1
- package/dist/preview-engine/{chunk-LLB3AGBQ.mjs → chunk-EJJITH6U.mjs} +1 -1
- package/dist/preview-engine/{chunk-COZG35ZR.mjs → chunk-FTCEG3SF.mjs} +1 -1
- package/dist/preview-engine/{chunk-57LES7TL.mjs → chunk-GA4HNR44.mjs} +1 -1
- package/dist/preview-engine/{chunk-S4WNCEMO.mjs → chunk-GIICZZQI.mjs} +1 -1
- package/dist/preview-engine/{chunk-RTHU7REC.mjs → chunk-GRJJVSOV.mjs} +1 -1
- package/dist/preview-engine/{chunk-RGDM6PQ5.mjs → chunk-GZWA5QJS.mjs} +1 -1
- package/dist/preview-engine/{chunk-LZNNM5OB.mjs → chunk-H7BSN7V7.mjs} +1 -1
- package/dist/preview-engine/{chunk-JXUENEQO.mjs → chunk-HOV6DDBZ.mjs} +1 -1
- package/dist/preview-engine/{chunk-C6XLAJLL.mjs → chunk-JSYG6OWZ.mjs} +1 -1
- package/dist/preview-engine/{chunk-GZVPVOHB.mjs → chunk-K3C6GUQD.mjs} +1 -1
- package/dist/preview-engine/chunk-KOVN277Z.mjs +1 -0
- package/dist/preview-engine/chunk-KXLXP66K.mjs +1974 -0
- package/dist/preview-engine/{chunk-Y6TWMUJC.mjs → chunk-LVYVXVZO.mjs} +1 -1
- package/dist/preview-engine/{chunk-NKAVHU7H.mjs → chunk-MIEH74UH.mjs} +7 -7
- package/dist/preview-engine/{chunk-AVDHZNIZ.mjs → chunk-OH5W5EL6.mjs} +1 -1
- package/dist/preview-engine/{chunk-22F33PPP.mjs → chunk-P5FKRQFU.mjs} +1 -1
- package/dist/preview-engine/{chunk-7X2AUKTU.mjs → chunk-PM2W4VLT.mjs} +1 -1
- package/dist/preview-engine/{chunk-PYX6Q2EJ.mjs → chunk-QCSVT73T.mjs} +1 -1
- package/dist/preview-engine/{chunk-523CTDOC.mjs → chunk-RJIAES3X.mjs} +1 -1
- package/dist/preview-engine/{chunk-DPQN7WYQ.mjs → chunk-S2ABWY5G.mjs} +1 -1
- package/dist/preview-engine/{chunk-G7JJ6HVL.mjs → chunk-SF37HXAH.mjs} +1 -1
- package/dist/preview-engine/{chunk-OKLYIQ5F.mjs → chunk-SPJPM43P.mjs} +1 -1
- package/dist/preview-engine/{chunk-UOTMBWBJ.mjs → chunk-TNJEZKXM.mjs} +1 -1
- package/dist/preview-engine/chunk-ULOFDFHJ.mjs +1 -0
- package/dist/preview-engine/{chunk-DISKQ5MH.mjs → chunk-UXYM2G6J.mjs} +1 -1
- package/dist/preview-engine/{chunk-U5YNECNG.mjs → chunk-VN36PRVD.mjs} +1 -1
- package/dist/preview-engine/{chunk-PMOKPVSD.mjs → chunk-VVE2QHVG.mjs} +1 -1
- package/dist/preview-engine/chunk-XYGDTPO7.mjs +39 -0
- package/dist/preview-engine/{chunk-PEUQRSIM.mjs → chunk-Y5K5LVOR.mjs} +1 -1
- package/dist/preview-engine/chunk-YGKO4NIU.mjs +1 -0
- package/dist/preview-engine/{chunk-PSEMCJBH.mjs → chunk-ZJ5SWTCW.mjs} +1 -1
- package/dist/preview-engine/chunk-ZY47XIRK.mjs +5 -0
- package/dist/preview-engine/components.mjs +1 -1
- package/dist/preview-engine/effects.mjs +1 -1
- package/dist/preview-engine/framefields.mjs +1 -1
- package/dist/preview-engine/player.mjs +1 -1
- package/dist/preview-engine/renderers-3BOQOUEU.mjs +1 -0
- package/dist/preview-engine/renderers-3M2FESR2.mjs +1 -0
- package/dist/preview-engine/{renderers-FEEIDQF3.mjs → renderers-4F7WLQD5.mjs} +1 -1
- package/dist/preview-engine/{renderers-OP6MKYRM.mjs → renderers-5KANN7XF.mjs} +1 -1
- package/dist/preview-engine/{renderers-TVRR7PGN.mjs → renderers-5TO2SXFR.mjs} +1 -1
- package/dist/preview-engine/{renderers-DR7UZ3QR.mjs → renderers-5UZ3YFBD.mjs} +1 -1
- package/dist/preview-engine/renderers-6LHIWKMZ.mjs +1 -0
- package/dist/preview-engine/{renderers-7F2KF5RE.mjs → renderers-6Z7DWAPH.mjs} +1 -1
- package/dist/preview-engine/renderers-77PDUMYI.mjs +1 -0
- package/dist/preview-engine/{renderers-3J3NCOAI.mjs → renderers-7C5RA3R5.mjs} +1 -1
- package/dist/preview-engine/{renderers-KPCQGBIY.mjs → renderers-7XHO6M3B.mjs} +1 -1
- package/dist/preview-engine/{renderers-KJAOPYAU.mjs → renderers-A24KZK2Q.mjs} +1 -1
- package/dist/preview-engine/renderers-A43VCJ7X.mjs +1 -0
- package/dist/preview-engine/renderers-AKY464RY.mjs +1 -0
- package/dist/preview-engine/renderers-C5UO6PL5.mjs +1 -0
- package/dist/preview-engine/renderers-C64QSZO4.mjs +1 -0
- package/dist/preview-engine/renderers-CIRCR6NG.mjs +1 -0
- package/dist/preview-engine/renderers-CIWOPETY.mjs +1 -0
- package/dist/preview-engine/renderers-CUMVIVHI.mjs +1 -0
- package/dist/preview-engine/renderers-CZEZCELP.mjs +1 -0
- package/dist/preview-engine/{renderers-R3YVLWKV.mjs → renderers-ENMY4DKF.mjs} +1 -1
- package/dist/preview-engine/{renderers-AAENCA7X.mjs → renderers-FSI5KNGZ.mjs} +1 -1
- package/dist/preview-engine/renderers-FSQMWHQM.mjs +1 -0
- package/dist/preview-engine/renderers-FZEW5C23.mjs +1 -0
- package/dist/preview-engine/renderers-HCET2IML.mjs +1 -0
- package/dist/preview-engine/{renderers-LBX7GPDU.mjs → renderers-IHGAWLUF.mjs} +1 -1
- package/dist/preview-engine/renderers-IUOOC6K7.mjs +1 -0
- package/dist/preview-engine/{renderers-VXMR47WZ.mjs → renderers-KC6ZSKCW.mjs} +1 -1
- package/dist/preview-engine/renderers-KYYJLVIJ.mjs +1 -0
- package/dist/preview-engine/renderers-L4GE7WV3.mjs +1 -0
- package/dist/preview-engine/renderers-L6YDX6GS.mjs +1 -0
- package/dist/preview-engine/renderers-LRAFWKCO.mjs +1 -0
- package/dist/preview-engine/renderers-LU3XZWEB.mjs +1 -0
- package/dist/preview-engine/{renderers-4YYGKLDK.mjs → renderers-MD3PRFZL.mjs} +1 -1
- package/dist/preview-engine/renderers-MDHPQY6D.mjs +1 -0
- package/dist/preview-engine/renderers-MOEC2XZZ.mjs +1 -0
- package/dist/preview-engine/{renderers-RGDTRVZM.mjs → renderers-NCGH2WWJ.mjs} +1 -1
- package/dist/preview-engine/renderers-ND2WV4K3.mjs +1 -0
- package/dist/preview-engine/renderers-NJ5CWVVH.mjs +1 -0
- package/dist/preview-engine/renderers-NKXYPR3V.mjs +1 -0
- package/dist/preview-engine/{renderers-WVQQZQ6Y.mjs → renderers-NUAI4TO5.mjs} +1 -1
- package/dist/preview-engine/renderers-NWR66CGK.mjs +1 -0
- package/dist/preview-engine/renderers-O22WTBRM.mjs +1 -0
- package/dist/preview-engine/renderers-PBBA7LQB.mjs +1 -0
- package/dist/preview-engine/{renderers-BL7Z3FTF.mjs → renderers-PIIEUKFE.mjs} +1 -1
- package/dist/preview-engine/renderers-PPZK6VEW.mjs +1 -0
- package/dist/preview-engine/renderers-Q6LJRZ7R.mjs +1 -0
- package/dist/preview-engine/{renderers-7TNEKJZS.mjs → renderers-QA2HKUJJ.mjs} +1 -1
- package/dist/preview-engine/renderers-RMEACSRL.mjs +1 -0
- package/dist/preview-engine/{renderers-AWRIELVX.mjs → renderers-RN2MHIFK.mjs} +1 -1
- package/dist/preview-engine/renderers-SEIAUKJF.mjs +1 -0
- package/dist/preview-engine/renderers-SP42LCSI.mjs +1 -0
- package/dist/preview-engine/{renderers-OE55O27K.mjs → renderers-T74CQCEN.mjs} +1 -1
- package/dist/preview-engine/renderers-T7SZA3BX.mjs +1 -0
- package/dist/preview-engine/{renderers-ZUQ2ZBYY.mjs → renderers-TGJSOKDY.mjs} +1 -1
- package/dist/preview-engine/renderers-TSBV4KPE.mjs +1 -0
- package/dist/preview-engine/{renderers-2SE5BLLB.mjs → renderers-U4M7ZCV4.mjs} +1 -1
- package/dist/preview-engine/{renderers-YEI4K4W4.mjs → renderers-V3AQO7AR.mjs} +1 -1
- package/dist/preview-engine/renderers-VADTDAHD.mjs +1 -0
- package/dist/preview-engine/renderers-VNNWI5C3.mjs +1 -0
- package/dist/preview-engine/{renderers-YYMRKHAA.mjs → renderers-WEYAHOBK.mjs} +1 -1
- package/dist/preview-engine/renderers-WZ75MLP3.mjs +1 -0
- package/dist/preview-engine/renderers-XB5R4UQA.mjs +1 -0
- package/dist/preview-engine/{renderers-YIVPMPQS.mjs → renderers-Y22VSOXF.mjs} +1 -1
- package/dist/preview-engine/{renderers-Y53D5CQ7.mjs → renderers-YBIUZDGQ.mjs} +1 -1
- package/dist/preview-engine/renderers-YESJR4O7.mjs +1 -0
- package/dist/preview-engine/renderers-YKSRZRRT.mjs +1 -0
- package/dist/preview-engine/{renderers-V4VML5IG.mjs → renderers-ZACSHGNZ.mjs} +1 -1
- package/dist/preview-engine/signals.mjs +1 -1
- package/dist/preview-engine/src-4IUYUKIZ.mjs +8 -0
- package/dist/{program-Cq4gP9Dd.mjs → program-CKpKkllV.mjs} +2 -2
- package/dist/{program-Cq4gP9Dd.mjs.map → program-CKpKkllV.mjs.map} +1 -1
- package/dist/renderer/index.mjs +2 -2
- package/dist/renderer--Ac-dg4A.mjs +5 -0
- package/dist/renderer--N7TMqzU.mjs +5 -0
- package/dist/{renderer-CXWAdRqn.mjs → renderer--fkmiVjl.mjs} +2 -2
- package/dist/{renderer-CXWAdRqn.mjs.map → renderer--fkmiVjl.mjs.map} +1 -1
- package/dist/{renderer-CZyJ72JZ.mjs → renderer-1r-Uq-Ae.mjs} +2 -2
- package/dist/{renderer-CZyJ72JZ.mjs.map → renderer-1r-Uq-Ae.mjs.map} +1 -1
- package/dist/renderer-2ecmdOae.mjs +5 -0
- package/dist/{renderer-D8CMakyz.mjs → renderer-8QIwXh7O.mjs} +3 -3
- package/dist/{renderer-D8CMakyz.mjs.map → renderer-8QIwXh7O.mjs.map} +1 -1
- package/dist/{renderer-B4iCFvJh.mjs → renderer-B-ur0Ej8.mjs} +3 -3
- package/dist/{renderer-B4iCFvJh.mjs.map → renderer-B-ur0Ej8.mjs.map} +1 -1
- package/dist/{renderer-BD25uND8.mjs → renderer-B2P1vgb7.mjs} +418 -187
- package/dist/renderer-B2P1vgb7.mjs.map +1 -0
- package/dist/{renderer-BZKkT-6Q.mjs → renderer-B2jjxsjO.mjs} +2 -2
- package/dist/{renderer-BZKkT-6Q.mjs.map → renderer-B2jjxsjO.mjs.map} +1 -1
- package/dist/{renderer-DEcbSNQd.mjs → renderer-B39I6CQw.mjs} +3 -3
- package/dist/{renderer-DEcbSNQd.mjs.map → renderer-B39I6CQw.mjs.map} +1 -1
- package/dist/{renderer-DIPyUVX2.mjs → renderer-B522Dkdk.mjs} +3 -3
- package/dist/{renderer-DIPyUVX2.mjs.map → renderer-B522Dkdk.mjs.map} +1 -1
- package/dist/renderer-B5RJp5g-.mjs +5 -0
- package/dist/renderer-B7xyT1Vb.mjs +5 -0
- package/dist/{renderer-CeX7uUXB.mjs → renderer-BAYTI6jj.mjs} +2 -2
- package/dist/{renderer-CeX7uUXB.mjs.map → renderer-BAYTI6jj.mjs.map} +1 -1
- package/dist/{renderer-DoRazdp_.mjs → renderer-BAusZ6Vu.mjs} +2 -2
- package/dist/{renderer-DoRazdp_.mjs.map → renderer-BAusZ6Vu.mjs.map} +1 -1
- package/dist/renderer-BBeArN_x.mjs +5 -0
- package/dist/renderer-BCAZDu-r.mjs +5 -0
- package/dist/{renderer-D41gHat4.mjs → renderer-BF0hx_iJ.mjs} +3 -3
- package/dist/{renderer-D41gHat4.mjs.map → renderer-BF0hx_iJ.mjs.map} +1 -1
- package/dist/renderer-BJnhik7Y.mjs +5 -0
- package/dist/{renderer-BeQrWrOa.mjs → renderer-BPWDsufX.mjs} +2 -2
- package/dist/{renderer-BeQrWrOa.mjs.map → renderer-BPWDsufX.mjs.map} +1 -1
- package/dist/{renderer-CxEBV-w0.mjs → renderer-BXJXziIt.mjs} +2 -2
- package/dist/{renderer-CxEBV-w0.mjs.map → renderer-BXJXziIt.mjs.map} +1 -1
- package/dist/{renderer-Ce8VPaog.mjs → renderer-BdyopiLC.mjs} +2 -2
- package/dist/{renderer-Ce8VPaog.mjs.map → renderer-BdyopiLC.mjs.map} +1 -1
- package/dist/{renderer-Bkqg-U2F.mjs → renderer-Bfk6A7UO.mjs} +3 -3
- package/dist/{renderer-Bkqg-U2F.mjs.map → renderer-Bfk6A7UO.mjs.map} +1 -1
- package/dist/{renderer-CAagaRag.mjs → renderer-BgO6BA_z.mjs} +2 -2
- package/dist/{renderer-CAagaRag.mjs.map → renderer-BgO6BA_z.mjs.map} +1 -1
- package/dist/{renderer-DlZwbO-A.mjs → renderer-BlPqTEii.mjs} +2 -2
- package/dist/{renderer-DlZwbO-A.mjs.map → renderer-BlPqTEii.mjs.map} +1 -1
- package/dist/{renderer-BEuU7qlG.mjs → renderer-BlvGcyAN.mjs} +2 -2
- package/dist/{renderer-BEuU7qlG.mjs.map → renderer-BlvGcyAN.mjs.map} +1 -1
- package/dist/{renderer-BrWOcJ9Q.mjs → renderer-BpIF1QIE.mjs} +3 -3
- package/dist/{renderer-BrWOcJ9Q.mjs.map → renderer-BpIF1QIE.mjs.map} +1 -1
- package/dist/renderer-BxRW8MZO.mjs +5 -0
- package/dist/renderer-C-lfsEAN.mjs +5 -0
- package/dist/{renderer-eAVNsuX8.mjs → renderer-C41U1tK6.mjs} +5 -5
- package/dist/{renderer-eAVNsuX8.mjs.map → renderer-C41U1tK6.mjs.map} +1 -1
- package/dist/renderer-C6nOFN4-.mjs +5 -0
- package/dist/{renderer-CjklM-KD.mjs → renderer-C7L8Ceqr.mjs} +2 -2
- package/dist/{renderer-CjklM-KD.mjs.map → renderer-C7L8Ceqr.mjs.map} +1 -1
- package/dist/{renderer-xLQ_nkmy.mjs → renderer-C7eFJf0_.mjs} +3 -3
- package/dist/{renderer-xLQ_nkmy.mjs.map → renderer-C7eFJf0_.mjs.map} +1 -1
- package/dist/renderer-C84TSQmS.mjs +5 -0
- package/dist/renderer-C8_6YofT.mjs +5 -0
- package/dist/{renderer-DsAoxQ8O.mjs → renderer-CCycwCEB.mjs} +2 -2
- package/dist/{renderer-DsAoxQ8O.mjs.map → renderer-CCycwCEB.mjs.map} +1 -1
- package/dist/{renderer-Cjx3x7xM.mjs → renderer-CHr7MiYW.mjs} +3 -3
- package/dist/{renderer-Cjx3x7xM.mjs.map → renderer-CHr7MiYW.mjs.map} +1 -1
- package/dist/renderer-COb3tOPG.mjs +5 -0
- package/dist/{renderer-DSpTGqUU.mjs → renderer-CQvmbRQ5.mjs} +3 -3
- package/dist/{renderer-DSpTGqUU.mjs.map → renderer-CQvmbRQ5.mjs.map} +1 -1
- package/dist/renderer-CSCIzaLy.mjs +5 -0
- package/dist/{renderer-D7Kk7VxM.mjs → renderer-CYC32bDW.mjs} +3 -3
- package/dist/{renderer-D7Kk7VxM.mjs.map → renderer-CYC32bDW.mjs.map} +1 -1
- package/dist/{renderer-Ci9x2WUd.mjs → renderer-CcvvoKiZ.mjs} +3 -3
- package/dist/{renderer-Ci9x2WUd.mjs.map → renderer-CcvvoKiZ.mjs.map} +1 -1
- package/dist/{renderer-DTgO5LPf.mjs → renderer-CiQhD8Gg.mjs} +3 -3
- package/dist/{renderer-DTgO5LPf.mjs.map → renderer-CiQhD8Gg.mjs.map} +1 -1
- package/dist/renderer-CmI4c8MS.mjs +5 -0
- package/dist/{renderer-BlVmbzPs.mjs → renderer-CpUJBOfb.mjs} +2 -2
- package/dist/renderer-CqVltdX9.mjs +5 -0
- package/dist/{renderer-LY2MiIj0.mjs → renderer-CwFqqpWY.mjs} +3 -3
- package/dist/{renderer-LY2MiIj0.mjs.map → renderer-CwFqqpWY.mjs.map} +1 -1
- package/dist/renderer-D-FpMzLY.mjs +5 -0
- package/dist/renderer-D-Oyn9mG.mjs +5 -0
- package/dist/renderer-D2QrkA8_.mjs +5 -0
- package/dist/{renderer-D7Cu9OZx.mjs → renderer-D47AEJE_.mjs} +2 -2
- package/dist/{renderer-D7Cu9OZx.mjs.map → renderer-D47AEJE_.mjs.map} +1 -1
- package/dist/renderer-D5bjOx83.mjs +3 -0
- package/dist/{renderer-DPn2DhMU.mjs → renderer-D61B9bXF.mjs} +2 -2
- package/dist/{renderer-DPn2DhMU.mjs.map → renderer-D61B9bXF.mjs.map} +1 -1
- package/dist/renderer-D64r4iN-.mjs +5 -0
- package/dist/{renderer-CUq2qgyc.mjs → renderer-D7Al3_-5.mjs} +3 -3
- package/dist/{renderer-CUq2qgyc.mjs.map → renderer-D7Al3_-5.mjs.map} +1 -1
- package/dist/{renderer-CyWRvKUI.mjs → renderer-D7r6onRT.mjs} +2 -2
- package/dist/{renderer-CyWRvKUI.mjs.map → renderer-D7r6onRT.mjs.map} +1 -1
- package/dist/{renderer-DxHICEk3.mjs → renderer-D8bBHrWC.mjs} +3 -3
- package/dist/{renderer-DxHICEk3.mjs.map → renderer-D8bBHrWC.mjs.map} +1 -1
- package/dist/renderer-DCq6YkgP.mjs +5 -0
- package/dist/{renderer-Dk45W8Zd.mjs → renderer-DDEkFbVI.mjs} +3 -3
- package/dist/{renderer-Dk45W8Zd.mjs.map → renderer-DDEkFbVI.mjs.map} +1 -1
- package/dist/renderer-DDHG3GdR.mjs +5 -0
- package/dist/{renderer-BWlMAacF.mjs → renderer-DEmYyaqj.mjs} +2 -2
- package/dist/{renderer-BWlMAacF.mjs.map → renderer-DEmYyaqj.mjs.map} +1 -1
- package/dist/{renderer-DRGa6tlX.mjs → renderer-DF-yvIrV.mjs} +2 -2
- package/dist/{renderer-DRGa6tlX.mjs.map → renderer-DF-yvIrV.mjs.map} +1 -1
- package/dist/{renderer-C-5RNIeX.mjs → renderer-DFzI3yI_.mjs} +2 -2
- package/dist/{renderer-C-5RNIeX.mjs.map → renderer-DFzI3yI_.mjs.map} +1 -1
- package/dist/{renderer-AMBVtZ_G.mjs → renderer-DIw3UtEU.mjs} +3 -3
- package/dist/{renderer-AMBVtZ_G.mjs.map → renderer-DIw3UtEU.mjs.map} +1 -1
- package/dist/renderer-DMdNfcud.mjs +6 -0
- package/dist/{renderer-DnPzvIHK.mjs → renderer-DMvmf3T2.mjs} +2 -2
- package/dist/{renderer-Gw1ICOJ3.mjs → renderer-DNQvOrkY.mjs} +3 -3
- package/dist/{renderer-Gw1ICOJ3.mjs.map → renderer-DNQvOrkY.mjs.map} +1 -1
- package/dist/{renderer-CP2FOWyJ.mjs → renderer-DO-KbpYZ.mjs} +3 -3
- package/dist/{renderer-CP2FOWyJ.mjs.map → renderer-DO-KbpYZ.mjs.map} +1 -1
- package/dist/{renderer-BeFiQfzV.mjs → renderer-DPAD6fL1.mjs} +70 -70
- package/dist/{renderer-BeFiQfzV.mjs.map → renderer-DPAD6fL1.mjs.map} +1 -1
- package/dist/{renderer-cg06hb82.mjs → renderer-DTqDy2m9.mjs} +3 -3
- package/dist/{renderer-cg06hb82.mjs.map → renderer-DTqDy2m9.mjs.map} +1 -1
- package/dist/{renderer-BXAgUuAq.mjs → renderer-DVCJjVn7.mjs} +2 -2
- package/dist/{renderer-BXAgUuAq.mjs.map → renderer-DVCJjVn7.mjs.map} +1 -1
- package/dist/{renderer-D6X9vWkN.mjs → renderer-DX41niRU.mjs} +2 -2
- package/dist/{renderer-D6X9vWkN.mjs.map → renderer-DX41niRU.mjs.map} +1 -1
- package/dist/{renderer-D3K9FEQk.mjs → renderer-DXEWbnRF.mjs} +3 -3
- package/dist/{renderer-D3K9FEQk.mjs.map → renderer-DXEWbnRF.mjs.map} +1 -1
- package/dist/renderer-DZQXZ4lK.mjs +5 -0
- package/dist/{renderer-CiMIftlS.mjs → renderer-DbRZe0Re.mjs} +3 -3
- package/dist/{renderer-CiMIftlS.mjs.map → renderer-DbRZe0Re.mjs.map} +1 -1
- package/dist/renderer-DczJJLA1.mjs +5 -0
- package/dist/renderer-DfqJj9oe.mjs +5 -0
- package/dist/renderer-DgO9ihVJ.mjs +5 -0
- package/dist/renderer-DhgnQZYb.mjs +5 -0
- package/dist/{renderer-CrgfMDbh.mjs → renderer-DiY70S8S.mjs} +3 -3
- package/dist/{renderer-CrgfMDbh.mjs.map → renderer-DiY70S8S.mjs.map} +1 -1
- package/dist/renderer-DjxKjHMf.mjs +5 -0
- package/dist/{renderer-Br4UZvfL.mjs → renderer-DkRSZg5g.mjs} +3 -3
- package/dist/{renderer-Br4UZvfL.mjs.map → renderer-DkRSZg5g.mjs.map} +1 -1
- package/dist/{renderer-CCSzKnvs.mjs → renderer-DmkWrWAk.mjs} +2 -2
- package/dist/{renderer-CCSzKnvs.mjs.map → renderer-DmkWrWAk.mjs.map} +1 -1
- package/dist/{renderer-D2JOseb1.mjs → renderer-DpruWmZU.mjs} +2 -2
- package/dist/{renderer-D2JOseb1.mjs.map → renderer-DpruWmZU.mjs.map} +1 -1
- package/dist/renderer-DqLA5cdR.mjs +5 -0
- package/dist/{renderer-DxbFjINv.mjs → renderer-DqvoMLca.mjs} +3 -3
- package/dist/{renderer-DxbFjINv.mjs.map → renderer-DqvoMLca.mjs.map} +1 -1
- package/dist/renderer-Dudp6ZlH.mjs +5 -0
- package/dist/{renderer-COQc1jn6.mjs → renderer-EaLUCobW.mjs} +2 -2
- package/dist/{renderer-COQc1jn6.mjs.map → renderer-EaLUCobW.mjs.map} +1 -1
- package/dist/{renderer-BioUC9zE.mjs → renderer-GBmWjBvy.mjs} +2 -2
- package/dist/{renderer-BioUC9zE.mjs.map → renderer-GBmWjBvy.mjs.map} +1 -1
- package/dist/{renderer-BNzT34UV.mjs → renderer-Lth37j17.mjs} +2 -2
- package/dist/{renderer-D-17HVPb.mjs → renderer-SSBL4M1o.mjs} +3 -3
- package/dist/{renderer-D-17HVPb.mjs.map → renderer-SSBL4M1o.mjs.map} +1 -1
- package/dist/{renderer-C8rxyjaE.mjs → renderer-SWr3vbrV.mjs} +2 -2
- package/dist/{renderer-C8rxyjaE.mjs.map → renderer-SWr3vbrV.mjs.map} +1 -1
- package/dist/{renderer-LwrcnEtI.mjs → renderer-WCZu2Rf5.mjs} +3 -3
- package/dist/{renderer-LwrcnEtI.mjs.map → renderer-WCZu2Rf5.mjs.map} +1 -1
- package/dist/{renderer-BIGILDEA.mjs → renderer-Xv6GfNUI.mjs} +2 -2
- package/dist/{renderer-BIGILDEA.mjs.map → renderer-Xv6GfNUI.mjs.map} +1 -1
- package/dist/renderer-_jC5KIT1.mjs +5 -0
- package/dist/{renderer-DveQQCi8.mjs → renderer-bAKUeHF3.mjs} +3 -3
- package/dist/{renderer-DveQQCi8.mjs.map → renderer-bAKUeHF3.mjs.map} +1 -1
- package/dist/renderer-cTgAuVmJ.mjs +5 -0
- package/dist/{renderer-DGPaKIFf.mjs → renderer-cod5Ona9.mjs} +2 -2
- package/dist/{renderer-DgLt0TPo.mjs → renderer-g_vrrAQU.mjs} +2 -2
- package/dist/{renderer-DgLt0TPo.mjs.map → renderer-g_vrrAQU.mjs.map} +1 -1
- package/dist/{renderer-uorPCWdC.mjs → renderer-hSCfnvaK.mjs} +3 -3
- package/dist/{renderer-uorPCWdC.mjs.map → renderer-hSCfnvaK.mjs.map} +1 -1
- package/dist/{renderer-BGPnCRFI.mjs → renderer-ktWXVYka.mjs} +3 -3
- package/dist/{renderer-BGPnCRFI.mjs.map → renderer-ktWXVYka.mjs.map} +1 -1
- package/dist/renderer-nVKDvDLO.mjs +5 -0
- package/dist/{renderer-U-12BOhe.mjs → renderer-oKRF4A0M.mjs} +2 -2
- package/dist/{renderer-U-12BOhe.mjs.map → renderer-oKRF4A0M.mjs.map} +1 -1
- package/dist/{renderer-CsilJwL-.mjs → renderer-pHWEHDnM.mjs} +3 -3
- package/dist/{renderer-CsilJwL-.mjs.map → renderer-pHWEHDnM.mjs.map} +1 -1
- package/dist/renderer-pZ6_pUo1.mjs +5 -0
- package/dist/{renderer-BD00i68i.mjs → renderer-sCovEubT.mjs} +3 -3
- package/dist/{renderer-BD00i68i.mjs.map → renderer-sCovEubT.mjs.map} +1 -1
- package/dist/{renderer-BdbGTz7z.mjs → renderer-sYSkIUfo.mjs} +3 -3
- package/dist/{renderer-BdbGTz7z.mjs.map → renderer-sYSkIUfo.mjs.map} +1 -1
- package/dist/{renderer-BLU0PQTB.mjs → renderer-zXPVLRlD.mjs} +3 -3
- package/dist/{renderer-BLU0PQTB.mjs.map → renderer-zXPVLRlD.mjs.map} +1 -1
- package/dist/{renderers-CP8CFWDs-ywy4xljX.mjs → renderers-CP8CFWDs-DH2oktaC.mjs} +2 -2
- package/dist/{renderers-CP8CFWDs-ywy4xljX.mjs.map → renderers-CP8CFWDs-DH2oktaC.mjs.map} +1 -1
- package/dist/signals/index.mjs +4 -4
- package/dist/{src-B0KFNjj4.mjs → src-DFEqficI.mjs} +445 -35
- package/dist/src-DFEqficI.mjs.map +1 -0
- package/package.json +67 -58
- package/dist/index-BwRrsP_V.d.mts.map +0 -1
- package/dist/index-UDDAfHAF.d.mts.map +0 -1
- package/dist/preview-engine/chunk-3U2A3RW4.mjs +0 -5
- package/dist/preview-engine/chunk-6E3JSPJN.mjs +0 -1
- package/dist/preview-engine/chunk-F4F2UDRX.mjs +0 -1
- package/dist/preview-engine/chunk-KFNVUGNN.mjs +0 -1974
- package/dist/preview-engine/chunk-PYSBWKIJ.mjs +0 -1
- package/dist/preview-engine/chunk-U2IFQMS3.mjs +0 -174
- package/dist/preview-engine/renderers-2GMY2ZNK.mjs +0 -1
- package/dist/preview-engine/renderers-2QJNKL7Q.mjs +0 -1
- package/dist/preview-engine/renderers-3OYU6O6F.mjs +0 -1
- package/dist/preview-engine/renderers-433Y2PCK.mjs +0 -1
- package/dist/preview-engine/renderers-4AGPGEL4.mjs +0 -1
- package/dist/preview-engine/renderers-54DBHGUW.mjs +0 -1
- package/dist/preview-engine/renderers-5M2O55U3.mjs +0 -1
- package/dist/preview-engine/renderers-6FVMDEAY.mjs +0 -1
- package/dist/preview-engine/renderers-6R7ZJ7DU.mjs +0 -1
- package/dist/preview-engine/renderers-75GCMFOD.mjs +0 -1
- package/dist/preview-engine/renderers-7LWLUCVQ.mjs +0 -1
- package/dist/preview-engine/renderers-BLDENIEV.mjs +0 -1
- package/dist/preview-engine/renderers-CDB3YK3R.mjs +0 -1
- package/dist/preview-engine/renderers-D6D4XDFY.mjs +0 -1
- package/dist/preview-engine/renderers-DJVFQZYU.mjs +0 -1
- package/dist/preview-engine/renderers-DMXSV7VO.mjs +0 -1
- package/dist/preview-engine/renderers-EBMASIOE.mjs +0 -1
- package/dist/preview-engine/renderers-F262HDFS.mjs +0 -1
- package/dist/preview-engine/renderers-FMXKIF22.mjs +0 -1
- package/dist/preview-engine/renderers-GJKSZ6DR.mjs +0 -1
- package/dist/preview-engine/renderers-GR3RLYDZ.mjs +0 -1
- package/dist/preview-engine/renderers-GT3W2QIA.mjs +0 -1
- package/dist/preview-engine/renderers-IHC7HUK3.mjs +0 -1
- package/dist/preview-engine/renderers-J56ZGEVM.mjs +0 -1
- package/dist/preview-engine/renderers-KYM6352U.mjs +0 -1
- package/dist/preview-engine/renderers-LFXX6TWI.mjs +0 -1
- package/dist/preview-engine/renderers-NAHUPFPU.mjs +0 -1
- package/dist/preview-engine/renderers-NM3FZLHH.mjs +0 -1
- package/dist/preview-engine/renderers-NNB4BTJA.mjs +0 -1
- package/dist/preview-engine/renderers-OYVQW6QI.mjs +0 -1
- package/dist/preview-engine/renderers-P5RIFU3C.mjs +0 -1
- package/dist/preview-engine/renderers-QB7HJUTS.mjs +0 -1
- package/dist/preview-engine/renderers-QRQVOCDC.mjs +0 -1
- package/dist/preview-engine/renderers-QVFHJTZA.mjs +0 -1
- package/dist/preview-engine/renderers-R3WQIE4L.mjs +0 -1
- package/dist/preview-engine/renderers-SQBVOLG7.mjs +0 -1
- package/dist/preview-engine/renderers-TLXMYEDI.mjs +0 -1
- package/dist/preview-engine/renderers-X4S3WELJ.mjs +0 -1
- package/dist/preview-engine/renderers-XT7U25I7.mjs +0 -1
- package/dist/preview-engine/renderers-XVGLMBB3.mjs +0 -1
- package/dist/preview-engine/renderers-YUWU3TQZ.mjs +0 -1
- package/dist/preview-engine/renderers-ZNUD5OVO.mjs +0 -1
- package/dist/renderer-01zxT4CK.mjs +0 -5
- package/dist/renderer-35LHkj36.mjs +0 -5
- package/dist/renderer-B0OIdCGj.mjs +0 -5
- package/dist/renderer-B3IPtkK9.mjs +0 -5
- package/dist/renderer-BD25uND8.mjs.map +0 -1
- package/dist/renderer-BMC39abo.mjs +0 -5
- package/dist/renderer-BQj3nlAI.mjs +0 -5
- package/dist/renderer-BnBvSmp_.mjs +0 -5
- package/dist/renderer-BsDSpTpL.mjs +0 -5
- package/dist/renderer-BtW6_gvE.mjs +0 -5
- package/dist/renderer-By8U44Rt.mjs +0 -5
- package/dist/renderer-C3lDmxuX.mjs +0 -5
- package/dist/renderer-C6SZAE_x.mjs +0 -5
- package/dist/renderer-CA3IVeZj.mjs +0 -5
- package/dist/renderer-CFoCH_mO.mjs +0 -5
- package/dist/renderer-CLhZqJF8.mjs +0 -6
- package/dist/renderer-CYJXQS8E.mjs +0 -5
- package/dist/renderer-C_vj6_WJ.mjs +0 -5
- package/dist/renderer-CeqfC6OR.mjs +0 -5
- package/dist/renderer-CkZCGMAc.mjs +0 -5
- package/dist/renderer-Clxju1r9.mjs +0 -5
- package/dist/renderer-Cvz22ZSh.mjs +0 -3
- package/dist/renderer-CyWtKBF7.mjs +0 -5
- package/dist/renderer-D27STGoB.mjs +0 -5
- package/dist/renderer-D78Aq9YK.mjs +0 -5
- package/dist/renderer-DHEffABL.mjs +0 -5
- package/dist/renderer-DUuNCgzW.mjs +0 -5
- package/dist/renderer-DVD5pzRq.mjs +0 -5
- package/dist/renderer-Dsp6xDw5.mjs +0 -5
- package/dist/renderer-DuC-BFXR.mjs +0 -5
- package/dist/renderer-DuWs_Wsv.mjs +0 -5
- package/dist/renderer-OSgsiIrW.mjs +0 -5
- package/dist/renderer-OZaMFYtZ.mjs +0 -5
- package/dist/renderer-T79TmHET.mjs +0 -5
- package/dist/renderer-UhsC9oTU.mjs +0 -5
- package/dist/renderer-WYZV1jWf.mjs +0 -5
- package/dist/renderer-Y7evDjHH.mjs +0 -5
- package/dist/renderer-mcePkmUe.mjs +0 -5
- package/dist/src-B0KFNjj4.mjs.map +0 -1
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { G as ProgrammaticSignal, K as Signal, Mt as frameArraySignal, N as MediaSignalRecorder, St as createVirtualMedia, pt as appendOperation, rn as mediaSourceTime, tn as mediaSourceRange, y as Effect$1, yn as resolveFrameRequest } from "./dist-BlIrsfcn.mjs";
|
|
2
|
-
import { F as getPrimitiveGeometry, K as mediaDecoderCache, N as generateExtrudedTextGeometry, Z as parseSvgPathToSegments, _ as buildShapeSvgPath, gt as Path3D, p as SlugFontCache, q as parseColor$1, z as inputStore } from "./dist-
|
|
3
|
-
import { a as preflightMediaTime, n as decodeAudioSource } from "./dist-
|
|
4
|
-
import { t as FontManager } from "./fonts-
|
|
2
|
+
import { F as getPrimitiveGeometry, K as mediaDecoderCache, N as generateExtrudedTextGeometry, Z as parseSvgPathToSegments, _ as buildShapeSvgPath, gt as Path3D, p as SlugFontCache, q as parseColor$1, z as inputStore } from "./dist-C1cCW7Bt.mjs";
|
|
3
|
+
import { a as preflightMediaTime, n as decodeAudioSource } from "./dist-C8Xq3zgx.mjs";
|
|
4
|
+
import { t as FontManager } from "./fonts-BW0pPcvJ.mjs";
|
|
5
5
|
import { s as TensorPipeline } from "./dist-Buaaj-Ul.mjs";
|
|
6
|
-
import { a as COCO17_KEYPOINT_NAMES, d as VisionNode, f as VisionRunner, g as
|
|
7
|
-
import { G as mediaSignalSampler, K as mergeAnimationTracks, N as collectNodeOps, P as compositorToProgram, W as lintComposition, f as LayerAnimation, q as sampleMediaTimeSignal } from "./program-
|
|
8
|
-
import { C as effectFactories, H as Dither, I as ColorBalance, K as Iridescence, L as ColorKey, M as CRT, R as Contour, S as Vision, T as Ascii, Y as LayerStyle, _ as SelectiveColor, a as CustomEffect, at as Posterize, b as TileOffset, c as GradientMap, d as Levels, et as OpArt, f as Modulate, g as SSAO, h as Relight3D, ht as Vignette, i as Curves, it as Pixelate, l as HalftoneScreen, m as PBRGlass, nt as Painterly, o as DepthOfField, ot as ProceduralVFX, p as MotionBlur, pt as Toon, q as Kaleidoscope, r as Crop, s as FilmGrain, st as RGBSplit, t as ApplyLUT, u as HighPass, v as ShadowsHighlights, w as Blur, x as UnsharpMask, y as TemporalDeflicker } from "./effects-
|
|
9
|
-
import { a as HeadlessMediaRenderer, n as renderFrameGrid } from "./renderer-
|
|
6
|
+
import { _ as pinNodeToObject, a as COCO17_KEYPOINT_NAMES, d as VisionNode, f as VisionRunner, g as pinNodeToLandmark, h as mergeSubjectMask, m as maskObject, n as CLIP_SUBJECT, p as analyzeSequence, u as VisionBundle } from "./renderer-B2P1vgb7.mjs";
|
|
7
|
+
import { G as mediaSignalSampler, K as mergeAnimationTracks, N as collectNodeOps, P as compositorToProgram, W as lintComposition, f as LayerAnimation, q as sampleMediaTimeSignal } from "./program-CKpKkllV.mjs";
|
|
8
|
+
import { C as effectFactories, H as Dither, I as ColorBalance, K as Iridescence, L as ColorKey, M as CRT, R as Contour, S as Vision, T as Ascii, Y as LayerStyle, _ as SelectiveColor, a as CustomEffect, at as Posterize, b as TileOffset, c as GradientMap, d as Levels, et as OpArt, f as Modulate, g as SSAO, h as Relight3D, ht as Vignette, i as Curves, it as Pixelate, l as HalftoneScreen, m as PBRGlass, nt as Painterly, o as DepthOfField, ot as ProceduralVFX, p as MotionBlur, pt as Toon, q as Kaleidoscope, r as Crop, s as FilmGrain, st as RGBSplit, t as ApplyLUT, u as HighPass, v as ShadowsHighlights, w as Blur, x as UnsharpMask, y as TemporalDeflicker } from "./effects-CemgqEPv.mjs";
|
|
9
|
+
import { a as HeadlessMediaRenderer, n as renderFrameGrid } from "./renderer-DPAD6fL1.mjs";
|
|
10
10
|
import { z, z as z$2 } from "zod";
|
|
11
11
|
import path from "node:path";
|
|
12
12
|
import fs from "node:fs/promises";
|
|
@@ -1337,6 +1337,19 @@ function translatePath(d, dx, dy) {
|
|
|
1337
1337
|
/** Frames looked back over to bridge a gap where the person is lost. */
|
|
1338
1338
|
const HOLD = 24;
|
|
1339
1339
|
const CACHE_VERSION = 1;
|
|
1340
|
+
let visionSam;
|
|
1341
|
+
let clipVisionIds = 0;
|
|
1342
|
+
/**
|
|
1343
|
+
* SAM lives in `@framefields/vision-sam`, an optional peer (SAM 3's weights are under Meta's SAM License), so it
|
|
1344
|
+
* is imported only when a clip asks for `sam2` or `sam3`.
|
|
1345
|
+
*/
|
|
1346
|
+
function loadVisionSam() {
|
|
1347
|
+
visionSam ??= import("@framefields/vision-sam").catch((cause) => {
|
|
1348
|
+
visionSam = void 0;
|
|
1349
|
+
throw new Error("Prompted sam2/sam3 tracking needs the optional @framefields/vision-sam package. Install it next to framefields.", { cause });
|
|
1350
|
+
});
|
|
1351
|
+
return visionSam;
|
|
1352
|
+
}
|
|
1340
1353
|
/**
|
|
1341
1354
|
* Vision results for one clip, computed per frame on demand and shared by
|
|
1342
1355
|
* everything that reads the clip: physics, layout, signals. Unlike the
|
|
@@ -1367,6 +1380,20 @@ var ClipVision = class {
|
|
|
1367
1380
|
cell;
|
|
1368
1381
|
queue = Promise.resolve();
|
|
1369
1382
|
runner;
|
|
1383
|
+
sam2Tracker;
|
|
1384
|
+
sam2Frame = -1;
|
|
1385
|
+
sam3Tracker;
|
|
1386
|
+
sam3Frame = -1;
|
|
1387
|
+
sam;
|
|
1388
|
+
/** Clips walk their source independently, so each owns a decoder (requests to one supersede). */
|
|
1389
|
+
decoderId = `clip-vision#${++clipVisionIds}#`;
|
|
1390
|
+
signalBundle;
|
|
1391
|
+
publishedSignals = /* @__PURE__ */ new Set();
|
|
1392
|
+
signalMaskFrame = -1;
|
|
1393
|
+
/** Masks of `signalMaskFrame` by track ID (0: all tracks merged). */
|
|
1394
|
+
signalMasks = /* @__PURE__ */ new Map();
|
|
1395
|
+
/** Prompted track count per source frame, including frames where every track is absent. */
|
|
1396
|
+
trackCounts = /* @__PURE__ */ new Map();
|
|
1370
1397
|
cacheLoaded;
|
|
1371
1398
|
unsaved = 0;
|
|
1372
1399
|
unsavedSubjects = 0;
|
|
@@ -1380,13 +1407,80 @@ var ClipVision = class {
|
|
|
1380
1407
|
/** @internal Use `comp.vision(source, options)`. */
|
|
1381
1408
|
constructor(source, fps, options = {}) {
|
|
1382
1409
|
this.source = source;
|
|
1383
|
-
|
|
1410
|
+
if (options.sam2 && options.sam3) throw new Error("Choose one prompted backend: sam2 or sam3.");
|
|
1411
|
+
this.options = options.sam2 ? {
|
|
1412
|
+
...options,
|
|
1413
|
+
sam2: {
|
|
1414
|
+
...options.sam2,
|
|
1415
|
+
prompts: options.sam2.prompts.map((prompt) => ({
|
|
1416
|
+
...prompt,
|
|
1417
|
+
points: prompt.points.map((point) => ({ ...point }))
|
|
1418
|
+
}))
|
|
1419
|
+
}
|
|
1420
|
+
} : options.sam3 ? {
|
|
1421
|
+
...options,
|
|
1422
|
+
sam3: {
|
|
1423
|
+
...options.sam3,
|
|
1424
|
+
prompts: (options.sam3.prompts ?? (options.sam3.text ? [{
|
|
1425
|
+
frame: 0,
|
|
1426
|
+
text: options.sam3.text
|
|
1427
|
+
}] : [])).map((prompt) => ({
|
|
1428
|
+
...prompt,
|
|
1429
|
+
...prompt.points ? { points: prompt.points.map((point) => ({ ...point })) } : {}
|
|
1430
|
+
}))
|
|
1431
|
+
}
|
|
1432
|
+
} : options;
|
|
1384
1433
|
this.compositionFps = fps;
|
|
1385
1434
|
this.fps = options.fps ?? fps;
|
|
1386
1435
|
this.startFrame = Math.round(options.startFrame ?? 0);
|
|
1387
1436
|
this.trimStartSec = options.trimStartSec ?? 0;
|
|
1388
|
-
this.smoothing = Math.max(0, Math.round(options.smoothing ?? 2));
|
|
1437
|
+
this.smoothing = Math.max(0, Math.round(options.smoothing ?? (options.sam2 || options.sam3 ? 0 : 2)));
|
|
1389
1438
|
this.cell = Math.max(1, Math.round(options.maskCell ?? 8));
|
|
1439
|
+
if (options.sam2 || options.sam3) this.wantSubjects = true;
|
|
1440
|
+
}
|
|
1441
|
+
/** @internal Explicit selections must never fall back to another detected subject. */
|
|
1442
|
+
get exact() {
|
|
1443
|
+
return this.options.sam2 !== void 0 || this.options.sam3 !== void 0;
|
|
1444
|
+
}
|
|
1445
|
+
/** Object, mask and optional pose signals on the composition clock, in source geometry. */
|
|
1446
|
+
get signals() {
|
|
1447
|
+
this.keepSubjects();
|
|
1448
|
+
this.signalBundle ??= new VisionBundle({
|
|
1449
|
+
fps: this.compositionFps,
|
|
1450
|
+
totalFrames: Number.MAX_SAFE_INTEGER,
|
|
1451
|
+
maskSource: (frame) => this.trackIds(frame).flatMap((id) => {
|
|
1452
|
+
const mask = this.maskAt(frame, id);
|
|
1453
|
+
return mask && mask.area > 0 ? [mask] : [];
|
|
1454
|
+
}),
|
|
1455
|
+
matteSource: (frame) => {
|
|
1456
|
+
const mask = this.maskAt(frame);
|
|
1457
|
+
return mask ? {
|
|
1458
|
+
mask: mask.mask,
|
|
1459
|
+
width: mask.width,
|
|
1460
|
+
height: mask.height,
|
|
1461
|
+
coverage: mask.coverage
|
|
1462
|
+
} : void 0;
|
|
1463
|
+
}
|
|
1464
|
+
});
|
|
1465
|
+
return this.signalBundle;
|
|
1466
|
+
}
|
|
1467
|
+
decoder() {
|
|
1468
|
+
return mediaDecoderCache.getVideo(this.source, true, this.decoderId);
|
|
1469
|
+
}
|
|
1470
|
+
/** Free inference sessions and the decoder. Analysed frames remain readable; later frames replay memory. */
|
|
1471
|
+
release() {
|
|
1472
|
+
mediaDecoderCache.clearNode(this.decoderId);
|
|
1473
|
+
this.sam2Tracker?.release();
|
|
1474
|
+
this.sam2Tracker = void 0;
|
|
1475
|
+
this.sam2Frame = -1;
|
|
1476
|
+
this.sam3Tracker?.release();
|
|
1477
|
+
this.sam3Tracker = void 0;
|
|
1478
|
+
this.sam3Frame = -1;
|
|
1479
|
+
this.runner?.close();
|
|
1480
|
+
this.runner = void 0;
|
|
1481
|
+
this.signalMaskFrame = -1;
|
|
1482
|
+
this.signalMasks.clear();
|
|
1483
|
+
this.publishedSignals.clear();
|
|
1390
1484
|
}
|
|
1391
1485
|
/** The tracked person in source pixels; `.place()` maps it into the composition. */
|
|
1392
1486
|
get person() {
|
|
@@ -1400,13 +1494,22 @@ var ClipVision = class {
|
|
|
1400
1494
|
*/
|
|
1401
1495
|
ready(frame, toFrame = frame) {
|
|
1402
1496
|
const [from, to] = this.window(frame, toFrame);
|
|
1403
|
-
|
|
1404
|
-
|
|
1497
|
+
const run$1 = this.queue.then(async () => {
|
|
1498
|
+
try {
|
|
1499
|
+
await this.compute(from, to);
|
|
1500
|
+
} catch (error) {
|
|
1501
|
+
this.release();
|
|
1502
|
+
throw error;
|
|
1503
|
+
}
|
|
1504
|
+
if (this.signalBundle) this.publishSignals(Math.min(frame, toFrame), Math.max(frame, toFrame));
|
|
1505
|
+
});
|
|
1506
|
+
this.queue = run$1.catch(() => void 0);
|
|
1507
|
+
return run$1;
|
|
1405
1508
|
}
|
|
1406
1509
|
/** True when composition frame `frame` can be read synchronously. */
|
|
1407
1510
|
isReady(frame) {
|
|
1408
1511
|
const [from, to] = this.window(frame, frame);
|
|
1409
|
-
for (let c = from; c <= to; c++) if (!this.
|
|
1512
|
+
for (let c = from; c <= to; c++) if (!this.analysed(c)) return false;
|
|
1410
1513
|
return true;
|
|
1411
1514
|
}
|
|
1412
1515
|
/**
|
|
@@ -1423,9 +1526,8 @@ var ClipVision = class {
|
|
|
1423
1526
|
* subjects kept, null when it holds no subject.
|
|
1424
1527
|
*/
|
|
1425
1528
|
subject(frame, fps) {
|
|
1426
|
-
const
|
|
1427
|
-
if (
|
|
1428
|
-
const sourceFrame = this.options.timeRemap ? Math.floor(c + 1e-6) : Math.round(c);
|
|
1529
|
+
const sourceFrame = this.sourceFrame(frame, fps);
|
|
1530
|
+
if (sourceFrame === void 0) return void 0;
|
|
1429
1531
|
const s = this.subjects.get(sourceFrame);
|
|
1430
1532
|
if (s === void 0) return s;
|
|
1431
1533
|
if (s === null || !this.sourceWidth) return null;
|
|
@@ -1433,7 +1535,7 @@ var ClipVision = class {
|
|
|
1433
1535
|
const height = this.sourceHeight;
|
|
1434
1536
|
return {
|
|
1435
1537
|
category: s.category,
|
|
1436
|
-
mask:
|
|
1538
|
+
mask: subjectAlpha(s, width * height),
|
|
1437
1539
|
width,
|
|
1438
1540
|
height,
|
|
1439
1541
|
area: s.area,
|
|
@@ -1441,6 +1543,45 @@ var ClipVision = class {
|
|
|
1441
1543
|
detectionIndex: -1
|
|
1442
1544
|
};
|
|
1443
1545
|
}
|
|
1546
|
+
/**
|
|
1547
|
+
* @internal The pose matched to the subject at a source frame of the clip
|
|
1548
|
+
* (`frame` at `fps`), normalized to the source size, for a render-time
|
|
1549
|
+
* skeleton: undefined until that frame and its smoothing window are
|
|
1550
|
+
* analysed, null when no pose matched there.
|
|
1551
|
+
*/
|
|
1552
|
+
pose(frame, fps) {
|
|
1553
|
+
const c = this.sourceFrame(frame, fps);
|
|
1554
|
+
if (c === void 0 || !this.tracksPose || !this.sourceWidth) return;
|
|
1555
|
+
for (let g = c - this.smoothing; g <= c + this.smoothing; g++) if (!this.results.has(Math.max(0, g))) return void 0;
|
|
1556
|
+
if (!this.results.get(c)?.kp) return null;
|
|
1557
|
+
const width = this.sourceWidth;
|
|
1558
|
+
const height = this.sourceHeight;
|
|
1559
|
+
return {
|
|
1560
|
+
width,
|
|
1561
|
+
height,
|
|
1562
|
+
keypoints: Array.from({ length: 17 }, (_, k) => {
|
|
1563
|
+
const [x, y, visibility] = this.keypoint(k, c);
|
|
1564
|
+
return {
|
|
1565
|
+
x: x / width,
|
|
1566
|
+
y: y / height,
|
|
1567
|
+
visibility
|
|
1568
|
+
};
|
|
1569
|
+
})
|
|
1570
|
+
};
|
|
1571
|
+
}
|
|
1572
|
+
/** Whether frames carry keypoints: on by default, opt-in for prompted (SAM) clips. */
|
|
1573
|
+
get tracksPose() {
|
|
1574
|
+
return this.exact ? this.options.pose === true : this.options.pose ?? true;
|
|
1575
|
+
}
|
|
1576
|
+
/**
|
|
1577
|
+
* The analysed source frame a render-time read at `frame` (at `fps`) maps to;
|
|
1578
|
+
* undefined for an unprompted clip read between its analysed frames.
|
|
1579
|
+
*/
|
|
1580
|
+
sourceFrame(frame, fps) {
|
|
1581
|
+
const c = frame * this.fps / fps;
|
|
1582
|
+
if (!this.exact && !this.options.timeRemap && Math.abs(c - Math.round(c)) > 1e-6) return void 0;
|
|
1583
|
+
return this.options.timeRemap || this.exact ? Math.floor(c + 1e-6) : Math.round(c);
|
|
1584
|
+
}
|
|
1444
1585
|
/** Composition frame → clip frame (fractional). */
|
|
1445
1586
|
clipFrame(frame) {
|
|
1446
1587
|
if (this.options.timeRemap) return mediaSourceTime(this.options.timeRemap, this.localFrame(frame), this.compositionFps) * this.fps;
|
|
@@ -1459,7 +1600,17 @@ var ClipVision = class {
|
|
|
1459
1600
|
analysed(c) {
|
|
1460
1601
|
return this.results.has(c) && (!this.wantSubjects || this.subjects.has(c));
|
|
1461
1602
|
}
|
|
1603
|
+
/** Loads `@framefields/vision-sam` and validates the prompts once, on first use. */
|
|
1604
|
+
prompted() {
|
|
1605
|
+
this.sam ??= loadVisionSam().then((sam) => {
|
|
1606
|
+
if (this.options.sam2) sam.validateSam2Prompts(this.options.sam2.prompts);
|
|
1607
|
+
if (this.options.sam3) sam.validateSam3Prompts(this.options.sam3);
|
|
1608
|
+
return sam;
|
|
1609
|
+
});
|
|
1610
|
+
return this.sam;
|
|
1611
|
+
}
|
|
1462
1612
|
async compute(from, to) {
|
|
1613
|
+
if (this.exact) await this.prompted();
|
|
1463
1614
|
this.cacheLoaded ??= this.loadCache();
|
|
1464
1615
|
await this.cacheLoaded;
|
|
1465
1616
|
if (this.wantSubjects) {
|
|
@@ -1469,7 +1620,15 @@ var ClipVision = class {
|
|
|
1469
1620
|
let missing = false;
|
|
1470
1621
|
for (let c = from; c <= to; c++) if (!this.analysed(c)) missing = true;
|
|
1471
1622
|
if (!missing) return;
|
|
1472
|
-
|
|
1623
|
+
if (this.options.sam2) {
|
|
1624
|
+
await this.computeSam2(to);
|
|
1625
|
+
return;
|
|
1626
|
+
}
|
|
1627
|
+
if (this.options.sam3) {
|
|
1628
|
+
await this.computeSam3(to);
|
|
1629
|
+
return;
|
|
1630
|
+
}
|
|
1631
|
+
const wantPose = this.tracksPose;
|
|
1473
1632
|
const wantMask = this.options.mask ?? true;
|
|
1474
1633
|
this.runner ??= VisionRunner.create({
|
|
1475
1634
|
modelsDir: this.options.modelsDir,
|
|
@@ -1477,7 +1636,7 @@ var ClipVision = class {
|
|
|
1477
1636
|
...this.options.confidence !== void 0 && { confidence: this.options.confidence },
|
|
1478
1637
|
...this.options.variant !== void 0 && { variant: this.options.variant }
|
|
1479
1638
|
});
|
|
1480
|
-
const decoder =
|
|
1639
|
+
const decoder = this.decoder();
|
|
1481
1640
|
for (let c = from; c <= to; c++) {
|
|
1482
1641
|
if (this.analysed(c)) continue;
|
|
1483
1642
|
const image = await decodedPixels(await decoder.getFrame(c / this.fps));
|
|
@@ -1532,6 +1691,221 @@ var ClipVision = class {
|
|
|
1532
1691
|
if (this.unsaved > 0) await this.saveCache();
|
|
1533
1692
|
if (this.unsavedSubjects > 0) await this.saveSubjects();
|
|
1534
1693
|
}
|
|
1694
|
+
async computeSam2(to) {
|
|
1695
|
+
const settings = this.options.sam2;
|
|
1696
|
+
if (!settings) return;
|
|
1697
|
+
const first = settings.prompts[0]?.frame ?? 0;
|
|
1698
|
+
for (let frame = 0; frame < Math.min(first, to + 1); frame++) {
|
|
1699
|
+
this.results.set(frame, {
|
|
1700
|
+
kp: null,
|
|
1701
|
+
mask: null,
|
|
1702
|
+
score: 0
|
|
1703
|
+
});
|
|
1704
|
+
this.subjects.set(frame, null);
|
|
1705
|
+
}
|
|
1706
|
+
if (to < first) return;
|
|
1707
|
+
const decoder = this.decoder();
|
|
1708
|
+
if (!this.sam2Tracker) {
|
|
1709
|
+
const frameCount = Math.max(1, Math.ceil(await decoder.durationSec() * this.fps - 1e-6));
|
|
1710
|
+
if (settings.prompts.some((prompt) => prompt.frame >= frameCount)) throw new Error("SAM 2 prompt frames must be inside the source video.");
|
|
1711
|
+
const { Sam2Tracker } = await this.prompted();
|
|
1712
|
+
this.sam2Tracker = await Sam2Tracker.create({
|
|
1713
|
+
modelsDir: this.options.modelsDir,
|
|
1714
|
+
baseUrl: this.options.baseUrl,
|
|
1715
|
+
frameCount,
|
|
1716
|
+
model: settings.model
|
|
1717
|
+
});
|
|
1718
|
+
this.sam2Frame = first - 1;
|
|
1719
|
+
}
|
|
1720
|
+
for (let frame = this.sam2Frame + 1; frame <= to; frame++) {
|
|
1721
|
+
const image = await decodedPixels(await decoder.getFrame(frame / this.fps));
|
|
1722
|
+
if (!image) throw new Error(`Cannot decode SAM 2 source frame ${frame}.`);
|
|
1723
|
+
if (!this.sourceWidth) this.setSize(image.width, image.height);
|
|
1724
|
+
const prompt = settings.prompts.find((item) => item.frame === frame);
|
|
1725
|
+
const result$1 = await this.sam2Tracker.process(image, frame, prompt?.points);
|
|
1726
|
+
const kp = this.tracksPose ? await this.matchedPose(image, result$1.mask) : null;
|
|
1727
|
+
this.storeSamFrame(frame, result$1.width, result$1.height, [result$1], kp);
|
|
1728
|
+
if (this.unsaved >= 24) {
|
|
1729
|
+
await this.saveCache();
|
|
1730
|
+
await this.saveSubjects();
|
|
1731
|
+
}
|
|
1732
|
+
}
|
|
1733
|
+
await this.saveCache();
|
|
1734
|
+
await this.saveSubjects();
|
|
1735
|
+
}
|
|
1736
|
+
async computeSam3(to) {
|
|
1737
|
+
const settings = this.options.sam3;
|
|
1738
|
+
if (!settings) return;
|
|
1739
|
+
const first = settings.prompts[0]?.frame ?? 0;
|
|
1740
|
+
for (let frame = 0; frame < Math.min(first, to + 1); frame++) {
|
|
1741
|
+
this.results.set(frame, {
|
|
1742
|
+
kp: null,
|
|
1743
|
+
mask: null,
|
|
1744
|
+
score: 0
|
|
1745
|
+
});
|
|
1746
|
+
this.subjects.set(frame, null);
|
|
1747
|
+
}
|
|
1748
|
+
if (to < first) return;
|
|
1749
|
+
const decoder = this.decoder();
|
|
1750
|
+
if (!this.sam3Tracker) {
|
|
1751
|
+
const frameCount = Math.max(1, Math.ceil(await decoder.durationSec() * this.fps - 1e-6));
|
|
1752
|
+
if (settings.prompts.some((prompt) => prompt.frame >= frameCount)) throw new Error("SAM 3 prompt frames must be inside the source video.");
|
|
1753
|
+
const { Sam3Tracker } = await this.prompted();
|
|
1754
|
+
this.sam3Tracker = await Sam3Tracker.create({
|
|
1755
|
+
modelsDir: this.options.modelsDir,
|
|
1756
|
+
baseUrl: this.options.baseUrl,
|
|
1757
|
+
frameCount,
|
|
1758
|
+
textThreshold: settings.textThreshold,
|
|
1759
|
+
maxObjects: settings.maxObjects,
|
|
1760
|
+
merge: settings.merge,
|
|
1761
|
+
redetect: settings.redetect,
|
|
1762
|
+
precision: settings.precision,
|
|
1763
|
+
acceptLicense: this.options.acceptSamLicense ?? this.options.sam3?.acceptLicense
|
|
1764
|
+
});
|
|
1765
|
+
this.sam3Frame = first - 1;
|
|
1766
|
+
}
|
|
1767
|
+
for (let frame = this.sam3Frame + 1; frame <= to; frame++) {
|
|
1768
|
+
const image = await decodedPixels(await decoder.getFrame(frame / this.fps));
|
|
1769
|
+
if (!image) throw new Error(`Cannot decode SAM 3 source frame ${frame}.`);
|
|
1770
|
+
if (!this.sourceWidth) this.setSize(image.width, image.height);
|
|
1771
|
+
const prompt = settings.prompts.find((item) => item.frame === frame);
|
|
1772
|
+
const result$1 = await this.sam3Tracker.process(image, frame, prompt);
|
|
1773
|
+
const kp = this.tracksPose ? await this.matchedPose(image, unionMask(result$1.objects, image)) : null;
|
|
1774
|
+
this.storeSamFrame(frame, result$1.width, result$1.height, result$1.objects, kp);
|
|
1775
|
+
if (this.unsaved >= 24) {
|
|
1776
|
+
await this.saveCache();
|
|
1777
|
+
await this.saveSubjects();
|
|
1778
|
+
}
|
|
1779
|
+
}
|
|
1780
|
+
await this.saveCache();
|
|
1781
|
+
await this.saveSubjects();
|
|
1782
|
+
}
|
|
1783
|
+
/** Stores a prompted frame: every track's mask as one label map, the union as the subject. */
|
|
1784
|
+
storeSamFrame(frame, width, height, objects, kp) {
|
|
1785
|
+
const labels = new Uint8Array(width * height);
|
|
1786
|
+
const order = [...objects.keys()].sort((a, b) => (objects[a]?.score ?? 0) - (objects[b]?.score ?? 0));
|
|
1787
|
+
for (const index of order) {
|
|
1788
|
+
const mask = objects[index]?.mask;
|
|
1789
|
+
if (!mask) continue;
|
|
1790
|
+
for (let i = 0; i < mask.length; i++) if ((mask[i] ?? 0) >= 128) labels[i] = index + 1;
|
|
1791
|
+
}
|
|
1792
|
+
const union = Uint8Array.from(labels, (id) => id ? 255 : 0);
|
|
1793
|
+
const grid = new Uint8Array(this.cellW * this.cellH);
|
|
1794
|
+
downsampleMean(union, width, height, this.cell, grid, this.cellW, this.cellH);
|
|
1795
|
+
let area$1 = 0;
|
|
1796
|
+
for (const id of labels) if (id) area$1++;
|
|
1797
|
+
const scores = objects.map((o) => 1 / (1 + Math.exp(-o.score)));
|
|
1798
|
+
this.results.set(frame, {
|
|
1799
|
+
kp,
|
|
1800
|
+
mask: grid,
|
|
1801
|
+
score: Math.max(0, ...scores)
|
|
1802
|
+
});
|
|
1803
|
+
this.subjects.set(frame, area$1 > 0 ? {
|
|
1804
|
+
category: this.samCategory(),
|
|
1805
|
+
area: area$1,
|
|
1806
|
+
scores,
|
|
1807
|
+
...encodeRuns(labels)
|
|
1808
|
+
} : null);
|
|
1809
|
+
this.trackCounts.set(frame, objects.length);
|
|
1810
|
+
this.blurred.delete(frame);
|
|
1811
|
+
if (this.options.sam3) this.sam3Frame = frame;
|
|
1812
|
+
else this.sam2Frame = frame;
|
|
1813
|
+
this.unsaved++;
|
|
1814
|
+
this.unsavedSubjects++;
|
|
1815
|
+
}
|
|
1816
|
+
samCategory() {
|
|
1817
|
+
return this.options.sam2?.category ?? this.options.sam3?.category ?? "object";
|
|
1818
|
+
}
|
|
1819
|
+
async matchedPose(image, mask) {
|
|
1820
|
+
this.runner ??= VisionRunner.create({
|
|
1821
|
+
modelsDir: this.options.modelsDir,
|
|
1822
|
+
baseUrl: this.options.baseUrl,
|
|
1823
|
+
variant: this.options.variant
|
|
1824
|
+
});
|
|
1825
|
+
const { people } = await this.runner.pose(image);
|
|
1826
|
+
const match = people.map((person) => ({
|
|
1827
|
+
person,
|
|
1828
|
+
overlap: person.keypoints.reduce((sum, point) => {
|
|
1829
|
+
const x = Math.max(0, Math.min(image.width - 1, Math.round(point.x)));
|
|
1830
|
+
return sum + (mask[Math.max(0, Math.min(image.height - 1, Math.round(point.y))) * image.width + x] ?? 0) / 255 * point.visibility;
|
|
1831
|
+
}, 0)
|
|
1832
|
+
})).sort((a, b) => b.overlap - a.overlap)[0];
|
|
1833
|
+
if (!match || match.overlap < 2) return null;
|
|
1834
|
+
return Float32Array.from(match.person.keypoints.flatMap((point) => [
|
|
1835
|
+
point.x,
|
|
1836
|
+
point.y,
|
|
1837
|
+
point.visibility
|
|
1838
|
+
]));
|
|
1839
|
+
}
|
|
1840
|
+
/** Track IDs at a composition frame: every prompted track, else the one subject. */
|
|
1841
|
+
trackIds(frame) {
|
|
1842
|
+
const c = Math.max(0, Math.floor(this.clipFrame(frame)));
|
|
1843
|
+
const count = this.subjects.get(c)?.scores?.length ?? this.trackCounts.get(c) ?? 1;
|
|
1844
|
+
return Array.from({ length: count }, (_, i) => i + 1);
|
|
1845
|
+
}
|
|
1846
|
+
/** The subject (all tracks merged) or, with `id`, one track's mask, in source pixels. */
|
|
1847
|
+
maskAt(frame, id) {
|
|
1848
|
+
const c = Math.max(0, Math.floor(this.clipFrame(frame)));
|
|
1849
|
+
if (this.signalMaskFrame !== c) {
|
|
1850
|
+
this.signalMaskFrame = c;
|
|
1851
|
+
this.signalMasks.clear();
|
|
1852
|
+
}
|
|
1853
|
+
const hit = this.signalMasks.get(id ?? 0);
|
|
1854
|
+
if (hit) return hit;
|
|
1855
|
+
if (!this.results.has(c) || !this.sourceWidth) return void 0;
|
|
1856
|
+
const stored = this.subjects.get(c);
|
|
1857
|
+
const size$1 = this.sourceWidth * this.sourceHeight;
|
|
1858
|
+
const data = stored ? subjectAlpha(stored, size$1, id) : new Uint8Array(size$1);
|
|
1859
|
+
let area$1 = stored?.area ?? 0;
|
|
1860
|
+
if (id !== void 0 && stored?.scores) {
|
|
1861
|
+
area$1 = 0;
|
|
1862
|
+
for (const alpha of data) if (alpha) area$1++;
|
|
1863
|
+
}
|
|
1864
|
+
const mask = {
|
|
1865
|
+
category: stored?.category ?? this.samCategory(),
|
|
1866
|
+
mask: data,
|
|
1867
|
+
width: this.sourceWidth,
|
|
1868
|
+
height: this.sourceHeight,
|
|
1869
|
+
area: area$1,
|
|
1870
|
+
coverage: area$1 / size$1,
|
|
1871
|
+
detectionIndex: (id ?? 1) - 1,
|
|
1872
|
+
trackId: id ?? 1
|
|
1873
|
+
};
|
|
1874
|
+
this.signalMasks.set(id ?? 0, mask);
|
|
1875
|
+
return mask;
|
|
1876
|
+
}
|
|
1877
|
+
publishSignals(from, to) {
|
|
1878
|
+
const bundle = this.signalBundle;
|
|
1879
|
+
if (!bundle || !this.sourceWidth) return;
|
|
1880
|
+
bundle.setFrameSize(this.sourceWidth, this.sourceHeight);
|
|
1881
|
+
for (let frame = from; frame <= to; frame++) {
|
|
1882
|
+
if (this.publishedSignals.has(frame)) continue;
|
|
1883
|
+
this.publishedSignals.add(frame);
|
|
1884
|
+
const c = Math.max(0, Math.floor(this.clipFrame(frame)));
|
|
1885
|
+
const mask = this.maskAt(frame);
|
|
1886
|
+
if (!mask) continue;
|
|
1887
|
+
const before = bundle.getObjectResult(frame - 1).objects;
|
|
1888
|
+
const scores = this.subjects.get(c)?.scores;
|
|
1889
|
+
const objects = this.trackIds(frame).flatMap((id) => {
|
|
1890
|
+
const track = this.maskAt(frame, id);
|
|
1891
|
+
if (!track) return [];
|
|
1892
|
+
return [maskObject(track, frame, this.compositionFps, scores?.[id - 1] ?? this.results.get(c)?.score ?? 1, before.find((object$1) => object$1.trackId === id))];
|
|
1893
|
+
});
|
|
1894
|
+
bundle.setObjectResult(frame, objects);
|
|
1895
|
+
const object = objects[0] ?? maskObject(mask, frame, this.compositionFps, 0);
|
|
1896
|
+
const kp = this.results.get(c)?.kp;
|
|
1897
|
+
bundle.setPoseResult(frame, { people: kp ? [{
|
|
1898
|
+
score: object.score,
|
|
1899
|
+
boundingBox: object.boundingBox,
|
|
1900
|
+
trackId: 1,
|
|
1901
|
+
keypoints: Array.from({ length: 17 }, (_, i) => ({
|
|
1902
|
+
x: (kp[i * 3] ?? 0) / mask.width,
|
|
1903
|
+
y: (kp[i * 3 + 1] ?? 0) / mask.height,
|
|
1904
|
+
visibility: kp[i * 3 + 2] ?? 0
|
|
1905
|
+
}))
|
|
1906
|
+
}] : [] });
|
|
1907
|
+
}
|
|
1908
|
+
}
|
|
1535
1909
|
setSize(width, height) {
|
|
1536
1910
|
this.sourceWidth = width;
|
|
1537
1911
|
this.sourceHeight = height;
|
|
@@ -1591,7 +1965,7 @@ var ClipVision = class {
|
|
|
1591
1965
|
c = Math.max(0, c);
|
|
1592
1966
|
if (this.blurred.has(c)) return this.blurred.get(c) ?? null;
|
|
1593
1967
|
this.mustHave(c);
|
|
1594
|
-
const mask = bridgedMask(this.results, c, this.smoothing);
|
|
1968
|
+
const mask = this.exact ? this.results.get(c)?.mask ?? null : bridgedMask(this.results, c, this.smoothing);
|
|
1595
1969
|
const grid = mask ? boxBlur(mask, this.cellW, this.cellH, 2) : null;
|
|
1596
1970
|
this.blurred.set(c, grid);
|
|
1597
1971
|
return grid;
|
|
@@ -1624,17 +1998,28 @@ var ClipVision = class {
|
|
|
1624
1998
|
const stat = fs$1.statSync(this.source);
|
|
1625
1999
|
const dir = this.options.cacheDir ?? process.env.FRAMEFIELDS_VISION_CACHE_DIR ?? path$1.join(os.homedir(), ".cache", "framefields", "vision");
|
|
1626
2000
|
const o = this.options;
|
|
2001
|
+
const sam = this.exact ? await this.prompted() : void 0;
|
|
1627
2002
|
const key = JSON.stringify([
|
|
1628
2003
|
CACHE_VERSION,
|
|
1629
2004
|
path$1.resolve(this.source),
|
|
1630
2005
|
stat.size,
|
|
1631
2006
|
stat.mtimeMs,
|
|
1632
2007
|
this.fps,
|
|
1633
|
-
|
|
2008
|
+
this.tracksPose,
|
|
1634
2009
|
o.mask ?? true,
|
|
1635
2010
|
this.cell,
|
|
1636
2011
|
o.variant ?? "s",
|
|
1637
|
-
o.confidence ?? null
|
|
2012
|
+
o.confidence ?? null,
|
|
2013
|
+
...o.sam2 ? [[
|
|
2014
|
+
sam?.sam2Revision(o.sam2.model),
|
|
2015
|
+
o.sam2,
|
|
2016
|
+
3
|
|
2017
|
+
]] : [],
|
|
2018
|
+
...o.sam3 && sam ? [[
|
|
2019
|
+
sam.sam3Revision(await sam.sam3Precision(void 0, o.sam3.precision)),
|
|
2020
|
+
o.sam3,
|
|
2021
|
+
3
|
|
2022
|
+
]] : []
|
|
1638
2023
|
]);
|
|
1639
2024
|
const hash = crypto.createHash("sha256").update(key).digest("hex").slice(0, 24);
|
|
1640
2025
|
fs$1.mkdirSync(dir, { recursive: true });
|
|
@@ -1655,6 +2040,7 @@ var ClipVision = class {
|
|
|
1655
2040
|
this.setSize(json.width, json.height);
|
|
1656
2041
|
for (const [c, r] of Object.entries(json.frames)) this.results.set(Number(c), {
|
|
1657
2042
|
kp: r.kp ? Float32Array.from(r.kp) : null,
|
|
2043
|
+
score: r.score,
|
|
1658
2044
|
mask: r.mask ? new Uint8Array(Buffer.from(r.mask, "base64")) : null
|
|
1659
2045
|
});
|
|
1660
2046
|
} catch {}
|
|
@@ -1666,7 +2052,8 @@ var ClipVision = class {
|
|
|
1666
2052
|
const frames = {};
|
|
1667
2053
|
for (const [c, r] of this.results) frames[c] = {
|
|
1668
2054
|
kp: r.kp ? Array.from(r.kp, (v) => Math.round(v * 100) / 100) : null,
|
|
1669
|
-
mask: r.mask ? Buffer.from(r.mask).toString("base64") : null
|
|
2055
|
+
mask: r.mask ? Buffer.from(r.mask).toString("base64") : null,
|
|
2056
|
+
score: r.score
|
|
1670
2057
|
};
|
|
1671
2058
|
const fs$1 = await import("node:fs");
|
|
1672
2059
|
const tmp = `${file}.${process.pid}.tmp`;
|
|
@@ -1697,6 +2084,7 @@ var ClipVision = class {
|
|
|
1697
2084
|
this.subjects.set(Number(c), s && {
|
|
1698
2085
|
category: s.category,
|
|
1699
2086
|
area: s.area,
|
|
2087
|
+
...s.scores && { scores: s.scores },
|
|
1700
2088
|
values: new Uint8Array(Buffer.from(s.values, "base64")),
|
|
1701
2089
|
lengths: new Uint32Array(lengths.buffer.slice(lengths.byteOffset, lengths.byteOffset + lengths.byteLength))
|
|
1702
2090
|
});
|
|
@@ -1711,6 +2099,7 @@ var ClipVision = class {
|
|
|
1711
2099
|
for (const [c, s] of this.subjects) frames[c] = s && {
|
|
1712
2100
|
category: s.category,
|
|
1713
2101
|
area: s.area,
|
|
2102
|
+
...s.scores && { scores: s.scores },
|
|
1714
2103
|
values: Buffer.from(s.values).toString("base64"),
|
|
1715
2104
|
lengths: Buffer.from(s.lengths.buffer, s.lengths.byteOffset, s.lengths.byteLength).toString("base64")
|
|
1716
2105
|
};
|
|
@@ -1993,6 +2382,18 @@ function boxBlur(src, w, h, r) {
|
|
|
1993
2382
|
}
|
|
1994
2383
|
return dst;
|
|
1995
2384
|
}
|
|
2385
|
+
/** A stored subject as 0/255 alpha: label maps merge every track, or keep track `id` only. */
|
|
2386
|
+
function subjectAlpha(stored, size$1, id) {
|
|
2387
|
+
const values = decodeRuns(stored, size$1);
|
|
2388
|
+
if (!stored.scores) return values;
|
|
2389
|
+
return values.map((label) => (id === void 0 ? label > 0 : label === id) ? 255 : 0);
|
|
2390
|
+
}
|
|
2391
|
+
/** Every track's mask merged, for matching one pose to the whole selection. */
|
|
2392
|
+
function unionMask(objects, image) {
|
|
2393
|
+
const union = new Uint8Array(image.width * image.height);
|
|
2394
|
+
for (const { mask } of objects) for (let i = 0; i < union.length; i++) union[i] = Math.max(union[i] ?? 0, mask[i] ?? 0);
|
|
2395
|
+
return union;
|
|
2396
|
+
}
|
|
1996
2397
|
|
|
1997
2398
|
//#endregion
|
|
1998
2399
|
//#region src/media-signals.ts
|
|
@@ -8199,16 +8600,17 @@ var Composition = class Composition {
|
|
|
8199
8600
|
* frame — physics, particles — always find every frame before it.
|
|
8200
8601
|
*/
|
|
8201
8602
|
async prepareVision(frame) {
|
|
8202
|
-
this.
|
|
8603
|
+
this.linkClipLayers();
|
|
8203
8604
|
await Promise.all([...this._clipVision.values()].map((clip) => clip.ready(0, frame)));
|
|
8204
8605
|
}
|
|
8205
8606
|
/**
|
|
8206
|
-
* Points matte-family `withVision` layers at the `comp.vision`
|
|
8207
|
-
* show, so the cutout reuses that clip's per-frame subject
|
|
8208
|
-
*
|
|
8209
|
-
* would give the same subject are
|
|
8607
|
+
* Points matte-family and skeleton `withVision` layers at the `comp.vision`
|
|
8608
|
+
* clip they show, so the cutout reuses that clip's per-frame subject and the
|
|
8609
|
+
* skeleton draws its matched pose, instead of analysing the frame again
|
|
8610
|
+
* during render. Only layers whose settings would give the same subject are
|
|
8611
|
+
* linked; the rest keep their own pass.
|
|
8210
8612
|
*/
|
|
8211
|
-
|
|
8613
|
+
linkClipLayers() {
|
|
8212
8614
|
if (this._clipVision.size === 0) return;
|
|
8213
8615
|
let layers;
|
|
8214
8616
|
const walk = (node) => {
|
|
@@ -8220,13 +8622,13 @@ var Composition = class Composition {
|
|
|
8220
8622
|
return [op.id, op];
|
|
8221
8623
|
}));
|
|
8222
8624
|
const layer = layers.get(n.id);
|
|
8223
|
-
const clip = this.
|
|
8625
|
+
const clip = this.clipForLayer(n.src ?? n.inputHandleId, n.vision, {
|
|
8224
8626
|
trimStartSec: n.trimStartSec,
|
|
8225
8627
|
startFrame: layer?.startFrame ?? n.startFrame,
|
|
8226
8628
|
timeRemap: layer?.timeRemap
|
|
8227
8629
|
});
|
|
8228
8630
|
if (clip) {
|
|
8229
|
-
clip.keepSubjects();
|
|
8631
|
+
if (n.vision.mode !== "skeleton") clip.keepSubjects();
|
|
8230
8632
|
Object.defineProperty(n.vision, CLIP_SUBJECT, {
|
|
8231
8633
|
value: clip,
|
|
8232
8634
|
enumerable: false,
|
|
@@ -8238,13 +8640,21 @@ var Composition = class Composition {
|
|
|
8238
8640
|
};
|
|
8239
8641
|
for (const child of this.children) walk(child);
|
|
8240
8642
|
}
|
|
8241
|
-
|
|
8643
|
+
/** The `comp.vision` clip a matte or skeleton layer of the same source reads instead of analysing. */
|
|
8644
|
+
clipForLayer(source, v, layer) {
|
|
8242
8645
|
const mode = v.mode ?? "passthrough";
|
|
8243
|
-
|
|
8244
|
-
if (
|
|
8646
|
+
const skeleton = mode === "skeleton";
|
|
8647
|
+
if (mode !== "matte" && mode !== "mask" && mode !== "crop" && !skeleton) return;
|
|
8648
|
+
if (v.classes !== void 0 || v.enableMatte === true || v.visionBundle !== void 0 || !skeleton && (v.matteSource === "selfie" || v.keyBackground === true || v.enablePose === true || (v.maskThreshold ?? .5) !== .5 || v.featherRadius !== void 0)) return;
|
|
8245
8649
|
for (const clip of this._clipVision.values()) {
|
|
8246
8650
|
const o = clip.options;
|
|
8247
|
-
if (clip.source === source && clip.startFrame === (layer.startFrame ?? 0) && clip.trimStartSec === (layer.trimStartSec ?? 0) && remapKey(o.timeRemap) === remapKey(layer.timeRemap) && (o.variant ?? "s") === (v.variant ?? "s") && (o.confidence ?? .3) === (v.confidence ?? .3))
|
|
8651
|
+
if (clip.source === source && clip.startFrame === (layer.startFrame ?? 0) && clip.trimStartSec === (layer.trimStartSec ?? 0) && remapKey(o.timeRemap) === remapKey(layer.timeRemap) && (o.variant ?? "s") === (v.variant ?? "s") && (o.confidence ?? .3) === (v.confidence ?? .3)) {
|
|
8652
|
+
if (skeleton && !clip.tracksPose) {
|
|
8653
|
+
if (clip.exact) throw new Error("A skeleton layer of a prompted comp.vision clip needs `pose: true` on that clip.");
|
|
8654
|
+
continue;
|
|
8655
|
+
}
|
|
8656
|
+
return clip;
|
|
8657
|
+
}
|
|
8248
8658
|
}
|
|
8249
8659
|
}
|
|
8250
8660
|
/**
|
|
@@ -9457,4 +9867,4 @@ const Effect = Object.assign(Effect$1, effectFactories, {
|
|
|
9457
9867
|
|
|
9458
9868
|
//#endregion
|
|
9459
9869
|
export { glyphAnimator as $, wordRanges as $t, boilKeys as A, squigglePath as At, defineTheme as B, themes as Bt, audioLevelsSchema as C, span as Cn, scaleFrames as Ct, basePropsSchema as D, FRAMEFIELDS_AI_PROXY_URL as Dn, springKeys as Dt, bandEdges as E, ApiError as En, springAt as Et, constantExpression as F, surfaceFill as Ft, elevationStyle as G, transparent as Gt, drawOnKeys as H, toPathData as Ht, contrastRatio as I, targetPoint as It, evaluateEase as J, windowExpression as Jt, ellipsePath as K, typingFrames as Kt, cover as L, targetSchema as Lt, boxPath as M, staggerRanks as Mt, catmullRom as N, stepExpression as Nt, beats as O, ValidationError as On, springSettleFrames as Ot, chain as P, supersede as Pt, frameSpan as Q, wobblePoints as Qt, defineComponent as R, textLayout as Rt, ascending as S, size as Sn, safeArea as St, bakeSamples as T, sup as Tn, smoothRelease as Tt, ease as U, toSeconds as Ut, dist as V, toFrames as Vt, elevate as W, transformPathData as Wt, exitAnimation as X, withDefaults as Xt, evaluateGlyphExpression as Y, withAlpha as Yt, findRange as Z, within as Zt, after as _, italic as _n, resampleBands as _t, Media as a, PhysicsWorld2D as an, last as at, arcPath as b, parseMarkup as bn, rng as bt, section as c, Layer3D as cn, lineShift as ct, analyzeAudio as d, PersonTrack as dn, offsetCues as dt, Styles as en, hashRng as et, KeyBook as f, DEFAULT_CHART_COLORS as fn, parseColor as ft, UNIT_INDEX as g, color as gn, rendererChars as gt, Track as h, code as hn, rangeRects as ht, Light as i, PhysicsBody2D as in, isLight as it, boundsOf as j, staggerOffsets as jt, bind as k, ai as kn, springTrack as kt, bindComponent as l, Particles as ln, luminance as lt, SAFE_INSETS as m, bold as mn, quantize as mt, Effect as n, PhysicsBody3D as nn, holdFirstKeys as nt, blurRegion as o, Lighting as on, lerp2 as ot, MOTION_PRESETS as p, accent as pn, pulseKeys as pt, enterAnimation as q, valueAt as qt, Layer as r, PhysicsWorld3D as rn, inkOn as rt, editTrackedRegion as s, Transition as sn, linePath as st, Composition as t, Physics as tn, hashString as tt, z$2 as u, ClipVision as un, mix as ut, analyzeChannels as v, mark as vn, resolveMotion as vt, bakeFunction as w, sub as wn, scheduleExpression as wt, arrowPaths as x, rich as xn, round as xt, anchorPoint as y, normalizeTextSpans as yn, resolveTarget as yt, defineMeta as z, themeFrames as zt };
|
|
9460
|
-
//# sourceMappingURL=src-
|
|
9870
|
+
//# sourceMappingURL=src-DFEqficI.mjs.map
|