framefields 2.3.1 → 2.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/audio/index.mjs +10 -10
- package/dist/{audio-CS104aUj.mjs → audio-C7Kn5xBm.mjs} +3 -3
- package/dist/{audio-CS104aUj.mjs.map → audio-C7Kn5xBm.mjs.map} +1 -1
- package/dist/{dist-BOdxAhOT.mjs → dist-CPUIfrtw.mjs} +2 -2
- package/dist/{dist-BOdxAhOT.mjs.map → dist-CPUIfrtw.mjs.map} +1 -1
- package/dist/{dist-jU289ehm.mjs → dist-CturBK2Z.mjs} +138 -66
- package/dist/dist-CturBK2Z.mjs.map +1 -0
- package/dist/effects/index.mjs +34 -34
- package/dist/{effects-BzOlVD-w.mjs → effects-CW1VgdI5.mjs} +2 -2
- package/dist/{effects-BzOlVD-w.mjs.map → effects-CW1VgdI5.mjs.map} +1 -1
- package/dist/fonts/index.mjs +2 -2
- package/dist/{fonts-BhlV_3Qt.mjs → fonts-EgMNL8KE.mjs} +2 -2
- package/dist/{fonts-BhlV_3Qt.mjs.map → fonts-EgMNL8KE.mjs.map} +1 -1
- package/dist/{gpu-BA1Wz_mS.mjs → gpu-CN14e7Bi.mjs} +2 -2
- package/dist/{gpu-BA1Wz_mS.mjs.map → gpu-CN14e7Bi.mjs.map} +1 -1
- package/dist/index-AdrZIWT0.d.mts.map +1 -1
- package/dist/index-CeRv1KC0.d.mts.map +1 -1
- package/dist/index.mjs +48 -48
- package/dist/preview/index.mjs +10 -10
- package/dist/{preview-BVyG76gO.mjs → preview-1sjnhHQL.mjs} +2 -2
- package/dist/{preview-BVyG76gO.mjs.map → preview-1sjnhHQL.mjs.map} +1 -1
- package/dist/preview-engine/audio.mjs +1 -1
- package/dist/preview-engine/{chunk-VO2R3DWV.mjs → chunk-44CQSOYE.mjs} +1 -1
- package/dist/preview-engine/{chunk-FNE22WGA.mjs → chunk-6AEU4DC7.mjs} +4 -4
- package/dist/preview-engine/{chunk-PR2BUYCL.mjs → chunk-7G3XIOP7.mjs} +1 -1
- package/dist/preview-engine/{chunk-AXQZX3TC.mjs → chunk-AY7UX37L.mjs} +1 -1
- package/dist/preview-engine/{chunk-FPRXK2WD.mjs → chunk-DIGIQ5MJ.mjs} +1 -1
- package/dist/preview-engine/{chunk-K773AOF3.mjs → chunk-EVXWDOCL.mjs} +1 -1
- package/dist/preview-engine/{chunk-ZNL4W4DK.mjs → chunk-EYWPOCZW.mjs} +1 -1
- package/dist/preview-engine/{chunk-WSIURGP2.mjs → chunk-HE4R7EZM.mjs} +1 -1
- package/dist/preview-engine/{chunk-L3CHEZMZ.mjs → chunk-IR5DNNWR.mjs} +1 -1
- package/dist/preview-engine/{chunk-2MZXSWVT.mjs → chunk-JXNG2ACR.mjs} +1 -1
- package/dist/preview-engine/{chunk-O2RNIQXT.mjs → chunk-L6BH5J4P.mjs} +1 -1
- package/dist/preview-engine/{chunk-BVA5NGSH.mjs → chunk-M5HZPZHQ.mjs} +1 -1
- package/dist/preview-engine/{chunk-PFA427ZC.mjs → chunk-MLY5M7Y5.mjs} +1 -1
- package/dist/preview-engine/{chunk-ZH5MZQTZ.mjs → chunk-OG62XGCT.mjs} +1 -1
- package/dist/preview-engine/{chunk-LBRVQ4GE.mjs → chunk-PSRQA3QW.mjs} +1 -1
- package/dist/preview-engine/{chunk-3UPI4EPV.mjs → chunk-Q22PJXFJ.mjs} +1 -1
- package/dist/preview-engine/{chunk-E3HC4GRQ.mjs → chunk-T2FE5VOW.mjs} +1 -1
- package/dist/preview-engine/{chunk-Q2DPNVIA.mjs → chunk-TS3JI3BH.mjs} +1 -1
- package/dist/preview-engine/{chunk-NEE3KQTX.mjs → chunk-U4JIFQRR.mjs} +1 -1
- package/dist/preview-engine/{chunk-GCTVRM7J.mjs → chunk-U7NIY7UC.mjs} +14 -14
- package/dist/preview-engine/{chunk-BQY4BUMN.mjs → chunk-VGZZSPDN.mjs} +1 -1
- package/dist/preview-engine/{chunk-TPAEN6VV.mjs → chunk-VK2CVMWJ.mjs} +1 -1
- package/dist/preview-engine/effects.mjs +1 -1
- package/dist/preview-engine/framefields.mjs +3 -3
- package/dist/preview-engine/player.mjs +5 -5
- package/dist/preview-engine/renderers-2H7YEUTD.mjs +1 -1
- package/dist/preview-engine/renderers-2ILG23ED.mjs +1 -0
- package/dist/preview-engine/renderers-2P6KXWEZ.mjs +1 -1
- package/dist/preview-engine/{renderers-P4S7GL64.mjs → renderers-2VN3AH45.mjs} +1 -1
- package/dist/preview-engine/{renderers-LLUEOW5T.mjs → renderers-3GHEWWVX.mjs} +1 -1
- package/dist/preview-engine/renderers-3SRG77SC.mjs +1 -1
- package/dist/preview-engine/{renderers-YNFKFM7D.mjs → renderers-3YCJOINH.mjs} +1 -1
- package/dist/preview-engine/{renderers-WP67KK5K.mjs → renderers-4GRVAW2W.mjs} +1 -1
- package/dist/preview-engine/{renderers-BGGRPAVV.mjs → renderers-5FQA2DP4.mjs} +1 -1
- package/dist/preview-engine/{renderers-FGHOLJJK.mjs → renderers-5YEIUTVN.mjs} +1 -1
- package/dist/preview-engine/{renderers-JLFGBYN4.mjs → renderers-6CG7DBTB.mjs} +1 -1
- package/dist/preview-engine/{renderers-O2DZPBOJ.mjs → renderers-6OGFUSH6.mjs} +1 -1
- package/dist/preview-engine/renderers-6WH7NZCC.mjs +1 -1
- package/dist/preview-engine/renderers-7VJN5L3Z.mjs +1 -1
- package/dist/preview-engine/{renderers-7JTNJE7M.mjs → renderers-A6HM64UZ.mjs} +1 -1
- package/dist/preview-engine/renderers-B7DSGUMI.mjs +1 -0
- package/dist/preview-engine/renderers-BFNJ7VCI.mjs +1 -0
- package/dist/preview-engine/{renderers-XCMVZ2XG.mjs → renderers-BSKZXITT.mjs} +1 -1
- package/dist/preview-engine/renderers-CGYIDAVV.mjs +1 -0
- package/dist/preview-engine/{renderers-LVDUZZ75.mjs → renderers-CRRLV7IO.mjs} +1 -1
- package/dist/preview-engine/{renderers-TFZST6WW.mjs → renderers-D6T6IPER.mjs} +1 -1
- package/dist/preview-engine/renderers-DXHJAMZR.mjs +1 -1
- package/dist/preview-engine/{renderers-6ODPWZ2R.mjs → renderers-E76OKK66.mjs} +1 -1
- package/dist/preview-engine/renderers-ECA3P4ON.mjs +1 -0
- package/dist/preview-engine/{renderers-7NCG6BYS.mjs → renderers-EJWPVVQR.mjs} +1 -1
- package/dist/preview-engine/renderers-FWGMNPYB.mjs +1 -1
- package/dist/preview-engine/renderers-HUW2ZMS3.mjs +1 -1
- package/dist/preview-engine/renderers-HXFRTIJD.mjs +1 -1
- package/dist/preview-engine/{renderers-ZSENYGIY.mjs → renderers-I5E2RSV4.mjs} +1 -1
- package/dist/preview-engine/renderers-IWQ3V6AJ.mjs +1 -1
- package/dist/preview-engine/renderers-JHFT27YU.mjs +1 -0
- package/dist/preview-engine/renderers-KZWGSKRF.mjs +1 -1
- package/dist/preview-engine/{renderers-FQWWAETX.mjs → renderers-MCECHPCL.mjs} +1 -1
- package/dist/preview-engine/renderers-MON4QFRF.mjs +1 -0
- package/dist/preview-engine/{renderers-UJ4YVJZT.mjs → renderers-N7FR54V2.mjs} +1 -1
- package/dist/preview-engine/{renderers-PVYP2ONH.mjs → renderers-N7TS5562.mjs} +1 -1
- package/dist/preview-engine/renderers-NQXMYNSY.mjs +1 -0
- package/dist/preview-engine/renderers-NWHS7N2L.mjs +1 -1
- package/dist/preview-engine/renderers-ORAIXUL3.mjs +1 -0
- package/dist/preview-engine/renderers-OT7D3BUA.mjs +1 -1
- package/dist/preview-engine/{renderers-WHBDHTRI.mjs → renderers-PYWXELLG.mjs} +1 -1
- package/dist/preview-engine/renderers-Q4OFCMXI.mjs +1 -1
- package/dist/preview-engine/renderers-QVZVEYP5.mjs +1 -0
- package/dist/preview-engine/renderers-RJO6H4FC.mjs +1 -1
- package/dist/preview-engine/renderers-RKDPX5JU.mjs +1 -0
- package/dist/preview-engine/{renderers-D2EJULOJ.mjs → renderers-RLHTNLRE.mjs} +1 -1
- package/dist/preview-engine/renderers-SBFF7JP5.mjs +1 -0
- package/dist/preview-engine/renderers-TAWT3ZSS.mjs +1 -1
- package/dist/preview-engine/{renderers-HMR2NAD7.mjs → renderers-TR2V2HZ2.mjs} +1 -1
- package/dist/preview-engine/{renderers-UPKB5OLS.mjs → renderers-U6KY34TP.mjs} +1 -1
- package/dist/preview-engine/renderers-UHTO6BQA.mjs +1 -1
- package/dist/preview-engine/renderers-UNK6I4JJ.mjs +1 -0
- package/dist/preview-engine/renderers-W773SBPV.mjs +1 -0
- package/dist/preview-engine/{renderers-3F5AIDEL.mjs → renderers-WP2LBR5U.mjs} +1 -1
- package/dist/preview-engine/renderers-XHTMRXC5.mjs +1 -1
- package/dist/preview-engine/renderers-YECY2YFT.mjs +1 -1
- package/dist/preview-engine/renderers-YMN6QXK7.mjs +1 -1
- package/dist/preview-engine/{renderers-DN2GF3I7.mjs → renderers-YMPXGYRU.mjs} +1 -1
- package/dist/preview-engine/renderers-ZANPE3OK.mjs +1 -1
- package/dist/preview-engine/renderers-ZHTX73PR.mjs +1 -0
- package/dist/preview-engine/{renderers-TPBPNXWH.mjs → renderers-ZHZMGMLN.mjs} +1 -1
- package/dist/preview-engine/renderers-ZJTRANIX.mjs +1 -1
- package/dist/preview-engine/signals.mjs +1 -1
- package/dist/{program-CCSfHMfh.mjs → program-DtiNMTxO.mjs} +2 -2
- package/dist/{program-CCSfHMfh.mjs.map → program-DtiNMTxO.mjs.map} +1 -1
- package/dist/renderer/index.mjs +2 -2
- package/dist/{renderer-DCGLXnYW.mjs → renderer--Da6pAJ4.mjs} +2 -2
- package/dist/{renderer-BFRI5alp.mjs → renderer--S2cNYXS.mjs} +3 -3
- package/dist/{renderer-BFRI5alp.mjs.map → renderer--S2cNYXS.mjs.map} +1 -1
- package/dist/renderer-1hypa-l7.mjs +5 -0
- package/dist/renderer-6D8M4DRu.mjs +5 -0
- package/dist/{renderer-CWx3Kg79.mjs → renderer-6QAlE1Mp.mjs} +3 -3
- package/dist/{renderer-CWx3Kg79.mjs.map → renderer-6QAlE1Mp.mjs.map} +1 -1
- package/dist/{renderer-wL-ly4fT.mjs → renderer-8k-TR_Cy.mjs} +3 -3
- package/dist/{renderer-wL-ly4fT.mjs.map → renderer-8k-TR_Cy.mjs.map} +1 -1
- package/dist/renderer-APrj6tdP.mjs +5 -0
- package/dist/{renderer-DPWeKe_x.mjs → renderer-B3x-uogM.mjs} +3 -3
- package/dist/{renderer-DPWeKe_x.mjs.map → renderer-B3x-uogM.mjs.map} +1 -1
- package/dist/{renderer-BG5sbTXt.mjs → renderer-B48vtpou.mjs} +3 -3
- package/dist/{renderer-BG5sbTXt.mjs.map → renderer-B48vtpou.mjs.map} +1 -1
- package/dist/{renderer-Cu5k5D9N.mjs → renderer-B5Icb0XW.mjs} +2 -2
- package/dist/{renderer-Cu5k5D9N.mjs.map → renderer-B5Icb0XW.mjs.map} +1 -1
- package/dist/{renderer-DUBb7D17.mjs → renderer-B6c_Rk_2.mjs} +3 -3
- package/dist/{renderer-DUBb7D17.mjs.map → renderer-B6c_Rk_2.mjs.map} +1 -1
- package/dist/{renderer-C3lPwajT.mjs → renderer-BAmGO6Hj.mjs} +3 -3
- package/dist/{renderer-C3lPwajT.mjs.map → renderer-BAmGO6Hj.mjs.map} +1 -1
- package/dist/renderer-BF8wlbN1.mjs +5 -0
- package/dist/{renderer-pPiQwFYh.mjs → renderer-BFHgl-0f.mjs} +2 -2
- package/dist/{renderer-pPiQwFYh.mjs.map → renderer-BFHgl-0f.mjs.map} +1 -1
- package/dist/{renderer-LM_XIKl1.mjs → renderer-BI1nmIqA.mjs} +3 -3
- package/dist/{renderer-LM_XIKl1.mjs.map → renderer-BI1nmIqA.mjs.map} +1 -1
- package/dist/renderer-BOUcMCJB.mjs +5 -0
- package/dist/{renderer-DpwlN4LH.mjs → renderer-BRWpn3dT.mjs} +3 -3
- package/dist/{renderer-DpwlN4LH.mjs.map → renderer-BRWpn3dT.mjs.map} +1 -1
- package/dist/renderer-BSwn6KmG.mjs +5 -0
- package/dist/renderer-BUxvuC5A.mjs +5 -0
- package/dist/{renderer-DerDxKK3.mjs → renderer-BXCZev4l.mjs} +3 -3
- package/dist/{renderer-DerDxKK3.mjs.map → renderer-BXCZev4l.mjs.map} +1 -1
- package/dist/renderer-BYOsmJ8F.mjs +5 -0
- package/dist/{renderer-CuphUktB.mjs → renderer-BYj8x8YM.mjs} +2 -2
- package/dist/{renderer-CuphUktB.mjs.map → renderer-BYj8x8YM.mjs.map} +1 -1
- package/dist/{renderer-C8GZ0pCV.mjs → renderer-BaOC1Pd1.mjs} +3 -3
- package/dist/{renderer-C8GZ0pCV.mjs.map → renderer-BaOC1Pd1.mjs.map} +1 -1
- package/dist/{renderer-C6cF5seJ.mjs → renderer-BebePsG7.mjs} +2 -2
- package/dist/{renderer-C6cF5seJ.mjs.map → renderer-BebePsG7.mjs.map} +1 -1
- package/dist/{renderer-Bzl0s07U.mjs → renderer-Bf4BdBtb.mjs} +2 -2
- package/dist/{renderer-Bzl0s07U.mjs.map → renderer-Bf4BdBtb.mjs.map} +1 -1
- package/dist/{renderer-CLdwOhST.mjs → renderer-BkXqFmNO.mjs} +2 -2
- package/dist/{renderer-CLdwOhST.mjs.map → renderer-BkXqFmNO.mjs.map} +1 -1
- package/dist/{renderer-O1b-oYJE.mjs → renderer-BlafvK-L.mjs} +2 -2
- package/dist/{renderer-D1wd0FhZ.mjs → renderer-BmWH4dK1.mjs} +5 -5
- package/dist/{renderer-D1wd0FhZ.mjs.map → renderer-BmWH4dK1.mjs.map} +1 -1
- package/dist/renderer-Bp7LqSTt.mjs +5 -0
- package/dist/{renderer-BonWt8jF.mjs → renderer-Bq9jXYJ5.mjs} +3 -3
- package/dist/{renderer-BonWt8jF.mjs.map → renderer-Bq9jXYJ5.mjs.map} +1 -1
- package/dist/{renderer-AtLlZMQ9.mjs → renderer-BqSiWRoD.mjs} +2 -2
- package/dist/{renderer-AtLlZMQ9.mjs.map → renderer-BqSiWRoD.mjs.map} +1 -1
- package/dist/{renderer-kSs8VtY7.mjs → renderer-ButaUWLr.mjs} +3 -3
- package/dist/{renderer-kSs8VtY7.mjs.map → renderer-ButaUWLr.mjs.map} +1 -1
- package/dist/{renderer-4VpA7LfU.mjs → renderer-C2Ff-9u_.mjs} +2 -2
- package/dist/{renderer-4VpA7LfU.mjs.map → renderer-C2Ff-9u_.mjs.map} +1 -1
- package/dist/{renderer-BvBIHi6N.mjs → renderer-C4puWDLK.mjs} +2 -2
- package/dist/{renderer-BvBIHi6N.mjs.map → renderer-C4puWDLK.mjs.map} +1 -1
- package/dist/{renderer-BvvuGfZk.mjs → renderer-CBG6ewNf.mjs} +3 -3
- package/dist/{renderer-BvvuGfZk.mjs.map → renderer-CBG6ewNf.mjs.map} +1 -1
- package/dist/renderer-CD0amH_Q.mjs +5 -0
- package/dist/renderer-CIJGjrt7.mjs +5 -0
- package/dist/{renderer-DCYabwlC.mjs → renderer-CJwgsecF.mjs} +2 -2
- package/dist/{renderer-DCYabwlC.mjs.map → renderer-CJwgsecF.mjs.map} +1 -1
- package/dist/{renderer-DukD7S3w.mjs → renderer-CMzd3BrW.mjs} +2 -2
- package/dist/{renderer-DukD7S3w.mjs.map → renderer-CMzd3BrW.mjs.map} +1 -1
- package/dist/renderer-CNFTl94b.mjs +5 -0
- package/dist/{renderer-B93zd3sx.mjs → renderer-CPNLkir4.mjs} +2 -2
- package/dist/{renderer-B93zd3sx.mjs.map → renderer-CPNLkir4.mjs.map} +1 -1
- package/dist/{renderer-CMdtUn5o.mjs → renderer-CRYO5HQw.mjs} +2 -2
- package/dist/{renderer-CMdtUn5o.mjs.map → renderer-CRYO5HQw.mjs.map} +1 -1
- package/dist/renderer-CTJ0gHPS.mjs +5 -0
- package/dist/{renderer-D7ss6fLB.mjs → renderer-CbNW0KHh.mjs} +3 -3
- package/dist/{renderer-D7ss6fLB.mjs.map → renderer-CbNW0KHh.mjs.map} +1 -1
- package/dist/renderer-Cc3INn7w.mjs +5 -0
- package/dist/{renderer-DpWRj6zF.mjs → renderer-CczmOPAO.mjs} +3 -3
- package/dist/{renderer-DpWRj6zF.mjs.map → renderer-CczmOPAO.mjs.map} +1 -1
- package/dist/renderer-CeHh2lKY.mjs +5 -0
- package/dist/renderer-CfjwkQP4.mjs +5 -0
- package/dist/{renderer-DdlaBsk_.mjs → renderer-CgEMtLOL.mjs} +2 -2
- package/dist/{renderer-DdlaBsk_.mjs.map → renderer-CgEMtLOL.mjs.map} +1 -1
- package/dist/{renderer-CFe9pZFN.mjs → renderer-Ch1rv1XP.mjs} +2 -2
- package/dist/{renderer-CFe9pZFN.mjs.map → renderer-Ch1rv1XP.mjs.map} +1 -1
- package/dist/renderer-CiuOB-Md.mjs +5 -0
- package/dist/{renderer-YdLL2o6d.mjs → renderer-ClK7_Yzz.mjs} +2 -2
- package/dist/{renderer-YdLL2o6d.mjs.map → renderer-ClK7_Yzz.mjs.map} +1 -1
- package/dist/renderer-Cor66Y2X.mjs +5 -0
- package/dist/renderer-CtIM0LWe.mjs +5 -0
- package/dist/renderer-CyqgTsnx.mjs +5 -0
- package/dist/{renderer-BVUTOGHs.mjs → renderer-Cz11KJmQ.mjs} +2 -2
- package/dist/{renderer-BVUTOGHs.mjs.map → renderer-Cz11KJmQ.mjs.map} +1 -1
- package/dist/{renderer-c-bwxMde.mjs → renderer-D-eTVnDS.mjs} +2 -2
- package/dist/{renderer-c-bwxMde.mjs.map → renderer-D-eTVnDS.mjs.map} +1 -1
- package/dist/renderer-D2QG9yIW.mjs +5 -0
- package/dist/renderer-D2woU27o.mjs +6 -0
- package/dist/{renderer-PknbdJyL.mjs → renderer-D8tdGi2P.mjs} +3 -3
- package/dist/{renderer-PknbdJyL.mjs.map → renderer-D8tdGi2P.mjs.map} +1 -1
- package/dist/{renderer-DfkWYUTX.mjs → renderer-D90PpIKG.mjs} +2 -2
- package/dist/renderer-DAhDiQQY.mjs +5 -0
- package/dist/{renderer-DcAfp1Er.mjs → renderer-DDBmBmQN.mjs} +2 -2
- package/dist/{renderer-DcAfp1Er.mjs.map → renderer-DDBmBmQN.mjs.map} +1 -1
- package/dist/renderer-DIjxOQFi.mjs +5 -0
- package/dist/{renderer-ChloaI6P.mjs → renderer-DJWQWN1E.mjs} +3 -3
- package/dist/{renderer-ChloaI6P.mjs.map → renderer-DJWQWN1E.mjs.map} +1 -1
- package/dist/{renderer-D26S5hUh.mjs → renderer-DL4oR40b.mjs} +2 -2
- package/dist/{renderer-D26S5hUh.mjs.map → renderer-DL4oR40b.mjs.map} +1 -1
- package/dist/{renderer-D1Jt-c3F.mjs → renderer-DNhOjz6C.mjs} +2 -2
- package/dist/{renderer-D1Jt-c3F.mjs.map → renderer-DNhOjz6C.mjs.map} +1 -1
- package/dist/renderer-DRzalGhU.mjs +5 -0
- package/dist/{renderer-CqewgazK.mjs → renderer-DS64UaYK.mjs} +3 -3
- package/dist/{renderer-CqewgazK.mjs.map → renderer-DS64UaYK.mjs.map} +1 -1
- package/dist/renderer-DY6S1jWp.mjs +5 -0
- package/dist/{renderer-BI4OMlEx.mjs → renderer-DYo_a5-8.mjs} +2 -2
- package/dist/{renderer-BI4OMlEx.mjs.map → renderer-DYo_a5-8.mjs.map} +1 -1
- package/dist/{renderer-BD7Lmb8h.mjs → renderer-DacnnTjY.mjs} +3 -3
- package/dist/{renderer-BD7Lmb8h.mjs.map → renderer-DacnnTjY.mjs.map} +1 -1
- package/dist/renderer-DeW0KNQV.mjs +5 -0
- package/dist/{renderer-YJ3Yukou.mjs → renderer-DjPC9l3w.mjs} +3 -3
- package/dist/{renderer-YJ3Yukou.mjs.map → renderer-DjPC9l3w.mjs.map} +1 -1
- package/dist/{renderer-BmDpyiII.mjs → renderer-DjwF10p2.mjs} +3 -3
- package/dist/{renderer-BmDpyiII.mjs.map → renderer-DjwF10p2.mjs.map} +1 -1
- package/dist/{renderer-Celrh689.mjs → renderer-DmOewVsB.mjs} +3 -3
- package/dist/{renderer-Celrh689.mjs.map → renderer-DmOewVsB.mjs.map} +1 -1
- package/dist/{renderer-HMl2V4iM.mjs → renderer-DqlvbOUt.mjs} +3 -3
- package/dist/{renderer-HMl2V4iM.mjs.map → renderer-DqlvbOUt.mjs.map} +1 -1
- package/dist/renderer-DsVSVFkl.mjs +5 -0
- package/dist/{renderer-Bel1UHA5.mjs → renderer-DvoPplvC.mjs} +2 -2
- package/dist/{renderer-g-ui08Lh.mjs → renderer-Dw1e5phO.mjs} +3 -3
- package/dist/{renderer-g-ui08Lh.mjs.map → renderer-Dw1e5phO.mjs.map} +1 -1
- package/dist/renderer-DxvcIgEU.mjs +5 -0
- package/dist/renderer-F0MKqmol.mjs +5 -0
- package/dist/{renderer-C39GD6jP.mjs → renderer-F410V727.mjs} +3 -3
- package/dist/{renderer-C39GD6jP.mjs.map → renderer-F410V727.mjs.map} +1 -1
- package/dist/{renderer-dUkOBfGB.mjs → renderer-Fm2brScz.mjs} +3 -3
- package/dist/{renderer-dUkOBfGB.mjs.map → renderer-Fm2brScz.mjs.map} +1 -1
- package/dist/{renderer-BpEsZG3t.mjs → renderer-GlyeFl5R.mjs} +3 -3
- package/dist/{renderer-BpEsZG3t.mjs.map → renderer-GlyeFl5R.mjs.map} +1 -1
- package/dist/{renderer-Dk-THZHp.mjs → renderer-ITtBRR4o.mjs} +3 -3
- package/dist/{renderer-Dk-THZHp.mjs.map → renderer-ITtBRR4o.mjs.map} +1 -1
- package/dist/{renderer-DaCsT-XU.mjs → renderer-Kj9AhRCc.mjs} +3 -3
- package/dist/{renderer-DaCsT-XU.mjs.map → renderer-Kj9AhRCc.mjs.map} +1 -1
- package/dist/{renderer-CNYfB5cC.mjs → renderer-MS70wrQB.mjs} +2 -2
- package/dist/{renderer-CNYfB5cC.mjs.map → renderer-MS70wrQB.mjs.map} +1 -1
- package/dist/{renderer-Cn6VlWHZ.mjs → renderer-Mdyv_W8K.mjs} +3 -3
- package/dist/{renderer-Cn6VlWHZ.mjs.map → renderer-Mdyv_W8K.mjs.map} +1 -1
- package/dist/renderer-OkbovcAc.mjs +5 -0
- package/dist/{renderer-Dq4aO7az.mjs → renderer-QMGrRiab.mjs} +2 -2
- package/dist/{renderer-Dq4aO7az.mjs.map → renderer-QMGrRiab.mjs.map} +1 -1
- package/dist/renderer-QyBeWMEL.mjs +5 -0
- package/dist/{renderer-DMZ5aLU1.mjs → renderer-R0sJId_6.mjs} +2 -2
- package/dist/{renderer-DMZ5aLU1.mjs.map → renderer-R0sJId_6.mjs.map} +1 -1
- package/dist/{renderer-CdOy3EBJ.mjs → renderer-Rg1BFv8B.mjs} +2 -2
- package/dist/{renderer-CdOy3EBJ.mjs.map → renderer-Rg1BFv8B.mjs.map} +1 -1
- package/dist/{renderer-CiMpdh0s.mjs → renderer-S6ez0leJ.mjs} +2 -2
- package/dist/{renderer-CiMpdh0s.mjs.map → renderer-S6ez0leJ.mjs.map} +1 -1
- package/dist/{renderer-Dh-OF6aH.mjs → renderer-YtRSM2cv.mjs} +2 -2
- package/dist/{renderer-Dh-OF6aH.mjs.map → renderer-YtRSM2cv.mjs.map} +1 -1
- package/dist/{renderer-1uLtqb74.mjs → renderer-_-MCpvGq.mjs} +91 -73
- package/dist/renderer-_-MCpvGq.mjs.map +1 -0
- package/dist/{renderer-DOWekunR.mjs → renderer-_Fh9IBlE.mjs} +3 -3
- package/dist/{renderer-DOWekunR.mjs.map → renderer-_Fh9IBlE.mjs.map} +1 -1
- package/dist/{renderer-FXUCKps6.mjs → renderer-dJcu7WqI.mjs} +3 -3
- package/dist/{renderer-FXUCKps6.mjs.map → renderer-dJcu7WqI.mjs.map} +1 -1
- package/dist/renderer-hSh5IrDp.mjs +5 -0
- package/dist/{renderer-BetA_iVd.mjs → renderer-ktpusVT2.mjs} +3 -3
- package/dist/{renderer-BetA_iVd.mjs.map → renderer-ktpusVT2.mjs.map} +1 -1
- package/dist/renderer-puLncHft.mjs +5 -0
- package/dist/{renderer-8BM6sJUR.mjs → renderer-w8LKBg_5.mjs} +2 -2
- package/dist/{renderer-8BM6sJUR.mjs.map → renderer-w8LKBg_5.mjs.map} +1 -1
- package/dist/renderer-wnFCaw7j.mjs +5 -0
- package/dist/renderer-xjtlyGS1.mjs +5 -0
- package/dist/{renderer-BRwp1kV-.mjs → renderer-z3YOOR3k.mjs} +3 -3
- package/dist/{renderer-BRwp1kV-.mjs.map → renderer-z3YOOR3k.mjs.map} +1 -1
- package/dist/{renderers-CP8CFWDs-CVHwMTiz.mjs → renderers-CP8CFWDs-DXiR_PLR.mjs} +2 -2
- package/dist/{renderers-CP8CFWDs-CVHwMTiz.mjs.map → renderers-CP8CFWDs-DXiR_PLR.mjs.map} +1 -1
- package/dist/signals/index.mjs +4 -4
- package/package.json +56 -56
- package/dist/dist-jU289ehm.mjs.map +0 -1
- package/dist/preview-engine/chunk-OCX5AD23.mjs +0 -1
- package/dist/preview-engine/renderers-3T7Q4SPP.mjs +0 -1
- package/dist/preview-engine/renderers-4DV4REGM.mjs +0 -1
- package/dist/preview-engine/renderers-CQXQHOW2.mjs +0 -1
- package/dist/preview-engine/renderers-IXGM55XK.mjs +0 -1
- package/dist/preview-engine/renderers-KVHUVWSN.mjs +0 -1
- package/dist/preview-engine/renderers-M7R2ZJUP.mjs +0 -1
- package/dist/preview-engine/renderers-PMOO7DLX.mjs +0 -1
- package/dist/preview-engine/renderers-QCCPCH73.mjs +0 -1
- package/dist/preview-engine/renderers-RRXFJRGI.mjs +0 -1
- package/dist/preview-engine/renderers-VLMQR3DW.mjs +0 -1
- package/dist/preview-engine/renderers-WVTTRCVI.mjs +0 -1
- package/dist/preview-engine/renderers-X5PUIPU5.mjs +0 -1
- package/dist/preview-engine/renderers-YDCDY3BR.mjs +0 -1
- package/dist/preview-engine/renderers-YJNQ4B7B.mjs +0 -1
- package/dist/preview-engine/renderers-Z7YQUFAY.mjs +0 -1
- package/dist/preview-engine/skia-canvas-QBXAOGPB.mjs +0 -1
- package/dist/renderer-1Kv7oA86.mjs +0 -5
- package/dist/renderer-1uLtqb74.mjs.map +0 -1
- package/dist/renderer-AVHJ33nv.mjs +0 -5
- package/dist/renderer-B8dJGf8R.mjs +0 -6
- package/dist/renderer-BEA6nknY.mjs +0 -5
- package/dist/renderer-BOfi06L2.mjs +0 -5
- package/dist/renderer-BOhvtAGL.mjs +0 -5
- package/dist/renderer-BQT3GI9g.mjs +0 -5
- package/dist/renderer-BXmStgeT.mjs +0 -5
- package/dist/renderer-Bajxo7Nt.mjs +0 -5
- package/dist/renderer-BzRR0KMm.mjs +0 -5
- package/dist/renderer-C3Gjy2iE.mjs +0 -5
- package/dist/renderer-C5hQgkz-.mjs +0 -5
- package/dist/renderer-CLF-MiOA.mjs +0 -5
- package/dist/renderer-CLa43fCd.mjs +0 -5
- package/dist/renderer-CMK1d6w_.mjs +0 -5
- package/dist/renderer-CPEQOe3u.mjs +0 -5
- package/dist/renderer-CemfjOM9.mjs +0 -5
- package/dist/renderer-CkcrScs9.mjs +0 -5
- package/dist/renderer-CwrLihY6.mjs +0 -5
- package/dist/renderer-D4S6i2MC.mjs +0 -5
- package/dist/renderer-DB8F0XoP.mjs +0 -5
- package/dist/renderer-DGpVLJOn.mjs +0 -5
- package/dist/renderer-DGxibeSa.mjs +0 -5
- package/dist/renderer-DJQm3bAW.mjs +0 -5
- package/dist/renderer-DMftVSfX.mjs +0 -5
- package/dist/renderer-DNpovOd8.mjs +0 -5
- package/dist/renderer-DSHlvKQk.mjs +0 -5
- package/dist/renderer-DYtrdR2p.mjs +0 -5
- package/dist/renderer-DuSImLUz.mjs +0 -5
- package/dist/renderer-FbyMYKXe.mjs +0 -5
- package/dist/renderer-NMFv7Auz.mjs +0 -5
- package/dist/renderer-P3vpdUnb.mjs +0 -5
- package/dist/renderer-QTOm26Lg.mjs +0 -5
- package/dist/renderer-ahzhMa5q.mjs +0 -5
- package/dist/renderer-dThfTNge.mjs +0 -5
- package/dist/renderer-dgAS_k7B.mjs +0 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-C3lPwajT.mjs","names":[],"sources":["../../../nodes/node-halftone-screen/dist/renderers-CvluQiq3.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { parseColor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_HALFTONE_SHADER = `\nstruct HalftoneUniforms {\n mode : f32, // 0 = Monochrome, 1 = CMYK\n dotShape : f32, // 0 = Circle, 1 = Diamond, 2 = Line, 3 = Square\n frequency : f32,\n angle : f32,\n\n contrast : f32,\n invert : f32,\n isSmooth : f32,\n opacity : f32,\n\n dotColor : vec4<f32>,\n paperColor : vec4<f32>,\n\n cyanAngle : f32,\n magentaAngle : f32,\n yellowAngle : f32,\n blackAngle : f32,\n\n hasFreqSig : f32,\n hasAngleSig : f32,\n hasContrastSig : f32,\n hasCyanSig : f32,\n\n hasMagSig : f32,\n hasYelSig : f32,\n hasBlkSig : f32,\n hasOpacitySig : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : HalftoneUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\n@group(2) @binding(0) var freqSigTex : texture_2d<f32>;\n@group(2) @binding(1) var angleSigTex : texture_2d<f32>;\n@group(2) @binding(2) var contrastSigTex : texture_2d<f32>;\n@group(2) @binding(3) var cyanSigTex : texture_2d<f32>;\n@group(2) @binding(4) var magSigTex : texture_2d<f32>;\n@group(2) @binding(5) var yelSigTex : texture_2d<f32>;\n@group(2) @binding(6) var blkSigTex : texture_2d<f32>;\n@group(2) @binding(7) var opacitySigTex : texture_2d<f32>;\n@group(2) @binding(8) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nconst PI: f32 = 3.141592653589793;\n\nfn getCellCenterUV(\n uv: vec2<f32>,\n dimensions: vec2<f32>,\n screenAngleDeg: f32,\n freq: f32\n) -> vec2<f32> {\n let rad = screenAngleDeg * PI / 180.0;\n let cosA = cos(rad);\n let sinA = sin(rad);\n let rot = mat2x2<f32>(cosA, -sinA, sinA, cosA);\n let invRot = mat2x2<f32>(cosA, sinA, -sinA, cosA);\n\n let minDim = min(dimensions.x, dimensions.y);\n let cellSize = max(minDim / max(freq, 1.0), 1.0);\n\n let center = dimensions * 0.5;\n let pixelPos = (uv * dimensions) - center;\n let rotPos = rot * pixelPos;\n\n let cellIndex = floor(rotPos / cellSize) + vec2<f32>(0.5);\n let cellCenterRot = cellIndex * cellSize;\n let cellCenterPixelPos = invRot * cellCenterRot;\n let cellCenterUV = (cellCenterPixelPos + center) / dimensions;\n return clamp(cellCenterUV, vec2<f32>(0.0), vec2<f32>(1.0));\n}\n\nfn evalDotCoverage(\n uv: vec2<f32>,\n dimensions: vec2<f32>,\n screenAngleDeg: f32,\n freq: f32,\n shape: f32,\n density: f32,\n contrastMultiplier: f32,\n isSmooth: f32\n) -> f32 {\n var d = clamp((density - 0.5) * contrastMultiplier + 0.5, 0.0, 1.0);\n if (d <= 0.0001) { return 0.0; }\n if (d >= 0.9999) { return 1.0; }\n\n let rad = screenAngleDeg * PI / 180.0;\n let cosA = cos(rad);\n let sinA = sin(rad);\n let rot = mat2x2<f32>(cosA, -sinA, sinA, cosA);\n\n let minDim = min(dimensions.x, dimensions.y);\n let cellSize = max(minDim / max(freq, 1.0), 1.0);\n\n let center = dimensions * 0.5;\n let pixelPos = (uv * dimensions) - center;\n let rotPos = rot * pixelPos;\n\n let cellUV = fract(rotPos / cellSize) - vec2<f32>(0.5);\n\n var spot: f32 = 0.0;\n\n if (shape < 0.5) {\n // 0: Euclidean Round Dot\n spot = 0.5 * (1.0 - (cos(cellUV.x * 2.0 * PI) + cos(cellUV.y * 2.0 * PI)) * 0.5);\n } else if (shape < 1.5) {\n // 1: Diamond\n spot = abs(cellUV.x) + abs(cellUV.y);\n } else if (shape < 2.5) {\n // 2: Line\n spot = abs(cellUV.y) * 2.0;\n } else {\n // 3: Square\n spot = max(abs(cellUV.x), abs(cellUV.y)) * 2.0;\n }\n\n let edgeWidth = select(0.001, max(1.5 / cellSize, 0.003), isSmooth > 0.5);\n\n return select(\n step(spot, d),\n smoothstep(d + edgeWidth, d - edgeWidth, spot),\n isSmooth > 0.5\n );\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n let sourceCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n if (sourceCol.a < 1e-5) {\n return sourceCol;\n }\n\n // Resolve parameter overrides or dynamic signals\n var frequency = u.frequency;\n if (u.hasFreqSig > 0.5) {\n frequency = textureSampleLevel(freqSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var baseAngle = u.angle;\n if (u.hasAngleSig > 0.5) {\n baseAngle = textureSampleLevel(angleSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var contrast = u.contrast;\n if (u.hasContrastSig > 0.5) {\n contrast = textureSampleLevel(contrastSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var cyanAngle = u.cyanAngle;\n if (u.hasCyanSig > 0.5) {\n cyanAngle = textureSampleLevel(cyanSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var magentaAngle = u.magentaAngle;\n if (u.hasMagSig > 0.5) {\n magentaAngle = textureSampleLevel(magSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var yellowAngle = u.yellowAngle;\n if (u.hasYelSig > 0.5) {\n yellowAngle = textureSampleLevel(yelSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var blackAngle = u.blackAngle;\n if (u.hasBlkSig > 0.5) {\n blackAngle = textureSampleLevel(blkSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var effectOpacity = u.opacity;\n if (u.hasOpacitySig > 0.5) {\n effectOpacity = textureSampleLevel(opacitySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n let dimensions = vec2<f32>(textureDimensions(tex));\n let unpremult = sourceCol.rgb / sourceCol.a;\n\n var screenedRgb: vec3<f32>;\n\n if (u.mode < 0.5) {\n // --- Monochrome Mode ---\n let cellCenterUV = getCellCenterUV(in.uv, dimensions, baseAngle, frequency);\n let cellCol = textureSampleLevel(tex, samp, cellCenterUV, 0.0);\n let cellRgb = select(cellCol.rgb, cellCol.rgb / cellCol.a, cellCol.a > 1e-5);\n let luminance = dot(cellRgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n var inkDensity = 1.0 - luminance;\n if (u.invert > 0.5) {\n inkDensity = luminance;\n }\n\n let coverage = evalDotCoverage(\n in.uv,\n dimensions,\n baseAngle,\n frequency,\n u.dotShape,\n inkDensity,\n contrast,\n u.isSmooth\n );\n\n screenedRgb = mix(u.paperColor.rgb, u.dotColor.rgb, coverage);\n } else {\n // --- CMYK Mode ---\n let cellCenterUVC = getCellCenterUV(in.uv, dimensions, baseAngle + cyanAngle, frequency);\n let colC = textureSampleLevel(tex, samp, cellCenterUVC, 0.0);\n let rgbC = select(colC.rgb, colC.rgb / colC.a, colC.a > 1e-5);\n let kC = 1.0 - max(max(rgbC.r, rgbC.g), rgbC.b);\n let invKC = 1.0 - kC;\n var densC = select(0.0, clamp((1.0 - rgbC.r - kC) / max(invKC, 0.0001), 0.0, 1.0), invKC > 0.0001);\n\n let cellCenterUVM = getCellCenterUV(in.uv, dimensions, baseAngle + magentaAngle, frequency);\n let colM = textureSampleLevel(tex, samp, cellCenterUVM, 0.0);\n let rgbM = select(colM.rgb, colM.rgb / colM.a, colM.a > 1e-5);\n let kM = 1.0 - max(max(rgbM.r, rgbM.g), rgbM.b);\n let invKM = 1.0 - kM;\n var densM = select(0.0, clamp((1.0 - rgbM.g - kM) / max(invKM, 0.0001), 0.0, 1.0), invKM > 0.0001);\n\n let cellCenterUVY = getCellCenterUV(in.uv, dimensions, baseAngle + yellowAngle, frequency);\n let colY = textureSampleLevel(tex, samp, cellCenterUVY, 0.0);\n let rgbY = select(colY.rgb, colY.rgb / colY.a, colY.a > 1e-5);\n let kY = 1.0 - max(max(rgbY.r, rgbY.g), rgbY.b);\n let invKY = 1.0 - kY;\n var densY = select(0.0, clamp((1.0 - rgbY.b - kY) / max(invKY, 0.0001), 0.0, 1.0), invKY > 0.0001);\n\n let cellCenterUVK = getCellCenterUV(in.uv, dimensions, baseAngle + blackAngle, frequency);\n let colK = textureSampleLevel(tex, samp, cellCenterUVK, 0.0);\n let rgbK = select(colK.rgb, colK.rgb / colK.a, colK.a > 1e-5);\n var densK = 1.0 - max(max(rgbK.r, rgbK.g), rgbK.b);\n\n if (u.invert > 0.5) {\n densC = 1.0 - densC;\n densM = 1.0 - densM;\n densY = 1.0 - densY;\n densK = 1.0 - densK;\n }\n\n let covC = evalDotCoverage(in.uv, dimensions, baseAngle + cyanAngle, frequency, u.dotShape, densC, contrast, u.isSmooth);\n let covM = evalDotCoverage(in.uv, dimensions, baseAngle + magentaAngle, frequency, u.dotShape, densM, contrast, u.isSmooth);\n let covY = evalDotCoverage(in.uv, dimensions, baseAngle + yellowAngle, frequency, u.dotShape, densY, contrast, u.isSmooth);\n let covK = evalDotCoverage(in.uv, dimensions, baseAngle + blackAngle, frequency, u.dotShape, densK, contrast, u.isSmooth);\n\n // Subtractive synthesis onto paper substrate\n let outR = u.paperColor.r * (1.0 - covC) * (1.0 - covK);\n let outG = u.paperColor.g * (1.0 - covM) * (1.0 - covK);\n let outB = u.paperColor.b * (1.0 - covY) * (1.0 - covK);\n\n screenedRgb = clamp(vec3<f32>(outR, outG, outB), vec3<f32>(0.0), vec3<f32>(1.0));\n }\n\n // Apply effect opacity blend\n let finalRgb = mix(unpremult, screenedRgb, clamp(effectOpacity, 0.0, 1.0));\n return vec4<f32>(finalRgb * sourceCol.a, sourceCol.a);\n}\n`;\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 8),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getHalftoneResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `halftone_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst halftoneModule = device.createShaderModule({\n\t\t\tlabel: `halftone_${format}.wgsl`,\n\t\t\tcode: WGSL_HALFTONE_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `HalftonePipeline_${format}`,\n\t\t\tmodule: halftoneModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\thalftonePipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst HalftoneScreenWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = 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 !== \"HalftoneScreen\" || !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 nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"halftone_node\";\n\tconst resolveBindable = (configKey, defaultValue, minVal, maxVal) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && input.outputItem?.type === \"Signal\");\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = defaultValue;\n\t\tlet hasStaticSig = false;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") val = Math.max(minVal, Math.min(maxVal, Number(input.outputItem.data ?? defaultValue)));\n\t\telse {\n\t\t\tconst rawVal = unwrapFrameParam(op[configKey], compositionFrame, fps).value;\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(rawVal ?? defaultValue)));\n\t\t}\n\t\telse if (sd) {\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(sd.offset ?? 0)));\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd\n\t\t};\n\t};\n\tconst freqRes = resolveBindable(\"frequency\", 30, 1, 200);\n\tconst angleRes = resolveBindable(\"angle\", 45, 0, 360);\n\tconst contrastRes = resolveBindable(\"contrast\", 1, .1, 5);\n\tconst cyanRes = resolveBindable(\"cyanAngle\", 15, 0, 360);\n\tconst magRes = resolveBindable(\"magentaAngle\", 75, 0, 360);\n\tconst yelRes = resolveBindable(\"yellowAngle\", 0, 0, 360);\n\tconst blkRes = resolveBindable(\"blackAngle\", 45, 0, 360);\n\tconst opacityRes = resolveBindable(\"opacity\", 1, 0, 1);\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { halftonePipeline: pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getHalftoneResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst signalContext = {\n\t\targs,\n\t\twidth,\n\t\theight,\n\t\tframe,\n\t\tfps,\n\t\telapsedSeconds,\n\t\tdurationSeconds\n\t};\n\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\tconst freqView = getSignalView(freqRes, \"freq_sig\");\n\tconst angleView = getSignalView(angleRes, \"angle_sig\");\n\tconst contrastView = getSignalView(contrastRes, \"contrast_sig\");\n\tconst cyanView = getSignalView(cyanRes, \"cyan_sig\");\n\tconst magView = getSignalView(magRes, \"mag_sig\");\n\tconst yelView = getSignalView(yelRes, \"yel_sig\");\n\tconst blkView = getSignalView(blkRes, \"blk_sig\");\n\tconst opacityView = getSignalView(opacityRes, \"opacity_sig\");\n\tconst modeVal = op.mode === \"CMYK\" ? 1 : 0;\n\tlet dotShapeVal = 0;\n\tif (op.dotShape === \"Diamond\") dotShapeVal = 1;\n\telse if (op.dotShape === \"Line\") dotShapeVal = 2;\n\telse if (op.dotShape === \"Square\") dotShapeVal = 3;\n\tconst dotCol = parseColor(op.dotColor ?? \"#000000\");\n\tconst paperCol = parseColor(op.paperColor ?? \"#ffffff\");\n\tconst halftoneUniformData = new Float32Array(28);\n\thalftoneUniformData[0] = modeVal;\n\thalftoneUniformData[1] = dotShapeVal;\n\thalftoneUniformData[2] = freqRes.val;\n\thalftoneUniformData[3] = angleRes.val;\n\thalftoneUniformData[4] = contrastRes.val;\n\thalftoneUniformData[5] = op.invert ? 1 : 0;\n\thalftoneUniformData[6] = op.smooth !== false ? 1 : 0;\n\thalftoneUniformData[7] = opacityRes.val;\n\thalftoneUniformData[8] = dotCol.r;\n\thalftoneUniformData[9] = dotCol.g;\n\thalftoneUniformData[10] = dotCol.b;\n\thalftoneUniformData[11] = dotCol.a;\n\thalftoneUniformData[12] = paperCol.r;\n\thalftoneUniformData[13] = paperCol.g;\n\thalftoneUniformData[14] = paperCol.b;\n\thalftoneUniformData[15] = paperCol.a;\n\thalftoneUniformData[16] = cyanRes.val;\n\thalftoneUniformData[17] = magRes.val;\n\thalftoneUniformData[18] = yelRes.val;\n\thalftoneUniformData[19] = blkRes.val;\n\thalftoneUniformData[20] = freqRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[21] = angleRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[22] = contrastRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[23] = cyanRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[24] = magRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[25] = yelRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[26] = blkRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[27] = opacityRes.hasStaticSig ? 1 : 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(halftoneUniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uniformBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: freqView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: angleView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: contrastView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: cyanView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: magView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: yelView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\n\t\t\t\t\tresource: blkView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 7,\n\t\t\t\t\tresource: opacityView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 8,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: HalftoneScreenWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-CvluQiq3.mjs.map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderer-BAmGO6Hj.mjs","names":[],"sources":["../../../nodes/node-halftone-screen/dist/renderers-CvluQiq3.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { parseColor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_HALFTONE_SHADER = `\nstruct HalftoneUniforms {\n mode : f32, // 0 = Monochrome, 1 = CMYK\n dotShape : f32, // 0 = Circle, 1 = Diamond, 2 = Line, 3 = Square\n frequency : f32,\n angle : f32,\n\n contrast : f32,\n invert : f32,\n isSmooth : f32,\n opacity : f32,\n\n dotColor : vec4<f32>,\n paperColor : vec4<f32>,\n\n cyanAngle : f32,\n magentaAngle : f32,\n yellowAngle : f32,\n blackAngle : f32,\n\n hasFreqSig : f32,\n hasAngleSig : f32,\n hasContrastSig : f32,\n hasCyanSig : f32,\n\n hasMagSig : f32,\n hasYelSig : f32,\n hasBlkSig : f32,\n hasOpacitySig : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : HalftoneUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\n@group(2) @binding(0) var freqSigTex : texture_2d<f32>;\n@group(2) @binding(1) var angleSigTex : texture_2d<f32>;\n@group(2) @binding(2) var contrastSigTex : texture_2d<f32>;\n@group(2) @binding(3) var cyanSigTex : texture_2d<f32>;\n@group(2) @binding(4) var magSigTex : texture_2d<f32>;\n@group(2) @binding(5) var yelSigTex : texture_2d<f32>;\n@group(2) @binding(6) var blkSigTex : texture_2d<f32>;\n@group(2) @binding(7) var opacitySigTex : texture_2d<f32>;\n@group(2) @binding(8) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nconst PI: f32 = 3.141592653589793;\n\nfn getCellCenterUV(\n uv: vec2<f32>,\n dimensions: vec2<f32>,\n screenAngleDeg: f32,\n freq: f32\n) -> vec2<f32> {\n let rad = screenAngleDeg * PI / 180.0;\n let cosA = cos(rad);\n let sinA = sin(rad);\n let rot = mat2x2<f32>(cosA, -sinA, sinA, cosA);\n let invRot = mat2x2<f32>(cosA, sinA, -sinA, cosA);\n\n let minDim = min(dimensions.x, dimensions.y);\n let cellSize = max(minDim / max(freq, 1.0), 1.0);\n\n let center = dimensions * 0.5;\n let pixelPos = (uv * dimensions) - center;\n let rotPos = rot * pixelPos;\n\n let cellIndex = floor(rotPos / cellSize) + vec2<f32>(0.5);\n let cellCenterRot = cellIndex * cellSize;\n let cellCenterPixelPos = invRot * cellCenterRot;\n let cellCenterUV = (cellCenterPixelPos + center) / dimensions;\n return clamp(cellCenterUV, vec2<f32>(0.0), vec2<f32>(1.0));\n}\n\nfn evalDotCoverage(\n uv: vec2<f32>,\n dimensions: vec2<f32>,\n screenAngleDeg: f32,\n freq: f32,\n shape: f32,\n density: f32,\n contrastMultiplier: f32,\n isSmooth: f32\n) -> f32 {\n var d = clamp((density - 0.5) * contrastMultiplier + 0.5, 0.0, 1.0);\n if (d <= 0.0001) { return 0.0; }\n if (d >= 0.9999) { return 1.0; }\n\n let rad = screenAngleDeg * PI / 180.0;\n let cosA = cos(rad);\n let sinA = sin(rad);\n let rot = mat2x2<f32>(cosA, -sinA, sinA, cosA);\n\n let minDim = min(dimensions.x, dimensions.y);\n let cellSize = max(minDim / max(freq, 1.0), 1.0);\n\n let center = dimensions * 0.5;\n let pixelPos = (uv * dimensions) - center;\n let rotPos = rot * pixelPos;\n\n let cellUV = fract(rotPos / cellSize) - vec2<f32>(0.5);\n\n var spot: f32 = 0.0;\n\n if (shape < 0.5) {\n // 0: Euclidean Round Dot\n spot = 0.5 * (1.0 - (cos(cellUV.x * 2.0 * PI) + cos(cellUV.y * 2.0 * PI)) * 0.5);\n } else if (shape < 1.5) {\n // 1: Diamond\n spot = abs(cellUV.x) + abs(cellUV.y);\n } else if (shape < 2.5) {\n // 2: Line\n spot = abs(cellUV.y) * 2.0;\n } else {\n // 3: Square\n spot = max(abs(cellUV.x), abs(cellUV.y)) * 2.0;\n }\n\n let edgeWidth = select(0.001, max(1.5 / cellSize, 0.003), isSmooth > 0.5);\n\n return select(\n step(spot, d),\n smoothstep(d + edgeWidth, d - edgeWidth, spot),\n isSmooth > 0.5\n );\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n let sourceCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n if (sourceCol.a < 1e-5) {\n return sourceCol;\n }\n\n // Resolve parameter overrides or dynamic signals\n var frequency = u.frequency;\n if (u.hasFreqSig > 0.5) {\n frequency = textureSampleLevel(freqSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var baseAngle = u.angle;\n if (u.hasAngleSig > 0.5) {\n baseAngle = textureSampleLevel(angleSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var contrast = u.contrast;\n if (u.hasContrastSig > 0.5) {\n contrast = textureSampleLevel(contrastSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var cyanAngle = u.cyanAngle;\n if (u.hasCyanSig > 0.5) {\n cyanAngle = textureSampleLevel(cyanSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var magentaAngle = u.magentaAngle;\n if (u.hasMagSig > 0.5) {\n magentaAngle = textureSampleLevel(magSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var yellowAngle = u.yellowAngle;\n if (u.hasYelSig > 0.5) {\n yellowAngle = textureSampleLevel(yelSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var blackAngle = u.blackAngle;\n if (u.hasBlkSig > 0.5) {\n blackAngle = textureSampleLevel(blkSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var effectOpacity = u.opacity;\n if (u.hasOpacitySig > 0.5) {\n effectOpacity = textureSampleLevel(opacitySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n let dimensions = vec2<f32>(textureDimensions(tex));\n let unpremult = sourceCol.rgb / sourceCol.a;\n\n var screenedRgb: vec3<f32>;\n\n if (u.mode < 0.5) {\n // --- Monochrome Mode ---\n let cellCenterUV = getCellCenterUV(in.uv, dimensions, baseAngle, frequency);\n let cellCol = textureSampleLevel(tex, samp, cellCenterUV, 0.0);\n let cellRgb = select(cellCol.rgb, cellCol.rgb / cellCol.a, cellCol.a > 1e-5);\n let luminance = dot(cellRgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n var inkDensity = 1.0 - luminance;\n if (u.invert > 0.5) {\n inkDensity = luminance;\n }\n\n let coverage = evalDotCoverage(\n in.uv,\n dimensions,\n baseAngle,\n frequency,\n u.dotShape,\n inkDensity,\n contrast,\n u.isSmooth\n );\n\n screenedRgb = mix(u.paperColor.rgb, u.dotColor.rgb, coverage);\n } else {\n // --- CMYK Mode ---\n let cellCenterUVC = getCellCenterUV(in.uv, dimensions, baseAngle + cyanAngle, frequency);\n let colC = textureSampleLevel(tex, samp, cellCenterUVC, 0.0);\n let rgbC = select(colC.rgb, colC.rgb / colC.a, colC.a > 1e-5);\n let kC = 1.0 - max(max(rgbC.r, rgbC.g), rgbC.b);\n let invKC = 1.0 - kC;\n var densC = select(0.0, clamp((1.0 - rgbC.r - kC) / max(invKC, 0.0001), 0.0, 1.0), invKC > 0.0001);\n\n let cellCenterUVM = getCellCenterUV(in.uv, dimensions, baseAngle + magentaAngle, frequency);\n let colM = textureSampleLevel(tex, samp, cellCenterUVM, 0.0);\n let rgbM = select(colM.rgb, colM.rgb / colM.a, colM.a > 1e-5);\n let kM = 1.0 - max(max(rgbM.r, rgbM.g), rgbM.b);\n let invKM = 1.0 - kM;\n var densM = select(0.0, clamp((1.0 - rgbM.g - kM) / max(invKM, 0.0001), 0.0, 1.0), invKM > 0.0001);\n\n let cellCenterUVY = getCellCenterUV(in.uv, dimensions, baseAngle + yellowAngle, frequency);\n let colY = textureSampleLevel(tex, samp, cellCenterUVY, 0.0);\n let rgbY = select(colY.rgb, colY.rgb / colY.a, colY.a > 1e-5);\n let kY = 1.0 - max(max(rgbY.r, rgbY.g), rgbY.b);\n let invKY = 1.0 - kY;\n var densY = select(0.0, clamp((1.0 - rgbY.b - kY) / max(invKY, 0.0001), 0.0, 1.0), invKY > 0.0001);\n\n let cellCenterUVK = getCellCenterUV(in.uv, dimensions, baseAngle + blackAngle, frequency);\n let colK = textureSampleLevel(tex, samp, cellCenterUVK, 0.0);\n let rgbK = select(colK.rgb, colK.rgb / colK.a, colK.a > 1e-5);\n var densK = 1.0 - max(max(rgbK.r, rgbK.g), rgbK.b);\n\n if (u.invert > 0.5) {\n densC = 1.0 - densC;\n densM = 1.0 - densM;\n densY = 1.0 - densY;\n densK = 1.0 - densK;\n }\n\n let covC = evalDotCoverage(in.uv, dimensions, baseAngle + cyanAngle, frequency, u.dotShape, densC, contrast, u.isSmooth);\n let covM = evalDotCoverage(in.uv, dimensions, baseAngle + magentaAngle, frequency, u.dotShape, densM, contrast, u.isSmooth);\n let covY = evalDotCoverage(in.uv, dimensions, baseAngle + yellowAngle, frequency, u.dotShape, densY, contrast, u.isSmooth);\n let covK = evalDotCoverage(in.uv, dimensions, baseAngle + blackAngle, frequency, u.dotShape, densK, contrast, u.isSmooth);\n\n // Subtractive synthesis onto paper substrate\n let outR = u.paperColor.r * (1.0 - covC) * (1.0 - covK);\n let outG = u.paperColor.g * (1.0 - covM) * (1.0 - covK);\n let outB = u.paperColor.b * (1.0 - covY) * (1.0 - covK);\n\n screenedRgb = clamp(vec3<f32>(outR, outG, outB), vec3<f32>(0.0), vec3<f32>(1.0));\n }\n\n // Apply effect opacity blend\n let finalRgb = mix(unpremult, screenedRgb, clamp(effectOpacity, 0.0, 1.0));\n return vec4<f32>(finalRgb * sourceCol.a, sourceCol.a);\n}\n`;\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 8),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getHalftoneResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `halftone_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst halftoneModule = device.createShaderModule({\n\t\t\tlabel: `halftone_${format}.wgsl`,\n\t\t\tcode: WGSL_HALFTONE_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `HalftonePipeline_${format}`,\n\t\t\tmodule: halftoneModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\thalftonePipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst HalftoneScreenWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = 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 !== \"HalftoneScreen\" || !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 nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"halftone_node\";\n\tconst resolveBindable = (configKey, defaultValue, minVal, maxVal) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && input.outputItem?.type === \"Signal\");\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = defaultValue;\n\t\tlet hasStaticSig = false;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") val = Math.max(minVal, Math.min(maxVal, Number(input.outputItem.data ?? defaultValue)));\n\t\telse {\n\t\t\tconst rawVal = unwrapFrameParam(op[configKey], compositionFrame, fps).value;\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(rawVal ?? defaultValue)));\n\t\t}\n\t\telse if (sd) {\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(sd.offset ?? 0)));\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd\n\t\t};\n\t};\n\tconst freqRes = resolveBindable(\"frequency\", 30, 1, 200);\n\tconst angleRes = resolveBindable(\"angle\", 45, 0, 360);\n\tconst contrastRes = resolveBindable(\"contrast\", 1, .1, 5);\n\tconst cyanRes = resolveBindable(\"cyanAngle\", 15, 0, 360);\n\tconst magRes = resolveBindable(\"magentaAngle\", 75, 0, 360);\n\tconst yelRes = resolveBindable(\"yellowAngle\", 0, 0, 360);\n\tconst blkRes = resolveBindable(\"blackAngle\", 45, 0, 360);\n\tconst opacityRes = resolveBindable(\"opacity\", 1, 0, 1);\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { halftonePipeline: pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getHalftoneResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst signalContext = {\n\t\targs,\n\t\twidth,\n\t\theight,\n\t\tframe,\n\t\tfps,\n\t\telapsedSeconds,\n\t\tdurationSeconds\n\t};\n\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\tconst freqView = getSignalView(freqRes, \"freq_sig\");\n\tconst angleView = getSignalView(angleRes, \"angle_sig\");\n\tconst contrastView = getSignalView(contrastRes, \"contrast_sig\");\n\tconst cyanView = getSignalView(cyanRes, \"cyan_sig\");\n\tconst magView = getSignalView(magRes, \"mag_sig\");\n\tconst yelView = getSignalView(yelRes, \"yel_sig\");\n\tconst blkView = getSignalView(blkRes, \"blk_sig\");\n\tconst opacityView = getSignalView(opacityRes, \"opacity_sig\");\n\tconst modeVal = op.mode === \"CMYK\" ? 1 : 0;\n\tlet dotShapeVal = 0;\n\tif (op.dotShape === \"Diamond\") dotShapeVal = 1;\n\telse if (op.dotShape === \"Line\") dotShapeVal = 2;\n\telse if (op.dotShape === \"Square\") dotShapeVal = 3;\n\tconst dotCol = parseColor(op.dotColor ?? \"#000000\");\n\tconst paperCol = parseColor(op.paperColor ?? \"#ffffff\");\n\tconst halftoneUniformData = new Float32Array(28);\n\thalftoneUniformData[0] = modeVal;\n\thalftoneUniformData[1] = dotShapeVal;\n\thalftoneUniformData[2] = freqRes.val;\n\thalftoneUniformData[3] = angleRes.val;\n\thalftoneUniformData[4] = contrastRes.val;\n\thalftoneUniformData[5] = op.invert ? 1 : 0;\n\thalftoneUniformData[6] = op.smooth !== false ? 1 : 0;\n\thalftoneUniformData[7] = opacityRes.val;\n\thalftoneUniformData[8] = dotCol.r;\n\thalftoneUniformData[9] = dotCol.g;\n\thalftoneUniformData[10] = dotCol.b;\n\thalftoneUniformData[11] = dotCol.a;\n\thalftoneUniformData[12] = paperCol.r;\n\thalftoneUniformData[13] = paperCol.g;\n\thalftoneUniformData[14] = paperCol.b;\n\thalftoneUniformData[15] = paperCol.a;\n\thalftoneUniformData[16] = cyanRes.val;\n\thalftoneUniformData[17] = magRes.val;\n\thalftoneUniformData[18] = yelRes.val;\n\thalftoneUniformData[19] = blkRes.val;\n\thalftoneUniformData[20] = freqRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[21] = angleRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[22] = contrastRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[23] = cyanRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[24] = magRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[25] = yelRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[26] = blkRes.hasStaticSig ? 1 : 0;\n\thalftoneUniformData[27] = opacityRes.hasStaticSig ? 1 : 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(halftoneUniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uniformBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: freqView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: angleView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: contrastView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: cyanView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: magView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: yelView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\n\t\t\t\t\tresource: blkView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 7,\n\t\t\t\t\tresource: opacityView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 8,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: HalftoneScreenWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-CvluQiq3.mjs.map"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import "./chunk-GBe2k3y8.mjs";
|
|
2
2
|
import { n as defineRenderer } from "./renderer-BSitV56h.mjs";
|
|
3
|
-
import { O as drawSvgNode } from "./dist-
|
|
3
|
+
import { O as drawSvgNode } from "./dist-CturBK2Z.mjs";
|
|
4
4
|
|
|
5
5
|
//#region ../../nodes/node-shape-generator/dist/renderers-CpnJ1Qiz.mjs
|
|
6
6
|
/**
|
|
@@ -238,4 +238,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: ShapeGeneratorWebGPURen
|
|
|
238
238
|
|
|
239
239
|
//#endregion
|
|
240
240
|
export { ShapeGeneratorWebGPURenderer, renderers_default as default };
|
|
241
|
-
//# sourceMappingURL=renderer-
|
|
241
|
+
//# sourceMappingURL=renderer-BFHgl-0f.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-pPiQwFYh.mjs","names":[],"sources":["../../../nodes/node-shape-generator/dist/renderers-CpnJ1Qiz.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { drawSvgNode } from \"@framefields/webgpu-renderers\";\n\n//#region src/shared/geometry.ts\n/**\n* Scale corner radii proportionally if their sum exceeds the box dimensions (W3C CSS standard).\n*/\nfunction normalizeCornerRadii(w, h, rTL, rTR, rBR, rBL) {\n\tconst topSum = rTL + rTR;\n\tconst bottomSum = rBL + rBR;\n\tconst leftSum = rTL + rBL;\n\tconst rightSum = rTR + rBR;\n\tlet scale = 1;\n\tif (topSum > w && topSum > 0) scale = Math.min(scale, w / topSum);\n\tif (bottomSum > w && bottomSum > 0) scale = Math.min(scale, w / bottomSum);\n\tif (leftSum > h && leftSum > 0) scale = Math.min(scale, h / leftSum);\n\tif (rightSum > h && rightSum > 0) scale = Math.min(scale, h / rightSum);\n\treturn [\n\t\tMath.max(0, rTL * scale),\n\t\tMath.max(0, rTR * scale),\n\t\tMath.max(0, rBR * scale),\n\t\tMath.max(0, rBL * scale)\n\t];\n}\n/**\n* Generates an SVG path string for a rounded rectangle with 4 independent corner radii.\n*/\nfunction buildRectanglePath(w, h, rTL, rTR, rBR, rBL, strokeWidth = 0) {\n\tconst inset = strokeWidth > 0 ? strokeWidth / 2 : 0;\n\tconst x = inset;\n\tconst y = inset;\n\tconst boxW = Math.max(.1, w - strokeWidth);\n\tconst boxH = Math.max(.1, h - strokeWidth);\n\tconst [rtl, rtr, rbr, rbl] = normalizeCornerRadii(boxW, boxH, rTL, rTR, rBR, rBL);\n\treturn [\n\t\t`M ${x + rtl} ${y}`,\n\t\t`L ${x + boxW - rtr} ${y}`,\n\t\trtr > 0 ? `A ${rtr} ${rtr} 0 0 1 ${x + boxW} ${y + rtr}` : \"\",\n\t\t`L ${x + boxW} ${y + boxH - rbr}`,\n\t\trbr > 0 ? `A ${rbr} ${rbr} 0 0 1 ${x + boxW - rbr} ${y + boxH}` : \"\",\n\t\t`L ${x + rbl} ${y + boxH}`,\n\t\trbl > 0 ? `A ${rbl} ${rbl} 0 0 1 ${x} ${y + boxH - rbl}` : \"\",\n\t\t`L ${x} ${y + rtl}`,\n\t\trtl > 0 ? `A ${rtl} ${rtl} 0 0 1 ${x + rtl} ${y}` : \"\",\n\t\t\"Z\"\n\t].filter(Boolean).join(\" \");\n}\n/**\n* Generates an SVG path string for an ellipse/circle.\n*/\nfunction buildEllipsePath(w, h, strokeWidth = 0) {\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst rx = Math.max(.1, (w - strokeWidth) / 2);\n\tconst ry = Math.max(.1, (h - strokeWidth) / 2);\n\treturn `M ${cx - rx} ${cy} A ${rx} ${ry} 0 1 0 ${cx + rx} ${cy} A ${rx} ${ry} 0 1 0 ${cx - rx} ${cy} Z`;\n}\n/**\n* Generates an SVG path string for a regular polygon with N sides.\n*/\nfunction buildPolygonPath(w, h, sides, strokeWidth = 0) {\n\tconst n = Math.max(3, Math.min(64, Math.floor(sides)));\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst radius = Math.max(.1, Math.min(w - strokeWidth, h - strokeWidth) / 2);\n\tconst points = [];\n\tconst angleStep = 2 * Math.PI / n;\n\tconst startAngle = -Math.PI / 2;\n\tfor (let i = 0; i < n; i++) {\n\t\tconst angle = startAngle + i * angleStep;\n\t\tpoints.push({\n\t\t\tx: cx + radius * Math.cos(angle),\n\t\t\ty: cy + radius * Math.sin(angle)\n\t\t});\n\t}\n\treturn points.map((p, i) => `${i === 0 ? \"M\" : \"L\"} ${p.x.toFixed(3)} ${p.y.toFixed(3)}`).join(\" \") + \" Z\";\n}\n/**\n* Generates an SVG path string for a star with N spikes and configurable inner radius ratio.\n*/\nfunction buildStarPath(w, h, pointsCount, innerRadiusRatio, strokeWidth = 0) {\n\tconst n = Math.max(3, Math.min(64, Math.floor(pointsCount)));\n\tconst ratio = Math.max(.01, Math.min(.99, innerRadiusRatio));\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst outerRadius = Math.max(.1, Math.min(w - strokeWidth, h - strokeWidth) / 2);\n\tconst innerRadius = outerRadius * ratio;\n\tconst points = [];\n\tconst totalVertices = n * 2;\n\tconst angleStep = Math.PI / n;\n\tconst startAngle = -Math.PI / 2;\n\tfor (let i = 0; i < totalVertices; i++) {\n\t\tconst r = i % 2 === 0 ? outerRadius : innerRadius;\n\t\tconst angle = startAngle + i * angleStep;\n\t\tpoints.push({\n\t\t\tx: cx + r * Math.cos(angle),\n\t\t\ty: cy + r * Math.sin(angle)\n\t\t});\n\t}\n\treturn points.map((p, i) => `${i === 0 ? \"M\" : \"L\"} ${p.x.toFixed(3)} ${p.y.toFixed(3)}`).join(\" \") + \" Z\";\n}\n/**\n* Generates an SVG path string for a parametric arrow pointing right.\n*/\nfunction buildArrowPath(w, h, headWidth, headLength, shaftWidth, strokeWidth = 0) {\n\tconst inset = strokeWidth > 0 ? strokeWidth / 2 : 0;\n\tconst boxW = Math.max(1, w - strokeWidth);\n\tconst boxH = Math.max(1, h - strokeWidth);\n\tconst cy = h / 2;\n\tconst hw = Math.min(boxH, Math.max(4, headWidth));\n\tconst hl = Math.min(boxW * .9, Math.max(4, headLength));\n\tconst sw = Math.min(hw * .95, Math.max(2, shaftWidth));\n\tconst leftX = inset;\n\tconst rightX = inset + boxW;\n\tconst headBaseX = rightX - hl;\n\tconst topShaftY = cy - sw / 2;\n\tconst bottomShaftY = cy + sw / 2;\n\tconst topHeadY = cy - hw / 2;\n\tconst bottomHeadY = cy + hw / 2;\n\treturn [\n\t\t`M ${leftX.toFixed(2)} ${topShaftY.toFixed(2)}`,\n\t\t`L ${headBaseX.toFixed(2)} ${topShaftY.toFixed(2)}`,\n\t\t`L ${headBaseX.toFixed(2)} ${topHeadY.toFixed(2)}`,\n\t\t`L ${rightX.toFixed(2)} ${cy.toFixed(2)}`,\n\t\t`L ${headBaseX.toFixed(2)} ${bottomHeadY.toFixed(2)}`,\n\t\t`L ${headBaseX.toFixed(2)} ${bottomShaftY.toFixed(2)}`,\n\t\t`L ${leftX.toFixed(2)} ${bottomShaftY.toFixed(2)}`,\n\t\t\"Z\"\n\t].join(\" \");\n}\n/**\n* Calculates linear gradient coordinate vector from an angle in degrees.\n*/\nfunction calculateLinearGradientCoords(angleDeg = 0) {\n\tconst rad = angleDeg * Math.PI / 180;\n\tconst cos = Math.cos(rad);\n\tconst sin = Math.sin(rad);\n\tconst x1 = ((.5 - cos * .5) * 100).toFixed(2);\n\tconst y1 = ((.5 - sin * .5) * 100).toFixed(2);\n\tconst x2 = ((.5 + cos * .5) * 100).toFixed(2);\n\tconst y2 = ((.5 + sin * .5) * 100).toFixed(2);\n\treturn {\n\t\tx1: `${x1}%`,\n\t\ty1: `${y1}%`,\n\t\tx2: `${x2}%`,\n\t\ty2: `${y2}%`\n\t};\n}\n/**\n* Builds the complete shape geometry path for any ShapeGenerator config.\n*/\nfunction generateShapePath(config) {\n\tconst width = Math.max(1, config.width ?? 500);\n\tconst height = Math.max(1, config.height ?? 500);\n\tconst strokeWidth = config.strokeWidth ?? 0;\n\tswitch (config.shapeType) {\n\t\tcase \"Rectangle\": return buildRectanglePath(width, height, config.radiusTL ?? 0, config.radiusTR ?? 0, config.radiusBR ?? 0, config.radiusBL ?? 0, strokeWidth);\n\t\tcase \"Ellipse\": return buildEllipsePath(width, height, strokeWidth);\n\t\tcase \"Polygon\": return buildPolygonPath(width, height, config.polygonSides ?? 5, strokeWidth);\n\t\tcase \"Star\": return buildStarPath(width, height, config.starPoints ?? 5, config.starInnerRadius ?? .5, strokeWidth);\n\t\tcase \"Arrow\": return buildArrowPath(width, height, config.arrowHeadWidth ?? 40, config.arrowHeadLength ?? 40, config.arrowShaftWidth ?? 20, strokeWidth);\n\t\tcase \"CustomPath\": return config.customPath?.trim() || buildRectanglePath(width, height, 0, 0, 0, 0, strokeWidth);\n\t\tdefault: return buildRectanglePath(width, height, 0, 0, 0, 0, strokeWidth);\n\t}\n}\n\n//#endregion\n//#region src/shared/svg-generator.ts\n/**\n* Generates an SVG string representation of the parametric shape configuration.\n*/\nfunction generateShapeSvg(config) {\n\tconst width = Math.max(1, config.width ?? 500);\n\tconst height = Math.max(1, config.height ?? 500);\n\tconst pathD = generateShapePath(config);\n\tconst fillType = config.fillType ?? \"solid\";\n\tconst fillColor = config.fillColor ?? \"#3b82f6\";\n\tconst gradientEndColor = config.gradientEndColor ?? \"#1d4ed8\";\n\tconst gradientAngle = config.gradientAngle ?? 0;\n\tconst strokeColor = config.strokeColor ?? \"#ffffff\";\n\tconst strokeWidth = Math.max(0, config.strokeWidth ?? 0);\n\tconst strokeDashArray = config.strokeDashArray?.trim();\n\tconst strokeLineCap = config.strokeLineCap ?? \"round\";\n\tconst strokeLineJoin = config.strokeLineJoin ?? \"round\";\n\tconst strokeDashOffset = config.strokeDashOffset ?? 0;\n\tconst rotation = config.rotation ?? 0;\n\tconst opacity = Math.max(0, Math.min(1, config.opacity ?? 1));\n\tconst customPathScale = config.shapeType === \"CustomPath\" ? config.customPathScale ?? 1 : 1;\n\tconst gradId = `gw_shape_grad_${Math.abs(Math.round(gradientAngle) * 31 + (fillType === \"linear\" ? 1 : 2))}`;\n\tlet defs = \"\";\n\tlet fillAttr = fillColor;\n\tif (fillType === \"none\") fillAttr = \"none\";\n\telse if (fillType === \"linear\") {\n\t\tconst coords = calculateLinearGradientCoords(gradientAngle);\n\t\tdefs = `<defs><linearGradient id=\"${gradId}\" x1=\"${coords.x1}\" y1=\"${coords.y1}\" x2=\"${coords.x2}\" y2=\"${coords.y2}\"><stop offset=\"0%\" stop-color=\"${fillColor}\"/><stop offset=\"100%\" stop-color=\"${gradientEndColor}\"/></linearGradient></defs>`;\n\t\tfillAttr = `url(#${gradId})`;\n\t} else if (fillType === \"radial\") {\n\t\tdefs = `<defs><radialGradient id=\"${gradId}\" cx=\"50%\" cy=\"50%\" r=\"50%\"><stop offset=\"0%\" stop-color=\"${fillColor}\"/><stop offset=\"100%\" stop-color=\"${gradientEndColor}\"/></radialGradient></defs>`;\n\t\tfillAttr = `url(#${gradId})`;\n\t}\n\tconst strokeAttrs = strokeWidth > 0 ? `stroke=\"${strokeColor}\" stroke-width=\"${strokeWidth}\" stroke-linecap=\"${strokeLineCap}\" stroke-linejoin=\"${strokeLineJoin}\" ${strokeDashArray ? `stroke-dasharray=\"${strokeDashArray}\"` : \"\"} ${strokeDashOffset ? `stroke-dashoffset=\"${strokeDashOffset}\"` : \"\"}` : \"stroke=\\\"none\\\"\";\n\tconst cx = width / 2;\n\tconst cy = height / 2;\n\tconst transformParts = [];\n\tif (rotation !== 0) transformParts.push(`rotate(${rotation} ${cx} ${cy})`);\n\tif (customPathScale !== 1) transformParts.push(`scale(${customPathScale})`);\n\tconst transformAttr = transformParts.length > 0 ? `transform=\"${transformParts.join(\" \")}\"` : \"\";\n\tconst opacityAttr = opacity < 1 ? `opacity=\"${opacity}\"` : \"\";\n\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${width} ${height}\" width=\"${width}\" height=\"${height}\">${defs}<g ${transformAttr} ${opacityAttr}><path d=\"${pathD}\" fill=\"${fillAttr}\" ${strokeAttrs} /></g></svg>`;\n}\n/**\n* Encodes the SVG into a base64 data URL for robust cross-environment rendering.\n*/\nfunction generateShapeSvgDataUrl(config) {\n\tconst svgString = generateShapeSvg(config);\n\tif (typeof Buffer !== \"undefined\") return `data:image/svg+xml;base64,${Buffer.from(svgString).toString(\"base64\")}`;\n\treturn `data:image/svg+xml;base64,${btoa(unescape(encodeURIComponent(svgString)))}`;\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst ShapeGeneratorWebGPURenderer = async (args) => {\n\tconst { ctx, pass, props, targetWidth, targetHeight } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (!op || op.op !== \"ShapeGenerator\" && op.op !== \"source\") return;\n\tconst svgDataUrl = generateShapeSvgDataUrl(op);\n\tconst width = targetWidth > 0 ? targetWidth : op.width ?? 500;\n\tconst height = targetHeight > 0 ? targetHeight : op.height ?? 500;\n\tconst isHeadless = Boolean(ctx.isHeadless || typeof window === \"undefined\");\n\tawait drawSvgNode(ctx, pass, {\n\t\tsrc: svgDataUrl,\n\t\tdstRect: {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth,\n\t\t\theight\n\t\t},\n\t\topacity: op.opacity ?? 1,\n\t\tisHeadless\n\t});\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ShapeGeneratorWebGPURenderer });\n\n//#endregion\nexport { buildArrowPath as a, buildRectanglePath as c, generateShapePath as d, normalizeCornerRadii as f, generateShapeSvgDataUrl as i, buildStarPath as l, ShapeGeneratorWebGPURenderer as n, buildEllipsePath as o, generateShapeSvg as r, buildPolygonPath as s, renderers_default as t, calculateLinearGradientCoords as u };\n//# sourceMappingURL=renderers-CpnJ1Qiz.mjs.map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderer-BFHgl-0f.mjs","names":[],"sources":["../../../nodes/node-shape-generator/dist/renderers-CpnJ1Qiz.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { drawSvgNode } from \"@framefields/webgpu-renderers\";\n\n//#region src/shared/geometry.ts\n/**\n* Scale corner radii proportionally if their sum exceeds the box dimensions (W3C CSS standard).\n*/\nfunction normalizeCornerRadii(w, h, rTL, rTR, rBR, rBL) {\n\tconst topSum = rTL + rTR;\n\tconst bottomSum = rBL + rBR;\n\tconst leftSum = rTL + rBL;\n\tconst rightSum = rTR + rBR;\n\tlet scale = 1;\n\tif (topSum > w && topSum > 0) scale = Math.min(scale, w / topSum);\n\tif (bottomSum > w && bottomSum > 0) scale = Math.min(scale, w / bottomSum);\n\tif (leftSum > h && leftSum > 0) scale = Math.min(scale, h / leftSum);\n\tif (rightSum > h && rightSum > 0) scale = Math.min(scale, h / rightSum);\n\treturn [\n\t\tMath.max(0, rTL * scale),\n\t\tMath.max(0, rTR * scale),\n\t\tMath.max(0, rBR * scale),\n\t\tMath.max(0, rBL * scale)\n\t];\n}\n/**\n* Generates an SVG path string for a rounded rectangle with 4 independent corner radii.\n*/\nfunction buildRectanglePath(w, h, rTL, rTR, rBR, rBL, strokeWidth = 0) {\n\tconst inset = strokeWidth > 0 ? strokeWidth / 2 : 0;\n\tconst x = inset;\n\tconst y = inset;\n\tconst boxW = Math.max(.1, w - strokeWidth);\n\tconst boxH = Math.max(.1, h - strokeWidth);\n\tconst [rtl, rtr, rbr, rbl] = normalizeCornerRadii(boxW, boxH, rTL, rTR, rBR, rBL);\n\treturn [\n\t\t`M ${x + rtl} ${y}`,\n\t\t`L ${x + boxW - rtr} ${y}`,\n\t\trtr > 0 ? `A ${rtr} ${rtr} 0 0 1 ${x + boxW} ${y + rtr}` : \"\",\n\t\t`L ${x + boxW} ${y + boxH - rbr}`,\n\t\trbr > 0 ? `A ${rbr} ${rbr} 0 0 1 ${x + boxW - rbr} ${y + boxH}` : \"\",\n\t\t`L ${x + rbl} ${y + boxH}`,\n\t\trbl > 0 ? `A ${rbl} ${rbl} 0 0 1 ${x} ${y + boxH - rbl}` : \"\",\n\t\t`L ${x} ${y + rtl}`,\n\t\trtl > 0 ? `A ${rtl} ${rtl} 0 0 1 ${x + rtl} ${y}` : \"\",\n\t\t\"Z\"\n\t].filter(Boolean).join(\" \");\n}\n/**\n* Generates an SVG path string for an ellipse/circle.\n*/\nfunction buildEllipsePath(w, h, strokeWidth = 0) {\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst rx = Math.max(.1, (w - strokeWidth) / 2);\n\tconst ry = Math.max(.1, (h - strokeWidth) / 2);\n\treturn `M ${cx - rx} ${cy} A ${rx} ${ry} 0 1 0 ${cx + rx} ${cy} A ${rx} ${ry} 0 1 0 ${cx - rx} ${cy} Z`;\n}\n/**\n* Generates an SVG path string for a regular polygon with N sides.\n*/\nfunction buildPolygonPath(w, h, sides, strokeWidth = 0) {\n\tconst n = Math.max(3, Math.min(64, Math.floor(sides)));\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst radius = Math.max(.1, Math.min(w - strokeWidth, h - strokeWidth) / 2);\n\tconst points = [];\n\tconst angleStep = 2 * Math.PI / n;\n\tconst startAngle = -Math.PI / 2;\n\tfor (let i = 0; i < n; i++) {\n\t\tconst angle = startAngle + i * angleStep;\n\t\tpoints.push({\n\t\t\tx: cx + radius * Math.cos(angle),\n\t\t\ty: cy + radius * Math.sin(angle)\n\t\t});\n\t}\n\treturn points.map((p, i) => `${i === 0 ? \"M\" : \"L\"} ${p.x.toFixed(3)} ${p.y.toFixed(3)}`).join(\" \") + \" Z\";\n}\n/**\n* Generates an SVG path string for a star with N spikes and configurable inner radius ratio.\n*/\nfunction buildStarPath(w, h, pointsCount, innerRadiusRatio, strokeWidth = 0) {\n\tconst n = Math.max(3, Math.min(64, Math.floor(pointsCount)));\n\tconst ratio = Math.max(.01, Math.min(.99, innerRadiusRatio));\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst outerRadius = Math.max(.1, Math.min(w - strokeWidth, h - strokeWidth) / 2);\n\tconst innerRadius = outerRadius * ratio;\n\tconst points = [];\n\tconst totalVertices = n * 2;\n\tconst angleStep = Math.PI / n;\n\tconst startAngle = -Math.PI / 2;\n\tfor (let i = 0; i < totalVertices; i++) {\n\t\tconst r = i % 2 === 0 ? outerRadius : innerRadius;\n\t\tconst angle = startAngle + i * angleStep;\n\t\tpoints.push({\n\t\t\tx: cx + r * Math.cos(angle),\n\t\t\ty: cy + r * Math.sin(angle)\n\t\t});\n\t}\n\treturn points.map((p, i) => `${i === 0 ? \"M\" : \"L\"} ${p.x.toFixed(3)} ${p.y.toFixed(3)}`).join(\" \") + \" Z\";\n}\n/**\n* Generates an SVG path string for a parametric arrow pointing right.\n*/\nfunction buildArrowPath(w, h, headWidth, headLength, shaftWidth, strokeWidth = 0) {\n\tconst inset = strokeWidth > 0 ? strokeWidth / 2 : 0;\n\tconst boxW = Math.max(1, w - strokeWidth);\n\tconst boxH = Math.max(1, h - strokeWidth);\n\tconst cy = h / 2;\n\tconst hw = Math.min(boxH, Math.max(4, headWidth));\n\tconst hl = Math.min(boxW * .9, Math.max(4, headLength));\n\tconst sw = Math.min(hw * .95, Math.max(2, shaftWidth));\n\tconst leftX = inset;\n\tconst rightX = inset + boxW;\n\tconst headBaseX = rightX - hl;\n\tconst topShaftY = cy - sw / 2;\n\tconst bottomShaftY = cy + sw / 2;\n\tconst topHeadY = cy - hw / 2;\n\tconst bottomHeadY = cy + hw / 2;\n\treturn [\n\t\t`M ${leftX.toFixed(2)} ${topShaftY.toFixed(2)}`,\n\t\t`L ${headBaseX.toFixed(2)} ${topShaftY.toFixed(2)}`,\n\t\t`L ${headBaseX.toFixed(2)} ${topHeadY.toFixed(2)}`,\n\t\t`L ${rightX.toFixed(2)} ${cy.toFixed(2)}`,\n\t\t`L ${headBaseX.toFixed(2)} ${bottomHeadY.toFixed(2)}`,\n\t\t`L ${headBaseX.toFixed(2)} ${bottomShaftY.toFixed(2)}`,\n\t\t`L ${leftX.toFixed(2)} ${bottomShaftY.toFixed(2)}`,\n\t\t\"Z\"\n\t].join(\" \");\n}\n/**\n* Calculates linear gradient coordinate vector from an angle in degrees.\n*/\nfunction calculateLinearGradientCoords(angleDeg = 0) {\n\tconst rad = angleDeg * Math.PI / 180;\n\tconst cos = Math.cos(rad);\n\tconst sin = Math.sin(rad);\n\tconst x1 = ((.5 - cos * .5) * 100).toFixed(2);\n\tconst y1 = ((.5 - sin * .5) * 100).toFixed(2);\n\tconst x2 = ((.5 + cos * .5) * 100).toFixed(2);\n\tconst y2 = ((.5 + sin * .5) * 100).toFixed(2);\n\treturn {\n\t\tx1: `${x1}%`,\n\t\ty1: `${y1}%`,\n\t\tx2: `${x2}%`,\n\t\ty2: `${y2}%`\n\t};\n}\n/**\n* Builds the complete shape geometry path for any ShapeGenerator config.\n*/\nfunction generateShapePath(config) {\n\tconst width = Math.max(1, config.width ?? 500);\n\tconst height = Math.max(1, config.height ?? 500);\n\tconst strokeWidth = config.strokeWidth ?? 0;\n\tswitch (config.shapeType) {\n\t\tcase \"Rectangle\": return buildRectanglePath(width, height, config.radiusTL ?? 0, config.radiusTR ?? 0, config.radiusBR ?? 0, config.radiusBL ?? 0, strokeWidth);\n\t\tcase \"Ellipse\": return buildEllipsePath(width, height, strokeWidth);\n\t\tcase \"Polygon\": return buildPolygonPath(width, height, config.polygonSides ?? 5, strokeWidth);\n\t\tcase \"Star\": return buildStarPath(width, height, config.starPoints ?? 5, config.starInnerRadius ?? .5, strokeWidth);\n\t\tcase \"Arrow\": return buildArrowPath(width, height, config.arrowHeadWidth ?? 40, config.arrowHeadLength ?? 40, config.arrowShaftWidth ?? 20, strokeWidth);\n\t\tcase \"CustomPath\": return config.customPath?.trim() || buildRectanglePath(width, height, 0, 0, 0, 0, strokeWidth);\n\t\tdefault: return buildRectanglePath(width, height, 0, 0, 0, 0, strokeWidth);\n\t}\n}\n\n//#endregion\n//#region src/shared/svg-generator.ts\n/**\n* Generates an SVG string representation of the parametric shape configuration.\n*/\nfunction generateShapeSvg(config) {\n\tconst width = Math.max(1, config.width ?? 500);\n\tconst height = Math.max(1, config.height ?? 500);\n\tconst pathD = generateShapePath(config);\n\tconst fillType = config.fillType ?? \"solid\";\n\tconst fillColor = config.fillColor ?? \"#3b82f6\";\n\tconst gradientEndColor = config.gradientEndColor ?? \"#1d4ed8\";\n\tconst gradientAngle = config.gradientAngle ?? 0;\n\tconst strokeColor = config.strokeColor ?? \"#ffffff\";\n\tconst strokeWidth = Math.max(0, config.strokeWidth ?? 0);\n\tconst strokeDashArray = config.strokeDashArray?.trim();\n\tconst strokeLineCap = config.strokeLineCap ?? \"round\";\n\tconst strokeLineJoin = config.strokeLineJoin ?? \"round\";\n\tconst strokeDashOffset = config.strokeDashOffset ?? 0;\n\tconst rotation = config.rotation ?? 0;\n\tconst opacity = Math.max(0, Math.min(1, config.opacity ?? 1));\n\tconst customPathScale = config.shapeType === \"CustomPath\" ? config.customPathScale ?? 1 : 1;\n\tconst gradId = `gw_shape_grad_${Math.abs(Math.round(gradientAngle) * 31 + (fillType === \"linear\" ? 1 : 2))}`;\n\tlet defs = \"\";\n\tlet fillAttr = fillColor;\n\tif (fillType === \"none\") fillAttr = \"none\";\n\telse if (fillType === \"linear\") {\n\t\tconst coords = calculateLinearGradientCoords(gradientAngle);\n\t\tdefs = `<defs><linearGradient id=\"${gradId}\" x1=\"${coords.x1}\" y1=\"${coords.y1}\" x2=\"${coords.x2}\" y2=\"${coords.y2}\"><stop offset=\"0%\" stop-color=\"${fillColor}\"/><stop offset=\"100%\" stop-color=\"${gradientEndColor}\"/></linearGradient></defs>`;\n\t\tfillAttr = `url(#${gradId})`;\n\t} else if (fillType === \"radial\") {\n\t\tdefs = `<defs><radialGradient id=\"${gradId}\" cx=\"50%\" cy=\"50%\" r=\"50%\"><stop offset=\"0%\" stop-color=\"${fillColor}\"/><stop offset=\"100%\" stop-color=\"${gradientEndColor}\"/></radialGradient></defs>`;\n\t\tfillAttr = `url(#${gradId})`;\n\t}\n\tconst strokeAttrs = strokeWidth > 0 ? `stroke=\"${strokeColor}\" stroke-width=\"${strokeWidth}\" stroke-linecap=\"${strokeLineCap}\" stroke-linejoin=\"${strokeLineJoin}\" ${strokeDashArray ? `stroke-dasharray=\"${strokeDashArray}\"` : \"\"} ${strokeDashOffset ? `stroke-dashoffset=\"${strokeDashOffset}\"` : \"\"}` : \"stroke=\\\"none\\\"\";\n\tconst cx = width / 2;\n\tconst cy = height / 2;\n\tconst transformParts = [];\n\tif (rotation !== 0) transformParts.push(`rotate(${rotation} ${cx} ${cy})`);\n\tif (customPathScale !== 1) transformParts.push(`scale(${customPathScale})`);\n\tconst transformAttr = transformParts.length > 0 ? `transform=\"${transformParts.join(\" \")}\"` : \"\";\n\tconst opacityAttr = opacity < 1 ? `opacity=\"${opacity}\"` : \"\";\n\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${width} ${height}\" width=\"${width}\" height=\"${height}\">${defs}<g ${transformAttr} ${opacityAttr}><path d=\"${pathD}\" fill=\"${fillAttr}\" ${strokeAttrs} /></g></svg>`;\n}\n/**\n* Encodes the SVG into a base64 data URL for robust cross-environment rendering.\n*/\nfunction generateShapeSvgDataUrl(config) {\n\tconst svgString = generateShapeSvg(config);\n\tif (typeof Buffer !== \"undefined\") return `data:image/svg+xml;base64,${Buffer.from(svgString).toString(\"base64\")}`;\n\treturn `data:image/svg+xml;base64,${btoa(unescape(encodeURIComponent(svgString)))}`;\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst ShapeGeneratorWebGPURenderer = async (args) => {\n\tconst { ctx, pass, props, targetWidth, targetHeight } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (!op || op.op !== \"ShapeGenerator\" && op.op !== \"source\") return;\n\tconst svgDataUrl = generateShapeSvgDataUrl(op);\n\tconst width = targetWidth > 0 ? targetWidth : op.width ?? 500;\n\tconst height = targetHeight > 0 ? targetHeight : op.height ?? 500;\n\tconst isHeadless = Boolean(ctx.isHeadless || typeof window === \"undefined\");\n\tawait drawSvgNode(ctx, pass, {\n\t\tsrc: svgDataUrl,\n\t\tdstRect: {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth,\n\t\t\theight\n\t\t},\n\t\topacity: op.opacity ?? 1,\n\t\tisHeadless\n\t});\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ShapeGeneratorWebGPURenderer });\n\n//#endregion\nexport { buildArrowPath as a, buildRectanglePath as c, generateShapePath as d, normalizeCornerRadii as f, generateShapeSvgDataUrl as i, buildStarPath as l, ShapeGeneratorWebGPURenderer as n, buildEllipsePath as o, generateShapeSvg as r, buildPolygonPath as s, renderers_default as t, calculateLinearGradientCoords as u };\n//# sourceMappingURL=renderers-CpnJ1Qiz.mjs.map"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "./chunk-GBe2k3y8.mjs";
|
|
2
2
|
import { n as defineRenderer } from "./renderer-BSitV56h.mjs";
|
|
3
|
-
import "./dist-
|
|
4
|
-
import { c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-
|
|
3
|
+
import "./dist-CturBK2Z.mjs";
|
|
4
|
+
import { c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CN14e7Bi.mjs";
|
|
5
5
|
|
|
6
6
|
//#region ../../nodes/node-iridescence/dist/renderers-qgYExzH6.mjs
|
|
7
7
|
const OP = "Iridescence";
|
|
@@ -200,4 +200,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: IridescenceWebGPURender
|
|
|
200
200
|
|
|
201
201
|
//#endregion
|
|
202
202
|
export { IridescenceWebGPURenderer, renderers_default as default };
|
|
203
|
-
//# sourceMappingURL=renderer-
|
|
203
|
+
//# sourceMappingURL=renderer-BI1nmIqA.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-
|
|
1
|
+
{"version":3,"file":"renderer-BI1nmIqA.mjs","names":[],"sources":["../../../nodes/node-iridescence/dist/renderers-qgYExzH6.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst OP = \"Iridescence\";\nconst UNIFORM_FLOATS = 8;\n/** One fragment shader per pass; pass 0 reads the layer, later passes read the previous pass. */\nconst PASSES = [`struct U { v : array<vec4<f32>, 2> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet strength = u.v[1].x;\n\tlet scale = u.v[1].y;\n\tlet shift = u.v[1].z;\n\tlet mode = u32(u.v[1].w + 0.5);\n\n\tlet R = res();\n\tlet c = sampleS(in.uv);\n\tlet l = luma(c.rgb);\n\tvar phase = l;\n\tvar amount = strength;\n\tif (mode == 1u) {\n\t\tlet o = 5.0 / R;\n\t\tlet gx = luma(sampleS(in.uv + vec2<f32>(o.x, 0.0)).rgb) - luma(sampleS(in.uv - vec2<f32>(o.x, 0.0)).rgb);\n\t\tlet gy = luma(sampleS(in.uv + vec2<f32>(0.0, o.y)).rgb) - luma(sampleS(in.uv - vec2<f32>(0.0, o.y)).rgb);\n\t\tlet n = normalize(vec3<f32>(-gx * 3.0, -gy * 3.0, 1.0));\n\t\tlet slope = 1.0 - n.z;\n\t\tphase = slope * 3.0 + l * 0.6 + in.uv.x * 0.4 + in.uv.y * 0.3;\n\t\tamount = strength * clamp(0.3 + slope * 6.0, 0.0, 1.0);\n\t}\n\tphase = phase * scale + shift / 360.0;\n\tlet rainbow = 0.5 + 0.5 * cos(6.2831853 * (phase + vec3<f32>(0.0, 0.33, 0.67)));\n\tlet screened = vec3<f32>(1.0) - (vec3<f32>(1.0) - c.rgb) * (vec3<f32>(1.0) - rainbow * 0.85);\n\treturn premul(vec4<f32>(mix(c.rgb, screened, amount), c.a));\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/** Packs the effect's resolved props into the uniform block the shaders read. */\nfunction pack(raw, data, time, frame) {\n\tdata.fill(0);\n\tdata[0] = time;\n\tdata[1] = frame;\n\tdata[4] = num(raw.strength, .6);\n\tdata[5] = num(raw.scale, 2);\n\tdata[6] = num(raw.shift, 0);\n\tdata[7] = Math.max(0, [\"luminance\", \"relief\"].indexOf(String(raw.mode ?? \"relief\")));\n}\nconst IridescenceWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== OP) return;\n\tconst child = props.virtualMedia?.children?.[0];\n\tif (!child) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst frame = Math.round(props.compositionFrame ?? props.frame ?? 0);\n\tconst raw = op.effect?.resolveUniforms ? op.effect.resolveUniforms({\n\t\tframe,\n\t\tfps,\n\t\ttime: frame / fps\n\t}) : op;\n\tconst data = new Float32Array(UNIFORM_FLOATS);\n\tpack(raw, data, frame / fps, frame);\n\tconst { texture: childTex } = await drawChildToTexture(args, child);\n\tconst device = ctx.device;\n\tconst r = resources(device);\n\tconst pipelines = pipelinesFor(device, ctx.renderer.format);\n\tconst ubo = ctx.renderer.getTemporaryBuffer(data);\n\tlet prev = childTex;\n\tfor (const pipeline of pipelines) {\n\t\tconst out = ctx.renderer.getTemporaryTexture(targetWidth, targetHeight, [\n\t\t\tchildTex,\n\t\t\tprev,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tdrawFullscreenPass(encoder, out.createView(), pipeline, [device.createBindGroup({\n\t\t\tlayout: r.layout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: ubo }\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: childTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: prev.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: r.sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})]);\n\t\tprev = out;\n\t}\n\tdrawTextureToTarget(args, prev);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: IridescenceWebGPURenderer });\n\n//#endregion\nexport { IridescenceWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-qgYExzH6.mjs.map"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "./chunk-GBe2k3y8.mjs";
|
|
2
2
|
import { n as defineRenderer } from "./renderer-BSitV56h.mjs";
|
|
3
|
-
import "./dist-
|
|
4
|
-
import { c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-
|
|
3
|
+
import "./dist-CturBK2Z.mjs";
|
|
4
|
+
import { c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CN14e7Bi.mjs";
|
|
5
5
|
|
|
6
6
|
//#region ../../nodes/node-op-art/dist/renderers-BYCqPRmD.mjs
|
|
7
7
|
const OP = "OpArt";
|
|
@@ -230,4 +230,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: OpArtWebGPURenderer });
|
|
|
230
230
|
|
|
231
231
|
//#endregion
|
|
232
232
|
export { OpArtWebGPURenderer, renderers_default as default };
|
|
233
|
-
//# sourceMappingURL=renderer-
|
|
233
|
+
//# sourceMappingURL=renderer-BRWpn3dT.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-DpwlN4LH.mjs","names":[],"sources":["../../../nodes/node-op-art/dist/renderers-BYCqPRmD.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst OP = \"OpArt\";\nconst UNIFORM_FLOATS = 20;\n/** One fragment shader per pass; pass 0 reads the layer, later passes read the previous pass. */\nconst PASSES = [`struct U { v : array<vec4<f32>, 5> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet pattern = u32(u.v[1].x + 0.5);\n\tlet frequency = u.v[1].y;\n\tlet angle = u.v[1].z;\n\tlet warp = u.v[1].w;\n\tlet source = u.v[2].x;\n\tlet colorA = u.v[3];\n\tlet colorB = u.v[4];\n\n\tlet R = res();\n\tlet c = sampleS(in.uv);\n\tlet l = luma(c.rgb) * c.a + (1.0 - c.a);\n\tvar p = (in.uv - 0.5) * vec2<f32>(R.x / R.y, 1.0);\n\tp = rot2(radians(angle)) * p;\n\tvar v = p.y * frequency;\n\tif (pattern == 1u) { v = length(p) * frequency; }\n\tif (pattern == 3u) { v = p.y * frequency + sin(p.x * frequency * 0.25) * 2.0; }\n\tv += (1.0 - l) * warp * 3.0;\n\tvar v2 = p.x * frequency + (1.0 - l) * warp * 3.0;\n\tlet duty = mix(0.5, clamp(1.0 - l, 0.05, 0.95), source);\n\tlet e = max(fwidth(v), 1e-4);\n\tlet e2 = max(fwidth(v2), 1e-4);\n\tlet s = fract(v);\n\tvar ink = smoothstep(duty + e, duty - e, s) * smoothstep(-e, e, s);\n\tif (pattern == 2u) {\n\t\tlet s2 = fract(v2);\n\t\tlet a = step(0.5, s);\n\t\tlet b = step(0.5, s2);\n\t\tink = abs(a - b);\n\t\tink = mix(ink, 1.0 - ink, step(duty, 0.5) * 0.0);\n\t\tlet edgeA = smoothstep(0.0, e, min(s, 1.0 - s)) * smoothstep(0.0, e, abs(s - 0.5));\n\t\tlet edgeB = smoothstep(0.0, e2, min(s2, 1.0 - s2)) * smoothstep(0.0, e2, abs(s2 - 0.5));\n\t\tink = mix(0.5, ink, edgeA * edgeB);\n\t}\n\treturn vec4<f32>(mix(colorB.rgb, colorA.rgb, ink), 1.0);\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\nfunction hexToRgba(hex) {\n\tlet h = hex.trim().replace(\"#\", \"\");\n\tif (h.length === 3 || h.length === 4) h = [...h].map((c) => c + c).join(\"\");\n\tconst n = (i) => Number.parseInt(h.slice(i, i + 2), 16) / 255;\n\treturn [\n\t\tn(0),\n\t\tn(2),\n\t\tn(4),\n\t\th.length >= 8 ? n(6) : 1\n\t];\n}\n/** Packs the effect's resolved props into the uniform block the shaders read. */\nfunction pack(raw, data, time, frame) {\n\tdata.fill(0);\n\tdata[0] = time;\n\tdata[1] = frame;\n\tdata[4] = Math.max(0, [\n\t\t\"stripes\",\n\t\t\"rings\",\n\t\t\"checker\",\n\t\t\"waves\"\n\t].indexOf(String(raw.pattern ?? \"stripes\")));\n\tdata[5] = num(raw.frequency, 48);\n\tdata[6] = num(raw.angle, 0);\n\tdata[7] = num(raw.warp, .6);\n\tdata[8] = num(raw.source, 1);\n\tdata.set(hexToRgba(String(raw.colorA ?? \"#0a0a0a\")), 12);\n\tdata.set(hexToRgba(String(raw.colorB ?? \"#f5f5f5\")), 16);\n}\nconst OpArtWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== OP) return;\n\tconst child = props.virtualMedia?.children?.[0];\n\tif (!child) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst frame = Math.round(props.compositionFrame ?? props.frame ?? 0);\n\tconst raw = op.effect?.resolveUniforms ? op.effect.resolveUniforms({\n\t\tframe,\n\t\tfps,\n\t\ttime: frame / fps\n\t}) : op;\n\tconst data = new Float32Array(UNIFORM_FLOATS);\n\tpack(raw, data, frame / fps, frame);\n\tconst { texture: childTex } = await drawChildToTexture(args, child);\n\tconst device = ctx.device;\n\tconst r = resources(device);\n\tconst pipelines = pipelinesFor(device, ctx.renderer.format);\n\tconst ubo = ctx.renderer.getTemporaryBuffer(data);\n\tlet prev = childTex;\n\tfor (const pipeline of pipelines) {\n\t\tconst out = ctx.renderer.getTemporaryTexture(targetWidth, targetHeight, [\n\t\t\tchildTex,\n\t\t\tprev,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tdrawFullscreenPass(encoder, out.createView(), pipeline, [device.createBindGroup({\n\t\t\tlayout: r.layout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: ubo }\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: childTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: prev.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: r.sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})]);\n\t\tprev = out;\n\t}\n\tdrawTextureToTarget(args, prev);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: OpArtWebGPURenderer });\n\n//#endregion\nexport { OpArtWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-BYCqPRmD.mjs.map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderer-BRWpn3dT.mjs","names":[],"sources":["../../../nodes/node-op-art/dist/renderers-BYCqPRmD.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst OP = \"OpArt\";\nconst UNIFORM_FLOATS = 20;\n/** One fragment shader per pass; pass 0 reads the layer, later passes read the previous pass. */\nconst PASSES = [`struct U { v : array<vec4<f32>, 5> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet pattern = u32(u.v[1].x + 0.5);\n\tlet frequency = u.v[1].y;\n\tlet angle = u.v[1].z;\n\tlet warp = u.v[1].w;\n\tlet source = u.v[2].x;\n\tlet colorA = u.v[3];\n\tlet colorB = u.v[4];\n\n\tlet R = res();\n\tlet c = sampleS(in.uv);\n\tlet l = luma(c.rgb) * c.a + (1.0 - c.a);\n\tvar p = (in.uv - 0.5) * vec2<f32>(R.x / R.y, 1.0);\n\tp = rot2(radians(angle)) * p;\n\tvar v = p.y * frequency;\n\tif (pattern == 1u) { v = length(p) * frequency; }\n\tif (pattern == 3u) { v = p.y * frequency + sin(p.x * frequency * 0.25) * 2.0; }\n\tv += (1.0 - l) * warp * 3.0;\n\tvar v2 = p.x * frequency + (1.0 - l) * warp * 3.0;\n\tlet duty = mix(0.5, clamp(1.0 - l, 0.05, 0.95), source);\n\tlet e = max(fwidth(v), 1e-4);\n\tlet e2 = max(fwidth(v2), 1e-4);\n\tlet s = fract(v);\n\tvar ink = smoothstep(duty + e, duty - e, s) * smoothstep(-e, e, s);\n\tif (pattern == 2u) {\n\t\tlet s2 = fract(v2);\n\t\tlet a = step(0.5, s);\n\t\tlet b = step(0.5, s2);\n\t\tink = abs(a - b);\n\t\tink = mix(ink, 1.0 - ink, step(duty, 0.5) * 0.0);\n\t\tlet edgeA = smoothstep(0.0, e, min(s, 1.0 - s)) * smoothstep(0.0, e, abs(s - 0.5));\n\t\tlet edgeB = smoothstep(0.0, e2, min(s2, 1.0 - s2)) * smoothstep(0.0, e2, abs(s2 - 0.5));\n\t\tink = mix(0.5, ink, edgeA * edgeB);\n\t}\n\treturn vec4<f32>(mix(colorB.rgb, colorA.rgb, ink), 1.0);\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\nfunction hexToRgba(hex) {\n\tlet h = hex.trim().replace(\"#\", \"\");\n\tif (h.length === 3 || h.length === 4) h = [...h].map((c) => c + c).join(\"\");\n\tconst n = (i) => Number.parseInt(h.slice(i, i + 2), 16) / 255;\n\treturn [\n\t\tn(0),\n\t\tn(2),\n\t\tn(4),\n\t\th.length >= 8 ? n(6) : 1\n\t];\n}\n/** Packs the effect's resolved props into the uniform block the shaders read. */\nfunction pack(raw, data, time, frame) {\n\tdata.fill(0);\n\tdata[0] = time;\n\tdata[1] = frame;\n\tdata[4] = Math.max(0, [\n\t\t\"stripes\",\n\t\t\"rings\",\n\t\t\"checker\",\n\t\t\"waves\"\n\t].indexOf(String(raw.pattern ?? \"stripes\")));\n\tdata[5] = num(raw.frequency, 48);\n\tdata[6] = num(raw.angle, 0);\n\tdata[7] = num(raw.warp, .6);\n\tdata[8] = num(raw.source, 1);\n\tdata.set(hexToRgba(String(raw.colorA ?? \"#0a0a0a\")), 12);\n\tdata.set(hexToRgba(String(raw.colorB ?? \"#f5f5f5\")), 16);\n}\nconst OpArtWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== OP) return;\n\tconst child = props.virtualMedia?.children?.[0];\n\tif (!child) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst frame = Math.round(props.compositionFrame ?? props.frame ?? 0);\n\tconst raw = op.effect?.resolveUniforms ? op.effect.resolveUniforms({\n\t\tframe,\n\t\tfps,\n\t\ttime: frame / fps\n\t}) : op;\n\tconst data = new Float32Array(UNIFORM_FLOATS);\n\tpack(raw, data, frame / fps, frame);\n\tconst { texture: childTex } = await drawChildToTexture(args, child);\n\tconst device = ctx.device;\n\tconst r = resources(device);\n\tconst pipelines = pipelinesFor(device, ctx.renderer.format);\n\tconst ubo = ctx.renderer.getTemporaryBuffer(data);\n\tlet prev = childTex;\n\tfor (const pipeline of pipelines) {\n\t\tconst out = ctx.renderer.getTemporaryTexture(targetWidth, targetHeight, [\n\t\t\tchildTex,\n\t\t\tprev,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tdrawFullscreenPass(encoder, out.createView(), pipeline, [device.createBindGroup({\n\t\t\tlayout: r.layout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: ubo }\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: childTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: prev.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: r.sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})]);\n\t\tprev = out;\n\t}\n\tdrawTextureToTarget(args, prev);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: OpArtWebGPURenderer });\n\n//#endregion\nexport { OpArtWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-BYCqPRmD.mjs.map"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "./chunk-GBe2k3y8.mjs";
|
|
2
2
|
import { n as defineRenderer } from "./renderer-BSitV56h.mjs";
|
|
3
|
-
import "./dist-
|
|
4
|
-
import { c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-
|
|
3
|
+
import "./dist-CturBK2Z.mjs";
|
|
4
|
+
import { c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CN14e7Bi.mjs";
|
|
5
5
|
|
|
6
6
|
//#region ../../nodes/node-dither/dist/renderers-v80Aclc6.mjs
|
|
7
7
|
const OP = "Dither";
|
|
@@ -217,4 +217,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: DitherWebGPURenderer })
|
|
|
217
217
|
|
|
218
218
|
//#endregion
|
|
219
219
|
export { DitherWebGPURenderer, renderers_default as default };
|
|
220
|
-
//# sourceMappingURL=renderer-
|
|
220
|
+
//# sourceMappingURL=renderer-BXCZev4l.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-DerDxKK3.mjs","names":[],"sources":["../../../nodes/node-dither/dist/renderers-v80Aclc6.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst OP = \"Dither\";\nconst UNIFORM_FLOATS = 16;\n/** One fragment shader per pass; pass 0 reads the layer, later passes read the previous pass. */\nconst PASSES = [`struct U { v : array<vec4<f32>, 4> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet mode = u32(u.v[1].x + 0.5);\n\tlet levels = u.v[1].y;\n\tlet scale = u.v[1].z;\n\tlet monochrome = u.v[1].w;\n\tlet dark = u.v[2];\n\tlet light = u.v[3];\n\n\tlet R = res();\n\tlet s = max(scale, 1.0);\n\tlet cellp = floor(in.uv * R / s);\n\tlet c = texelS(cellp * s + s * 0.5);\n\tvar t = bayer8(cellp);\n\tif (mode == 1u) { t = hash12(cellp); }\n\tif (mode == 2u) { t = clamp(length(fract(cellp / 4.0) - 0.5) * 1.414, 0.0, 1.0); }\n\tlet n = max(levels - 1.0, 1.0);\n\tvar rgb : vec3<f32>;\n\tif (monochrome > 0.5) {\n\t\tlet q = clamp(floor(luma(c.rgb) * n + t) / n, 0.0, 1.0);\n\t\trgb = mix(dark.rgb, light.rgb, q);\n\t} else {\n\t\trgb = clamp(floor(c.rgb * n + vec3<f32>(t)) / n, vec3<f32>(0.0), vec3<f32>(1.0));\n\t}\n\treturn premul(vec4<f32>(rgb, c.a));\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\nfunction hexToRgba(hex) {\n\tlet h = hex.trim().replace(\"#\", \"\");\n\tif (h.length === 3 || h.length === 4) h = [...h].map((c) => c + c).join(\"\");\n\tconst n = (i) => Number.parseInt(h.slice(i, i + 2), 16) / 255;\n\treturn [\n\t\tn(0),\n\t\tn(2),\n\t\tn(4),\n\t\th.length >= 8 ? n(6) : 1\n\t];\n}\n/** Packs the effect's resolved props into the uniform block the shaders read. */\nfunction pack(raw, data, time, frame) {\n\tdata.fill(0);\n\tdata[0] = time;\n\tdata[1] = frame;\n\tdata[4] = Math.max(0, [\n\t\t\"bayer\",\n\t\t\"noise\",\n\t\t\"halftone\"\n\t].indexOf(String(raw.mode ?? \"bayer\")));\n\tdata[5] = num(raw.levels, 2);\n\tdata[6] = num(raw.scale, 2);\n\tdata[7] = raw.monochrome === void 0 ? 1 : raw.monochrome ? 1 : 0;\n\tdata.set(hexToRgba(String(raw.dark ?? \"#111111\")), 8);\n\tdata.set(hexToRgba(String(raw.light ?? \"#f2efe6\")), 12);\n}\nconst DitherWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== OP) return;\n\tconst child = props.virtualMedia?.children?.[0];\n\tif (!child) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst frame = Math.round(props.compositionFrame ?? props.frame ?? 0);\n\tconst raw = op.effect?.resolveUniforms ? op.effect.resolveUniforms({\n\t\tframe,\n\t\tfps,\n\t\ttime: frame / fps\n\t}) : op;\n\tconst data = new Float32Array(UNIFORM_FLOATS);\n\tpack(raw, data, frame / fps, frame);\n\tconst { texture: childTex } = await drawChildToTexture(args, child);\n\tconst device = ctx.device;\n\tconst r = resources(device);\n\tconst pipelines = pipelinesFor(device, ctx.renderer.format);\n\tconst ubo = ctx.renderer.getTemporaryBuffer(data);\n\tlet prev = childTex;\n\tfor (const pipeline of pipelines) {\n\t\tconst out = ctx.renderer.getTemporaryTexture(targetWidth, targetHeight, [\n\t\t\tchildTex,\n\t\t\tprev,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tdrawFullscreenPass(encoder, out.createView(), pipeline, [device.createBindGroup({\n\t\t\tlayout: r.layout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: ubo }\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: childTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: prev.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: r.sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})]);\n\t\tprev = out;\n\t}\n\tdrawTextureToTarget(args, prev);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: DitherWebGPURenderer });\n\n//#endregion\nexport { DitherWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-v80Aclc6.mjs.map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderer-BXCZev4l.mjs","names":[],"sources":["../../../nodes/node-dither/dist/renderers-v80Aclc6.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst OP = \"Dither\";\nconst UNIFORM_FLOATS = 16;\n/** One fragment shader per pass; pass 0 reads the layer, later passes read the previous pass. */\nconst PASSES = [`struct U { v : array<vec4<f32>, 4> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet mode = u32(u.v[1].x + 0.5);\n\tlet levels = u.v[1].y;\n\tlet scale = u.v[1].z;\n\tlet monochrome = u.v[1].w;\n\tlet dark = u.v[2];\n\tlet light = u.v[3];\n\n\tlet R = res();\n\tlet s = max(scale, 1.0);\n\tlet cellp = floor(in.uv * R / s);\n\tlet c = texelS(cellp * s + s * 0.5);\n\tvar t = bayer8(cellp);\n\tif (mode == 1u) { t = hash12(cellp); }\n\tif (mode == 2u) { t = clamp(length(fract(cellp / 4.0) - 0.5) * 1.414, 0.0, 1.0); }\n\tlet n = max(levels - 1.0, 1.0);\n\tvar rgb : vec3<f32>;\n\tif (monochrome > 0.5) {\n\t\tlet q = clamp(floor(luma(c.rgb) * n + t) / n, 0.0, 1.0);\n\t\trgb = mix(dark.rgb, light.rgb, q);\n\t} else {\n\t\trgb = clamp(floor(c.rgb * n + vec3<f32>(t)) / n, vec3<f32>(0.0), vec3<f32>(1.0));\n\t}\n\treturn premul(vec4<f32>(rgb, c.a));\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\nfunction hexToRgba(hex) {\n\tlet h = hex.trim().replace(\"#\", \"\");\n\tif (h.length === 3 || h.length === 4) h = [...h].map((c) => c + c).join(\"\");\n\tconst n = (i) => Number.parseInt(h.slice(i, i + 2), 16) / 255;\n\treturn [\n\t\tn(0),\n\t\tn(2),\n\t\tn(4),\n\t\th.length >= 8 ? n(6) : 1\n\t];\n}\n/** Packs the effect's resolved props into the uniform block the shaders read. */\nfunction pack(raw, data, time, frame) {\n\tdata.fill(0);\n\tdata[0] = time;\n\tdata[1] = frame;\n\tdata[4] = Math.max(0, [\n\t\t\"bayer\",\n\t\t\"noise\",\n\t\t\"halftone\"\n\t].indexOf(String(raw.mode ?? \"bayer\")));\n\tdata[5] = num(raw.levels, 2);\n\tdata[6] = num(raw.scale, 2);\n\tdata[7] = raw.monochrome === void 0 ? 1 : raw.monochrome ? 1 : 0;\n\tdata.set(hexToRgba(String(raw.dark ?? \"#111111\")), 8);\n\tdata.set(hexToRgba(String(raw.light ?? \"#f2efe6\")), 12);\n}\nconst DitherWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== OP) return;\n\tconst child = props.virtualMedia?.children?.[0];\n\tif (!child) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst frame = Math.round(props.compositionFrame ?? props.frame ?? 0);\n\tconst raw = op.effect?.resolveUniforms ? op.effect.resolveUniforms({\n\t\tframe,\n\t\tfps,\n\t\ttime: frame / fps\n\t}) : op;\n\tconst data = new Float32Array(UNIFORM_FLOATS);\n\tpack(raw, data, frame / fps, frame);\n\tconst { texture: childTex } = await drawChildToTexture(args, child);\n\tconst device = ctx.device;\n\tconst r = resources(device);\n\tconst pipelines = pipelinesFor(device, ctx.renderer.format);\n\tconst ubo = ctx.renderer.getTemporaryBuffer(data);\n\tlet prev = childTex;\n\tfor (const pipeline of pipelines) {\n\t\tconst out = ctx.renderer.getTemporaryTexture(targetWidth, targetHeight, [\n\t\t\tchildTex,\n\t\t\tprev,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tdrawFullscreenPass(encoder, out.createView(), pipeline, [device.createBindGroup({\n\t\t\tlayout: r.layout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: ubo }\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: childTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: prev.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: r.sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})]);\n\t\tprev = out;\n\t}\n\tdrawTextureToTarget(args, prev);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: DitherWebGPURenderer });\n\n//#endregion\nexport { DitherWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-v80Aclc6.mjs.map"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { c as solveHomography, n as defineRenderer } from "./renderer-BSitV56h.mjs";
|
|
2
|
-
import { a as createFullscreenPipeline, c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, r as STRAIGHT_ALPHA_BLEND, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-
|
|
2
|
+
import { a as createFullscreenPipeline, c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, r as STRAIGHT_ALPHA_BLEND, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-CN14e7Bi.mjs";
|
|
3
3
|
|
|
4
4
|
//#region ../../nodes/node-corner-pin/dist/renderers-pM5Tx32P.mjs
|
|
5
5
|
function getDefaultPoints() {
|
|
@@ -145,4 +145,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: CornerPinWebGPURenderer
|
|
|
145
145
|
|
|
146
146
|
//#endregion
|
|
147
147
|
export { renderers_default as t };
|
|
148
|
-
//# sourceMappingURL=renderer-
|
|
148
|
+
//# sourceMappingURL=renderer-BYj8x8YM.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-
|
|
1
|
+
{"version":3,"file":"renderer-BYj8x8YM.mjs","names":[],"sources":["../../../nodes/node-corner-pin/dist/renderers-pM5Tx32P.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, STRAIGHT_ALPHA_BLEND, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\nimport { solveHomography } from \"@framefields/node-sdk\";\n\n//#region src/shared/utils.ts\nfunction getDefaultPoints() {\n\treturn [\n\t\t{\n\t\t\tx: 0,\n\t\t\ty: 0\n\t\t},\n\t\t{\n\t\t\tx: 100,\n\t\t\ty: 0\n\t\t},\n\t\t{\n\t\t\tx: 0,\n\t\t\ty: 100\n\t\t},\n\t\t{\n\t\t\tx: 100,\n\t\t\ty: 100\n\t\t}\n\t];\n}\n/**\n* Homography mapping the corner-pin quad (percent coordinates, TL, TR, BL, BR)\n* to the unit square it samples from. Falls back to the identity quad.\n*/\nfunction solveCornerPinHomography(targetPoints) {\n\treturn solveHomography((targetPoints && targetPoints.length === 4 ? targetPoints : getDefaultPoints()).map((p) => ({\n\t\tx: p.x / 100,\n\t\ty: p.y / 100\n\t})));\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst cornerPinWgsl = `\nstruct CornerPinUniforms {\n\tmatrix_row0 : vec4<f32>,\n\tmatrix_row1 : vec4<f32>,\n\tmatrix_row2 : vec4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : CornerPinUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet x = in.uv.x;\n\tlet y = in.uv.y;\n\n\tlet d = u.matrix_row2.x * x + u.matrix_row2.y * y + u.matrix_row2.z;\n\tif (abs(d) < 1e-6) {\n\t\treturn vec4<f32>(0.0);\n\t}\n\n\tlet src_u = (u.matrix_row0.x * x + u.matrix_row0.y * y + u.matrix_row0.z) / d;\n\tlet src_v = (u.matrix_row1.x * x + u.matrix_row1.y * y + u.matrix_row1.z) / d;\n\n\tif (src_u < 0.0 || src_u > 1.0 || src_v < 0.0 || src_v > 1.0) {\n\t\treturn vec4<f32>(0.0);\n\t}\n\n\tlet color = textureSampleLevel(tex, samp, vec2<f32>(src_u, src_v), 0.0);\n\treturn color;\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getCornerPinResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (!res) {\n\t\tconst pinUniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\t\tconst pinTextureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\t\tres = {\n\t\t\tpinPipeline: createFullscreenPipeline(device, {\n\t\t\t\tlabel: \"CornerPinPipeline\",\n\t\t\t\tmodule: device.createShaderModule({\n\t\t\t\t\tlabel: \"corner_pin.wgsl\",\n\t\t\t\t\tcode: cornerPinWgsl\n\t\t\t\t}),\n\t\t\t\tlayouts: [pinUniformLayout, pinTextureLayout],\n\t\t\t\tformat,\n\t\t\t\tblend: STRAIGHT_ALPHA_BLEND\n\t\t\t}),\n\t\t\tpinUniformLayout,\n\t\t\tpinTextureLayout\n\t\t};\n\t\tdeviceResourceCache.set(device, res);\n\t}\n\treturn res;\n}\nconst CornerPinWebGPURenderer = async (args) => {\n\tconst { ctx, props, targetTexture, targetWidth, targetHeight, encoder } = args;\n\tconst { virtualMedia } = props;\n\tconst op = virtualMedia?.operation;\n\tif (!op || op.op !== \"CornerPin\") return;\n\tconst childMedia = virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tconst sourceWidth = op.originalWidth ?? childMedia.metadata?.width ?? props.containerWidth ?? targetWidth;\n\tconst sourceHeight = op.originalHeight ?? childMedia.metadata?.height ?? props.containerHeight ?? targetHeight;\n\targs.pass.end();\n\tconst { texture: childTex } = await drawChildToTexture(args, childMedia, {\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tcontainerWidth: sourceWidth,\n\t\t\tcontainerHeight: sourceHeight,\n\t\t\tvirtualMedia: childMedia\n\t\t}\n\t});\n\tconst h = solveCornerPinHomography(op.points || []);\n\tconst uniformData = new Float32Array(12);\n\tuniformData[0] = h[0];\n\tuniformData[1] = h[1];\n\tuniformData[2] = h[2];\n\tuniformData[3] = 0;\n\tuniformData[4] = h[3];\n\tuniformData[5] = h[4];\n\tuniformData[6] = h[5];\n\tuniformData[7] = 0;\n\tuniformData[8] = h[6];\n\tuniformData[9] = h[7];\n\tuniformData[10] = h[8];\n\tuniformData[11] = 0;\n\tconst { pinPipeline: pipeline, pinUniformLayout: uLayout, pinTextureLayout: tLayout } = getCornerPinResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst uniformBindGroup = 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\tconst textureBindGroup = ctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, childTex, sampler);\n\tconst outTex = ctx.renderer.getTemporaryTexture(targetWidth, targetHeight, [\n\t\tchildTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [uniformBindGroup, textureBindGroup]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: CornerPinWebGPURenderer });\n\n//#endregion\nexport { getDefaultPoints as n, solveCornerPinHomography as r, renderers_default as t };\n//# sourceMappingURL=renderers-pM5Tx32P.mjs.map"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "./chunk-GBe2k3y8.mjs";
|
|
2
2
|
import { n as defineRenderer } from "./renderer-BSitV56h.mjs";
|
|
3
|
-
import "./dist-
|
|
4
|
-
import { c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-
|
|
3
|
+
import "./dist-CturBK2Z.mjs";
|
|
4
|
+
import { c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CN14e7Bi.mjs";
|
|
5
5
|
|
|
6
6
|
//#region ../../nodes/node-rgb-split/dist/renderers-BrKktWQX.mjs
|
|
7
7
|
const OP = "RGBSplit";
|
|
@@ -188,4 +188,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: RGBSplitWebGPURenderer
|
|
|
188
188
|
|
|
189
189
|
//#endregion
|
|
190
190
|
export { RGBSplitWebGPURenderer, renderers_default as default };
|
|
191
|
-
//# sourceMappingURL=renderer-
|
|
191
|
+
//# sourceMappingURL=renderer-BaOC1Pd1.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-
|
|
1
|
+
{"version":3,"file":"renderer-BaOC1Pd1.mjs","names":[],"sources":["../../../nodes/node-rgb-split/dist/renderers-BrKktWQX.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst OP = \"RGBSplit\";\nconst UNIFORM_FLOATS = 8;\n/** One fragment shader per pass; pass 0 reads the layer, later passes read the previous pass. */\nconst PASSES = [`struct U { v : array<vec4<f32>, 2> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet amount = u.v[1].x;\n\tlet angle = u.v[1].y;\n\tlet radial = u.v[1].z;\n\n\tlet R = res();\n\tlet a = radians(angle);\n\tvar d = vec2<f32>(cos(a), sin(a)) * amount / R;\n\tif (radial > 0.5) { d = (in.uv - 0.5) * 2.0 * amount / R; }\n\tlet cr = sampleP(in.uv + d);\n\tlet cg = sampleP(in.uv);\n\tlet cb = sampleP(in.uv - d);\n\treturn vec4<f32>(cr.r, cg.g, cb.b, max(max(cr.a, cg.a), cb.a));\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/** Packs the effect's resolved props into the uniform block the shaders read. */\nfunction pack(raw, data, time, frame) {\n\tdata.fill(0);\n\tdata[0] = time;\n\tdata[1] = frame;\n\tdata[4] = num(raw.amount, 8);\n\tdata[5] = num(raw.angle, 0);\n\tdata[6] = raw.radial === void 0 ? 0 : raw.radial ? 1 : 0;\n}\nconst RGBSplitWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== OP) return;\n\tconst child = props.virtualMedia?.children?.[0];\n\tif (!child) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst frame = Math.round(props.compositionFrame ?? props.frame ?? 0);\n\tconst raw = op.effect?.resolveUniforms ? op.effect.resolveUniforms({\n\t\tframe,\n\t\tfps,\n\t\ttime: frame / fps\n\t}) : op;\n\tconst data = new Float32Array(UNIFORM_FLOATS);\n\tpack(raw, data, frame / fps, frame);\n\tconst { texture: childTex } = await drawChildToTexture(args, child);\n\tconst device = ctx.device;\n\tconst r = resources(device);\n\tconst pipelines = pipelinesFor(device, ctx.renderer.format);\n\tconst ubo = ctx.renderer.getTemporaryBuffer(data);\n\tlet prev = childTex;\n\tfor (const pipeline of pipelines) {\n\t\tconst out = ctx.renderer.getTemporaryTexture(targetWidth, targetHeight, [\n\t\t\tchildTex,\n\t\t\tprev,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tdrawFullscreenPass(encoder, out.createView(), pipeline, [device.createBindGroup({\n\t\t\tlayout: r.layout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: ubo }\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: childTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: prev.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: r.sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})]);\n\t\tprev = out;\n\t}\n\tdrawTextureToTarget(args, prev);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: RGBSplitWebGPURenderer });\n\n//#endregion\nexport { RGBSplitWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-BrKktWQX.mjs.map"],"mappings":"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"}
|