framefields 2.0.8 → 2.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/audio/index.d.mts +4 -4
- package/dist/audio/index.mjs +10 -10
- package/dist/{audio--hi7MiZt.mjs → audio-B7Al-W_0.mjs} +3 -3
- package/dist/{audio--hi7MiZt.mjs.map → audio-B7Al-W_0.mjs.map} +1 -1
- package/dist/{audio-a6pY05g2.d.mts → audio-BxA0sL9z.d.mts} +3 -3
- package/dist/{audio-a6pY05g2.d.mts.map → audio-BxA0sL9z.d.mts.map} +1 -1
- package/dist/{client-C74hb7fy.mjs → client-CwRhflHE.mjs} +1 -1
- package/dist/{client-C74hb7fy.mjs.map → client-CwRhflHE.mjs.map} +1 -1
- package/dist/{dist-BQFap0wr.mjs → dist-B9PkqWnN.mjs} +78 -17
- package/dist/dist-B9PkqWnN.mjs.map +1 -0
- package/dist/{dist-ZVlYkuR4.mjs → dist-BFjSQP7i.mjs} +17 -8
- package/dist/dist-BFjSQP7i.mjs.map +1 -0
- package/dist/{dist-cjs-qEJrwjGk.mjs → dist-cjs--lfMLs3U.mjs} +4 -4
- package/dist/{dist-cjs-qEJrwjGk.mjs.map → dist-cjs--lfMLs3U.mjs.map} +1 -1
- package/dist/{dist-cjs-x5cwlqA5.mjs → dist-cjs--pxyGFw2.mjs} +1 -1
- package/dist/{dist-cjs-x5cwlqA5.mjs.map → dist-cjs--pxyGFw2.mjs.map} +1 -1
- package/dist/dist-cjs-3pon9kTt.mjs +6 -0
- package/dist/{dist-cjs-Dzs5P3K0.mjs → dist-cjs-BDpO-TH_.mjs} +1 -1
- package/dist/{dist-cjs-Dzs5P3K0.mjs.map → dist-cjs-BDpO-TH_.mjs.map} +1 -1
- package/dist/{dist-cjs-lYvO8aDo.mjs → dist-cjs-BiKQozdJ.mjs} +3 -3
- package/dist/{dist-cjs-lYvO8aDo.mjs.map → dist-cjs-BiKQozdJ.mjs.map} +1 -1
- package/dist/{dist-cjs-BUwe2XhR.mjs → dist-cjs-BmyyWYWv.mjs} +2 -2
- package/dist/{dist-cjs-BUwe2XhR.mjs.map → dist-cjs-BmyyWYWv.mjs.map} +1 -1
- package/dist/{dist-cjs-DgxjcvBN.mjs → dist-cjs-CND_ghfH.mjs} +1 -1
- package/dist/{dist-cjs-DgxjcvBN.mjs.map → dist-cjs-CND_ghfH.mjs.map} +1 -1
- package/dist/{dist-cjs-BWgoUCXJ.mjs → dist-cjs-CQwmMllY.mjs} +6 -6
- package/dist/{dist-cjs-BWgoUCXJ.mjs.map → dist-cjs-CQwmMllY.mjs.map} +1 -1
- package/dist/{dist-cjs-B5EVqDFp.mjs → dist-cjs-CgFzrgj8.mjs} +1 -1
- package/dist/{dist-cjs-B5EVqDFp.mjs.map → dist-cjs-CgFzrgj8.mjs.map} +1 -1
- package/dist/{dist-cjs-ECMuIF57.mjs → dist-cjs-CsU2sZoX.mjs} +4 -4
- package/dist/{dist-cjs-ECMuIF57.mjs.map → dist-cjs-CsU2sZoX.mjs.map} +1 -1
- package/dist/{dist-cjs-BKmGCgtm.mjs → dist-cjs-DJ8fcQEe.mjs} +11 -11
- package/dist/{dist-cjs-BKmGCgtm.mjs.map → dist-cjs-DJ8fcQEe.mjs.map} +1 -1
- package/dist/{dist-cjs-D7kEM-Mj.mjs → dist-cjs-DT2jJlcK.mjs} +5 -5
- package/dist/{dist-cjs-D7kEM-Mj.mjs.map → dist-cjs-DT2jJlcK.mjs.map} +1 -1
- package/dist/{dist-cjs-BUc0_kg-.mjs → dist-cjs-DjzmP0-x.mjs} +13 -13
- package/dist/{dist-cjs-BUc0_kg-.mjs.map → dist-cjs-DjzmP0-x.mjs.map} +1 -1
- package/dist/{dist-cjs-BGJkdexX.mjs → dist-cjs-DzjrlfbE.mjs} +14 -14
- package/dist/{dist-cjs-BGJkdexX.mjs.map → dist-cjs-DzjrlfbE.mjs.map} +1 -1
- package/dist/{dist-cjs-Df7144zM.mjs → dist-cjs-M-8QOgS_.mjs} +2 -2
- package/dist/{dist-cjs-Df7144zM.mjs.map → dist-cjs-M-8QOgS_.mjs.map} +1 -1
- package/dist/{dist-cjs-DFUmy89O.mjs → dist-cjs-TsA8LFXC.mjs} +3 -3
- package/dist/{dist-cjs-DFUmy89O.mjs.map → dist-cjs-TsA8LFXC.mjs.map} +1 -1
- package/dist/{dist-cjs-DsMdld8l.mjs → dist-cjs-agQl9T8M.mjs} +6 -6
- package/dist/{dist-cjs-DsMdld8l.mjs.map → dist-cjs-agQl9T8M.mjs.map} +1 -1
- package/dist/effects/index.d.mts +5 -5
- package/dist/effects/index.mjs +27 -26
- package/dist/{effects-axfL_C3a.mjs → effects-CREopCyP.mjs} +27 -3
- package/dist/effects-CREopCyP.mjs.map +1 -0
- package/dist/{event-streams-D-APZ7Ke.mjs → event-streams-BaNGaLxh.mjs} +2 -2
- package/dist/{event-streams-D-APZ7Ke.mjs.map → event-streams-BaNGaLxh.mjs.map} +1 -1
- package/dist/fonts/index.d.mts +1 -1
- package/dist/fonts/index.mjs +1 -1
- package/dist/{fonts-Cy26mbrO.mjs → fonts-DhEQ5h6E.mjs} +2 -2
- package/dist/{fonts-Cy26mbrO.mjs.map → fonts-DhEQ5h6E.mjs.map} +1 -1
- package/dist/{index-BJUS4Nx6.d.mts → index-BXNNJVs8.d.mts} +2 -2
- package/dist/{index-BJUS4Nx6.d.mts.map → index-BXNNJVs8.d.mts.map} +1 -1
- package/dist/{index-CbzEM_o6.d.mts → index-CQcdKyxF.d.mts} +1 -1
- package/dist/{index-CbzEM_o6.d.mts.map → index-CQcdKyxF.d.mts.map} +1 -1
- package/dist/{index-BJx_Qxc_.d.mts → index-CvDVpaKn.d.mts} +69 -27
- package/dist/index-CvDVpaKn.d.mts.map +1 -0
- package/dist/{index-WIPHLy5m.d.mts → index-D1zaOwEU.d.mts} +1 -1
- package/dist/index-D1zaOwEU.d.mts.map +1 -0
- package/dist/{index-CZChQhXZ.d.mts → index-J9CIK_nu.d.mts} +4 -2
- package/dist/index-J9CIK_nu.d.mts.map +1 -0
- package/dist/{index-Bi2nRZ_g.d.mts → index-fo4E7A6C.d.mts} +3 -3
- package/dist/{index-Bi2nRZ_g.d.mts.map → index-fo4E7A6C.d.mts.map} +1 -1
- package/dist/{index-BLbUQolI.d.mts → index-oodg5k9K.d.mts} +3 -3
- package/dist/{index-BLbUQolI.d.mts.map → index-oodg5k9K.d.mts.map} +1 -1
- package/dist/index.d.mts +11 -10
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +43 -42
- package/dist/index.mjs.map +1 -1
- package/dist/{package-C58KmGKw.mjs → package-XpCRbTOA.mjs} +1 -1
- package/dist/{package-C58KmGKw.mjs.map → package-XpCRbTOA.mjs.map} +1 -1
- package/dist/preview/index.d.mts +2 -2
- package/dist/preview/index.mjs +11 -11
- package/dist/{preview-BUPB38Kk.mjs → preview-9ifxywUM.mjs} +2 -2
- package/dist/{preview-BUPB38Kk.mjs.map → preview-9ifxywUM.mjs.map} +1 -1
- package/dist/preview-engine/audio.mjs +1 -1
- package/dist/preview-engine/{chunk-3ROJ7JVY.mjs → chunk-25IW7NYO.mjs} +1 -1
- package/dist/preview-engine/chunk-36YGYLKD.mjs +58 -0
- package/dist/preview-engine/chunk-4VOHF3FF.mjs +1 -0
- package/dist/preview-engine/{chunk-TNZENER3.mjs → chunk-7DIAFPQP.mjs} +2 -2
- package/dist/preview-engine/{chunk-CXFEQ5PM.mjs → chunk-7O24H4YT.mjs} +2 -2
- package/dist/preview-engine/{chunk-VWLR2AZR.mjs → chunk-AEK5BO3J.mjs} +1 -1
- package/dist/preview-engine/{chunk-5PPSCISJ.mjs → chunk-AG5JNZYQ.mjs} +1 -1
- package/dist/preview-engine/{chunk-BE3CEVJB.mjs → chunk-AUFSM5KI.mjs} +2 -2
- package/dist/preview-engine/chunk-AW7HNZKR.mjs +98 -0
- package/dist/preview-engine/chunk-BHFI3Y4T.mjs +1 -0
- package/dist/preview-engine/chunk-DLXQDDIN.mjs +46 -0
- package/dist/preview-engine/chunk-EJGLUZMW.mjs +1 -0
- package/dist/preview-engine/{chunk-XSMK5E2V.mjs → chunk-JAOXXYXG.mjs} +2 -2
- package/dist/preview-engine/{chunk-PO4VAAQC.mjs → chunk-K52S5DJX.mjs} +1 -1
- package/dist/preview-engine/{chunk-IGFT3XLN.mjs → chunk-MDDF2GCF.mjs} +2 -2
- package/dist/preview-engine/chunk-MJM3NFEC.mjs +315 -0
- package/dist/preview-engine/{chunk-BUWK5RJ4.mjs → chunk-QTKJXDIW.mjs} +1 -1
- package/dist/preview-engine/{chunk-WQ7BFSKF.mjs → chunk-RNOO4UR5.mjs} +1 -1
- package/dist/preview-engine/{chunk-POPVFC5P.mjs → chunk-S4CSX6K5.mjs} +10 -10
- package/dist/preview-engine/chunk-SNYAHQ25.mjs +186 -0
- package/dist/preview-engine/{chunk-JNEVSC4I.mjs → chunk-T6CC2KCZ.mjs} +1 -1
- package/dist/preview-engine/{chunk-MC7TZZLD.mjs → chunk-T6COGNOW.mjs} +2 -2
- package/dist/preview-engine/chunk-VVLM6LZ3.mjs +1 -0
- package/dist/preview-engine/chunk-XUM42I4R.mjs +1 -0
- package/dist/preview-engine/chunk-ZDCA6NVT.mjs +82 -0
- package/dist/preview-engine/effects.mjs +1 -1
- package/dist/preview-engine/fonts.mjs +1 -1
- package/dist/preview-engine/framefields.mjs +13 -13
- package/dist/preview-engine/player.mjs +5 -5
- package/dist/preview-engine/{renderers-Q2ZDD5K2.mjs → renderers-2US2NIUG.mjs} +2 -2
- package/dist/preview-engine/{renderers-54AQK6RF.mjs → renderers-32PIFHPS.mjs} +1 -1
- package/dist/preview-engine/{renderers-O6HOYIPS.mjs → renderers-76PQY2SO.mjs} +1 -1
- package/dist/preview-engine/renderers-7HNVXNAI.mjs +248 -0
- package/dist/preview-engine/{renderers-PXGLEFZO.mjs → renderers-CI2GXWLP.mjs} +1 -1
- package/dist/preview-engine/{renderers-GC7EGB5Z.mjs → renderers-CRKRWR2Y.mjs} +1 -1
- package/dist/preview-engine/{renderers-47UITXLZ.mjs → renderers-EE2GFG7J.mjs} +1 -1
- package/dist/preview-engine/{renderers-E3JYRLSD.mjs → renderers-GJSUN5HU.mjs} +1 -1
- package/dist/preview-engine/{renderers-KCP4TFHG.mjs → renderers-IHKORHMT.mjs} +1 -1
- package/dist/preview-engine/{renderers-OBMTU3QY.mjs → renderers-NQUDQEHY.mjs} +1 -1
- package/dist/preview-engine/{renderers-QECJP22T.mjs → renderers-NSY2SDIE.mjs} +1 -1
- package/dist/preview-engine/{renderers-KS4HPV6Q.mjs → renderers-PWLWOZY4.mjs} +1 -1
- package/dist/preview-engine/{renderers-TUYQLKHJ.mjs → renderers-W5CVDJVH.mjs} +1 -1
- package/dist/preview-engine/{renderers-N5UPJY73.mjs → renderers-WLLJFZTF.mjs} +1 -1
- package/dist/preview-engine/renderers-WN4SYFCU.mjs +1 -0
- package/dist/preview-engine/{renderers-TG62LZTF.mjs → renderers-XFBSGTHU.mjs} +1 -1
- package/dist/preview-engine/signals.mjs +1 -1
- package/dist/{program-Jt07Tx1J.mjs → program-xRfFoPxe.mjs} +2 -2
- package/dist/{program-Jt07Tx1J.mjs.map → program-xRfFoPxe.mjs.map} +1 -1
- package/dist/renderer/index.d.mts +2 -2
- package/dist/renderer/index.mjs +3 -3
- package/dist/{renderer-Bal8734U.d.mts → renderer-2NQWaZd7.d.mts} +2 -2
- package/dist/{renderer-Bal8734U.d.mts.map → renderer-2NQWaZd7.d.mts.map} +1 -1
- package/dist/{renderer-CIMjMFGm.mjs → renderer-5h0llpx7.mjs} +2 -2
- package/dist/{renderer-CIMjMFGm.mjs.map → renderer-5h0llpx7.mjs.map} +1 -1
- package/dist/{renderer-U0LJuM9D.mjs → renderer-6GeDT4Mx.mjs} +2 -2
- package/dist/{renderer-U0LJuM9D.mjs.map → renderer-6GeDT4Mx.mjs.map} +1 -1
- package/dist/{renderer-CIQYTiT9.mjs → renderer-8qpGxSSO.mjs} +2 -2
- package/dist/{renderer-CIQYTiT9.mjs.map → renderer-8qpGxSSO.mjs.map} +1 -1
- package/dist/{renderer-BkOXe6o6.mjs → renderer-9wp5R7PL.mjs} +2 -2
- package/dist/{renderer-BkOXe6o6.mjs.map → renderer-9wp5R7PL.mjs.map} +1 -1
- package/dist/renderer-B4F6wL68.mjs +3 -0
- package/dist/renderer-B4i1jmiT.mjs +3 -0
- package/dist/renderer-B5ylY3uM.mjs +3 -0
- package/dist/{renderer-B6Q5e9CU.mjs → renderer-BA8YwBRQ.mjs} +2 -2
- package/dist/{renderer-B6Q5e9CU.mjs.map → renderer-BA8YwBRQ.mjs.map} +1 -1
- package/dist/{renderer-DVQp5fLG.mjs → renderer-BGXbGqY4.mjs} +5 -4
- package/dist/{renderer-DVQp5fLG.mjs.map → renderer-BGXbGqY4.mjs.map} +1 -1
- package/dist/{renderer-Dgg6pQGI.mjs → renderer-BJ6Y-7ke.mjs} +2 -2
- package/dist/{renderer-Dgg6pQGI.mjs.map → renderer-BJ6Y-7ke.mjs.map} +1 -1
- package/dist/{renderer-BDLnExoP.mjs → renderer-BM05sB8m.mjs} +8 -7
- package/dist/renderer-BM05sB8m.mjs.map +1 -0
- package/dist/renderer-BPw23wiR.mjs +3 -0
- package/dist/{renderer-DP-xNaYX.mjs → renderer-BZmfKIom.mjs} +2 -2
- package/dist/{renderer-DP-xNaYX.mjs.map → renderer-BZmfKIom.mjs.map} +1 -1
- package/dist/{renderer-DXyaswab.mjs → renderer-BgdkEFmv.mjs} +18 -17
- package/dist/renderer-BgdkEFmv.mjs.map +1 -0
- package/dist/renderer-BghW-bSZ.mjs +3 -0
- package/dist/{renderer-BdSHGzHj.mjs → renderer-BiSALMQy.mjs} +1 -1
- package/dist/{renderer-C-Bv9nVB.mjs → renderer-BnvqEqvE.mjs} +2 -2
- package/dist/{renderer-C-Bv9nVB.mjs.map → renderer-BnvqEqvE.mjs.map} +1 -1
- package/dist/{renderer-CmIySXSN.mjs → renderer-BpCxKWQm.mjs} +11 -5
- package/dist/renderer-BpCxKWQm.mjs.map +1 -0
- package/dist/{renderer-CceiI6P7.mjs → renderer-BtRfKx5N.mjs} +18 -4
- package/dist/renderer-BtRfKx5N.mjs.map +1 -0
- package/dist/{renderer-CXZe0lfI.mjs → renderer-But0u-xi.mjs} +2 -2
- package/dist/{renderer-CXZe0lfI.mjs.map → renderer-But0u-xi.mjs.map} +1 -1
- package/dist/renderer-Bw3oZ9YT.mjs +3 -0
- package/dist/renderer-C2009W-_.mjs +3 -0
- package/dist/renderer-C36yoGXG.mjs +3 -0
- package/dist/{renderer-VPK8JnSw.mjs → renderer-CIYcdZuZ.mjs} +7 -6
- package/dist/{renderer-VPK8JnSw.mjs.map → renderer-CIYcdZuZ.mjs.map} +1 -1
- package/dist/{renderer-D49-PYDo.mjs → renderer-CJNyhr_S.mjs} +2 -2
- package/dist/{renderer-D49-PYDo.mjs.map → renderer-CJNyhr_S.mjs.map} +1 -1
- package/dist/renderer-CM1_2ZWA.mjs +3 -0
- package/dist/{renderer-0uccAKQe.mjs → renderer-CNF10fCq.mjs} +2 -2
- package/dist/{renderer-0uccAKQe.mjs.map → renderer-CNF10fCq.mjs.map} +1 -1
- package/dist/{renderer-DxBUppHf.mjs → renderer-CStktK20.mjs} +74 -63
- package/dist/{renderer-DxBUppHf.mjs.map → renderer-CStktK20.mjs.map} +1 -1
- package/dist/renderer-CWlzudP8.mjs +3 -0
- package/dist/{renderer-D5GsF1LT.mjs → renderer-CcU7dVn9.mjs} +2 -2
- package/dist/{renderer-D5GsF1LT.mjs.map → renderer-CcU7dVn9.mjs.map} +1 -1
- package/dist/renderer-Cd5vzrGs.mjs +3 -0
- package/dist/renderer-CeJ_vDXI.mjs +3 -0
- package/dist/{renderer-DFKsLrUs.mjs → renderer-CepMDQ06.mjs} +1 -1
- package/dist/{renderer-DFKsLrUs.mjs.map → renderer-CepMDQ06.mjs.map} +1 -1
- package/dist/{renderer-DrgNyCSx.mjs → renderer-CfeoxM_3.mjs} +2 -2
- package/dist/{renderer-DrgNyCSx.mjs.map → renderer-CfeoxM_3.mjs.map} +1 -1
- package/dist/{renderer-BENX0vRC.mjs → renderer-CgmFh6MY.mjs} +1 -1
- package/dist/renderer-CjY77sB_.mjs +3 -0
- package/dist/{renderer-Bu0xOP_v.mjs → renderer-CoZKST2Y.mjs} +2 -2
- package/dist/{renderer-Bu0xOP_v.mjs.map → renderer-CoZKST2Y.mjs.map} +1 -1
- package/dist/{renderer-BQZniXw0.mjs → renderer-CroHPOsX.mjs} +2 -2
- package/dist/{renderer-BQZniXw0.mjs.map → renderer-CroHPOsX.mjs.map} +1 -1
- package/dist/{renderer-DabG62XS.mjs → renderer-D2XD4QYk.mjs} +1 -1
- package/dist/{renderer-DabG62XS.mjs.map → renderer-D2XD4QYk.mjs.map} +1 -1
- package/dist/renderer-D5Z6mda5.mjs +3 -0
- package/dist/{renderer-Bv-ljXHc.mjs → renderer-D7ztfQHX.mjs} +2 -2
- package/dist/{renderer-Bv-ljXHc.mjs.map → renderer-D7ztfQHX.mjs.map} +1 -1
- package/dist/{renderer-DjI45OYC.mjs → renderer-D7zvPHKn.mjs} +1 -1
- package/dist/{renderer-DjI45OYC.mjs.map → renderer-D7zvPHKn.mjs.map} +1 -1
- package/dist/renderer-D9NnIx7o.mjs +3 -0
- package/dist/{renderer-C5RhNQdr.mjs → renderer-DAMJZNtX.mjs} +10 -9
- package/dist/{renderer-C5RhNQdr.mjs.map → renderer-DAMJZNtX.mjs.map} +1 -1
- package/dist/{renderer-Bq3Geqe3.mjs → renderer-DBlPbsgi.mjs} +1 -1
- package/dist/renderer-DCJa7OGk.mjs +3 -0
- package/dist/{renderer-DDd3cjaz.mjs → renderer-DCkSR2Ne.mjs} +18 -11
- package/dist/renderer-DCkSR2Ne.mjs.map +1 -0
- package/dist/{renderer-B80s47yo.mjs → renderer-DEJwPRkR.mjs} +1 -1
- package/dist/{renderer-B80s47yo.mjs.map → renderer-DEJwPRkR.mjs.map} +1 -1
- package/dist/renderer-DGwSl7g1.mjs +3 -0
- package/dist/{renderer-DbaSgadp.mjs → renderer-DNNqpK7t.mjs} +2 -2
- package/dist/{renderer-DbaSgadp.mjs.map → renderer-DNNqpK7t.mjs.map} +1 -1
- package/dist/renderer-DNoRNfMm.mjs +3 -0
- package/dist/renderer-DOZ8bpyY.mjs +3 -0
- package/dist/renderer-DRHyRNU8.mjs +3 -0
- package/dist/{renderer-BjROyv5F.mjs → renderer-DTvfYkI9.mjs} +2 -2
- package/dist/{renderer-BjROyv5F.mjs.map → renderer-DTvfYkI9.mjs.map} +1 -1
- package/dist/{renderer-CboM4tba.mjs → renderer-DYm4duFr.mjs} +11 -5
- package/dist/renderer-DYm4duFr.mjs.map +1 -0
- package/dist/{renderer-CIvaRnP_.mjs → renderer-D_1oDOCP.mjs} +1 -1
- package/dist/{renderer-CIvaRnP_.mjs.map → renderer-D_1oDOCP.mjs.map} +1 -1
- package/dist/renderer-DdVBt8Rz.mjs +263 -0
- package/dist/renderer-DdVBt8Rz.mjs.map +1 -0
- package/dist/{renderer-BPbNLPcz.mjs → renderer-DffynBHa.mjs} +2 -2
- package/dist/{renderer-BPbNLPcz.mjs.map → renderer-DffynBHa.mjs.map} +1 -1
- package/dist/{renderer-CXJxK7HP.mjs → renderer-DjTiNeAp.mjs} +17 -4
- package/dist/renderer-DjTiNeAp.mjs.map +1 -0
- package/dist/{renderer-DP948J9X.mjs → renderer-Dju9CaeL.mjs} +18 -4
- package/dist/renderer-Dju9CaeL.mjs.map +1 -0
- package/dist/renderer-DlD85Xoi.mjs +3 -0
- package/dist/renderer-Dr0bgOrW.mjs +3 -0
- package/dist/{renderer-BTFPC3UJ.mjs → renderer-DryPrxYc.mjs} +1 -1
- package/dist/renderer-DurtG-Hc.mjs +3 -0
- package/dist/{renderer-zwxwjWqa.mjs → renderer-DxtHmyAa.mjs} +2 -2
- package/dist/{renderer-zwxwjWqa.mjs.map → renderer-DxtHmyAa.mjs.map} +1 -1
- package/dist/{renderer-h-HOoLwD.mjs → renderer-_bygZSKk.mjs} +1 -1
- package/dist/{renderer-h-HOoLwD.mjs.map → renderer-_bygZSKk.mjs.map} +1 -1
- package/dist/{renderer-BD6Jkc8j.mjs → renderer-b6sZN90h.mjs} +4 -3
- package/dist/{renderer-BD6Jkc8j.mjs.map → renderer-b6sZN90h.mjs.map} +1 -1
- package/dist/renderer-d5-F_48R.mjs +3 -0
- package/dist/renderer-eFv9HBmL.mjs +3 -0
- package/dist/renderer-iuV6wQoL.mjs +4 -0
- package/dist/{renderer-D5xelwpw.mjs → renderer-jkZ_IQnW.mjs} +2 -2
- package/dist/{renderer-D5xelwpw.mjs.map → renderer-jkZ_IQnW.mjs.map} +1 -1
- package/dist/renderer-n-uuWPF4.mjs +3 -0
- package/dist/renderer-rzccTFuY.mjs +3 -0
- package/dist/{renderer-DIfk6m2O.mjs → renderer-wVldKtFU.mjs} +2 -2
- package/dist/{renderer-DIfk6m2O.mjs.map → renderer-wVldKtFU.mjs.map} +1 -1
- package/dist/{renderer-o4wOvjEC.mjs → renderer-xKOVmd2O.mjs} +21 -18
- package/dist/renderer-xKOVmd2O.mjs.map +1 -0
- package/dist/renderer-y9eGFPFL.mjs +3 -0
- package/dist/{renderers-CP8CFWDs-BQBjaV9O.mjs → renderers-CP8CFWDs-BLgwUYX2.mjs} +2 -2
- package/dist/{renderers-CP8CFWDs-BQBjaV9O.mjs.map → renderers-CP8CFWDs-BLgwUYX2.mjs.map} +1 -1
- package/dist/signals/index.d.mts +5 -5
- package/dist/signals/index.mjs +4 -4
- package/dist/{signin-CZj4Oc5s.mjs → signin-Db08vl-g.mjs} +9 -9
- package/dist/{signin-CZj4Oc5s.mjs.map → signin-Db08vl-g.mjs.map} +1 -1
- package/dist/{sso-oidc-C0_31ThY.mjs → sso-oidc-CpLz_lIu.mjs} +9 -9
- package/dist/{sso-oidc-C0_31ThY.mjs.map → sso-oidc-CpLz_lIu.mjs.map} +1 -1
- package/dist/{sts-DD4ggEXC.mjs → sts-BQefGuml.mjs} +2 -2
- package/dist/{sts-nXw8RDJI.mjs → sts-Dgl0kH-t.mjs} +9 -9
- package/dist/{sts-nXw8RDJI.mjs.map → sts-Dgl0kH-t.mjs.map} +1 -1
- package/package.json +55 -54
- package/dist/dist-BQFap0wr.mjs.map +0 -1
- package/dist/dist-ZVlYkuR4.mjs.map +0 -1
- package/dist/dist-cjs-CmZEMtO6.mjs +0 -6
- package/dist/effects-axfL_C3a.mjs.map +0 -1
- package/dist/index-BJx_Qxc_.d.mts.map +0 -1
- package/dist/index-CZChQhXZ.d.mts.map +0 -1
- package/dist/index-WIPHLy5m.d.mts.map +0 -1
- package/dist/preview-engine/chunk-2XXICKQV.mjs +0 -82
- package/dist/preview-engine/chunk-66NVL4BN.mjs +0 -58
- package/dist/preview-engine/chunk-7MJVROKR.mjs +0 -98
- package/dist/preview-engine/chunk-7NVDTELW.mjs +0 -1
- package/dist/preview-engine/chunk-DMWSTYFF.mjs +0 -1
- package/dist/preview-engine/chunk-FKZ4XXPE.mjs +0 -1
- package/dist/preview-engine/chunk-JQ4WY6BZ.mjs +0 -186
- package/dist/preview-engine/chunk-S3P3MJYU.mjs +0 -1
- package/dist/preview-engine/chunk-ZJFAGIOM.mjs +0 -315
- package/dist/preview-engine/renderers-MZBR3MSR.mjs +0 -248
- package/dist/renderer-1mNREW16.mjs +0 -3
- package/dist/renderer-4tKI3p9c.mjs +0 -3
- package/dist/renderer-B3XeKN-e.mjs +0 -3
- package/dist/renderer-B7_6SHd8.mjs +0 -3
- package/dist/renderer-BDLnExoP.mjs.map +0 -1
- package/dist/renderer-BENF6Wts.mjs +0 -3
- package/dist/renderer-BMovYRoR.mjs +0 -3
- package/dist/renderer-BPiLdwI1.mjs +0 -3
- package/dist/renderer-BdyMrzUX.mjs +0 -3
- package/dist/renderer-BfpdekRn.mjs +0 -3
- package/dist/renderer-BfvBHHNr.mjs +0 -3
- package/dist/renderer-BtdnLjKZ.mjs +0 -3
- package/dist/renderer-C0q5UUY7.mjs +0 -3
- package/dist/renderer-CXJxK7HP.mjs.map +0 -1
- package/dist/renderer-CboM4tba.mjs.map +0 -1
- package/dist/renderer-CceiI6P7.mjs.map +0 -1
- package/dist/renderer-Cg-rJgwM.mjs +0 -3
- package/dist/renderer-CkgQArsi.mjs +0 -3
- package/dist/renderer-CmIySXSN.mjs.map +0 -1
- package/dist/renderer-CnO9KcmP.mjs +0 -3
- package/dist/renderer-Cnp5JCwi.mjs +0 -3
- package/dist/renderer-CwiCQzjW.mjs +0 -4
- package/dist/renderer-D2LCMZ0l.mjs +0 -3
- package/dist/renderer-D6bWQtr-.mjs +0 -3
- package/dist/renderer-DBGy4qIh.mjs +0 -3
- package/dist/renderer-DBRnvHBV.mjs +0 -3
- package/dist/renderer-DDd3cjaz.mjs.map +0 -1
- package/dist/renderer-DJgrcu3v.mjs +0 -3
- package/dist/renderer-DP948J9X.mjs.map +0 -1
- package/dist/renderer-DTpBOlDA.mjs +0 -3
- package/dist/renderer-DWwIX4Mr.mjs +0 -3
- package/dist/renderer-DXyaswab.mjs.map +0 -1
- package/dist/renderer-DfnacE0H.mjs +0 -3
- package/dist/renderer-RA8pee2T.mjs +0 -3
- package/dist/renderer-eH4u4-2c.mjs +0 -3
- package/dist/renderer-eWOqFUz9.mjs +0 -3
- package/dist/renderer-o4wOvjEC.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-DbaSgadp.mjs","names":[],"sources":["../../../nodes/node-audio-noise-gate/dist/renderers-C77wd_vw.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveNumber } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"threshold\",\n\t\"attack\",\n\t\"hold\",\n\t\"release\",\n\t\"range\"\n];\nconst NOISE_GATE_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n threshold : f32,\n attack : f32,\n hold : f32,\n release : f32,\n closedGain : f32,\n windowLength : f32,\n hasThresholdSig : f32,\n hasAttackSig : f32,\n hasHoldSig : f32,\n hasReleaseSig : f32,\n hasRangeSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var<storage, read> inputChannels : array<f32>;\n@group(0) @binding(2) var<storage, read_write> outputChannels : array<f32>;\n@group(0) @binding(3) var<storage, read_write> state : array<f32>;\n@group(0) @binding(4) var<storage, read> thresholdSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> attackSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> holdSignal : array<f32>;\n@group(0) @binding(7) var<storage, read> releaseSignal : array<f32>;\n@group(0) @binding(8) var<storage, read> rangeSignal : array<f32>;\n\nfn log10(x: f32) -> f32 {\n return log(x) * 0.4342944819032518f;\n}\n\nfn tanh(x: f32) -> f32 {\n let exp2x = exp(2.0f * x);\n return (exp2x - 1.0f) / (exp2x + 1.0f);\n}\n\nfn is_nan_or_inf(v: f32) -> bool {\n return (v != v) || (abs(v) > 3.402823466e+38f);\n}\n\n@compute @workgroup_size(1)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n if (gid.x != 0u) { return; }\n\n let numSamples = u32(u.numSamples);\n let numChannels = u32(u.numChannels);\n let windowLength = u32(u.windowLength);\n\n var gateState = u32(state[0]); // 0=CLOSED, 1=ATTACK, 2=OPEN, 3=HOLD, 4=RELEASE\n if (is_nan_or_inf(state[0])) { gateState = 0u; }\n\n var currentGain = state[1];\n if (is_nan_or_inf(currentGain)) { currentGain = 0.0f; }\n\n var gainAtTransition = state[2];\n if (is_nan_or_inf(gainAtTransition)) { gainAtTransition = 0.0f; }\n\n var attackSamplesLeft = i32(state[3]);\n var holdSamplesLeft = i32(state[4]);\n var releaseSamplesLeft = i32(state[5]);\n var writeIndex = u32(state[6]);\n var sumSquares = state[7];\n if (is_nan_or_inf(sumSquares)) { sumSquares = 0.0f; }\n\n let sampleRate = u.sampleRate;\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n // 1. Dynamic Parameter Modulation & Anti-Explosion Clamping\n var effThreshold = u.threshold;\n if (u.hasThresholdSig > 0.5f) {\n effThreshold = thresholdSignal[index];\n }\n effThreshold = clamp(effThreshold, -120.0f, 0.0f);\n\n var effAttack = u.attack;\n if (u.hasAttackSig > 0.5f) {\n effAttack = attackSignal[index];\n }\n effAttack = clamp(effAttack, 0.0001f, 5.0f);\n\n var effHold = u.hold;\n if (u.hasHoldSig > 0.5f) {\n effHold = holdSignal[index];\n }\n effHold = clamp(effHold, 0.001f, 10.0f);\n\n var effRelease = u.release;\n if (u.hasReleaseSig > 0.5f) {\n effRelease = releaseSignal[index];\n }\n effRelease = clamp(effRelease, 0.01f, 10.0f);\n\n var effRange = u.closedGain;\n if (u.hasRangeSig > 0.5f) {\n let rDb = clamp(rangeSignal[index], -120.0f, 0.0f);\n effRange = select(0.0f, pow(10.0f, rDb / 20.0f), rDb > -96.0f);\n }\n effRange = clamp(effRange, 0.0f, 1.0f);\n\n // 2. Peak & RMS Window Calculation\n var peak = 0.0f;\n for (var c = 0u; c < numChannels; c = c + 1u) {\n var val = abs(inputChannels[c * numSamples + index]);\n if (is_nan_or_inf(val)) { val = 0.0f; }\n if (val > peak) {\n peak = val;\n }\n }\n\n let inputPowerSq = peak * peak;\n let oldestSq = state[8u + writeIndex];\n state[8u + writeIndex] = inputPowerSq;\n sumSquares = max(0.0f, sumSquares - oldestSq + inputPowerSq);\n writeIndex = (writeIndex + 1u) % windowLength;\n\n if (writeIndex == 0u) {\n var sum = 0.0f;\n for (var j = 0u; j < windowLength; j = j + 1u) {\n sum = sum + state[8u + j];\n }\n sumSquares = sum;\n }\n\n let rms = sqrt(sumSquares / f32(windowLength));\n let db = 20.0f * log10(max(rms, 1e-9f));\n\n let signalAboveThreshold = db >= effThreshold;\n\n if (signalAboveThreshold) {\n if (gateState == 0u || gateState == 4u) {\n gateState = 1u; // ATTACK\n gainAtTransition = currentGain;\n var samples = i32(round(effAttack * sampleRate));\n if (samples <= 0) { samples = 1; }\n attackSamplesLeft = samples;\n } else if (gateState == 3u) {\n gateState = 2u; // OPEN\n currentGain = 1.0f;\n }\n } else {\n if (gateState == 2u || gateState == 1u) {\n gateState = 3u; // HOLD\n var samples = i32(round(effHold * sampleRate));\n if (samples <= 0) { samples = 1; }\n holdSamplesLeft = samples;\n }\n }\n\n if (gateState == 0u) {\n currentGain = effRange;\n } else if (gateState == 2u) {\n currentGain = 1.0f;\n } else if (gateState == 1u) {\n var totalAttackSamples = i32(round(effAttack * sampleRate));\n if (totalAttackSamples <= 0) { totalAttackSamples = 1; }\n let progress = 1.0f - f32(attackSamplesLeft) / f32(totalAttackSamples);\n currentGain = gainAtTransition + progress * (1.0f - gainAtTransition);\n\n attackSamplesLeft = attackSamplesLeft - 1;\n if (attackSamplesLeft <= 0) {\n gateState = 2u;\n currentGain = 1.0f;\n }\n } else if (gateState == 3u) {\n currentGain = 1.0f;\n holdSamplesLeft = holdSamplesLeft - 1;\n if (holdSamplesLeft <= 0) {\n gateState = 4u; // RELEASE\n gainAtTransition = 1.0f;\n var samples = i32(round(effRelease * sampleRate));\n if (samples <= 0) { samples = 1; }\n releaseSamplesLeft = samples;\n }\n } else if (gateState == 4u) {\n var totalReleaseSamples = i32(round(effRelease * sampleRate));\n if (totalReleaseSamples <= 0) { totalReleaseSamples = 1; }\n let progress = 1.0f - f32(releaseSamplesLeft) / f32(totalReleaseSamples);\n currentGain = gainAtTransition + progress * (effRange - gainAtTransition);\n\n releaseSamplesLeft = releaseSamplesLeft - 1;\n if (releaseSamplesLeft <= 0) {\n gateState = 0u;\n currentGain = effRange;\n }\n }\n\n currentGain = clamp(currentGain, 0.0f, 1.0f);\n\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let sampleIndex = c * numSamples + index;\n var inVal = inputChannels[sampleIndex];\n if (is_nan_or_inf(inVal)) { inVal = 0.0f; }\n\n var outVal = inVal * currentGain;\n if (is_nan_or_inf(outVal)) { outVal = 0.0f; }\n\n if (outVal > 1.0f) {\n outVal = 1.0f;\n } else if (outVal < -1.0f) {\n outVal = -1.0f;\n } else if (outVal > 0.9f) {\n outVal = 0.9f + 0.1f * tanh((outVal - 0.9f) / 0.1f);\n } else if (outVal < -0.9f) {\n outVal = -0.9f + 0.1f * tanh((outVal + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = outVal;\n }\n }\n\n state[0] = f32(gateState);\n state[1] = currentGain;\n state[2] = gainAtTransition;\n state[3] = f32(attackSamplesLeft);\n state[4] = f32(holdSamplesLeft);\n state[5] = f32(releaseSamplesLeft);\n state[6] = f32(writeIndex);\n state[7] = sumSquares;\n}\n`;\nconst noiseGateAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Noise Gate.\");\n\tconst op = virtualMedia.operation || {};\n\tconst inputs = op.inputs || {};\n\tconst threshold = resolveNumber(op.threshold, -40);\n\tconst attack = resolveNumber(op.attack, .005);\n\tconst hold = resolveNumber(op.hold, .05);\n\tconst release = resolveNumber(op.release, .1);\n\tconst range = resolveNumber(op.range, -80);\n\tconst closedGain = range <= -96 ? 0 : 10 ** (range / 20);\n\tconst isHandleConnected = (handleIdKey) => {\n\t\tconst handleId = op[handleIdKey];\n\t\tif (typeof handleId !== \"string\" || !handleId) return false;\n\t\tconst input = inputs[handleId];\n\t\treturn Boolean(input?.connectionValid && input.outputItem && (input.outputItem.type === \"Signal\" || input.outputItem.type === \"Number\"));\n\t};\n\tconst hasThresholdSig = isHandleConnected(\"thresholdHandleId\") ? 1 : 0;\n\tconst hasAttackSig = isHandleConnected(\"attackHandleId\") ? 1 : 0;\n\tconst hasHoldSig = isHandleConnected(\"holdHandleId\") ? 1 : 0;\n\tconst hasReleaseSig = isHandleConnected(\"releaseHandleId\") ? 1 : 0;\n\tconst hasRangeSig = isHandleConnected(\"rangeHandleId\") ? 1 : 0;\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst windowLength = Math.max(1, Math.round(.01 * sampleRate));\n\tconst nodeId = op.id || \"audio-noise-gate\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = 8 + windowLength;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, NOISE_GATE_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\tthreshold,\n\t\tattack,\n\t\thold,\n\t\trelease,\n\t\tclosedGain,\n\t\twindowLength,\n\t\thasThresholdSig,\n\t\thasAttackSig,\n\t\thasHoldSig,\n\t\thasReleaseSig,\n\t\thasRangeSig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels\n\t], 16, stateFloatCount, ctx?.renderId, true, ctx?.elapsedMs, ctx?.durationMs, void 0, void 0, PARAM_ORDER);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: noiseGateAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-C77wd_vw.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;CACA;CACA;AACD,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+NzC,MAAM,0BAA0B,OAAO,UAAU,YAAY,cAAc,QAAQ;AAClF,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,+CAA+C;CACjF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,SAAS,GAAG,UAAU,EAAE;CAC9B,MAAM,YAAY,cAAc,GAAG,WAAW,IAAI;CAClD,MAAM,SAAS,cAAc,GAAG,QAAQ,KAAK;CAC7C,MAAM,OAAO,cAAc,GAAG,MAAM,IAAI;CACxC,MAAM,UAAU,cAAc,GAAG,SAAS,GAAG;CAC7C,MAAM,QAAQ,cAAc,GAAG,OAAO,IAAI;CAC1C,MAAM,aAAa,SAAS,MAAM,IAAI,OAAO,QAAQ;CACrD,MAAM,qBAAqB,gBAAgB;EAC1C,MAAM,WAAW,GAAG;AACpB,MAAI,OAAO,aAAa,YAAY,CAAC,SAAU,QAAO;EACtD,MAAM,QAAQ,OAAO;AACrB,SAAO,QAAQ,OAAO,mBAAmB,MAAM,eAAe,MAAM,WAAW,SAAS,YAAY,MAAM,WAAW,SAAS,UAAU;;CAEzI,MAAM,kBAAkB,kBAAkB,oBAAoB,GAAG,IAAI;CACrE,MAAM,eAAe,kBAAkB,iBAAiB,GAAG,IAAI;CAC/D,MAAM,aAAa,kBAAkB,eAAe,GAAG,IAAI;CAC3D,MAAM,gBAAgB,kBAAkB,kBAAkB,GAAG,IAAI;CACjE,MAAM,cAAc,kBAAkB,gBAAgB,GAAG,IAAI;CAC7D,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,WAAW,CAAC;CAC9D,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,IAAI;AAC5B,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,kCAAkC;EACxI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,iBAAiB,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK3G,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"renderer-DNNqpK7t.mjs","names":[],"sources":["../../../nodes/node-audio-noise-gate/dist/renderers-C77wd_vw.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveNumber } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"threshold\",\n\t\"attack\",\n\t\"hold\",\n\t\"release\",\n\t\"range\"\n];\nconst NOISE_GATE_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n threshold : f32,\n attack : f32,\n hold : f32,\n release : f32,\n closedGain : f32,\n windowLength : f32,\n hasThresholdSig : f32,\n hasAttackSig : f32,\n hasHoldSig : f32,\n hasReleaseSig : f32,\n hasRangeSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var<storage, read> inputChannels : array<f32>;\n@group(0) @binding(2) var<storage, read_write> outputChannels : array<f32>;\n@group(0) @binding(3) var<storage, read_write> state : array<f32>;\n@group(0) @binding(4) var<storage, read> thresholdSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> attackSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> holdSignal : array<f32>;\n@group(0) @binding(7) var<storage, read> releaseSignal : array<f32>;\n@group(0) @binding(8) var<storage, read> rangeSignal : array<f32>;\n\nfn log10(x: f32) -> f32 {\n return log(x) * 0.4342944819032518f;\n}\n\nfn tanh(x: f32) -> f32 {\n let exp2x = exp(2.0f * x);\n return (exp2x - 1.0f) / (exp2x + 1.0f);\n}\n\nfn is_nan_or_inf(v: f32) -> bool {\n return (v != v) || (abs(v) > 3.402823466e+38f);\n}\n\n@compute @workgroup_size(1)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n if (gid.x != 0u) { return; }\n\n let numSamples = u32(u.numSamples);\n let numChannels = u32(u.numChannels);\n let windowLength = u32(u.windowLength);\n\n var gateState = u32(state[0]); // 0=CLOSED, 1=ATTACK, 2=OPEN, 3=HOLD, 4=RELEASE\n if (is_nan_or_inf(state[0])) { gateState = 0u; }\n\n var currentGain = state[1];\n if (is_nan_or_inf(currentGain)) { currentGain = 0.0f; }\n\n var gainAtTransition = state[2];\n if (is_nan_or_inf(gainAtTransition)) { gainAtTransition = 0.0f; }\n\n var attackSamplesLeft = i32(state[3]);\n var holdSamplesLeft = i32(state[4]);\n var releaseSamplesLeft = i32(state[5]);\n var writeIndex = u32(state[6]);\n var sumSquares = state[7];\n if (is_nan_or_inf(sumSquares)) { sumSquares = 0.0f; }\n\n let sampleRate = u.sampleRate;\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n // 1. Dynamic Parameter Modulation & Anti-Explosion Clamping\n var effThreshold = u.threshold;\n if (u.hasThresholdSig > 0.5f) {\n effThreshold = thresholdSignal[index];\n }\n effThreshold = clamp(effThreshold, -120.0f, 0.0f);\n\n var effAttack = u.attack;\n if (u.hasAttackSig > 0.5f) {\n effAttack = attackSignal[index];\n }\n effAttack = clamp(effAttack, 0.0001f, 5.0f);\n\n var effHold = u.hold;\n if (u.hasHoldSig > 0.5f) {\n effHold = holdSignal[index];\n }\n effHold = clamp(effHold, 0.001f, 10.0f);\n\n var effRelease = u.release;\n if (u.hasReleaseSig > 0.5f) {\n effRelease = releaseSignal[index];\n }\n effRelease = clamp(effRelease, 0.01f, 10.0f);\n\n var effRange = u.closedGain;\n if (u.hasRangeSig > 0.5f) {\n let rDb = clamp(rangeSignal[index], -120.0f, 0.0f);\n effRange = select(0.0f, pow(10.0f, rDb / 20.0f), rDb > -96.0f);\n }\n effRange = clamp(effRange, 0.0f, 1.0f);\n\n // 2. Peak & RMS Window Calculation\n var peak = 0.0f;\n for (var c = 0u; c < numChannels; c = c + 1u) {\n var val = abs(inputChannels[c * numSamples + index]);\n if (is_nan_or_inf(val)) { val = 0.0f; }\n if (val > peak) {\n peak = val;\n }\n }\n\n let inputPowerSq = peak * peak;\n let oldestSq = state[8u + writeIndex];\n state[8u + writeIndex] = inputPowerSq;\n sumSquares = max(0.0f, sumSquares - oldestSq + inputPowerSq);\n writeIndex = (writeIndex + 1u) % windowLength;\n\n if (writeIndex == 0u) {\n var sum = 0.0f;\n for (var j = 0u; j < windowLength; j = j + 1u) {\n sum = sum + state[8u + j];\n }\n sumSquares = sum;\n }\n\n let rms = sqrt(sumSquares / f32(windowLength));\n let db = 20.0f * log10(max(rms, 1e-9f));\n\n let signalAboveThreshold = db >= effThreshold;\n\n if (signalAboveThreshold) {\n if (gateState == 0u || gateState == 4u) {\n gateState = 1u; // ATTACK\n gainAtTransition = currentGain;\n var samples = i32(round(effAttack * sampleRate));\n if (samples <= 0) { samples = 1; }\n attackSamplesLeft = samples;\n } else if (gateState == 3u) {\n gateState = 2u; // OPEN\n currentGain = 1.0f;\n }\n } else {\n if (gateState == 2u || gateState == 1u) {\n gateState = 3u; // HOLD\n var samples = i32(round(effHold * sampleRate));\n if (samples <= 0) { samples = 1; }\n holdSamplesLeft = samples;\n }\n }\n\n if (gateState == 0u) {\n currentGain = effRange;\n } else if (gateState == 2u) {\n currentGain = 1.0f;\n } else if (gateState == 1u) {\n var totalAttackSamples = i32(round(effAttack * sampleRate));\n if (totalAttackSamples <= 0) { totalAttackSamples = 1; }\n let progress = 1.0f - f32(attackSamplesLeft) / f32(totalAttackSamples);\n currentGain = gainAtTransition + progress * (1.0f - gainAtTransition);\n\n attackSamplesLeft = attackSamplesLeft - 1;\n if (attackSamplesLeft <= 0) {\n gateState = 2u;\n currentGain = 1.0f;\n }\n } else if (gateState == 3u) {\n currentGain = 1.0f;\n holdSamplesLeft = holdSamplesLeft - 1;\n if (holdSamplesLeft <= 0) {\n gateState = 4u; // RELEASE\n gainAtTransition = 1.0f;\n var samples = i32(round(effRelease * sampleRate));\n if (samples <= 0) { samples = 1; }\n releaseSamplesLeft = samples;\n }\n } else if (gateState == 4u) {\n var totalReleaseSamples = i32(round(effRelease * sampleRate));\n if (totalReleaseSamples <= 0) { totalReleaseSamples = 1; }\n let progress = 1.0f - f32(releaseSamplesLeft) / f32(totalReleaseSamples);\n currentGain = gainAtTransition + progress * (effRange - gainAtTransition);\n\n releaseSamplesLeft = releaseSamplesLeft - 1;\n if (releaseSamplesLeft <= 0) {\n gateState = 0u;\n currentGain = effRange;\n }\n }\n\n currentGain = clamp(currentGain, 0.0f, 1.0f);\n\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let sampleIndex = c * numSamples + index;\n var inVal = inputChannels[sampleIndex];\n if (is_nan_or_inf(inVal)) { inVal = 0.0f; }\n\n var outVal = inVal * currentGain;\n if (is_nan_or_inf(outVal)) { outVal = 0.0f; }\n\n if (outVal > 1.0f) {\n outVal = 1.0f;\n } else if (outVal < -1.0f) {\n outVal = -1.0f;\n } else if (outVal > 0.9f) {\n outVal = 0.9f + 0.1f * tanh((outVal - 0.9f) / 0.1f);\n } else if (outVal < -0.9f) {\n outVal = -0.9f + 0.1f * tanh((outVal + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = outVal;\n }\n }\n\n state[0] = f32(gateState);\n state[1] = currentGain;\n state[2] = gainAtTransition;\n state[3] = f32(attackSamplesLeft);\n state[4] = f32(holdSamplesLeft);\n state[5] = f32(releaseSamplesLeft);\n state[6] = f32(writeIndex);\n state[7] = sumSquares;\n}\n`;\nconst noiseGateAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Noise Gate.\");\n\tconst op = virtualMedia.operation || {};\n\tconst inputs = op.inputs || {};\n\tconst threshold = resolveNumber(op.threshold, -40);\n\tconst attack = resolveNumber(op.attack, .005);\n\tconst hold = resolveNumber(op.hold, .05);\n\tconst release = resolveNumber(op.release, .1);\n\tconst range = resolveNumber(op.range, -80);\n\tconst closedGain = range <= -96 ? 0 : 10 ** (range / 20);\n\tconst isHandleConnected = (handleIdKey) => {\n\t\tconst handleId = op[handleIdKey];\n\t\tif (typeof handleId !== \"string\" || !handleId) return false;\n\t\tconst input = inputs[handleId];\n\t\treturn Boolean(input?.connectionValid && input.outputItem && (input.outputItem.type === \"Signal\" || input.outputItem.type === \"Number\"));\n\t};\n\tconst hasThresholdSig = isHandleConnected(\"thresholdHandleId\") ? 1 : 0;\n\tconst hasAttackSig = isHandleConnected(\"attackHandleId\") ? 1 : 0;\n\tconst hasHoldSig = isHandleConnected(\"holdHandleId\") ? 1 : 0;\n\tconst hasReleaseSig = isHandleConnected(\"releaseHandleId\") ? 1 : 0;\n\tconst hasRangeSig = isHandleConnected(\"rangeHandleId\") ? 1 : 0;\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst windowLength = Math.max(1, Math.round(.01 * sampleRate));\n\tconst nodeId = op.id || \"audio-noise-gate\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = 8 + windowLength;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, NOISE_GATE_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\tthreshold,\n\t\tattack,\n\t\thold,\n\t\trelease,\n\t\tclosedGain,\n\t\twindowLength,\n\t\thasThresholdSig,\n\t\thasAttackSig,\n\t\thasHoldSig,\n\t\thasReleaseSig,\n\t\thasRangeSig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels\n\t], 16, stateFloatCount, ctx?.renderId, true, ctx?.elapsedMs, ctx?.durationMs, void 0, void 0, PARAM_ORDER);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: noiseGateAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-C77wd_vw.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;CACA;CACA;AACD,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+NzC,MAAM,0BAA0B,OAAO,UAAU,YAAY,cAAc,QAAQ;AAClF,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,+CAA+C;CACjF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,SAAS,GAAG,UAAU,EAAE;CAC9B,MAAM,YAAY,cAAc,GAAG,WAAW,IAAI;CAClD,MAAM,SAAS,cAAc,GAAG,QAAQ,KAAK;CAC7C,MAAM,OAAO,cAAc,GAAG,MAAM,IAAI;CACxC,MAAM,UAAU,cAAc,GAAG,SAAS,GAAG;CAC7C,MAAM,QAAQ,cAAc,GAAG,OAAO,IAAI;CAC1C,MAAM,aAAa,SAAS,MAAM,IAAI,OAAO,QAAQ;CACrD,MAAM,qBAAqB,gBAAgB;EAC1C,MAAM,WAAW,GAAG;AACpB,MAAI,OAAO,aAAa,YAAY,CAAC,SAAU,QAAO;EACtD,MAAM,QAAQ,OAAO;AACrB,SAAO,QAAQ,OAAO,mBAAmB,MAAM,eAAe,MAAM,WAAW,SAAS,YAAY,MAAM,WAAW,SAAS,UAAU;;CAEzI,MAAM,kBAAkB,kBAAkB,oBAAoB,GAAG,IAAI;CACrE,MAAM,eAAe,kBAAkB,iBAAiB,GAAG,IAAI;CAC/D,MAAM,aAAa,kBAAkB,eAAe,GAAG,IAAI;CAC3D,MAAM,gBAAgB,kBAAkB,kBAAkB,GAAG,IAAI;CACjE,MAAM,cAAc,kBAAkB,gBAAgB,GAAG,IAAI;CAC7D,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,WAAW,CAAC;CAC9D,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,IAAI;AAC5B,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,kCAAkC;EACxI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,iBAAiB,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK3G,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,yBAAyB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { It as resolveNumber, Pt as resolveBoolean } from "./dist-B9Afsv83.mjs";
|
|
2
2
|
import { n as defineRenderer } from "./renderer-CtVkU_GA.mjs";
|
|
3
|
-
import { C as WebGPUAudioProcessor } from "./dist-
|
|
3
|
+
import { C as WebGPUAudioProcessor } from "./dist-B9PkqWnN.mjs";
|
|
4
4
|
|
|
5
5
|
//#region ../../nodes/node-audio-delay/dist/renderers-DS4P79mD.mjs
|
|
6
6
|
const PARAM_ORDER = [
|
|
@@ -224,4 +224,4 @@ var renderers_default = defineRenderer({ audioProcessor: delayAudioProcessor });
|
|
|
224
224
|
|
|
225
225
|
//#endregion
|
|
226
226
|
export { renderers_default as t };
|
|
227
|
-
//# sourceMappingURL=renderer-
|
|
227
|
+
//# sourceMappingURL=renderer-DTvfYkI9.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-BjROyv5F.mjs","names":[],"sources":["../../../nodes/node-audio-delay/dist/renderers-DS4P79mD.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveBoolean, resolveNumber } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"delayTime\",\n\t\"feedback\",\n\t\"wet\",\n\t\"dry\"\n];\nconst DELAY_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n delaySec : f32,\n feedback : f32,\n wet : f32,\n dry : f32,\n pingPong : f32,\n bufferLength : f32,\n hasDelayTimeSig : f32,\n hasFeedbackSig : f32,\n hasWetSig : f32,\n hasDrySig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var<storage, read> inputChannels : array<f32>;\n@group(0) @binding(2) var<storage, read_write> outputChannels : array<f32>;\n@group(0) @binding(3) var<storage, read_write> state : array<f32>;\n@group(0) @binding(4) var<storage, read> delayTimeSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> feedbackSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> wetSignal : array<f32>;\n@group(0) @binding(7) var<storage, read> drySignal : array<f32>;\n\nfn tanh(x: f32) -> f32 {\n let exp2x = exp(2.0f * x);\n return (exp2x - 1.0f) / (exp2x + 1.0f);\n}\n\nfn is_nan_or_inf(v: f32) -> bool {\n return (v != v) || (abs(v) > 3.402823466e+38f);\n}\n\n@compute @workgroup_size(1)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n if (gid.x != 0u) { return; }\n\n let numSamples = u32(u.numSamples);\n let numChannels = u32(u.numChannels);\n let bufferLength = u32(u.bufferLength);\n\n var writeIndex = u32(state[0]);\n if (is_nan_or_inf(state[0])) {\n writeIndex = 0u;\n }\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n // 1. Dynamic Parameter Modulation & Anti-Explosion Clamping\n var effDelaySec = u.delaySec;\n if (u.hasDelayTimeSig > 0.5f) {\n effDelaySec = delayTimeSignal[index];\n }\n effDelaySec = clamp(effDelaySec, 0.001f, 5.0f);\n\n var effFeedback = u.feedback;\n if (u.hasFeedbackSig > 0.5f) {\n effFeedback = feedbackSignal[index];\n }\n effFeedback = clamp(effFeedback, 0.0f, 0.95f);\n\n var effWet = u.wet;\n if (u.hasWetSig > 0.5f) {\n effWet = wetSignal[index];\n }\n effWet = clamp(effWet, 0.0f, 2.0f);\n\n var effDry = u.dry;\n if (u.hasDrySig > 0.5f) {\n effDry = drySignal[index];\n }\n effDry = clamp(effDry, 0.0f, 2.0f);\n\n // 2. Safe Dynamic Read Index\n let readOffset = u32(clamp(effDelaySec * u.sampleRate, 1.0f, f32(bufferLength - 1u)));\n let readIndex = (writeIndex + bufferLength - readOffset) % bufferLength;\n\n if (numChannels == 1u || u.pingPong == 0.0f) {\n // Standard Delay\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let sampleIndex = c * numSamples + index;\n var inputVal = inputChannels[sampleIndex];\n if (is_nan_or_inf(inputVal)) {\n inputVal = 0.0f;\n }\n\n let stateOffset = c * bufferLength + 1u;\n var delayedSample = state[stateOffset + readIndex];\n if (is_nan_or_inf(delayedSample)) {\n delayedSample = 0.0f;\n }\n\n var nextStateVal = inputVal + delayedSample * effFeedback;\n if (is_nan_or_inf(nextStateVal)) {\n nextStateVal = 0.0f;\n }\n state[stateOffset + writeIndex] = clamp(nextStateVal, -4.0f, 4.0f);\n\n var outVal = effDry * inputVal + effWet * delayedSample;\n if (is_nan_or_inf(outVal)) {\n outVal = 0.0f;\n }\n if (outVal > 1.0f) {\n outVal = 1.0f;\n } else if (outVal < -1.0f) {\n outVal = -1.0f;\n } else if (outVal > 0.9f) {\n outVal = 0.9f + 0.1f * tanh((outVal - 0.9f) / 0.1f);\n } else if (outVal < -0.9f) {\n outVal = -0.9f + 0.1f * tanh((outVal + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = outVal;\n }\n } else {\n // Stereo Ping-Pong Delay\n var sampleL = inputChannels[index];\n if (is_nan_or_inf(sampleL)) { sampleL = 0.0f; }\n\n var sampleR = inputChannels[numSamples + index];\n if (is_nan_or_inf(sampleR)) { sampleR = 0.0f; }\n\n var delayedL = state[1u + readIndex];\n if (is_nan_or_inf(delayedL)) { delayedL = 0.0f; }\n\n var delayedR = state[bufferLength + 1u + readIndex];\n if (is_nan_or_inf(delayedR)) { delayedR = 0.0f; }\n\n // Ping-pong cross-feedback\n var nextL = sampleL + delayedR * effFeedback;\n var nextR = sampleR + delayedL * effFeedback;\n if (is_nan_or_inf(nextL)) { nextL = 0.0f; }\n if (is_nan_or_inf(nextR)) { nextR = 0.0f; }\n\n state[1u + writeIndex] = clamp(nextL, -4.0f, 4.0f);\n state[bufferLength + 1u + writeIndex] = clamp(nextR, -4.0f, 4.0f);\n\n var outL = effDry * sampleL + effWet * delayedL;\n var outR = effDry * sampleR + effWet * delayedR;\n if (is_nan_or_inf(outL)) { outL = 0.0f; }\n if (is_nan_or_inf(outR)) { outR = 0.0f; }\n\n if (outL > 1.0f) { outL = 1.0f; } else if (outL < -1.0f) { outL = -1.0f; }\n else if (outL > 0.9f) { outL = 0.9f + 0.1f * tanh((outL - 0.9f) / 0.1f); }\n else if (outL < -0.9f) { outL = -0.9f + 0.1f * tanh((outL + 0.9f) / 0.1f); }\n\n if (outR > 1.0f) { outR = 1.0f; } else if (outR < -1.0f) { outR = -1.0f; }\n else if (outR > 0.9f) { outR = 0.9f + 0.1f * tanh((outR - 0.9f) / 0.1f); }\n else if (outR < -0.9f) { outR = -0.9f + 0.1f * tanh((outR + 0.9f) / 0.1f); }\n\n outputChannels[index] = outL;\n outputChannels[numSamples + index] = outR;\n }\n\n writeIndex = (writeIndex + 1u) % bufferLength;\n }\n\n state[0] = f32(writeIndex);\n}\n`;\nconst delayAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Audio Delay.\");\n\tconst op = virtualMedia.operation || {};\n\tconst inputs = op.inputs || {};\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst delaySec = Math.max(.001, Math.min(resolveNumber(op.delayTime, .25), 5));\n\tconst feedbackInternal = Math.max(0, Math.min(resolveNumber(op.feedback, .4), .95));\n\tconst wetInternal = Math.max(0, Math.min(resolveNumber(op.wet, .3), 1));\n\tconst dryInternal = Math.max(0, Math.min(resolveNumber(op.dry, 1), 1));\n\tconst pingPongInternal = resolveBoolean(op.pingPong, false);\n\tconst isHandleConnected = (handleIdKey) => {\n\t\tconst handleId = op[handleIdKey];\n\t\tif (typeof handleId !== \"string\" || !handleId) return false;\n\t\tconst input = inputs[handleId];\n\t\treturn Boolean(input?.connectionValid && input.outputItem && (input.outputItem.type === \"Signal\" || input.outputItem.type === \"Number\"));\n\t};\n\tconst hasDelayTimeSig = isHandleConnected(\"delayTimeHandleId\") ? 1 : 0;\n\tconst hasFeedbackSig = isHandleConnected(\"feedbackHandleId\") ? 1 : 0;\n\tconst hasWetSig = isHandleConnected(\"wetHandleId\") ? 1 : 0;\n\tconst hasDrySig = isHandleConnected(\"dryHandleId\") ? 1 : 0;\n\tconst bufferLength = Math.ceil(5 * sampleRate);\n\tconst nodeId = op.id || \"audio-delay\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = numChannels * bufferLength + 1;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, DELAY_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\tdelaySec,\n\t\tfeedbackInternal,\n\t\twetInternal,\n\t\tdryInternal,\n\t\tpingPongInternal ? 1 : 0,\n\t\tbufferLength,\n\t\thasDelayTimeSig,\n\t\thasFeedbackSig,\n\t\thasWetSig,\n\t\thasDrySig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\n\t\t0\n\t], 16, stateFloatCount, ctx?.renderId, true, ctx?.elapsedMs, ctx?.durationMs, void 0, void 0, PARAM_ORDER);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: delayAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-DS4P79mD.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;CACA;AACD,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoKpC,MAAM,sBAAsB,OAAO,UAAU,YAAY,cAAc,QAAQ;AAC9E,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,gDAAgD;CAClF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,SAAS,GAAG,UAAU,EAAE;CAC9B,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,WAAW,KAAK,IAAI,MAAM,KAAK,IAAI,cAAc,GAAG,WAAW,IAAI,EAAE,EAAE,CAAC;CAC9E,MAAM,mBAAmB,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,GAAG,UAAU,GAAG,EAAE,IAAI,CAAC;CACnF,MAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,GAAG,KAAK,GAAG,EAAE,EAAE,CAAC;CACvE,MAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC;CACtE,MAAM,mBAAmB,eAAe,GAAG,UAAU,MAAM;CAC3D,MAAM,qBAAqB,gBAAgB;EAC1C,MAAM,WAAW,GAAG;AACpB,MAAI,OAAO,aAAa,YAAY,CAAC,SAAU,QAAO;EACtD,MAAM,QAAQ,OAAO;AACrB,SAAO,QAAQ,OAAO,mBAAmB,MAAM,eAAe,MAAM,WAAW,SAAS,YAAY,MAAM,WAAW,SAAS,UAAU;;CAEzI,MAAM,kBAAkB,kBAAkB,oBAAoB,GAAG,IAAI;CACrE,MAAM,iBAAiB,kBAAkB,mBAAmB,GAAG,IAAI;CACnE,MAAM,YAAY,kBAAkB,cAAc,GAAG,IAAI;CACzD,MAAM,YAAY,kBAAkB,cAAc,GAAG,IAAI;CACzD,MAAM,eAAe,KAAK,KAAK,IAAI,WAAW;CAC9C,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,cAAc,eAAe;AACrD,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,6BAA6B;EACnI;EACA;EACA;EACA;EACA;EACA,mBAAmB,IAAI;EACvB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,iBAAiB,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK3G,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"renderer-DTvfYkI9.mjs","names":[],"sources":["../../../nodes/node-audio-delay/dist/renderers-DS4P79mD.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveBoolean, resolveNumber } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"delayTime\",\n\t\"feedback\",\n\t\"wet\",\n\t\"dry\"\n];\nconst DELAY_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n delaySec : f32,\n feedback : f32,\n wet : f32,\n dry : f32,\n pingPong : f32,\n bufferLength : f32,\n hasDelayTimeSig : f32,\n hasFeedbackSig : f32,\n hasWetSig : f32,\n hasDrySig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var<storage, read> inputChannels : array<f32>;\n@group(0) @binding(2) var<storage, read_write> outputChannels : array<f32>;\n@group(0) @binding(3) var<storage, read_write> state : array<f32>;\n@group(0) @binding(4) var<storage, read> delayTimeSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> feedbackSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> wetSignal : array<f32>;\n@group(0) @binding(7) var<storage, read> drySignal : array<f32>;\n\nfn tanh(x: f32) -> f32 {\n let exp2x = exp(2.0f * x);\n return (exp2x - 1.0f) / (exp2x + 1.0f);\n}\n\nfn is_nan_or_inf(v: f32) -> bool {\n return (v != v) || (abs(v) > 3.402823466e+38f);\n}\n\n@compute @workgroup_size(1)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n if (gid.x != 0u) { return; }\n\n let numSamples = u32(u.numSamples);\n let numChannels = u32(u.numChannels);\n let bufferLength = u32(u.bufferLength);\n\n var writeIndex = u32(state[0]);\n if (is_nan_or_inf(state[0])) {\n writeIndex = 0u;\n }\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n // 1. Dynamic Parameter Modulation & Anti-Explosion Clamping\n var effDelaySec = u.delaySec;\n if (u.hasDelayTimeSig > 0.5f) {\n effDelaySec = delayTimeSignal[index];\n }\n effDelaySec = clamp(effDelaySec, 0.001f, 5.0f);\n\n var effFeedback = u.feedback;\n if (u.hasFeedbackSig > 0.5f) {\n effFeedback = feedbackSignal[index];\n }\n effFeedback = clamp(effFeedback, 0.0f, 0.95f);\n\n var effWet = u.wet;\n if (u.hasWetSig > 0.5f) {\n effWet = wetSignal[index];\n }\n effWet = clamp(effWet, 0.0f, 2.0f);\n\n var effDry = u.dry;\n if (u.hasDrySig > 0.5f) {\n effDry = drySignal[index];\n }\n effDry = clamp(effDry, 0.0f, 2.0f);\n\n // 2. Safe Dynamic Read Index\n let readOffset = u32(clamp(effDelaySec * u.sampleRate, 1.0f, f32(bufferLength - 1u)));\n let readIndex = (writeIndex + bufferLength - readOffset) % bufferLength;\n\n if (numChannels == 1u || u.pingPong == 0.0f) {\n // Standard Delay\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let sampleIndex = c * numSamples + index;\n var inputVal = inputChannels[sampleIndex];\n if (is_nan_or_inf(inputVal)) {\n inputVal = 0.0f;\n }\n\n let stateOffset = c * bufferLength + 1u;\n var delayedSample = state[stateOffset + readIndex];\n if (is_nan_or_inf(delayedSample)) {\n delayedSample = 0.0f;\n }\n\n var nextStateVal = inputVal + delayedSample * effFeedback;\n if (is_nan_or_inf(nextStateVal)) {\n nextStateVal = 0.0f;\n }\n state[stateOffset + writeIndex] = clamp(nextStateVal, -4.0f, 4.0f);\n\n var outVal = effDry * inputVal + effWet * delayedSample;\n if (is_nan_or_inf(outVal)) {\n outVal = 0.0f;\n }\n if (outVal > 1.0f) {\n outVal = 1.0f;\n } else if (outVal < -1.0f) {\n outVal = -1.0f;\n } else if (outVal > 0.9f) {\n outVal = 0.9f + 0.1f * tanh((outVal - 0.9f) / 0.1f);\n } else if (outVal < -0.9f) {\n outVal = -0.9f + 0.1f * tanh((outVal + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = outVal;\n }\n } else {\n // Stereo Ping-Pong Delay\n var sampleL = inputChannels[index];\n if (is_nan_or_inf(sampleL)) { sampleL = 0.0f; }\n\n var sampleR = inputChannels[numSamples + index];\n if (is_nan_or_inf(sampleR)) { sampleR = 0.0f; }\n\n var delayedL = state[1u + readIndex];\n if (is_nan_or_inf(delayedL)) { delayedL = 0.0f; }\n\n var delayedR = state[bufferLength + 1u + readIndex];\n if (is_nan_or_inf(delayedR)) { delayedR = 0.0f; }\n\n // Ping-pong cross-feedback\n var nextL = sampleL + delayedR * effFeedback;\n var nextR = sampleR + delayedL * effFeedback;\n if (is_nan_or_inf(nextL)) { nextL = 0.0f; }\n if (is_nan_or_inf(nextR)) { nextR = 0.0f; }\n\n state[1u + writeIndex] = clamp(nextL, -4.0f, 4.0f);\n state[bufferLength + 1u + writeIndex] = clamp(nextR, -4.0f, 4.0f);\n\n var outL = effDry * sampleL + effWet * delayedL;\n var outR = effDry * sampleR + effWet * delayedR;\n if (is_nan_or_inf(outL)) { outL = 0.0f; }\n if (is_nan_or_inf(outR)) { outR = 0.0f; }\n\n if (outL > 1.0f) { outL = 1.0f; } else if (outL < -1.0f) { outL = -1.0f; }\n else if (outL > 0.9f) { outL = 0.9f + 0.1f * tanh((outL - 0.9f) / 0.1f); }\n else if (outL < -0.9f) { outL = -0.9f + 0.1f * tanh((outL + 0.9f) / 0.1f); }\n\n if (outR > 1.0f) { outR = 1.0f; } else if (outR < -1.0f) { outR = -1.0f; }\n else if (outR > 0.9f) { outR = 0.9f + 0.1f * tanh((outR - 0.9f) / 0.1f); }\n else if (outR < -0.9f) { outR = -0.9f + 0.1f * tanh((outR + 0.9f) / 0.1f); }\n\n outputChannels[index] = outL;\n outputChannels[numSamples + index] = outR;\n }\n\n writeIndex = (writeIndex + 1u) % bufferLength;\n }\n\n state[0] = f32(writeIndex);\n}\n`;\nconst delayAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Audio Delay.\");\n\tconst op = virtualMedia.operation || {};\n\tconst inputs = op.inputs || {};\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst delaySec = Math.max(.001, Math.min(resolveNumber(op.delayTime, .25), 5));\n\tconst feedbackInternal = Math.max(0, Math.min(resolveNumber(op.feedback, .4), .95));\n\tconst wetInternal = Math.max(0, Math.min(resolveNumber(op.wet, .3), 1));\n\tconst dryInternal = Math.max(0, Math.min(resolveNumber(op.dry, 1), 1));\n\tconst pingPongInternal = resolveBoolean(op.pingPong, false);\n\tconst isHandleConnected = (handleIdKey) => {\n\t\tconst handleId = op[handleIdKey];\n\t\tif (typeof handleId !== \"string\" || !handleId) return false;\n\t\tconst input = inputs[handleId];\n\t\treturn Boolean(input?.connectionValid && input.outputItem && (input.outputItem.type === \"Signal\" || input.outputItem.type === \"Number\"));\n\t};\n\tconst hasDelayTimeSig = isHandleConnected(\"delayTimeHandleId\") ? 1 : 0;\n\tconst hasFeedbackSig = isHandleConnected(\"feedbackHandleId\") ? 1 : 0;\n\tconst hasWetSig = isHandleConnected(\"wetHandleId\") ? 1 : 0;\n\tconst hasDrySig = isHandleConnected(\"dryHandleId\") ? 1 : 0;\n\tconst bufferLength = Math.ceil(5 * sampleRate);\n\tconst nodeId = op.id || \"audio-delay\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = numChannels * bufferLength + 1;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, DELAY_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\tdelaySec,\n\t\tfeedbackInternal,\n\t\twetInternal,\n\t\tdryInternal,\n\t\tpingPongInternal ? 1 : 0,\n\t\tbufferLength,\n\t\thasDelayTimeSig,\n\t\thasFeedbackSig,\n\t\thasWetSig,\n\t\thasDrySig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\n\t\t0\n\t], 16, stateFloatCount, ctx?.renderId, true, ctx?.elapsedMs, ctx?.durationMs, void 0, void 0, PARAM_ORDER);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: delayAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-DS4P79mD.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;CACA;AACD,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoKpC,MAAM,sBAAsB,OAAO,UAAU,YAAY,cAAc,QAAQ;AAC9E,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,gDAAgD;CAClF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,SAAS,GAAG,UAAU,EAAE;CAC9B,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,WAAW,KAAK,IAAI,MAAM,KAAK,IAAI,cAAc,GAAG,WAAW,IAAI,EAAE,EAAE,CAAC;CAC9E,MAAM,mBAAmB,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,GAAG,UAAU,GAAG,EAAE,IAAI,CAAC;CACnF,MAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,GAAG,KAAK,GAAG,EAAE,EAAE,CAAC;CACvE,MAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC;CACtE,MAAM,mBAAmB,eAAe,GAAG,UAAU,MAAM;CAC3D,MAAM,qBAAqB,gBAAgB;EAC1C,MAAM,WAAW,GAAG;AACpB,MAAI,OAAO,aAAa,YAAY,CAAC,SAAU,QAAO;EACtD,MAAM,QAAQ,OAAO;AACrB,SAAO,QAAQ,OAAO,mBAAmB,MAAM,eAAe,MAAM,WAAW,SAAS,YAAY,MAAM,WAAW,SAAS,UAAU;;CAEzI,MAAM,kBAAkB,kBAAkB,oBAAoB,GAAG,IAAI;CACrE,MAAM,iBAAiB,kBAAkB,mBAAmB,GAAG,IAAI;CACnE,MAAM,YAAY,kBAAkB,cAAc,GAAG,IAAI;CACzD,MAAM,YAAY,kBAAkB,cAAc,GAAG,IAAI;CACzD,MAAM,eAAe,KAAK,KAAK,IAAI,WAAW;CAC9C,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,cAAc,eAAe;AACrD,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,6BAA6B;EACnI;EACA;EACA;EACA;EACA;EACA,mBAAmB,IAAI;EACvB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,iBAAiB,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK3G,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,qBAAqB,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { n as defineRenderer } from "./renderer-CtVkU_GA.mjs";
|
|
2
|
-
import {
|
|
2
|
+
import { nt as signalRegistry } from "./dist-B9PkqWnN.mjs";
|
|
3
3
|
|
|
4
|
-
//#region ../../nodes/node-film-grain/dist/renderers-
|
|
4
|
+
//#region ../../nodes/node-film-grain/dist/renderers-yx-E93C7.mjs
|
|
5
5
|
const FILM_GRAIN_SHADER = `
|
|
6
6
|
struct FilmUniforms {
|
|
7
7
|
strength : f32,
|
|
@@ -216,6 +216,7 @@ function getFilmGrainResources(device, format) {
|
|
|
216
216
|
const FilmGrainWebGPURenderer = async (args) => {
|
|
217
217
|
const { ctx, encoder, pass, targetView, targetTexture, targetWidth, targetHeight, props, drawChild } = args;
|
|
218
218
|
const frame = props.frame ?? 0;
|
|
219
|
+
const compositionFrame = props.compositionFrame ?? frame;
|
|
219
220
|
const fps = props.fps || 30;
|
|
220
221
|
const op = props.virtualMedia?.operation;
|
|
221
222
|
if (op?.op !== "FilmGrain" || !op) return;
|
|
@@ -230,8 +231,13 @@ const FilmGrainWebGPURenderer = async (args) => {
|
|
|
230
231
|
const sd = hasSignal && signalInput?.outputItem?.data ? signalInput.outputItem.data : null;
|
|
231
232
|
const resolveVal = (val, fallback) => {
|
|
232
233
|
if (val === void 0 || val === null) return fallback;
|
|
233
|
-
if (typeof val === "object" &&
|
|
234
|
-
|
|
234
|
+
if (typeof val === "object" && val !== null) {
|
|
235
|
+
if ("get" in val && typeof val.get === "function") val = val.get({
|
|
236
|
+
frame: compositionFrame,
|
|
237
|
+
fps
|
|
238
|
+
});
|
|
239
|
+
else if ("value" in val) val = val.value;
|
|
240
|
+
} else if (typeof val === "function") val = val(compositionFrame, fps);
|
|
235
241
|
const n = Number(val);
|
|
236
242
|
return Number.isFinite(n) ? n : fallback;
|
|
237
243
|
};
|
|
@@ -340,4 +346,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: FilmGrainWebGPURenderer
|
|
|
340
346
|
|
|
341
347
|
//#endregion
|
|
342
348
|
export { renderers_default as t };
|
|
343
|
-
//# sourceMappingURL=renderer-
|
|
349
|
+
//# sourceMappingURL=renderer-DYm4duFr.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer-DYm4duFr.mjs","names":[],"sources":["../../../nodes/node-film-grain/dist/renderers-yx-E93C7.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst FILM_GRAIN_SHADER = `\nstruct FilmUniforms {\n strength : f32,\n size : f32,\n monochrome : f32,\n animated : f32,\n\n frameIndex : f32, // discrete per-output-frame counter (speed-scaled), NOT continuous time\n shadows : f32,\n midtones : f32,\n highlights : f32,\n\n hasSignal : f32,\n _pad0 : f32,\n _pad1 : f32,\n _pad2 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : FilmUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(2) @binding(0) var signalTex : texture_2d<f32>;\n@group(2) @binding(1) var signalSamp : sampler;\n\nstruct VSOut {\n @builtin(position) pos : vec4<f32>,\n @location(0) uv : vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\n var pos = array<vec2<f32>, 4>(\n vec2<f32>(-1.0, 1.0),\n vec2<f32>(1.0, 1.0),\n vec2<f32>(-1.0, -1.0),\n vec2<f32>(1.0, -1.0)\n );\n var uv = array<vec2<f32>, 4>(\n vec2<f32>(0.0, 0.0),\n vec2<f32>(1.0, 0.0),\n vec2<f32>(0.0, 1.0),\n vec2<f32>(1.0, 1.0)\n );\n return VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);\n}\n\nfn hash2D(p: vec2<f32>) -> f32 {\n var p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nfn smoothNoise(p: vec2<f32>) -> f32 {\n let pi = floor(p);\n let pf = fract(p);\n\n // Quintic interpolation\n let w = pf * pf * pf * (pf * (pf * 6.0 - 15.0) + 10.0);\n\n let h00 = hash2D(pi + vec2<f32>(0.0, 0.0));\n let h10 = hash2D(pi + vec2<f32>(1.0, 0.0));\n let h01 = hash2D(pi + vec2<f32>(0.0, 1.0));\n let h11 = hash2D(pi + vec2<f32>(1.0, 1.0));\n\n let n0 = mix(h00, h10, w.x);\n let n1 = mix(h01, h11, w.x);\n\n return mix(n0, n1, w.y);\n}\n\n// Produces a pseudo-random, NON-directional offset that changes once per\n// output frame. This replaces the old time * constant translation, which\n// smoothly scrolled the noise lattice in a fixed direction (17.31, 43.19)\n// every frame -- that's why grain visibly drifted instead of flickering.\n//\n// The frame index is wrapped into a bounded range before hashing so the\n// pattern stays high quality over long renders (f32 precision degrades on\n// very large hash inputs); the wrap period is long enough that any repeat\n// is imperceptible in grain.\nfn frameJitter(frameIndex: f32) -> vec2<f32> {\n let raw = floor(frameIndex);\n let n = raw - floor(raw / 4096.0) * 4096.0;\n let hx = hash2D(vec2<f32>(n, n * 1.6180339887));\n let hy = hash2D(vec2<f32>(n * 3.14159265, n + 91.7));\n return vec2<f32>(hx, hy) * 1024.0;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n var color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\n var strength = u.strength;\n if (u.hasSignal > 0.5) {\n let sigVal = textureSampleLevel(signalTex, signalSamp, in.uv, 0.0).r;\n strength = sigVal;\n }\n\n if (strength <= 0.0) {\n return color;\n }\n\n let dimensions = vec2<f32>(textureDimensions(tex));\n let grainCoord = (in.uv * dimensions) / u.size;\n\n let jitter = select(vec2<f32>(0.0), frameJitter(u.frameIndex), u.animated > 0.5);\n\n let luminance = dot(color.rgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n\n // Luminance response curve logic\n let shadowFactor = exp(-luminance * luminance / 0.1);\n let highlightFactor = exp(-(1.0 - luminance) * (1.0 - luminance) / 0.1);\n let midtoneFactor = max(0.0, 1.0 - shadowFactor - highlightFactor);\n\n let response = (u.shadows * shadowFactor) + (u.midtones * midtoneFactor) + (u.highlights * highlightFactor);\n let finalGrainStrength = (strength / 100.0) * response * 0.15; // Normalized scale\n\n if (u.monochrome > 0.5) {\n let seed = grainCoord + jitter;\n let noiseVal = smoothNoise(seed);\n let grain = (noiseVal - 0.5) * finalGrainStrength;\n color.r += grain;\n color.g += grain;\n color.b += grain;\n } else {\n // Fixed per-channel spatial offsets (unrelated to time) keep the\n // R/G/B lattices decorrelated from each other; temporal variation\n // comes entirely from jitter now.\n let seedR = grainCoord + jitter;\n let seedG = grainCoord + jitter + vec2<f32>(173.3, 281.9);\n let seedB = grainCoord + jitter + vec2<f32>(391.7, 127.1);\n\n let noiseR = smoothNoise(seedR);\n let noiseG = smoothNoise(seedG);\n let noiseB = smoothNoise(seedB);\n\n color.r += (noiseR - 0.5) * finalGrainStrength;\n color.g += (noiseG - 0.5) * finalGrainStrength;\n color.b += (noiseB - 0.5) * finalGrainStrength;\n }\n\n return clamp(color, vec4<f32>(0.0), vec4<f32>(1.0));\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst filmGrainUniformData = new Float32Array(12);\nfunction getDeviceLayouts(device) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tres = {\n\t\tfilmUniformLayout: device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tbuffer: { type: \"uniform\" }\n\t\t}] }),\n\t\tsingleTextureLayout: device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}] }),\n\t\tsignalTextureLayout: device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}] }),\n\t\tpipelineCache: /* @__PURE__ */ new Map()\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction getFilmGrainResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `filmgrain_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst filmModule = device.createShaderModule({\n\t\t\tlabel: `filmgrain_${format}.wgsl`,\n\t\t\tcode: FILM_GRAIN_SHADER\n\t\t});\n\t\tpipeline = device.createRenderPipeline({\n\t\t\tlabel: `FilmGrainPipeline_${format}`,\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [\n\t\t\t\tlayouts.filmUniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t] }),\n\t\t\tvertex: {\n\t\t\t\tmodule: filmModule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule: filmModule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tfilmPipeline: pipeline,\n\t\tfilmUniformLayout: layouts.filmUniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst FilmGrainWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetTexture, targetWidth, targetHeight, props, drawChild } = args;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"FilmGrain\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst dpiScale = width / (props.containerWidth ?? ctx.surface.width / (typeof window !== \"undefined\" ? window.devicePixelRatio : 1));\n\tconst signalInput = op.strengthHandleId ? op.inputs?.[op.strengthHandleId] : null;\n\tconst hasSignal = !!(signalInput?.connectionValid && (signalInput.outputItem?.type === \"Signal\" || signalInput.outputItem?.type === \"Numeric\"));\n\tconst sd = hasSignal && signalInput?.outputItem?.data ? signalInput.outputItem.data : null;\n\tconst resolveVal = (val, fallback) => {\n\t\tif (val === void 0 || val === null) return fallback;\n\t\tif (typeof val === \"object\" && val !== null) {\n\t\t\tif (\"get\" in val && typeof val.get === \"function\") val = val.get({\n\t\t\t\tframe: compositionFrame,\n\t\t\t\tfps\n\t\t\t});\n\t\t\telse if (\"value\" in val) val = val.value;\n\t\t} else if (typeof val === \"function\") val = val(compositionFrame, fps);\n\t\tconst n = Number(val);\n\t\treturn Number.isFinite(n) ? n : fallback;\n\t};\n\tlet strength = 0;\n\tlet hasStaticSignal = false;\n\tif (!hasSignal) if (signalInput?.connectionValid && signalInput.outputItem?.type === \"Number\") strength = Math.max(0, Number(signalInput.outputItem.data ?? 0));\n\telse strength = Math.max(0, resolveVal(op.strength, 15));\n\telse if (sd) {\n\t\tstrength = Math.max(0, Number(sd.offset ?? 0));\n\t\thasStaticSignal = true;\n\t}\n\tconst tmpTex = ctx.renderer.getTemporaryTexture(width, height, [...props.excludeTextures || [], targetTexture]);\n\tconst tmpView = tmpTex.createView();\n\tctx.renderer.beginFrame(encoder, tmpView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(childMedia, {\n\t\t...props,\n\t\tvirtualMedia: childMedia\n\t}, tmpView, tmpTex, width, height);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\targs.pass.end();\n\tconst { filmPipeline: pipeline, filmUniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getFilmGrainResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tlet signalView;\n\tconst elapsedSeconds = props.elapsedMs !== void 0 ? props.elapsedMs / 1e3 : frame / fps;\n\tconst durationSeconds = props.virtualMedia?.metadata?.durationMs ? props.virtualMedia.metadata.durationMs / 1e3 : props.durationMs !== void 0 ? props.durationMs / 1e3 : 0;\n\tif (hasStaticSignal && sd) signalView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, sd.nodeId ?? \"filmgrain_strength_sig\", elapsedSeconds, durationSeconds, sd, width, height, props.renderId, frame, fps);\n\telse signalView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tconst size = Math.max(.5, resolveVal(op.size, 1.5)) * dpiScale;\n\tconst animated = op.animated ?? true;\n\tconst grainFrameIndex = frame * (resolveVal(op.speed, 50) / 50);\n\tfilmGrainUniformData[0] = strength;\n\tfilmGrainUniformData[1] = size;\n\tfilmGrainUniformData[2] = op.monochrome ?? true ? 1 : 0;\n\tfilmGrainUniformData[3] = animated ? 1 : 0;\n\tfilmGrainUniformData[4] = grainFrameIndex;\n\tfilmGrainUniformData[5] = resolveVal(op.shadows, .2);\n\tfilmGrainUniformData[6] = resolveVal(op.midtones, 1);\n\tfilmGrainUniformData[7] = resolveVal(op.highlights, .2);\n\tfilmGrainUniformData[8] = hasStaticSignal ? 1 : 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(filmGrainUniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst filmPass = encoder.beginRenderPass({ colorAttachments: [{\n\t\tview: outTex.createView(),\n\t\tloadOp: \"clear\",\n\t\tstoreOp: \"store\",\n\t\tclearValue: {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}\n\t}] });\n\tfilmPass.setPipeline(pipeline);\n\tfilmPass.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t}));\n\tfilmPass.setBindGroup(1, ctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler));\n\tfilmPass.setBindGroup(2, ctx.device.createBindGroup({\n\t\tlayout: sigLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: signalView\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: sampler\n\t\t}]\n\t}));\n\tfilmPass.draw(4);\n\tfilmPass.end();\n\tconst finalPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"load\");\n\tctx.renderer.drawTexture(finalPass, outTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t}, { opacity: resolveVal(op.opacity, 1) });\n\targs.pass = finalPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: FilmGrainWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-yx-E93C7.mjs.map"],"mappings":"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"}
|
|
@@ -258,4 +258,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: ChannelSplitterWebGPURe
|
|
|
258
258
|
|
|
259
259
|
//#endregion
|
|
260
260
|
export { ChannelSplitterWebGPURenderer, renderers_default as default };
|
|
261
|
-
//# sourceMappingURL=renderer-
|
|
261
|
+
//# sourceMappingURL=renderer-D_1oDOCP.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-CIvaRnP_.mjs","names":[],"sources":["../../../nodes/node-channel-splitter/dist/renderers-B7lhYmZQ.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst COLOR_SPACE_MAP = {\n\tRGBA: 0,\n\tHSLA: 1,\n\tCMYK: 2,\n\tLAB: 3\n};\nconst WGSL_CHANNEL_SPLITTER = `\nstruct SplitterUniforms {\n\tcolorSpace : f32, // 0=RGBA, 1=HSLA, 2=CMYK, 3=LAB\n\tchannelIndex : f32, // 0=Ch1, 1=Ch2, 2=Ch3, 3=Ch4\n\t_pad0 : f32,\n\t_pad1 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : SplitterUniforms;\n@group(1) @binding(0) var srcTex : texture_2d<f32>;\n@group(1) @binding(1) var srcSamp : sampler;\n\nstruct VSOut {\n\t@builtin(position) pos : vec4<f32>,\n\t@location(0) uv : vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\n\tvar pos = array<vec2<f32>, 4>(\n\t\tvec2<f32>(-1.0, 1.0),\n\t\tvec2<f32>(1.0, 1.0),\n\t\tvec2<f32>(-1.0, -1.0),\n\t\tvec2<f32>(1.0, -1.0)\n\t);\n\tvar uv = array<vec2<f32>, 4>(\n\t\tvec2<f32>(0.0, 0.0),\n\t\tvec2<f32>(1.0, 0.0),\n\t\tvec2<f32>(0.0, 1.0),\n\t\tvec2<f32>(1.0, 1.0)\n\t);\n\treturn VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);\n}\n\nfn srgb2lin(v: f32) -> f32 {\n\tlet cv = clamp(v, 0.0, 1.0);\n\treturn select(cv / 12.92, pow((cv + 0.055) / 1.055, 2.4), cv > 0.04045);\n}\n\nfn lab_f(t: f32) -> f32 {\n\treturn select(pow(t, 1.0 / 3.0), (7.787 * t) + (16.0 / 116.0), t <= 0.008856);\n}\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n\tlet c = textureSample(srcTex, srcSamp, in.uv);\n\tlet cs = u32(u.colorSpace + 0.5);\n\tlet idx = u32(u.channelIndex + 0.5);\n\n\tvar val: f32 = 0.0;\n\n\tif (cs == 0u) { // RGBA\n\t\tif (idx == 0u) { val = c.r; }\n\t\telse if (idx == 1u) { val = c.g; }\n\t\telse if (idx == 2u) { val = c.b; }\n\t\telse { val = c.a; }\n\t} else if (cs == 1u) { // HSLA\n\t\tlet maxV = max(c.r, max(c.g, c.b));\n\t\tlet minV = min(c.r, min(c.g, c.b));\n\t\tlet d = maxV - minV;\n\t\tlet L = (maxV + minV) * 0.5;\n\t\tlet S = select(select(d / (2.0 - maxV - minV), d / (maxV + minV), L < 0.5), 0.0, d < 0.00001);\n\t\tvar H: f32 = 0.0;\n\t\tif (d > 0.00001) {\n\t\t\tif (maxV == c.r) {\n\t\t\t\tH = ((c.g - c.b) / d + select(0.0, 6.0, c.g < c.b)) / 6.0;\n\t\t\t} else if (maxV == c.g) {\n\t\t\t\tH = ((c.b - c.r) / d + 2.0) / 6.0;\n\t\t\t} else {\n\t\t\t\tH = ((c.r - c.g) / d + 4.0) / 6.0;\n\t\t\t}\n\t\t}\n\t\tif (idx == 0u) { val = H; }\n\t\telse if (idx == 1u) { val = S; }\n\t\telse if (idx == 2u) { val = L; }\n\t\telse { val = c.a; }\n\t} else if (cs == 2u) { // CMYK\n\t\tlet K = 1.0 - max(c.r, max(c.g, c.b));\n\t\tif (K >= 1.0 - 0.00001) {\n\t\t\tval = select(0.0, 1.0, idx == 3u);\n\t\t} else {\n\t\t\tlet denom = 1.0 - K;\n\t\t\tif (idx == 0u) { val = (1.0 - c.r - K) / denom; }\n\t\t\telse if (idx == 1u) { val = (1.0 - c.g - K) / denom; }\n\t\t\telse if (idx == 2u) { val = (1.0 - c.b - K) / denom; }\n\t\t\telse { val = K; }\n\t\t}\n\t} else { // LAB\n\t\tlet lr = srgb2lin(c.r);\n\t\tlet lg = srgb2lin(c.g);\n\t\tlet lb = srgb2lin(c.b);\n\n\t\tlet X = lr * 0.4124564 + lg * 0.3575761 + lb * 0.1804375;\n\t\tlet Y = lr * 0.2126729 + lg * 0.7151522 + lb * 0.0721750;\n\t\tlet Z = lr * 0.0193339 + lg * 0.1191920 + lb * 0.9503041;\n\n\t\tlet x = X / 0.95047;\n\t\tlet y = Y / 1.00000;\n\t\tlet z = Z / 1.08883;\n\n\t\tlet fx = lab_f(x);\n\t\tlet fy = lab_f(y);\n\t\tlet fz = lab_f(z);\n\n\t\tlet L_star = 116.0 * fy - 16.0;\n\t\tlet a_star = 500.0 * (fx - fy);\n\t\tlet b_star = 200.0 * (fy - fz);\n\n\t\tlet L_norm = clamp(L_star / 100.0, 0.0, 1.0);\n\t\tlet a_norm = clamp((a_star + 128.0) / 255.0, 0.0, 1.0);\n\t\tlet b_norm = clamp((b_star + 128.0) / 255.0, 0.0, 1.0);\n\n\t\tif (idx == 0u) { val = L_norm; }\n\t\telse if (idx == 1u) { val = a_norm; }\n\t\telse if (idx == 2u) { val = b_norm; }\n\t\telse { val = c.a; }\n\t}\n\n\tval = clamp(val, 0.0, 1.0);\n\treturn vec4<f32>(val, val, val, 1.0);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst uniformData = new Float32Array(4);\nfunction getDeviceLayouts(device) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tres = {\n\t\tuniformLayout: device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tbuffer: { type: \"uniform\" }\n\t\t}] }),\n\t\ttextureLayout: device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}] }),\n\t\tpipelineCache: /* @__PURE__ */ new Map()\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction getPipeline(device, format) {\n\tconst resources = getDeviceLayouts(device);\n\tconst key = `splitter_${format}`;\n\tlet pipeline = resources.pipelineCache.get(key);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: \"ChannelSplitterShader\",\n\t\t\tcode: WGSL_CHANNEL_SPLITTER\n\t\t});\n\t\tconst layout = device.createPipelineLayout({ bindGroupLayouts: [resources.uniformLayout, resources.textureLayout] });\n\t\tpipeline = device.createRenderPipeline({\n\t\t\tlabel: \"ChannelSplitterPipeline\",\n\t\t\tlayout,\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t});\n\t\tresources.pipelineCache.set(key, pipeline);\n\t}\n\treturn {\n\t\tpipeline,\n\t\tresources\n\t};\n}\nconst ChannelSplitterWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetTexture, targetWidth, targetHeight, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ChannelSplitter\" || !op) return;\n\tconst sourceMedia = props.virtualMedia.children?.[0];\n\tif (!sourceMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst srcTex = ctx.renderer.getTemporaryTexture(width, height, [...props.excludeTextures || [], targetTexture]);\n\tconst srcView = srcTex.createView();\n\tctx.renderer.beginFrame(encoder, srcView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(sourceMedia, {\n\t\t...props,\n\t\tvirtualMedia: sourceMedia,\n\t\trenderId: `${props.renderId}-src`,\n\t\texcludeTextures: [...props.excludeTextures || [], srcTex]\n\t}, srcView, srcTex, width, height);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\targs.pass.end();\n\tconst colorSpace = op.colorSpace ?? \"RGBA\";\n\tconst channelIndex = op.channelIndex ?? 0;\n\tuniformData[0] = COLOR_SPACE_MAP[colorSpace] ?? 0;\n\tuniformData[1] = channelIndex;\n\tuniformData[2] = 0;\n\tuniformData[3] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst { pipeline, resources } = getPipeline(ctx.device, targetTexture.format);\n\tconst uniformBindGroup = ctx.device.createBindGroup({\n\t\tlayout: resources.uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t});\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst textureBindGroup = ctx.device.createBindGroup({\n\t\tlayout: resources.textureLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: srcView\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: sampler\n\t\t}]\n\t});\n\tconst finalPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"load\");\n\tfinalPass.setPipeline(pipeline);\n\tfinalPass.setBindGroup(0, uniformBindGroup);\n\tfinalPass.setBindGroup(1, textureBindGroup);\n\tfinalPass.draw(4, 1, 0, 0);\n\targs.pass = finalPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ChannelSplitterWebGPURenderer });\n\n//#endregion\nexport { ChannelSplitterWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-B7lhYmZQ.mjs.map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderer-D_1oDOCP.mjs","names":[],"sources":["../../../nodes/node-channel-splitter/dist/renderers-B7lhYmZQ.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst COLOR_SPACE_MAP = {\n\tRGBA: 0,\n\tHSLA: 1,\n\tCMYK: 2,\n\tLAB: 3\n};\nconst WGSL_CHANNEL_SPLITTER = `\nstruct SplitterUniforms {\n\tcolorSpace : f32, // 0=RGBA, 1=HSLA, 2=CMYK, 3=LAB\n\tchannelIndex : f32, // 0=Ch1, 1=Ch2, 2=Ch3, 3=Ch4\n\t_pad0 : f32,\n\t_pad1 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : SplitterUniforms;\n@group(1) @binding(0) var srcTex : texture_2d<f32>;\n@group(1) @binding(1) var srcSamp : sampler;\n\nstruct VSOut {\n\t@builtin(position) pos : vec4<f32>,\n\t@location(0) uv : vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\n\tvar pos = array<vec2<f32>, 4>(\n\t\tvec2<f32>(-1.0, 1.0),\n\t\tvec2<f32>(1.0, 1.0),\n\t\tvec2<f32>(-1.0, -1.0),\n\t\tvec2<f32>(1.0, -1.0)\n\t);\n\tvar uv = array<vec2<f32>, 4>(\n\t\tvec2<f32>(0.0, 0.0),\n\t\tvec2<f32>(1.0, 0.0),\n\t\tvec2<f32>(0.0, 1.0),\n\t\tvec2<f32>(1.0, 1.0)\n\t);\n\treturn VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);\n}\n\nfn srgb2lin(v: f32) -> f32 {\n\tlet cv = clamp(v, 0.0, 1.0);\n\treturn select(cv / 12.92, pow((cv + 0.055) / 1.055, 2.4), cv > 0.04045);\n}\n\nfn lab_f(t: f32) -> f32 {\n\treturn select(pow(t, 1.0 / 3.0), (7.787 * t) + (16.0 / 116.0), t <= 0.008856);\n}\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n\tlet c = textureSample(srcTex, srcSamp, in.uv);\n\tlet cs = u32(u.colorSpace + 0.5);\n\tlet idx = u32(u.channelIndex + 0.5);\n\n\tvar val: f32 = 0.0;\n\n\tif (cs == 0u) { // RGBA\n\t\tif (idx == 0u) { val = c.r; }\n\t\telse if (idx == 1u) { val = c.g; }\n\t\telse if (idx == 2u) { val = c.b; }\n\t\telse { val = c.a; }\n\t} else if (cs == 1u) { // HSLA\n\t\tlet maxV = max(c.r, max(c.g, c.b));\n\t\tlet minV = min(c.r, min(c.g, c.b));\n\t\tlet d = maxV - minV;\n\t\tlet L = (maxV + minV) * 0.5;\n\t\tlet S = select(select(d / (2.0 - maxV - minV), d / (maxV + minV), L < 0.5), 0.0, d < 0.00001);\n\t\tvar H: f32 = 0.0;\n\t\tif (d > 0.00001) {\n\t\t\tif (maxV == c.r) {\n\t\t\t\tH = ((c.g - c.b) / d + select(0.0, 6.0, c.g < c.b)) / 6.0;\n\t\t\t} else if (maxV == c.g) {\n\t\t\t\tH = ((c.b - c.r) / d + 2.0) / 6.0;\n\t\t\t} else {\n\t\t\t\tH = ((c.r - c.g) / d + 4.0) / 6.0;\n\t\t\t}\n\t\t}\n\t\tif (idx == 0u) { val = H; }\n\t\telse if (idx == 1u) { val = S; }\n\t\telse if (idx == 2u) { val = L; }\n\t\telse { val = c.a; }\n\t} else if (cs == 2u) { // CMYK\n\t\tlet K = 1.0 - max(c.r, max(c.g, c.b));\n\t\tif (K >= 1.0 - 0.00001) {\n\t\t\tval = select(0.0, 1.0, idx == 3u);\n\t\t} else {\n\t\t\tlet denom = 1.0 - K;\n\t\t\tif (idx == 0u) { val = (1.0 - c.r - K) / denom; }\n\t\t\telse if (idx == 1u) { val = (1.0 - c.g - K) / denom; }\n\t\t\telse if (idx == 2u) { val = (1.0 - c.b - K) / denom; }\n\t\t\telse { val = K; }\n\t\t}\n\t} else { // LAB\n\t\tlet lr = srgb2lin(c.r);\n\t\tlet lg = srgb2lin(c.g);\n\t\tlet lb = srgb2lin(c.b);\n\n\t\tlet X = lr * 0.4124564 + lg * 0.3575761 + lb * 0.1804375;\n\t\tlet Y = lr * 0.2126729 + lg * 0.7151522 + lb * 0.0721750;\n\t\tlet Z = lr * 0.0193339 + lg * 0.1191920 + lb * 0.9503041;\n\n\t\tlet x = X / 0.95047;\n\t\tlet y = Y / 1.00000;\n\t\tlet z = Z / 1.08883;\n\n\t\tlet fx = lab_f(x);\n\t\tlet fy = lab_f(y);\n\t\tlet fz = lab_f(z);\n\n\t\tlet L_star = 116.0 * fy - 16.0;\n\t\tlet a_star = 500.0 * (fx - fy);\n\t\tlet b_star = 200.0 * (fy - fz);\n\n\t\tlet L_norm = clamp(L_star / 100.0, 0.0, 1.0);\n\t\tlet a_norm = clamp((a_star + 128.0) / 255.0, 0.0, 1.0);\n\t\tlet b_norm = clamp((b_star + 128.0) / 255.0, 0.0, 1.0);\n\n\t\tif (idx == 0u) { val = L_norm; }\n\t\telse if (idx == 1u) { val = a_norm; }\n\t\telse if (idx == 2u) { val = b_norm; }\n\t\telse { val = c.a; }\n\t}\n\n\tval = clamp(val, 0.0, 1.0);\n\treturn vec4<f32>(val, val, val, 1.0);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst uniformData = new Float32Array(4);\nfunction getDeviceLayouts(device) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tres = {\n\t\tuniformLayout: device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tbuffer: { type: \"uniform\" }\n\t\t}] }),\n\t\ttextureLayout: device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}] }),\n\t\tpipelineCache: /* @__PURE__ */ new Map()\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction getPipeline(device, format) {\n\tconst resources = getDeviceLayouts(device);\n\tconst key = `splitter_${format}`;\n\tlet pipeline = resources.pipelineCache.get(key);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: \"ChannelSplitterShader\",\n\t\t\tcode: WGSL_CHANNEL_SPLITTER\n\t\t});\n\t\tconst layout = device.createPipelineLayout({ bindGroupLayouts: [resources.uniformLayout, resources.textureLayout] });\n\t\tpipeline = device.createRenderPipeline({\n\t\t\tlabel: \"ChannelSplitterPipeline\",\n\t\t\tlayout,\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t});\n\t\tresources.pipelineCache.set(key, pipeline);\n\t}\n\treturn {\n\t\tpipeline,\n\t\tresources\n\t};\n}\nconst ChannelSplitterWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetTexture, targetWidth, targetHeight, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ChannelSplitter\" || !op) return;\n\tconst sourceMedia = props.virtualMedia.children?.[0];\n\tif (!sourceMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst srcTex = ctx.renderer.getTemporaryTexture(width, height, [...props.excludeTextures || [], targetTexture]);\n\tconst srcView = srcTex.createView();\n\tctx.renderer.beginFrame(encoder, srcView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(sourceMedia, {\n\t\t...props,\n\t\tvirtualMedia: sourceMedia,\n\t\trenderId: `${props.renderId}-src`,\n\t\texcludeTextures: [...props.excludeTextures || [], srcTex]\n\t}, srcView, srcTex, width, height);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\targs.pass.end();\n\tconst colorSpace = op.colorSpace ?? \"RGBA\";\n\tconst channelIndex = op.channelIndex ?? 0;\n\tuniformData[0] = COLOR_SPACE_MAP[colorSpace] ?? 0;\n\tuniformData[1] = channelIndex;\n\tuniformData[2] = 0;\n\tuniformData[3] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst { pipeline, resources } = getPipeline(ctx.device, targetTexture.format);\n\tconst uniformBindGroup = ctx.device.createBindGroup({\n\t\tlayout: resources.uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t});\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst textureBindGroup = ctx.device.createBindGroup({\n\t\tlayout: resources.textureLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: srcView\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: sampler\n\t\t}]\n\t});\n\tconst finalPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"load\");\n\tfinalPass.setPipeline(pipeline);\n\tfinalPass.setBindGroup(0, uniformBindGroup);\n\tfinalPass.setBindGroup(1, textureBindGroup);\n\tfinalPass.draw(4, 1, 0, 0);\n\targs.pass = finalPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ChannelSplitterWebGPURenderer });\n\n//#endregion\nexport { ChannelSplitterWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-B7lhYmZQ.mjs.map"],"mappings":"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"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { n as defineRenderer } from "./renderer-CtVkU_GA.mjs";
|
|
2
|
+
import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-DzUJmIHt.mjs";
|
|
3
|
+
import { $ as probeVideoSize } from "./dist-B9PkqWnN.mjs";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
|
|
6
|
+
//#region ../../nodes/node-rotate/dist/renderers-BzrxSSux.mjs
|
|
7
|
+
const rotateConfig = configBuilder().field("angle", z.number().default(90), {
|
|
8
|
+
bindable: true,
|
|
9
|
+
dataTypes: ["Number", "Signal"],
|
|
10
|
+
label: "Angle Signal",
|
|
11
|
+
description: "Rotation in degrees about the frame center, clockwise. Any value; 90 / 180 / 270 fix footage shot sideways or upside down."
|
|
12
|
+
}).field("fit", z.enum([
|
|
13
|
+
"cover",
|
|
14
|
+
"contain",
|
|
15
|
+
"fill"
|
|
16
|
+
]).default("cover"), { description: "How the rotated source sits in the output: cover fills it (cropping the overhang), contain shows all of it (transparent margins), fill keeps the unrotated source stretched to the output and only turns it." }).field("scale", z.number().min(.01).max(20).default(1), {
|
|
17
|
+
bindable: true,
|
|
18
|
+
dataTypes: ["Number", "Signal"],
|
|
19
|
+
label: "Scale Signal",
|
|
20
|
+
description: "Extra zoom applied after the fit (1 = exactly fitted)."
|
|
21
|
+
}).build();
|
|
22
|
+
const RotateNodeConfigSchema = rotateConfig.schema;
|
|
23
|
+
const RotateResultSchema = z.union([ImageResultSchema, VideoResultSchema]);
|
|
24
|
+
/**
|
|
25
|
+
* Size (px) of the rotated source inside a `targetWidth × targetHeight` output.
|
|
26
|
+
* `cover` is the smallest size whose rotated rectangle still covers the whole
|
|
27
|
+
* output; `contain` the largest whose rotated bounding box fits inside it.
|
|
28
|
+
*/
|
|
29
|
+
function rotatedSourceSize(sourceWidth, sourceHeight, targetWidth, targetHeight, angleDeg, fit) {
|
|
30
|
+
if (fit === "fill") return {
|
|
31
|
+
width: targetWidth,
|
|
32
|
+
height: targetHeight
|
|
33
|
+
};
|
|
34
|
+
const rad = angleDeg * Math.PI / 180;
|
|
35
|
+
const c = Math.abs(Math.cos(rad));
|
|
36
|
+
const s = Math.abs(Math.sin(rad));
|
|
37
|
+
const k = fit === "cover" ? Math.max((c * targetWidth + s * targetHeight) / sourceWidth, (s * targetWidth + c * targetHeight) / sourceHeight) : Math.min(targetWidth / (c * sourceWidth + s * sourceHeight), targetHeight / (s * sourceWidth + c * sourceHeight));
|
|
38
|
+
return {
|
|
39
|
+
width: sourceWidth * k,
|
|
40
|
+
height: sourceHeight * k
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const WGSL_ROTATE_SHADER = `
|
|
44
|
+
struct RotateUniforms {
|
|
45
|
+
outSize: vec2<f32>,
|
|
46
|
+
size : vec2<f32>,
|
|
47
|
+
cs : vec2<f32>,
|
|
48
|
+
_pad : vec2<f32>,
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
@group(0) @binding(0) var<uniform> u : RotateUniforms;
|
|
52
|
+
@group(1) @binding(0) var tex : texture_2d<f32>;
|
|
53
|
+
@group(1) @binding(1) var samp : sampler;
|
|
54
|
+
|
|
55
|
+
struct VSOut {
|
|
56
|
+
@builtin(position) pos : vec4<f32>,
|
|
57
|
+
@location(0) uv : vec2<f32>,
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {
|
|
61
|
+
var pos = array<vec2<f32>, 4>(
|
|
62
|
+
vec2<f32>(-1.0, 1.0),
|
|
63
|
+
vec2<f32>(1.0, 1.0),
|
|
64
|
+
vec2<f32>(-1.0, -1.0),
|
|
65
|
+
vec2<f32>(1.0, -1.0)
|
|
66
|
+
);
|
|
67
|
+
var uv = array<vec2<f32>, 4>(
|
|
68
|
+
vec2<f32>(0.0, 0.0),
|
|
69
|
+
vec2<f32>(1.0, 0.0),
|
|
70
|
+
vec2<f32>(0.0, 1.0),
|
|
71
|
+
vec2<f32>(1.0, 1.0)
|
|
72
|
+
);
|
|
73
|
+
return VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
|
|
77
|
+
let p = (in.uv - vec2<f32>(0.5)) * u.outSize;
|
|
78
|
+
// Clockwise on screen (y down): undo it with the transpose.
|
|
79
|
+
let q = vec2<f32>(u.cs.x * p.x + u.cs.y * p.y, -u.cs.y * p.x + u.cs.x * p.y);
|
|
80
|
+
let uv = q / u.size + vec2<f32>(0.5);
|
|
81
|
+
// Distance (output px) inside the source rectangle's nearest edge.
|
|
82
|
+
let edge = (vec2<f32>(0.5) - abs(uv - vec2<f32>(0.5))) * u.size;
|
|
83
|
+
let coverage = clamp(min(edge.x, edge.y) + 0.5, 0.0, 1.0);
|
|
84
|
+
let color = textureSampleLevel(tex, samp, clamp(uv, vec2<f32>(0.0), vec2<f32>(1.0)), 0.0);
|
|
85
|
+
// Premultiplied: coverage scales every channel.
|
|
86
|
+
return color * coverage;
|
|
87
|
+
}
|
|
88
|
+
`;
|
|
89
|
+
const deviceResourceCache = /* @__PURE__ */ new WeakMap();
|
|
90
|
+
const uniformData = new Float32Array(8);
|
|
91
|
+
function getRotateResources(device, targetFormat) {
|
|
92
|
+
const cached = deviceResourceCache.get(device);
|
|
93
|
+
if (cached) return cached;
|
|
94
|
+
const uniformLayout = device.createBindGroupLayout({ entries: [{
|
|
95
|
+
binding: 0,
|
|
96
|
+
visibility: GPUShaderStage.FRAGMENT,
|
|
97
|
+
buffer: { type: "uniform" }
|
|
98
|
+
}] });
|
|
99
|
+
const textureLayout = device.createBindGroupLayout({ entries: [{
|
|
100
|
+
binding: 0,
|
|
101
|
+
visibility: GPUShaderStage.FRAGMENT,
|
|
102
|
+
texture: { sampleType: "float" }
|
|
103
|
+
}, {
|
|
104
|
+
binding: 1,
|
|
105
|
+
visibility: GPUShaderStage.FRAGMENT,
|
|
106
|
+
sampler: { type: "filtering" }
|
|
107
|
+
}] });
|
|
108
|
+
const shaderModule = device.createShaderModule({ code: WGSL_ROTATE_SHADER });
|
|
109
|
+
const res = {
|
|
110
|
+
uniformLayout,
|
|
111
|
+
textureLayout,
|
|
112
|
+
pipeline: device.createRenderPipeline({
|
|
113
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [uniformLayout, textureLayout] }),
|
|
114
|
+
vertex: {
|
|
115
|
+
module: shaderModule,
|
|
116
|
+
entryPoint: "vs"
|
|
117
|
+
},
|
|
118
|
+
fragment: {
|
|
119
|
+
module: shaderModule,
|
|
120
|
+
entryPoint: "fs",
|
|
121
|
+
targets: [{ format: targetFormat }]
|
|
122
|
+
},
|
|
123
|
+
primitive: { topology: "triangle-strip" }
|
|
124
|
+
})
|
|
125
|
+
};
|
|
126
|
+
deviceResourceCache.set(device, res);
|
|
127
|
+
return res;
|
|
128
|
+
}
|
|
129
|
+
function resolveNumber(raw, fallback, frame, fps) {
|
|
130
|
+
const value = typeof raw === "function" ? raw(frame, fps) : raw !== null && typeof raw === "object" ? "get" in raw && typeof raw.get === "function" ? raw.get({
|
|
131
|
+
frame,
|
|
132
|
+
fps
|
|
133
|
+
}) : "value" in raw ? raw.value : raw : raw;
|
|
134
|
+
const n = Number(value ?? fallback);
|
|
135
|
+
return Number.isFinite(n) ? n : fallback;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* The child's own size: the nearest stated metadata down the chain, else the
|
|
139
|
+
* source file's display size. A layer built from a bare path states none, and
|
|
140
|
+
* guessing the layer box would turn a 16:9 clip into a squeezed 9:16 one.
|
|
141
|
+
*/
|
|
142
|
+
async function intrinsicSize(media) {
|
|
143
|
+
for (let node = media; node;) {
|
|
144
|
+
const { width, height } = node.metadata ?? {};
|
|
145
|
+
if (width && height) return {
|
|
146
|
+
width,
|
|
147
|
+
height
|
|
148
|
+
};
|
|
149
|
+
const op = node.operation;
|
|
150
|
+
if (op.op === "source") {
|
|
151
|
+
const url = typeof op.url === "string" ? op.url : op.source;
|
|
152
|
+
return typeof url === "string" ? probeVideoSize(url) : null;
|
|
153
|
+
}
|
|
154
|
+
node = node.children?.[0];
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
const WebGPURenderer = async (args) => {
|
|
159
|
+
const { ctx, encoder, pass, targetView, targetTexture, targetWidth, targetHeight, props, drawChild } = args;
|
|
160
|
+
const op = props.virtualMedia?.operation;
|
|
161
|
+
if (op?.op !== "Rotate" || !op) return;
|
|
162
|
+
const childMedia = props.virtualMedia.children?.[0];
|
|
163
|
+
if (!childMedia) return;
|
|
164
|
+
pass.end();
|
|
165
|
+
const frame = props.frame ?? 0;
|
|
166
|
+
const compositionFrame = props.compositionFrame ?? frame;
|
|
167
|
+
const fps = props.fps || 30;
|
|
168
|
+
const width = targetWidth;
|
|
169
|
+
const height = targetHeight;
|
|
170
|
+
const intrinsic = await intrinsicSize(childMedia);
|
|
171
|
+
const sourceWidth = intrinsic?.width ?? props.containerWidth ?? width;
|
|
172
|
+
const sourceHeight = intrinsic?.height ?? props.containerHeight ?? height;
|
|
173
|
+
const childTex = ctx.renderer.getTemporaryTexture(sourceWidth, sourceHeight, [...props.excludeTextures || [], targetTexture]);
|
|
174
|
+
const childView = childTex.createView();
|
|
175
|
+
ctx.renderer.beginFrame(encoder, childView, {
|
|
176
|
+
r: 0,
|
|
177
|
+
g: 0,
|
|
178
|
+
b: 0,
|
|
179
|
+
a: 0
|
|
180
|
+
}, sourceWidth, sourceHeight, "clear").end();
|
|
181
|
+
ctx.renderer.pushScissor({
|
|
182
|
+
x: 0,
|
|
183
|
+
y: 0,
|
|
184
|
+
width: sourceWidth,
|
|
185
|
+
height: sourceHeight
|
|
186
|
+
});
|
|
187
|
+
ctx.renderer.pushIdentity();
|
|
188
|
+
await drawChild(childMedia, {
|
|
189
|
+
...props,
|
|
190
|
+
containerWidth: sourceWidth,
|
|
191
|
+
containerHeight: sourceHeight,
|
|
192
|
+
virtualMedia: childMedia
|
|
193
|
+
}, childView, childTex, sourceWidth, sourceHeight);
|
|
194
|
+
ctx.renderer.popTransform();
|
|
195
|
+
ctx.renderer.popScissor();
|
|
196
|
+
const angle = resolveNumber(op.angle, 90, compositionFrame, fps);
|
|
197
|
+
const scale = Math.max(.01, resolveNumber(op.scale, 1, compositionFrame, fps));
|
|
198
|
+
const size = rotatedSourceSize(sourceWidth, sourceHeight, width, height, angle, op.fit ?? "cover");
|
|
199
|
+
const rad = angle * Math.PI / 180;
|
|
200
|
+
uniformData[0] = width;
|
|
201
|
+
uniformData[1] = height;
|
|
202
|
+
uniformData[2] = size.width * scale;
|
|
203
|
+
uniformData[3] = size.height * scale;
|
|
204
|
+
uniformData[4] = Math.cos(rad);
|
|
205
|
+
uniformData[5] = Math.sin(rad);
|
|
206
|
+
const { pipeline, uniformLayout, textureLayout } = getRotateResources(ctx.device, ctx.renderer.format);
|
|
207
|
+
const uBindGroup = ctx.device.createBindGroup({
|
|
208
|
+
layout: uniformLayout,
|
|
209
|
+
entries: [{
|
|
210
|
+
binding: 0,
|
|
211
|
+
resource: { buffer: ctx.renderer.getTemporaryBuffer(uniformData) }
|
|
212
|
+
}]
|
|
213
|
+
});
|
|
214
|
+
const tBindGroup = ctx.device.createBindGroup({
|
|
215
|
+
layout: textureLayout,
|
|
216
|
+
entries: [{
|
|
217
|
+
binding: 0,
|
|
218
|
+
resource: childTex.createView()
|
|
219
|
+
}, {
|
|
220
|
+
binding: 1,
|
|
221
|
+
resource: ctx.renderer.samplerCache.getSampler(ctx.device)
|
|
222
|
+
}]
|
|
223
|
+
});
|
|
224
|
+
const outTex = ctx.renderer.getTemporaryTexture(width, height, [
|
|
225
|
+
childTex,
|
|
226
|
+
targetTexture,
|
|
227
|
+
...props.excludeTextures || []
|
|
228
|
+
]);
|
|
229
|
+
const renderPass = encoder.beginRenderPass({ colorAttachments: [{
|
|
230
|
+
view: outTex.createView(),
|
|
231
|
+
loadOp: "clear",
|
|
232
|
+
storeOp: "store",
|
|
233
|
+
clearValue: {
|
|
234
|
+
r: 0,
|
|
235
|
+
g: 0,
|
|
236
|
+
b: 0,
|
|
237
|
+
a: 0
|
|
238
|
+
}
|
|
239
|
+
}] });
|
|
240
|
+
renderPass.setPipeline(pipeline);
|
|
241
|
+
renderPass.setBindGroup(0, uBindGroup);
|
|
242
|
+
renderPass.setBindGroup(1, tBindGroup);
|
|
243
|
+
renderPass.draw(4);
|
|
244
|
+
renderPass.end();
|
|
245
|
+
const finalPass = ctx.renderer.beginFrame(encoder, targetView, {
|
|
246
|
+
r: 0,
|
|
247
|
+
g: 0,
|
|
248
|
+
b: 0,
|
|
249
|
+
a: 0
|
|
250
|
+
}, targetWidth, targetHeight, "load");
|
|
251
|
+
ctx.renderer.drawTexture(finalPass, outTex, {
|
|
252
|
+
x: 0,
|
|
253
|
+
y: 0,
|
|
254
|
+
width: targetWidth,
|
|
255
|
+
height: targetHeight
|
|
256
|
+
}, { opacity: op.opacity ?? 1 });
|
|
257
|
+
args.pass = finalPass;
|
|
258
|
+
};
|
|
259
|
+
var renderers_default = defineRenderer({ WebGPURenderer });
|
|
260
|
+
|
|
261
|
+
//#endregion
|
|
262
|
+
export { renderers_default as t };
|
|
263
|
+
//# sourceMappingURL=renderer-DdVBt8Rz.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer-DdVBt8Rz.mjs","names":[],"sources":["../../../nodes/node-rotate/dist/renderers-BzrxSSux.mjs"],"sourcesContent":["import { ImageResultSchema, VideoResultSchema, configBuilder } from \"@framefields/node-sdk\";\nimport { z } from \"zod\";\nimport { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { probeVideoSize } from \"@framefields/webgpu-renderers\";\n\n//#region src/shared/config.ts\nconst rotateConfig = configBuilder().field(\"angle\", z.number().default(90), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Angle Signal\",\n\tdescription: \"Rotation in degrees about the frame center, clockwise. Any value; 90 / 180 / 270 fix footage shot sideways or upside down.\"\n}).field(\"fit\", z.enum([\n\t\"cover\",\n\t\"contain\",\n\t\"fill\"\n]).default(\"cover\"), { description: \"How the rotated source sits in the output: cover fills it (cropping the overhang), contain shows all of it (transparent margins), fill keeps the unrotated source stretched to the output and only turns it.\" }).field(\"scale\", z.number().min(.01).max(20).default(1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Scale Signal\",\n\tdescription: \"Extra zoom applied after the fit (1 = exactly fitted).\"\n}).build();\nconst RotateNodeConfigSchema = rotateConfig.schema;\nconst RotateResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst ROTATE_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n/**\n* Size (px) of the rotated source inside a `targetWidth × targetHeight` output.\n* `cover` is the smallest size whose rotated rectangle still covers the whole\n* output; `contain` the largest whose rotated bounding box fits inside it.\n*/\nfunction rotatedSourceSize(sourceWidth, sourceHeight, targetWidth, targetHeight, angleDeg, fit) {\n\tif (fit === \"fill\") return {\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t};\n\tconst rad = angleDeg * Math.PI / 180;\n\tconst c = Math.abs(Math.cos(rad));\n\tconst s = Math.abs(Math.sin(rad));\n\tconst k = fit === \"cover\" ? Math.max((c * targetWidth + s * targetHeight) / sourceWidth, (s * targetWidth + c * targetHeight) / sourceHeight) : Math.min(targetWidth / (c * sourceWidth + s * sourceHeight), targetHeight / (s * sourceWidth + c * sourceHeight));\n\treturn {\n\t\twidth: sourceWidth * k,\n\t\theight: sourceHeight * k\n\t};\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_ROTATE_SHADER = `\nstruct RotateUniforms {\n\toutSize: vec2<f32>,\n\tsize : vec2<f32>,\n\tcs : vec2<f32>,\n\t_pad : vec2<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : RotateUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\nstruct VSOut {\n\t@builtin(position) pos : vec4<f32>,\n\t@location(0) uv : vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\n\tvar pos = array<vec2<f32>, 4>(\n\t\tvec2<f32>(-1.0, 1.0),\n\t\tvec2<f32>(1.0, 1.0),\n\t\tvec2<f32>(-1.0, -1.0),\n\t\tvec2<f32>(1.0, -1.0)\n\t);\n\tvar uv = array<vec2<f32>, 4>(\n\t\tvec2<f32>(0.0, 0.0),\n\t\tvec2<f32>(1.0, 0.0),\n\t\tvec2<f32>(0.0, 1.0),\n\t\tvec2<f32>(1.0, 1.0)\n\t);\n\treturn VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet p = (in.uv - vec2<f32>(0.5)) * u.outSize;\n\t// Clockwise on screen (y down): undo it with the transpose.\n\tlet q = vec2<f32>(u.cs.x * p.x + u.cs.y * p.y, -u.cs.y * p.x + u.cs.x * p.y);\n\tlet uv = q / u.size + vec2<f32>(0.5);\n\t// Distance (output px) inside the source rectangle's nearest edge.\n\tlet edge = (vec2<f32>(0.5) - abs(uv - vec2<f32>(0.5))) * u.size;\n\tlet coverage = clamp(min(edge.x, edge.y) + 0.5, 0.0, 1.0);\n\tlet color = textureSampleLevel(tex, samp, clamp(uv, vec2<f32>(0.0), vec2<f32>(1.0)), 0.0);\n\t// Premultiplied: coverage scales every channel.\n\treturn color * coverage;\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst uniformData = new Float32Array(8);\nfunction getRotateResources(device, targetFormat) {\n\tconst cached = deviceResourceCache.get(device);\n\tif (cached) return cached;\n\tconst uniformLayout = device.createBindGroupLayout({ entries: [{\n\t\tbinding: 0,\n\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\tbuffer: { type: \"uniform\" }\n\t}] });\n\tconst textureLayout = device.createBindGroupLayout({ entries: [{\n\t\tbinding: 0,\n\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\ttexture: { sampleType: \"float\" }\n\t}, {\n\t\tbinding: 1,\n\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\tsampler: { type: \"filtering\" }\n\t}] });\n\tconst shaderModule = device.createShaderModule({ code: WGSL_ROTATE_SHADER });\n\tconst res = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [uniformLayout, textureLayout] }),\n\t\t\tvertex: {\n\t\t\t\tmodule: shaderModule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule: shaderModule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format: targetFormat }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction resolveNumber(raw, fallback, frame, fps) {\n\tconst value = typeof raw === \"function\" ? raw(frame, fps) : raw !== null && typeof raw === \"object\" ? \"get\" in raw && typeof raw.get === \"function\" ? raw.get({\n\t\tframe,\n\t\tfps\n\t}) : \"value\" in raw ? raw.value : raw : raw;\n\tconst n = Number(value ?? fallback);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/**\n* The child's own size: the nearest stated metadata down the chain, else the\n* source file's display size. A layer built from a bare path states none, and\n* guessing the layer box would turn a 16:9 clip into a squeezed 9:16 one.\n*/\nasync function intrinsicSize(media) {\n\tfor (let node = media; node;) {\n\t\tconst { width, height } = node.metadata ?? {};\n\t\tif (width && height) return {\n\t\t\twidth,\n\t\t\theight\n\t\t};\n\t\tconst op = node.operation;\n\t\tif (op.op === \"source\") {\n\t\t\tconst url = typeof op.url === \"string\" ? op.url : op.source;\n\t\t\treturn typeof url === \"string\" ? probeVideoSize(url) : null;\n\t\t}\n\t\tnode = node.children?.[0];\n\t}\n\treturn null;\n}\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetTexture, targetWidth, targetHeight, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Rotate\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst intrinsic = await intrinsicSize(childMedia);\n\tconst sourceWidth = intrinsic?.width ?? props.containerWidth ?? width;\n\tconst sourceHeight = intrinsic?.height ?? props.containerHeight ?? height;\n\tconst childTex = ctx.renderer.getTemporaryTexture(sourceWidth, sourceHeight, [...props.excludeTextures || [], targetTexture]);\n\tconst childView = childTex.createView();\n\tctx.renderer.beginFrame(encoder, childView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, sourceWidth, sourceHeight, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(childMedia, {\n\t\t...props,\n\t\tcontainerWidth: sourceWidth,\n\t\tcontainerHeight: sourceHeight,\n\t\tvirtualMedia: childMedia\n\t}, childView, childTex, sourceWidth, sourceHeight);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\tconst angle = resolveNumber(op.angle, 90, compositionFrame, fps);\n\tconst scale = Math.max(.01, resolveNumber(op.scale, 1, compositionFrame, fps));\n\tconst size = rotatedSourceSize(sourceWidth, sourceHeight, width, height, angle, op.fit ?? \"cover\");\n\tconst rad = angle * Math.PI / 180;\n\tuniformData[0] = width;\n\tuniformData[1] = height;\n\tuniformData[2] = size.width * scale;\n\tuniformData[3] = size.height * scale;\n\tuniformData[4] = Math.cos(rad);\n\tuniformData[5] = Math.sin(rad);\n\tconst { pipeline, uniformLayout, textureLayout } = getRotateResources(ctx.device, ctx.renderer.format);\n\tconst uBindGroup = ctx.device.createBindGroup({\n\t\tlayout: uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: ctx.renderer.getTemporaryBuffer(uniformData) }\n\t\t}]\n\t});\n\tconst tBindGroup = ctx.device.createBindGroup({\n\t\tlayout: textureLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: childTex.createView()\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: ctx.renderer.samplerCache.getSampler(ctx.device)\n\t\t}]\n\t});\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tchildTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst renderPass = encoder.beginRenderPass({ colorAttachments: [{\n\t\tview: outTex.createView(),\n\t\tloadOp: \"clear\",\n\t\tstoreOp: \"store\",\n\t\tclearValue: {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}\n\t}] });\n\trenderPass.setPipeline(pipeline);\n\trenderPass.setBindGroup(0, uBindGroup);\n\trenderPass.setBindGroup(1, tBindGroup);\n\trenderPass.draw(4);\n\trenderPass.end();\n\tconst finalPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"load\");\n\tctx.renderer.drawTexture(finalPass, outTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t}, { opacity: op.opacity ?? 1 });\n\targs.pass = finalPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { rotateConfig as a, RotateResultSchema as i, ROTATE_OUTPUT_TYPE_MAP as n, rotatedSourceSize as o, RotateNodeConfigSchema as r, renderers_default as t };\n//# sourceMappingURL=renderers-BzrxSSux.mjs.map"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { It as resolveNumber, Ot as isSignal } from "./dist-B9Afsv83.mjs";
|
|
2
2
|
import { n as defineRenderer } from "./renderer-CtVkU_GA.mjs";
|
|
3
|
-
import { C as WebGPUAudioProcessor } from "./dist-
|
|
3
|
+
import { C as WebGPUAudioProcessor } from "./dist-B9PkqWnN.mjs";
|
|
4
4
|
|
|
5
5
|
//#region ../../nodes/node-stereo-panning/dist/renderers-Dc15sLt-.mjs
|
|
6
6
|
const PARAM_ORDER = ["pan"];
|
|
@@ -96,4 +96,4 @@ var renderers_default = defineRenderer({ audioProcessor: stereoPanningAudioProce
|
|
|
96
96
|
|
|
97
97
|
//#endregion
|
|
98
98
|
export { renderers_default as t };
|
|
99
|
-
//# sourceMappingURL=renderer-
|
|
99
|
+
//# sourceMappingURL=renderer-DffynBHa.mjs.map
|