framefields 2.5.1 → 2.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/audio/index.d.mts +4 -4
- package/dist/audio/index.mjs +10 -10
- package/dist/{audio-C1A4N3Wh.d.mts → audio-2ew5y0Bl.d.mts} +3 -3
- package/dist/{audio-C1A4N3Wh.d.mts.map → audio-2ew5y0Bl.d.mts.map} +1 -1
- package/dist/{audio-CZwVENqB.mjs → audio-DrUskzwZ.mjs} +4 -4
- package/dist/{audio-CZwVENqB.mjs.map → audio-DrUskzwZ.mjs.map} +1 -1
- package/dist/components/index.d.mts +10 -10
- package/dist/components/index.mjs +44 -44
- package/dist/{dist-CQZ5_60A.mjs → dist-BPOi5xb_.mjs} +2 -2
- package/dist/{dist-CQZ5_60A.mjs.map → dist-BPOi5xb_.mjs.map} +1 -1
- package/dist/{dist-DBWkkSvJ.mjs → dist-Bf0H4lp1.mjs} +66 -28
- package/dist/dist-Bf0H4lp1.mjs.map +1 -0
- package/dist/{dist-DFeF-ygz.mjs → dist-D021IFfp.mjs} +3 -1
- package/dist/{dist-DFeF-ygz.mjs.map → dist-D021IFfp.mjs.map} +1 -1
- package/dist/{dist-DHQVWaV2.mjs → dist-DG65RDhc.mjs} +3 -3
- package/dist/{dist-DHQVWaV2.mjs.map → dist-DG65RDhc.mjs.map} +1 -1
- package/dist/effects/index.d.mts +4 -4
- package/dist/effects/index.mjs +35 -35
- package/dist/{effects-DZvq-nWT.mjs → effects-Z-brb-n7.mjs} +3 -3
- package/dist/{effects-DZvq-nWT.mjs.map → effects-Z-brb-n7.mjs.map} +1 -1
- package/dist/fonts/index.mjs +2 -2
- package/dist/{fonts-DcsxFpyU.mjs → fonts-DqYgk_1a.mjs} +2 -2
- package/dist/{fonts-DcsxFpyU.mjs.map → fonts-DqYgk_1a.mjs.map} +1 -1
- package/dist/{gpu-Dq_uI_00.mjs → gpu-CevnCkZC.mjs} +2 -2
- package/dist/{gpu-Dq_uI_00.mjs.map → gpu-CevnCkZC.mjs.map} +1 -1
- package/dist/{index-C2f4Hm-p.d.mts → index-COQTaniR.d.mts} +2 -2
- package/dist/{index-C2f4Hm-p.d.mts.map → index-COQTaniR.d.mts.map} +1 -1
- package/dist/{index-fymoeGNW.d.mts → index-CZK6CFLy.d.mts} +22 -19
- package/dist/index-CZK6CFLy.d.mts.map +1 -0
- package/dist/{index-BpdVOlsV.d.mts → index-CfMylY3O.d.mts} +3 -3
- package/dist/{index-BpdVOlsV.d.mts.map → index-CfMylY3O.d.mts.map} +1 -1
- package/dist/{index-DNKM3to5.d.mts → index-D1C735Wp.d.mts} +3 -3
- package/dist/{index-DNKM3to5.d.mts.map → index-D1C735Wp.d.mts.map} +1 -1
- package/dist/{index-D6-lH1Mx.d.mts → index-DSGFMpwL.d.mts} +4 -4
- package/dist/{index-D6-lH1Mx.d.mts.map → index-DSGFMpwL.d.mts.map} +1 -1
- package/dist/{index-B-KVpJMb.d.mts → index-KqW22NHL.d.mts} +2 -2
- package/dist/{index-B-KVpJMb.d.mts.map → index-KqW22NHL.d.mts.map} +1 -1
- package/dist/{index-DKssQ_wn.d.mts → index-tCKz9Tku.d.mts} +231 -233
- package/dist/index-tCKz9Tku.d.mts.map +1 -0
- package/dist/index.d.mts +11 -11
- package/dist/index.mjs +52 -52
- package/dist/preview/index.d.mts +3 -3
- package/dist/preview/index.mjs +10 -10
- package/dist/{preview-CYI4i4m3.mjs → preview-DVw2jLDh.mjs} +2 -2
- package/dist/{preview-CYI4i4m3.mjs.map → preview-DVw2jLDh.mjs.map} +1 -1
- package/dist/preview-engine/{chunk-3I6B3YPF.mjs → chunk-2WOCQNZX.mjs} +3 -3
- package/dist/preview-engine/{chunk-PDM3TJ45.mjs → chunk-45XGWIOY.mjs} +1 -1
- package/dist/preview-engine/{chunk-XUPZBI3Y.mjs → chunk-5FTCPTOX.mjs} +13 -7
- package/dist/preview-engine/{chunk-Z4TKEI3I.mjs → chunk-B555EGEU.mjs} +1 -1
- package/dist/preview-engine/{chunk-6GMEF2QB.mjs → chunk-FAEWI3LF.mjs} +1 -1
- package/dist/preview-engine/{chunk-W4HIVUUA.mjs → chunk-I3ZTDIVM.mjs} +1 -1
- package/dist/preview-engine/{chunk-CT2WFPYG.mjs → chunk-MCFYUKAJ.mjs} +8 -8
- package/dist/preview-engine/{chunk-AB5VITYM.mjs → chunk-PR37RCNO.mjs} +1 -1
- package/dist/preview-engine/{chunk-NAISBHLR.mjs → chunk-QP24X77K.mjs} +1 -1
- package/dist/preview-engine/chunk-SYP4AJMF.mjs +1 -0
- package/dist/preview-engine/{chunk-SNASF7OM.mjs → chunk-YSXMXD3F.mjs} +1 -1
- package/dist/preview-engine/components.mjs +1 -1
- package/dist/preview-engine/effects.mjs +1 -1
- package/dist/preview-engine/fonts.mjs +1 -1
- package/dist/preview-engine/framefields.mjs +1 -1
- package/dist/preview-engine/player.mjs +1 -1
- package/dist/preview-engine/renderers-BILNWTUC.mjs +228 -0
- package/dist/preview-engine/{renderers-HJ6NO5ZD.mjs → renderers-EJATUIUP.mjs} +1 -1
- package/dist/preview-engine/renderers-SKT7AGGE.mjs +1 -0
- package/dist/{program-BdPDtfVv.mjs → program-4mAVgg3c.mjs} +4 -4
- package/dist/{program-BdPDtfVv.mjs.map → program-4mAVgg3c.mjs.map} +1 -1
- package/dist/registry/captions.json +1 -1
- package/dist/registry/lower-third.json +1 -1
- package/dist/registry/meter.json +1 -1
- package/dist/renderer/index.d.mts +2 -2
- package/dist/renderer/index.mjs +2 -2
- package/dist/renderer-1ymN1FIT.mjs +5 -0
- package/dist/{renderer-VdTs-dqH.mjs → renderer-4P-DCjk2.mjs} +3 -3
- package/dist/{renderer-VdTs-dqH.mjs.map → renderer-4P-DCjk2.mjs.map} +1 -1
- package/dist/{renderer-B4blg067.mjs → renderer-5-9DPis6.mjs} +3 -3
- package/dist/{renderer-B4blg067.mjs.map → renderer-5-9DPis6.mjs.map} +1 -1
- package/dist/{renderer-COXKPofU.d.mts → renderer-92IAZzBU.d.mts} +2 -2
- package/dist/{renderer-COXKPofU.d.mts.map → renderer-92IAZzBU.d.mts.map} +1 -1
- package/dist/{renderer-o_JK4YfO.mjs → renderer-9gjn790a.mjs} +3 -3
- package/dist/{renderer-o_JK4YfO.mjs.map → renderer-9gjn790a.mjs.map} +1 -1
- package/dist/renderer-B-43EuKb.mjs +5 -0
- package/dist/renderer-B-v5ZboU.mjs +5 -0
- package/dist/{renderer-IMg0dK6K.mjs → renderer-B8PNlKEM.mjs} +3 -3
- package/dist/{renderer-IMg0dK6K.mjs.map → renderer-B8PNlKEM.mjs.map} +1 -1
- package/dist/{renderer-Db_wphHH.mjs → renderer-B9AZ6R1U.mjs} +64 -21
- package/dist/renderer-B9AZ6R1U.mjs.map +1 -0
- package/dist/{renderer-7DyjqxEj.mjs → renderer-B9iVE2GG.mjs} +3 -3
- package/dist/{renderer-7DyjqxEj.mjs.map → renderer-B9iVE2GG.mjs.map} +1 -1
- package/dist/{renderer-ChCUad83.mjs → renderer-B9m7xIPo.mjs} +3 -3
- package/dist/{renderer-ChCUad83.mjs.map → renderer-B9m7xIPo.mjs.map} +1 -1
- package/dist/{renderer-BAkPq8qo.mjs → renderer-B9yv3R1y.mjs} +2 -2
- package/dist/{renderer-BAkPq8qo.mjs.map → renderer-B9yv3R1y.mjs.map} +1 -1
- package/dist/{renderer-DuQMzR3v.mjs → renderer-BBA-iCi-.mjs} +8 -417
- package/dist/renderer-BBA-iCi-.mjs.map +1 -0
- package/dist/{renderer-l_U6kA8K.mjs → renderer-BIYJKdwA.mjs} +2 -2
- package/dist/{renderer-l_U6kA8K.mjs.map → renderer-BIYJKdwA.mjs.map} +1 -1
- package/dist/{renderer-DQuKNgIx.mjs → renderer-BIt-At3v.mjs} +4 -4
- package/dist/{renderer-DQuKNgIx.mjs.map → renderer-BIt-At3v.mjs.map} +1 -1
- package/dist/renderer-BKF8Sfbg.mjs +3 -0
- package/dist/{renderer-D2ru2Afi.mjs → renderer-BKayVZhL.mjs} +3 -3
- package/dist/{renderer-D2ru2Afi.mjs.map → renderer-BKayVZhL.mjs.map} +1 -1
- package/dist/renderer-BTB8ifgH.mjs +5 -0
- package/dist/{renderer-fH9SCJC2.mjs → renderer-BVtQzjgT.mjs} +2 -2
- package/dist/{renderer-fH9SCJC2.mjs.map → renderer-BVtQzjgT.mjs.map} +1 -1
- package/dist/{renderer-DBjV6C2u.mjs → renderer-BWqQxZNk.mjs} +2 -2
- package/dist/renderer-BYxzR6Hp.mjs +5 -0
- package/dist/renderer-BcGhO_Mw.mjs +5 -0
- package/dist/{renderer-DK34NH92.mjs → renderer-BcSSAzc4.mjs} +3 -3
- package/dist/{renderer-DK34NH92.mjs.map → renderer-BcSSAzc4.mjs.map} +1 -1
- package/dist/{renderer-BBTkfhL8.mjs → renderer-Bh0dwc8n.mjs} +3 -3
- package/dist/{renderer-BBTkfhL8.mjs.map → renderer-Bh0dwc8n.mjs.map} +1 -1
- package/dist/{renderer-CDX2f82b.mjs → renderer-BjxceNBj.mjs} +3 -3
- package/dist/{renderer-CDX2f82b.mjs.map → renderer-BjxceNBj.mjs.map} +1 -1
- package/dist/renderer-Bk3RgiFg.mjs +5 -0
- package/dist/{renderer-Bmj7AyJP.mjs → renderer-Bk7vVfTu.mjs} +3 -3
- package/dist/{renderer-Bmj7AyJP.mjs.map → renderer-Bk7vVfTu.mjs.map} +1 -1
- package/dist/{renderer-Ch7qwjH9.mjs → renderer-BmX2CmyO.mjs} +3 -3
- package/dist/{renderer-Ch7qwjH9.mjs.map → renderer-BmX2CmyO.mjs.map} +1 -1
- package/dist/{renderer-Bo1PY0zW.mjs → renderer-BpBhvMi1.mjs} +2 -2
- package/dist/{renderer-ZjSP5jw6.mjs → renderer-Bt_j2Zi6.mjs} +2 -2
- package/dist/{renderer-ZjSP5jw6.mjs.map → renderer-Bt_j2Zi6.mjs.map} +1 -1
- package/dist/renderer-BvItCxkw.mjs +5 -0
- package/dist/{renderer-Bw5YP2Db.mjs → renderer-BwRLXhxJ.mjs} +3 -3
- package/dist/{renderer-Bw5YP2Db.mjs.map → renderer-BwRLXhxJ.mjs.map} +1 -1
- package/dist/{renderer-CWSM0IGG.mjs → renderer-C0P8ZRiC.mjs} +2 -2
- package/dist/{renderer-CWSM0IGG.mjs.map → renderer-C0P8ZRiC.mjs.map} +1 -1
- package/dist/{renderer-Z39F9QK5.mjs → renderer-C1sFg34Y.mjs} +3 -3
- package/dist/{renderer-Z39F9QK5.mjs.map → renderer-C1sFg34Y.mjs.map} +1 -1
- package/dist/{renderer-BGNdwdCR.mjs → renderer-C4f_X1Qc.mjs} +3 -3
- package/dist/{renderer-BGNdwdCR.mjs.map → renderer-C4f_X1Qc.mjs.map} +1 -1
- package/dist/{renderer-DyMEAZIm.mjs → renderer-C4pS7aAI.mjs} +4 -4
- package/dist/{renderer-DyMEAZIm.mjs.map → renderer-C4pS7aAI.mjs.map} +1 -1
- package/dist/{renderer-BWa3CLK7.mjs → renderer-C5h2TSjH.mjs} +2 -2
- package/dist/{renderer-BWa3CLK7.mjs.map → renderer-C5h2TSjH.mjs.map} +1 -1
- package/dist/{renderer-BN_n6O6P.mjs → renderer-C7HIJcJK.mjs} +3 -3
- package/dist/{renderer-BN_n6O6P.mjs.map → renderer-C7HIJcJK.mjs.map} +1 -1
- package/dist/{renderer-G3px5ODP.mjs → renderer-C8-NmotX.mjs} +3 -3
- package/dist/{renderer-G3px5ODP.mjs.map → renderer-C8-NmotX.mjs.map} +1 -1
- package/dist/renderer-CCnfPHqk.mjs +5 -0
- package/dist/{renderer-Dx28wTi1.d.mts → renderer-CE9N4EEI.d.mts} +2 -2
- package/dist/{renderer-Dx28wTi1.d.mts.map → renderer-CE9N4EEI.d.mts.map} +1 -1
- package/dist/{renderer-CLO8QHWE.mjs → renderer-CGKKjJ5Q.mjs} +3 -3
- package/dist/{renderer-CLO8QHWE.mjs.map → renderer-CGKKjJ5Q.mjs.map} +1 -1
- package/dist/renderer-CIoWQNaA.mjs +5 -0
- package/dist/{renderer-2bipMLqz.mjs → renderer-CJ2-jEy7.mjs} +2 -2
- package/dist/{renderer-2bipMLqz.mjs.map → renderer-CJ2-jEy7.mjs.map} +1 -1
- package/dist/renderer-CMwQtIIq.mjs +5 -0
- package/dist/renderer-CN8kRB90.mjs +6 -0
- package/dist/renderer-CPKBDif1.mjs +5 -0
- package/dist/{renderer-Cj1giMd0.mjs → renderer-CPl1wOrj.mjs} +2 -2
- package/dist/{renderer-Cj1giMd0.mjs.map → renderer-CPl1wOrj.mjs.map} +1 -1
- package/dist/{renderer-BmoQJUJO.mjs → renderer-CT_3Fegr.mjs} +3 -3
- package/dist/{renderer-BmoQJUJO.mjs.map → renderer-CT_3Fegr.mjs.map} +1 -1
- package/dist/{renderer-BfrzKmRh.mjs → renderer-CTvPNRMH.mjs} +2 -2
- package/dist/{renderer-BfrzKmRh.mjs.map → renderer-CTvPNRMH.mjs.map} +1 -1
- package/dist/{renderer-DWaqF7-6.mjs → renderer-CWnhRMOq.mjs} +3 -3
- package/dist/{renderer-DWaqF7-6.mjs.map → renderer-CWnhRMOq.mjs.map} +1 -1
- package/dist/{renderer-BBTdHKH7.mjs → renderer-CXa6SWXy.mjs} +3 -3
- package/dist/{renderer-BBTdHKH7.mjs.map → renderer-CXa6SWXy.mjs.map} +1 -1
- package/dist/renderer-CamsHxEP.mjs +5 -0
- package/dist/{renderer-CMEqUhrW.mjs → renderer-Cb5uDZm0.mjs} +3 -3
- package/dist/{renderer-CMEqUhrW.mjs.map → renderer-Cb5uDZm0.mjs.map} +1 -1
- package/dist/renderer-CeQormOH.mjs +5 -0
- package/dist/renderer-Cex4eMtv.mjs +5 -0
- package/dist/{renderer-kP5Y282J.mjs → renderer-CgMnZYTM.mjs} +4 -4
- package/dist/{renderer-kP5Y282J.mjs.map → renderer-CgMnZYTM.mjs.map} +1 -1
- package/dist/{renderer-B5YYBBDq.mjs → renderer-CjcrhBB2.mjs} +2 -2
- package/dist/{renderer-B5YYBBDq.mjs.map → renderer-CjcrhBB2.mjs.map} +1 -1
- package/dist/{renderer-CXbXF7Dh.mjs → renderer-Cjw6lyaK.mjs} +3 -3
- package/dist/{renderer-CXbXF7Dh.mjs.map → renderer-Cjw6lyaK.mjs.map} +1 -1
- package/dist/renderer-CjyTrNlr.mjs +5 -0
- package/dist/{renderer-D6p8b6ql.mjs → renderer-CkJXq4bD.mjs} +3 -3
- package/dist/{renderer-D6p8b6ql.mjs.map → renderer-CkJXq4bD.mjs.map} +1 -1
- package/dist/renderer-Clv9TO6C.mjs +5 -0
- package/dist/{renderer-gjT5v76-.mjs → renderer-Cm9fEQsw.mjs} +2 -2
- package/dist/{renderer-gjT5v76-.mjs.map → renderer-Cm9fEQsw.mjs.map} +1 -1
- package/dist/{renderer-CJoa4H2G.mjs → renderer-CuwVuVKG.mjs} +2 -2
- package/dist/{renderer-CJoa4H2G.mjs.map → renderer-CuwVuVKG.mjs.map} +1 -1
- package/dist/{renderer-D5u3GVtD.mjs → renderer-CvYxxS_X.mjs} +71 -71
- package/dist/{renderer-D5u3GVtD.mjs.map → renderer-CvYxxS_X.mjs.map} +1 -1
- package/dist/{renderer-VxVi_0c7.mjs → renderer-CxOaqnho.mjs} +2 -2
- package/dist/{renderer-VxVi_0c7.mjs.map → renderer-CxOaqnho.mjs.map} +1 -1
- package/dist/{renderer-DkPDYtD3.mjs → renderer-CxkUI9s_.mjs} +3 -3
- package/dist/{renderer-DkPDYtD3.mjs.map → renderer-CxkUI9s_.mjs.map} +1 -1
- package/dist/{renderer-BYJS2lhn.mjs → renderer-Cz5SOnJr.mjs} +3 -3
- package/dist/{renderer-BYJS2lhn.mjs.map → renderer-Cz5SOnJr.mjs.map} +1 -1
- package/dist/{renderer-WVrUeiLZ.mjs → renderer-D-FwaV1R.mjs} +2 -2
- package/dist/{renderer-BWnFh7NO.mjs → renderer-D0iSbNza.mjs} +3 -3
- package/dist/{renderer-BWnFh7NO.mjs.map → renderer-D0iSbNza.mjs.map} +1 -1
- package/dist/{renderer-DHqicGgT.mjs → renderer-D22g6ION.mjs} +3 -3
- package/dist/{renderer-DHqicGgT.mjs.map → renderer-D22g6ION.mjs.map} +1 -1
- package/dist/renderer-D4LnJk-M.mjs +5 -0
- package/dist/renderer-D5OfQ8Ut.mjs +5 -0
- package/dist/renderer-DBYssktC.mjs +5 -0
- package/dist/renderer-DC-Aj3me.mjs +5 -0
- package/dist/renderer-DG97_Aoc.mjs +5 -0
- package/dist/{renderer-Cjs1OeBu.mjs → renderer-DPVEs5ME.mjs} +3 -3
- package/dist/{renderer-Cjs1OeBu.mjs.map → renderer-DPVEs5ME.mjs.map} +1 -1
- package/dist/{renderer-COtZ315B.mjs → renderer-DPzair18.mjs} +2 -2
- package/dist/renderer-DS4UGjcS.mjs +5 -0
- package/dist/{renderer-PLoGrFGz.mjs → renderer-DTXAa2pL.mjs} +3 -3
- package/dist/{renderer-PLoGrFGz.mjs.map → renderer-DTXAa2pL.mjs.map} +1 -1
- package/dist/{renderer-ChjkppUz.mjs → renderer-DYdll3xW.mjs} +3 -3
- package/dist/{renderer-ChjkppUz.mjs.map → renderer-DYdll3xW.mjs.map} +1 -1
- package/dist/{renderer-BhhweLr_.mjs → renderer-Datqywo_.mjs} +3 -3
- package/dist/{renderer-BhhweLr_.mjs.map → renderer-Datqywo_.mjs.map} +1 -1
- package/dist/renderer-DdG6ibtM.mjs +5 -0
- package/dist/{renderer-D0X7Eh-T.mjs → renderer-Ddg3dJmu.mjs} +3 -3
- package/dist/{renderer-D0X7Eh-T.mjs.map → renderer-Ddg3dJmu.mjs.map} +1 -1
- package/dist/{renderer-CmKdr2nA.mjs → renderer-De7gno9X.mjs} +3 -3
- package/dist/{renderer-CmKdr2nA.mjs.map → renderer-De7gno9X.mjs.map} +1 -1
- package/dist/renderer-DhZi4f3t.mjs +5 -0
- package/dist/{renderer-BJwOM1Dq.mjs → renderer-Dkt1oh9H.mjs} +3 -3
- package/dist/{renderer-BJwOM1Dq.mjs.map → renderer-Dkt1oh9H.mjs.map} +1 -1
- package/dist/{renderer-DqO9gBAi.mjs → renderer-DnT62IDK.mjs} +3 -3
- package/dist/{renderer-DqO9gBAi.mjs.map → renderer-DnT62IDK.mjs.map} +1 -1
- package/dist/{renderer-vwoyR8pW.mjs → renderer-Du8z4UrN.mjs} +2 -2
- package/dist/{renderer-vwoyR8pW.mjs.map → renderer-Du8z4UrN.mjs.map} +1 -1
- package/dist/{renderer-B8LXXvHi.mjs → renderer-MQPiZQXN.mjs} +3 -3
- package/dist/{renderer-B8LXXvHi.mjs.map → renderer-MQPiZQXN.mjs.map} +1 -1
- package/dist/renderer-MgLekf6d.mjs +5 -0
- package/dist/{renderer-FCqOfN6n.mjs → renderer-NL2IZShC.mjs} +3 -3
- package/dist/{renderer-FCqOfN6n.mjs.map → renderer-NL2IZShC.mjs.map} +1 -1
- package/dist/renderer-Qvs-1lWh.mjs +5 -0
- package/dist/{renderer-B31zMDE8.mjs → renderer-RiWi7y5C.mjs} +4 -4
- package/dist/{renderer-B31zMDE8.mjs.map → renderer-RiWi7y5C.mjs.map} +1 -1
- package/dist/{renderer-Fsdod0yZ.mjs → renderer-T2dd9a2L.mjs} +3 -3
- package/dist/{renderer-Fsdod0yZ.mjs.map → renderer-T2dd9a2L.mjs.map} +1 -1
- package/dist/{renderer-1VKN5j2C.mjs → renderer-Y5JmTL8J.mjs} +3 -3
- package/dist/{renderer-1VKN5j2C.mjs.map → renderer-Y5JmTL8J.mjs.map} +1 -1
- package/dist/{renderer-CdUf7ZDJ.mjs → renderer-_vcT__tW.mjs} +3 -3
- package/dist/{renderer-CdUf7ZDJ.mjs.map → renderer-_vcT__tW.mjs.map} +1 -1
- package/dist/renderer-bN7dOErt.mjs +5 -0
- package/dist/renderer-jWKVmReU.mjs +5 -0
- package/dist/{renderer-kkDfQ56G.mjs → renderer-khVVYoVF.mjs} +3 -3
- package/dist/{renderer-kkDfQ56G.mjs.map → renderer-khVVYoVF.mjs.map} +1 -1
- package/dist/renderer-lk-At57G.mjs +5 -0
- package/dist/renderer-qi8Slwfo.mjs +5 -0
- package/dist/renderer-qxOH4JH1.mjs +5 -0
- package/dist/renderer-t30NpmIl.mjs +5 -0
- package/dist/{renderer-Bo_d7h86.mjs → renderer-vc8t_z-y.mjs} +3 -3
- package/dist/{renderer-Bo_d7h86.mjs.map → renderer-vc8t_z-y.mjs.map} +1 -1
- package/dist/{renderer-0cHsK6xR.mjs → renderer-wEXBnlr1.mjs} +3 -3
- package/dist/{renderer-0cHsK6xR.mjs.map → renderer-wEXBnlr1.mjs.map} +1 -1
- package/dist/{renderer-CNs1vBUy.mjs → renderer-wIsJb2eO.mjs} +2 -2
- package/dist/{renderer-CNs1vBUy.mjs.map → renderer-wIsJb2eO.mjs.map} +1 -1
- package/dist/renderer-wKW4HWRx.mjs +5 -0
- package/dist/renderer-ydjPm8bp.mjs +5 -0
- package/dist/{renderer-DP41Fokp.mjs → renderer-zdpn1Hkk.mjs} +3 -3
- package/dist/{renderer-DP41Fokp.mjs.map → renderer-zdpn1Hkk.mjs.map} +1 -1
- package/dist/{renderers-CP8CFWDs-DiX2Y4Qp.mjs → renderers-CP8CFWDs-BbLkcJTN.mjs} +3 -3
- package/dist/{renderers-CP8CFWDs-DiX2Y4Qp.mjs.map → renderers-CP8CFWDs-BbLkcJTN.mjs.map} +1 -1
- package/dist/signals/index.d.mts +5 -5
- package/dist/signals/index.mjs +6 -6
- package/dist/{signals-Cf9mfNGE.mjs → signals-BrNF9l9s.mjs} +3 -3
- package/dist/{signals-Cf9mfNGE.mjs.map → signals-BrNF9l9s.mjs.map} +1 -1
- package/dist/{src-Ds9IAk5S.mjs → src-WAnxhDYD.mjs} +9 -9
- package/dist/{src-Ds9IAk5S.mjs.map → src-WAnxhDYD.mjs.map} +1 -1
- package/package.json +58 -58
- package/dist/dist-DBWkkSvJ.mjs.map +0 -1
- package/dist/index-DKssQ_wn.d.mts.map +0 -1
- package/dist/index-fymoeGNW.d.mts.map +0 -1
- package/dist/preview-engine/chunk-X6HUH6K4.mjs +0 -1
- package/dist/preview-engine/renderers-KSQM7EM5.mjs +0 -1
- package/dist/preview-engine/renderers-XLBHSQZJ.mjs +0 -228
- package/dist/renderer-B-D_VZg3.mjs +0 -5
- package/dist/renderer-B64dhpDX.mjs +0 -5
- package/dist/renderer-BA2Ko4H1.mjs +0 -3
- package/dist/renderer-BDL4jyrb.mjs +0 -5
- package/dist/renderer-BKCZGKkl.mjs +0 -5
- package/dist/renderer-BKs3jI7-.mjs +0 -5
- package/dist/renderer-BW74Zf-u.mjs +0 -5
- package/dist/renderer-BXuQN61O.mjs +0 -5
- package/dist/renderer-BY1pPvzx.mjs +0 -6
- package/dist/renderer-Bahthqvq.mjs +0 -5
- package/dist/renderer-BbaiQG8h.mjs +0 -5
- package/dist/renderer-BhHF-08y.mjs +0 -5
- package/dist/renderer-BnrMcw6C.mjs +0 -5
- package/dist/renderer-BsS61z5l.mjs +0 -5
- package/dist/renderer-Btuq2Eq8.mjs +0 -5
- package/dist/renderer-BxmsEl2x.mjs +0 -5
- package/dist/renderer-CGOyHdKs.mjs +0 -5
- package/dist/renderer-CJjmpmpu.mjs +0 -5
- package/dist/renderer-CQvDDAIu.mjs +0 -5
- package/dist/renderer-CYxigw7S.mjs +0 -5
- package/dist/renderer-CgDofO5z.mjs +0 -5
- package/dist/renderer-CgmQchab.mjs +0 -5
- package/dist/renderer-CjzrLwW_.mjs +0 -5
- package/dist/renderer-ClnYWADT.mjs +0 -5
- package/dist/renderer-CwAd71C6.mjs +0 -5
- package/dist/renderer-D3Z9t-xT.mjs +0 -5
- package/dist/renderer-DKH1oSlW.mjs +0 -5
- package/dist/renderer-DTkf_hwG.mjs +0 -5
- package/dist/renderer-DU0bmOS7.mjs +0 -5
- package/dist/renderer-D_vJHQt5.mjs +0 -5
- package/dist/renderer-Db_wphHH.mjs.map +0 -1
- package/dist/renderer-Dc5n0M6P.mjs +0 -5
- package/dist/renderer-Ddfn0Dha.mjs +0 -5
- package/dist/renderer-DeSoNQeG.mjs +0 -5
- package/dist/renderer-DuQMzR3v.mjs.map +0 -1
- package/dist/renderer-Dzca9Qba.mjs +0 -5
- package/dist/renderer-HRVvtc9c.mjs +0 -5
- package/dist/renderer-M3Qs4f1K.mjs +0 -5
- package/dist/renderer-NDHJt_Ae.mjs +0 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-PLoGrFGz.mjs","names":[],"sources":["../../../nodes/node-modulate/dist/renderers-B9q42xr2.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nfunction resolveVal(val, fallback, frame, fps) {\n\tif (val === void 0 || val === null) return fallback;\n\tif (typeof val === \"object\" && val !== null) {\n\t\tif (\"get\" in val && typeof val.get === \"function\") try {\n\t\t\tconst res = val.get({\n\t\t\t\tframe,\n\t\t\t\tfps,\n\t\t\t\ttime: fps > 0 ? frame / fps : 0,\n\t\t\t\tduration: 0,\n\t\t\t\tdurationMs: 0,\n\t\t\t\tprogress: 0,\n\t\t\t\tdeltaTime: fps > 0 ? 1 / fps : 0\n\t\t\t});\n\t\t\tconst n$1 = Number(res);\n\t\t\tif (Number.isFinite(n$1)) return n$1;\n\t\t} catch {}\n\t\tif (\"value\" in val) {\n\t\t\tconst n$1 = Number(val.value);\n\t\t\tif (Number.isFinite(n$1)) return n$1;\n\t\t}\n\t} else if (typeof val === \"function\") try {\n\t\tconst res = val(frame, fps);\n\t\tconst n$1 = Number(res);\n\t\tif (Number.isFinite(n$1)) return n$1;\n\t} catch {}\n\tconst n = Number(val);\n\treturn Number.isFinite(n) ? n : fallback;\n}\nfunction resolveModulateField(op, fieldName, defaultValue, minVal, maxVal, frame = 0, fps = 30) {\n\tconst handleId = op[`${fieldName}HandleId`];\n\tconst signalInput = handleId ? op.inputs?.[handleId] : null;\n\tconst hasSignal = !!(signalInput?.connectionValid && signalInput.outputItem?.type === \"Signal\");\n\tconst sd = hasSignal ? signalInput?.outputItem?.data : null;\n\tlet value = defaultValue;\n\tif (!hasSignal) if (signalInput?.connectionValid && signalInput.outputItem?.type === \"Number\") value = Number(signalInput.outputItem.data ?? defaultValue);\n\telse value = resolveVal(op[fieldName] ?? op.signals?.[fieldName], defaultValue, frame, fps);\n\telse if (sd && typeof sd === \"object\" && \"offset\" in sd) value = Number(sd.offset ?? defaultValue);\n\tvalue = Math.max(minVal, Math.min(maxVal, value));\n\treturn {\n\t\thasSignal,\n\t\tsd,\n\t\tvalue\n\t};\n}\nconst STATIC_MODULATE_SHADER = `\nstruct ModulateUniforms {\n\thue : f32,\n\tbrightness : f32,\n\tcontrast : f32,\n\texposure : f32,\n\tsaturation : f32,\n\tsepia : f32,\n\n\thasSignal_hue : f32,\n\thasSignal_brightness : f32,\n\thasSignal_contrast : f32,\n\thasSignal_exposure : f32,\n\thasSignal_saturation : f32,\n\thasSignal_sepia : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : ModulateUniforms;\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 hueTex : texture_2d<f32>;\n@group(2) @binding(1) var brightnessTex : texture_2d<f32>;\n@group(2) @binding(2) var contrastTex : texture_2d<f32>;\n@group(2) @binding(3) var exposureTex : texture_2d<f32>;\n@group(2) @binding(4) var saturationTex : texture_2d<f32>;\n@group(2) @binding(5) var sepiaTex : texture_2d<f32>;\n@group(2) @binding(6) var sigSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn apply_exposure(c: vec4<f32>, exposure: f32) -> vec4<f32> {\n\tlet scale = pow(2.0, exposure);\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = scale * unpremult.r;\n\tlet g = scale * unpremult.g;\n\tlet b = scale * unpremult.b;\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_hue(c: vec4<f32>, degrees: f32) -> vec4<f32> {\n\tlet rad = (degrees * 3.1415926535) / 180.0;\n\tlet cosVal = cos(rad);\n\tlet sinVal = sin(rad);\n\n\tlet row0 = vec4<f32>(0.213 + cosVal * 0.787 - sinVal * 0.213, 0.715 - cosVal * 0.715 - sinVal * 0.715, 0.072 - cosVal * 0.072 + sinVal * 0.928, 0.0);\n\tlet row1 = vec4<f32>(0.213 - cosVal * 0.213 + sinVal * 0.143, 0.715 + cosVal * 0.285 + sinVal * 0.14, 0.072 - cosVal * 0.072 - sinVal * 0.283, 0.0);\n\tlet row2 = vec4<f32>(0.213 - cosVal * 0.213 - sinVal * 0.787, 0.715 - cosVal * 0.715 + sinVal * 0.715, 0.072 + cosVal * 0.928 + sinVal * 0.072, 0.0);\n\t\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = dot(row0, unpremult);\n\tlet g = dot(row1, unpremult);\n\tlet b = dot(row2, unpremult);\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_saturation(c: vec4<f32>, sat: f32) -> vec4<f32> {\n\tlet row0 = vec4<f32>(0.213 + sat * 0.787, 0.715 * (1.0 - sat), 0.072 * (1.0 - sat), 0.0);\n\tlet row1 = vec4<f32>(0.213 * (1.0 - sat), 0.715 + sat * 0.285, 0.072 * (1.0 - sat), 0.0);\n\tlet row2 = vec4<f32>(0.213 * (1.0 - sat), 0.715 * (1.0 - sat), 0.072 + sat * 0.928, 0.0);\n\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = dot(row0, unpremult);\n\tlet g = dot(row1, unpremult);\n\tlet b = dot(row2, unpremult);\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_contrast(c: vec4<f32>, contrast: f32) -> vec4<f32> {\n\tlet offset = 0.5 * (1.0 - contrast);\n\t\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = contrast * unpremult.r + offset;\n\tlet g = contrast * unpremult.g + offset;\n\tlet b = contrast * unpremult.b + offset;\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_brightness(c: vec4<f32>, bright: f32) -> vec4<f32> {\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = bright * unpremult.r;\n\tlet g = bright * unpremult.g;\n\tlet b = bright * unpremult.b;\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_sepia(c: vec4<f32>, s: f32) -> vec4<f32> {\n\tlet row0 = vec4<f32>(1.0 - 0.607 * s, 0.769 * s, 0.189 * s, 0.0);\n\tlet row1 = vec4<f32>(0.349 * s, 1.0 - 0.314 * s, 0.168 * s, 0.0);\n\tlet row2 = vec4<f32>(0.272 * s, 0.534 * s, 1.0 - 0.869 * s, 0.0);\n\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = dot(row0, unpremult);\n\tlet g = dot(row1, unpremult);\n\tlet b = dot(row2, unpremult);\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet original = textureSample(tex, samp, in.uv);\n\tvar color = original;\n\n\t// 1. Exposure\n\tvar exposure = u.exposure;\n\tif (u.hasSignal_exposure > 0.5) {\n\t\texposure = textureSampleLevel(exposureTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_exposure(color, exposure);\n\n\t// 2. Hue\n\tvar hue = u.hue;\n\tif (u.hasSignal_hue > 0.5) {\n\t\thue = textureSampleLevel(hueTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_hue(color, hue);\n\n\t// 3. Saturation\n\tvar saturation = u.saturation;\n\tif (u.hasSignal_saturation > 0.5) {\n\t\tsaturation = textureSampleLevel(saturationTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_saturation(color, saturation);\n\n\t// 4. Contrast\n\tvar contrast = u.contrast;\n\tif (u.hasSignal_contrast > 0.5) {\n\t\tcontrast = textureSampleLevel(contrastTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_contrast(color, contrast);\n\n\t// 5. Brightness\n\tvar brightness = u.brightness;\n\tif (u.hasSignal_brightness > 0.5) {\n\t\tbrightness = textureSampleLevel(brightnessTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_brightness(color, brightness);\n\n\t// 6. Sepia\n\tvar sepia = u.sepia;\n\tif (u.hasSignal_sepia > 0.5) {\n\t\tsepia = textureSampleLevel(sepiaTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_sepia(color, sepia);\n\n\treturn color;\n}\n`;\nconst modulateData = new Float32Array(12);\nconst getDeviceLayouts = perDevice((device) => ({\n\tmodulateUniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tmodulateSignalsLayout: texturesLayout(device, 6),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getModulateResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `modulate_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst modulateModule = device.createShaderModule({\n\t\t\tlabel: `modulate_static_${format}.wgsl`,\n\t\t\tcode: STATIC_MODULATE_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `ModulatePipeline_static_${format}`,\n\t\t\tmodule: modulateModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.modulateUniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.modulateSignalsLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tmodulatePipeline: pipeline,\n\t\tmodulateUniformLayout: layouts.modulateUniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tmodulateSignalsLayout: layouts.modulateSignalsLayout\n\t};\n}\nconst ModulateWebGPURenderer = 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 !== \"Modulate\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst hueInfo = resolveModulateField(op, \"hue\", 0, 0, 360, compositionFrame, fps);\n\tconst brightnessInfo = resolveModulateField(op, \"brightness\", 1, 0, 2, compositionFrame, fps);\n\tconst contrastInfo = resolveModulateField(op, \"contrast\", 1, 0, 2, compositionFrame, fps);\n\tconst exposureInfo = resolveModulateField(op, \"exposure\", 0, -2, 2, compositionFrame, fps);\n\tconst saturationInfo = resolveModulateField(op, \"saturation\", 1, 0, 2, compositionFrame, fps);\n\tconst sepiaInfo = resolveModulateField(op, \"sepia\", 0, 0, 1, compositionFrame, fps);\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { modulatePipeline: pipeline, modulateUniformLayout: uLayout, singleTextureLayout: tLayout, modulateSignalsLayout: sigLayout } = getModulateResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tmodulateData[0] = hueInfo.value;\n\tmodulateData[1] = brightnessInfo.value;\n\tmodulateData[2] = contrastInfo.value;\n\tmodulateData[3] = exposureInfo.value;\n\tmodulateData[4] = saturationInfo.value;\n\tmodulateData[5] = sepiaInfo.value;\n\tconst fields = [\n\t\t{\n\t\t\tname: \"hue\",\n\t\t\tinfo: hueInfo,\n\t\t\tidx: 6\n\t\t},\n\t\t{\n\t\t\tname: \"brightness\",\n\t\t\tinfo: brightnessInfo,\n\t\t\tidx: 7\n\t\t},\n\t\t{\n\t\t\tname: \"contrast\",\n\t\t\tinfo: contrastInfo,\n\t\t\tidx: 8\n\t\t},\n\t\t{\n\t\t\tname: \"exposure\",\n\t\t\tinfo: exposureInfo,\n\t\t\tidx: 9\n\t\t},\n\t\t{\n\t\t\tname: \"saturation\",\n\t\t\tinfo: saturationInfo,\n\t\t\tidx: 10\n\t\t},\n\t\t{\n\t\t\tname: \"sepia\",\n\t\t\tinfo: sepiaInfo,\n\t\t\tidx: 11\n\t\t}\n\t];\n\tconst signalViews = [];\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tfor (const f of fields) {\n\t\tconst isGenerator = !!(f.info.hasSignal && f.info.sd);\n\t\tmodulateData[f.idx] = isGenerator ? 1 : 0;\n\t\tif (isGenerator) {\n\t\t\tconst view = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, f.info.sd.nodeId ?? `modulate_${f.name}_sig`, elapsedSeconds, durationSeconds, f.info.sd, width, height, props.renderId, frame, fps);\n\t\t\tsignalViews.push(view);\n\t\t} else signalViews.push(signalRegistry.getDummy1x1TextureView(ctx.device));\n\t}\n\tconst buffer = ctx.renderer.getTemporaryBuffer(modulateData);\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 }\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: signalViews[0]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: signalViews[1]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: signalViews[2]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: signalViews[3]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: signalViews[4]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: signalViews[5]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\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, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ModulateWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-B9q42xr2.mjs.map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderer-DTXAa2pL.mjs","names":[],"sources":["../../../nodes/node-modulate/dist/renderers-B9q42xr2.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nfunction resolveVal(val, fallback, frame, fps) {\n\tif (val === void 0 || val === null) return fallback;\n\tif (typeof val === \"object\" && val !== null) {\n\t\tif (\"get\" in val && typeof val.get === \"function\") try {\n\t\t\tconst res = val.get({\n\t\t\t\tframe,\n\t\t\t\tfps,\n\t\t\t\ttime: fps > 0 ? frame / fps : 0,\n\t\t\t\tduration: 0,\n\t\t\t\tdurationMs: 0,\n\t\t\t\tprogress: 0,\n\t\t\t\tdeltaTime: fps > 0 ? 1 / fps : 0\n\t\t\t});\n\t\t\tconst n$1 = Number(res);\n\t\t\tif (Number.isFinite(n$1)) return n$1;\n\t\t} catch {}\n\t\tif (\"value\" in val) {\n\t\t\tconst n$1 = Number(val.value);\n\t\t\tif (Number.isFinite(n$1)) return n$1;\n\t\t}\n\t} else if (typeof val === \"function\") try {\n\t\tconst res = val(frame, fps);\n\t\tconst n$1 = Number(res);\n\t\tif (Number.isFinite(n$1)) return n$1;\n\t} catch {}\n\tconst n = Number(val);\n\treturn Number.isFinite(n) ? n : fallback;\n}\nfunction resolveModulateField(op, fieldName, defaultValue, minVal, maxVal, frame = 0, fps = 30) {\n\tconst handleId = op[`${fieldName}HandleId`];\n\tconst signalInput = handleId ? op.inputs?.[handleId] : null;\n\tconst hasSignal = !!(signalInput?.connectionValid && signalInput.outputItem?.type === \"Signal\");\n\tconst sd = hasSignal ? signalInput?.outputItem?.data : null;\n\tlet value = defaultValue;\n\tif (!hasSignal) if (signalInput?.connectionValid && signalInput.outputItem?.type === \"Number\") value = Number(signalInput.outputItem.data ?? defaultValue);\n\telse value = resolveVal(op[fieldName] ?? op.signals?.[fieldName], defaultValue, frame, fps);\n\telse if (sd && typeof sd === \"object\" && \"offset\" in sd) value = Number(sd.offset ?? defaultValue);\n\tvalue = Math.max(minVal, Math.min(maxVal, value));\n\treturn {\n\t\thasSignal,\n\t\tsd,\n\t\tvalue\n\t};\n}\nconst STATIC_MODULATE_SHADER = `\nstruct ModulateUniforms {\n\thue : f32,\n\tbrightness : f32,\n\tcontrast : f32,\n\texposure : f32,\n\tsaturation : f32,\n\tsepia : f32,\n\n\thasSignal_hue : f32,\n\thasSignal_brightness : f32,\n\thasSignal_contrast : f32,\n\thasSignal_exposure : f32,\n\thasSignal_saturation : f32,\n\thasSignal_sepia : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : ModulateUniforms;\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 hueTex : texture_2d<f32>;\n@group(2) @binding(1) var brightnessTex : texture_2d<f32>;\n@group(2) @binding(2) var contrastTex : texture_2d<f32>;\n@group(2) @binding(3) var exposureTex : texture_2d<f32>;\n@group(2) @binding(4) var saturationTex : texture_2d<f32>;\n@group(2) @binding(5) var sepiaTex : texture_2d<f32>;\n@group(2) @binding(6) var sigSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn apply_exposure(c: vec4<f32>, exposure: f32) -> vec4<f32> {\n\tlet scale = pow(2.0, exposure);\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = scale * unpremult.r;\n\tlet g = scale * unpremult.g;\n\tlet b = scale * unpremult.b;\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_hue(c: vec4<f32>, degrees: f32) -> vec4<f32> {\n\tlet rad = (degrees * 3.1415926535) / 180.0;\n\tlet cosVal = cos(rad);\n\tlet sinVal = sin(rad);\n\n\tlet row0 = vec4<f32>(0.213 + cosVal * 0.787 - sinVal * 0.213, 0.715 - cosVal * 0.715 - sinVal * 0.715, 0.072 - cosVal * 0.072 + sinVal * 0.928, 0.0);\n\tlet row1 = vec4<f32>(0.213 - cosVal * 0.213 + sinVal * 0.143, 0.715 + cosVal * 0.285 + sinVal * 0.14, 0.072 - cosVal * 0.072 - sinVal * 0.283, 0.0);\n\tlet row2 = vec4<f32>(0.213 - cosVal * 0.213 - sinVal * 0.787, 0.715 - cosVal * 0.715 + sinVal * 0.715, 0.072 + cosVal * 0.928 + sinVal * 0.072, 0.0);\n\t\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = dot(row0, unpremult);\n\tlet g = dot(row1, unpremult);\n\tlet b = dot(row2, unpremult);\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_saturation(c: vec4<f32>, sat: f32) -> vec4<f32> {\n\tlet row0 = vec4<f32>(0.213 + sat * 0.787, 0.715 * (1.0 - sat), 0.072 * (1.0 - sat), 0.0);\n\tlet row1 = vec4<f32>(0.213 * (1.0 - sat), 0.715 + sat * 0.285, 0.072 * (1.0 - sat), 0.0);\n\tlet row2 = vec4<f32>(0.213 * (1.0 - sat), 0.715 * (1.0 - sat), 0.072 + sat * 0.928, 0.0);\n\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = dot(row0, unpremult);\n\tlet g = dot(row1, unpremult);\n\tlet b = dot(row2, unpremult);\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_contrast(c: vec4<f32>, contrast: f32) -> vec4<f32> {\n\tlet offset = 0.5 * (1.0 - contrast);\n\t\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = contrast * unpremult.r + offset;\n\tlet g = contrast * unpremult.g + offset;\n\tlet b = contrast * unpremult.b + offset;\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_brightness(c: vec4<f32>, bright: f32) -> vec4<f32> {\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = bright * unpremult.r;\n\tlet g = bright * unpremult.g;\n\tlet b = bright * unpremult.b;\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\nfn apply_sepia(c: vec4<f32>, s: f32) -> vec4<f32> {\n\tlet row0 = vec4<f32>(1.0 - 0.607 * s, 0.769 * s, 0.189 * s, 0.0);\n\tlet row1 = vec4<f32>(0.349 * s, 1.0 - 0.314 * s, 0.168 * s, 0.0);\n\tlet row2 = vec4<f32>(0.272 * s, 0.534 * s, 1.0 - 0.869 * s, 0.0);\n\n\tvar unpremult = c;\n\tif (unpremult.a > 0.0) { unpremult = vec4<f32>(unpremult.rgb / unpremult.a, unpremult.a); }\n\tlet r = dot(row0, unpremult);\n\tlet g = dot(row1, unpremult);\n\tlet b = dot(row2, unpremult);\n\tlet outAlpha = clamp(unpremult.a, 0.0, 1.0);\n\tlet outRgb = clamp(vec3<f32>(r, g, b), vec3<f32>(0.0), vec3<f32>(1.0)) * outAlpha;\n\treturn vec4<f32>(outRgb, outAlpha);\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet original = textureSample(tex, samp, in.uv);\n\tvar color = original;\n\n\t// 1. Exposure\n\tvar exposure = u.exposure;\n\tif (u.hasSignal_exposure > 0.5) {\n\t\texposure = textureSampleLevel(exposureTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_exposure(color, exposure);\n\n\t// 2. Hue\n\tvar hue = u.hue;\n\tif (u.hasSignal_hue > 0.5) {\n\t\thue = textureSampleLevel(hueTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_hue(color, hue);\n\n\t// 3. Saturation\n\tvar saturation = u.saturation;\n\tif (u.hasSignal_saturation > 0.5) {\n\t\tsaturation = textureSampleLevel(saturationTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_saturation(color, saturation);\n\n\t// 4. Contrast\n\tvar contrast = u.contrast;\n\tif (u.hasSignal_contrast > 0.5) {\n\t\tcontrast = textureSampleLevel(contrastTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_contrast(color, contrast);\n\n\t// 5. Brightness\n\tvar brightness = u.brightness;\n\tif (u.hasSignal_brightness > 0.5) {\n\t\tbrightness = textureSampleLevel(brightnessTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_brightness(color, brightness);\n\n\t// 6. Sepia\n\tvar sepia = u.sepia;\n\tif (u.hasSignal_sepia > 0.5) {\n\t\tsepia = textureSampleLevel(sepiaTex, sigSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolor = apply_sepia(color, sepia);\n\n\treturn color;\n}\n`;\nconst modulateData = new Float32Array(12);\nconst getDeviceLayouts = perDevice((device) => ({\n\tmodulateUniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tmodulateSignalsLayout: texturesLayout(device, 6),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getModulateResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `modulate_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst modulateModule = device.createShaderModule({\n\t\t\tlabel: `modulate_static_${format}.wgsl`,\n\t\t\tcode: STATIC_MODULATE_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `ModulatePipeline_static_${format}`,\n\t\t\tmodule: modulateModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.modulateUniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.modulateSignalsLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tmodulatePipeline: pipeline,\n\t\tmodulateUniformLayout: layouts.modulateUniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tmodulateSignalsLayout: layouts.modulateSignalsLayout\n\t};\n}\nconst ModulateWebGPURenderer = 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 !== \"Modulate\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst hueInfo = resolveModulateField(op, \"hue\", 0, 0, 360, compositionFrame, fps);\n\tconst brightnessInfo = resolveModulateField(op, \"brightness\", 1, 0, 2, compositionFrame, fps);\n\tconst contrastInfo = resolveModulateField(op, \"contrast\", 1, 0, 2, compositionFrame, fps);\n\tconst exposureInfo = resolveModulateField(op, \"exposure\", 0, -2, 2, compositionFrame, fps);\n\tconst saturationInfo = resolveModulateField(op, \"saturation\", 1, 0, 2, compositionFrame, fps);\n\tconst sepiaInfo = resolveModulateField(op, \"sepia\", 0, 0, 1, compositionFrame, fps);\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { modulatePipeline: pipeline, modulateUniformLayout: uLayout, singleTextureLayout: tLayout, modulateSignalsLayout: sigLayout } = getModulateResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tmodulateData[0] = hueInfo.value;\n\tmodulateData[1] = brightnessInfo.value;\n\tmodulateData[2] = contrastInfo.value;\n\tmodulateData[3] = exposureInfo.value;\n\tmodulateData[4] = saturationInfo.value;\n\tmodulateData[5] = sepiaInfo.value;\n\tconst fields = [\n\t\t{\n\t\t\tname: \"hue\",\n\t\t\tinfo: hueInfo,\n\t\t\tidx: 6\n\t\t},\n\t\t{\n\t\t\tname: \"brightness\",\n\t\t\tinfo: brightnessInfo,\n\t\t\tidx: 7\n\t\t},\n\t\t{\n\t\t\tname: \"contrast\",\n\t\t\tinfo: contrastInfo,\n\t\t\tidx: 8\n\t\t},\n\t\t{\n\t\t\tname: \"exposure\",\n\t\t\tinfo: exposureInfo,\n\t\t\tidx: 9\n\t\t},\n\t\t{\n\t\t\tname: \"saturation\",\n\t\t\tinfo: saturationInfo,\n\t\t\tidx: 10\n\t\t},\n\t\t{\n\t\t\tname: \"sepia\",\n\t\t\tinfo: sepiaInfo,\n\t\t\tidx: 11\n\t\t}\n\t];\n\tconst signalViews = [];\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tfor (const f of fields) {\n\t\tconst isGenerator = !!(f.info.hasSignal && f.info.sd);\n\t\tmodulateData[f.idx] = isGenerator ? 1 : 0;\n\t\tif (isGenerator) {\n\t\t\tconst view = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, f.info.sd.nodeId ?? `modulate_${f.name}_sig`, elapsedSeconds, durationSeconds, f.info.sd, width, height, props.renderId, frame, fps);\n\t\t\tsignalViews.push(view);\n\t\t} else signalViews.push(signalRegistry.getDummy1x1TextureView(ctx.device));\n\t}\n\tconst buffer = ctx.renderer.getTemporaryBuffer(modulateData);\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 }\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: signalViews[0]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: signalViews[1]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: signalViews[2]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: signalViews[3]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: signalViews[4]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: signalViews[5]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\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, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ModulateWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-B9q42xr2.mjs.map"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "./chunk-D7gtBK74.mjs";
|
|
2
2
|
import { n as defineRenderer, s as resolveSignalField } from "./renderer-C9r0-KY4.mjs";
|
|
3
|
-
import { Fn as signalRegistry } from "./dist-
|
|
4
|
-
import { a as createFullscreenPipeline, f as signalTiming, l as fragmentBindGroupLayout, p as texturesLayout, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-
|
|
3
|
+
import { Fn as signalRegistry } from "./dist-Bf0H4lp1.mjs";
|
|
4
|
+
import { a as createFullscreenPipeline, f as signalTiming, l as fragmentBindGroupLayout, p as texturesLayout, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CevnCkZC.mjs";
|
|
5
5
|
|
|
6
6
|
//#region ../../nodes/node-noise-generator/dist/renderers-DdsDStam.mjs
|
|
7
7
|
const NOISE_SHADER = `
|
|
@@ -392,4 +392,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: NoiseWebGPURenderer });
|
|
|
392
392
|
|
|
393
393
|
//#endregion
|
|
394
394
|
export { NoiseWebGPURenderer, renderers_default as default };
|
|
395
|
-
//# sourceMappingURL=renderer-
|
|
395
|
+
//# sourceMappingURL=renderer-DYdll3xW.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-ChjkppUz.mjs","names":[],"sources":["../../../nodes/node-noise-generator/dist/renderers-DdsDStam.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveSignalField } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, fragmentBindGroupLayout, perDevice, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst NOISE_SHADER = `\nstruct NoiseUniforms {\n noiseType : f32, // 0 = Perlin, 1 = Simplex, 2 = Voronoi\n outputType : f32, // 0 = Image, 1 = Video\n time : f32,\n _padding : f32,\n \n scale : f32,\n octaves : f32,\n persistence : f32,\n lacunarity : f32,\n \n speed : f32,\n hasSignal_scale : f32,\n hasSignal_octaves : f32,\n hasSignal_persistence : f32,\n \n hasSignal_lacunarity : f32,\n hasSignal_speed : f32,\n _pad2 : f32,\n _pad3 : f32,\n\n colorStart : vec4<f32>,\n colorEnd : vec4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : NoiseUniforms;\n\n@group(1) @binding(0) var scaleTex : texture_2d<f32>;\n@group(1) @binding(1) var octavesTex : texture_2d<f32>;\n@group(1) @binding(2) var persistenceTex : texture_2d<f32>;\n@group(1) @binding(3) var lacunarityTex : texture_2d<f32>;\n@group(1) @binding(4) var speedTex : texture_2d<f32>;\n@group(1) @binding(5) var sigSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn hash3(p: vec3<f32>) -> vec3<f32> {\n var p3 = fract(p * vec3<f32>(0.1031, 0.11369, 0.13787));\n p3 += dot(p3, p3.yzx + 19.19);\n return fract((p3.xxy + p3.yzz) * p3.zyx) * 2.0 - 1.0;\n}\n\nfn perlin3d(p: vec3<f32>) -> f32 {\n let pi = floor(p);\n let pf = fract(p);\n \n let w = pf * pf * (3.0 - 2.0 * pf);\n \n let g000 = hash3(pi + vec3<f32>(0.0, 0.0, 0.0));\n let g100 = hash3(pi + vec3<f32>(1.0, 0.0, 0.0));\n let g010 = hash3(pi + vec3<f32>(0.0, 1.0, 0.0));\n let g110 = hash3(pi + vec3<f32>(1.0, 1.0, 0.0));\n let g001 = hash3(pi + vec3<f32>(0.0, 0.0, 1.0));\n let g101 = hash3(pi + vec3<f32>(1.0, 0.0, 1.0));\n let g011 = hash3(pi + vec3<f32>(0.0, 1.0, 1.0));\n let g111 = hash3(pi + vec3<f32>(1.0, 1.0, 1.0));\n \n let n000 = dot(g000, pf - vec3<f32>(0.0, 0.0, 0.0));\n let n100 = dot(g100, pf - vec3<f32>(1.0, 0.0, 0.0));\n let n010 = dot(g010, pf - vec3<f32>(0.0, 1.0, 0.0));\n let n110 = dot(g110, pf - vec3<f32>(1.0, 1.0, 0.0));\n let n001 = dot(g001, pf - vec3<f32>(0.0, 0.0, 1.0));\n let n101 = dot(g101, pf - vec3<f32>(1.0, 0.0, 1.0));\n let n011 = dot(g011, pf - vec3<f32>(0.0, 1.0, 1.0));\n let n111 = dot(g111, pf - vec3<f32>(1.0, 1.0, 1.0));\n \n let n_x00 = mix(n000, n100, w.x);\n let n_x10 = mix(n010, n110, w.x);\n let n_y0 = mix(n_x00, n_x10, w.y);\n \n let n_x01 = mix(n001, n101, w.x);\n let n_x11 = mix(n011, n111, w.x);\n let n_y1 = mix(n_x01, n_x11, w.y);\n \n return mix(n_y0, n_y1, w.z) * 0.5 + 0.5; // Map to [0, 1]\n}\n\nfn simplex3d(v: vec3<f32>) -> f32 {\n let skew = (v.x + v.y + v.z) * (1.0 / 3.0);\n let i = floor(v + skew);\n let unskew = (i.x + i.y + i.z) * (1.0 / 6.0);\n let x0 = v - i + unskew;\n \n var i1 = vec3<f32>(0.0);\n var i2 = vec3<f32>(0.0);\n \n if (x0.x >= x0.y) {\n if (x0.y >= x0.z) {\n i1 = vec3<f32>(1.0, 0.0, 0.0);\n i2 = vec3<f32>(1.0, 1.0, 0.0);\n } else if (x0.x >= x0.z) {\n i1 = vec3<f32>(1.0, 0.0, 0.0);\n i2 = vec3<f32>(1.0, 0.0, 1.0);\n } else {\n i1 = vec3<f32>(0.0, 0.0, 1.0);\n i2 = vec3<f32>(1.0, 0.0, 1.0);\n }\n } else {\n if (x0.y < x0.z) {\n i1 = vec3<f32>(0.0, 0.0, 1.0);\n i2 = vec3<f32>(0.0, 1.0, 1.0);\n } else if (x0.x < x0.z) {\n i1 = vec3<f32>(0.0, 1.0, 0.0);\n i2 = vec3<f32>(0.0, 1.0, 1.0);\n } else {\n i1 = vec3<f32>(0.0, 1.0, 0.0);\n i2 = vec3<f32>(1.0, 1.0, 0.0);\n }\n }\n \n let x1 = x0 - i1 + (1.0 / 6.0);\n let x2 = x0 - i2 + (1.0 / 3.0);\n let x3 = x0 - 1.0 + 0.5;\n \n var m = vec4<f32>(\n dot(x0, x0),\n dot(x1, x1),\n dot(x2, x2),\n dot(x3, x3)\n );\n m = max(0.6 - m, vec4<f32>(0.0));\n m = m * m;\n m = m * m;\n \n let g0 = dot(hash3(i + vec3<f32>(0.0)), x0);\n let g1 = dot(hash3(i + i1), x1);\n let g2 = dot(hash3(i + i2), x2);\n let g3 = dot(hash3(i + vec3<f32>(1.0)), x3);\n \n let n = dot(m, vec4<f32>(g0, g1, g2, g3));\n return 32.0 * n * 0.5 + 0.5;\n}\n\nfn voronoi3d(p: vec3<f32>) -> f32 {\n let pi = floor(p);\n let pf = fract(p);\n var min_dist = 8.0;\n \n for (var k = -1; k <= 1; k++) {\n for (var j = -1; j <= 1; j++) {\n for (var i = -1; i <= 1; i++) {\n let g = vec3<f32>(f32(i), f32(j), f32(k));\n let o = hash3(pi + g) * 0.5 + 0.5;\n let r = g + o - pf;\n let d = dot(r, r);\n if (d < min_dist) {\n min_dist = d;\n }\n }\n }\n }\n return clamp(sqrt(min_dist), 0.0, 1.0);\n}\n\nfn fbm_perlin(p: vec3<f32>, octaves: i32, persistence: f32, lacunarity: f32) -> f32 {\n var value = 0.0;\n var amp = 1.0;\n var freq = 1.0;\n var total_amp = 0.0;\n for (var i = 0; i < 8; i++) {\n if (i >= octaves) { break; }\n value += amp * perlin3d(p * freq);\n total_amp += amp;\n freq *= lacunarity;\n amp *= persistence;\n }\n return value / total_amp;\n}\n\nfn fbm_simplex(p: vec3<f32>, octaves: i32, persistence: f32, lacunarity: f32) -> f32 {\n var value = 0.0;\n var amp = 1.0;\n var freq = 1.0;\n var total_amp = 0.0;\n for (var i = 0; i < 8; i++) {\n if (i >= octaves) { break; }\n value += amp * simplex3d(p * freq);\n total_amp += amp;\n freq *= lacunarity;\n amp *= persistence;\n }\n return value / total_amp;\n}\n\nfn fbm_voronoi(p: vec3<f32>, octaves: i32, persistence: f32, lacunarity: f32) -> f32 {\n var value = 0.0;\n var amp = 1.0;\n var freq = 1.0;\n var total_amp = 0.0;\n for (var i = 0; i < 8; i++) {\n if (i >= octaves) { break; }\n value += amp * voronoi3d(p * freq);\n total_amp += amp;\n freq *= lacunarity;\n amp *= persistence;\n }\n return value / total_amp;\n}\n\nfn get_field(val: f32, hasSig: f32, tex: texture_2d<f32>, samp: sampler, uv: vec2<f32>) -> f32 {\n if (hasSig > 0.5) {\n return textureSampleLevel(tex, samp, uv, 0.0).r;\n }\n return val;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n let scale = get_field(u.scale, u.hasSignal_scale, scaleTex, sigSamp, in.uv);\n let octaves_f = get_field(u.octaves, u.hasSignal_octaves, octavesTex, sigSamp, in.uv);\n let octaves = i32(clamp(octaves_f, 1.0, 8.0));\n let persistence = get_field(u.persistence, u.hasSignal_persistence, persistenceTex, sigSamp, in.uv);\n let lacunarity = get_field(u.lacunarity, u.hasSignal_lacunarity, lacunarityTex, sigSamp, in.uv);\n let speed = get_field(u.speed, u.hasSignal_speed, speedTex, sigSamp, in.uv);\n\n let isVideo = u.outputType > 0.5;\n let z_coord = select(0.0, u.time * speed, isVideo);\n \n let coord = vec3<f32>(in.uv * scale, z_coord);\n \n var n_val = 0.0;\n if (u.noiseType < 0.5) {\n n_val = fbm_perlin(coord, octaves, persistence, lacunarity);\n } else if (u.noiseType < 1.5) {\n n_val = fbm_simplex(coord, octaves, persistence, lacunarity);\n } else {\n n_val = fbm_voronoi(coord, octaves, persistence, lacunarity);\n }\n \n return mix(u.colorStart, u.colorEnd, clamp(n_val, 0.0, 1.0));\n}\n`;\nconst noiseUniformData = new Float32Array(24);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsignalsLayout: texturesLayout(device, 5),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getNoiseResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `noise_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst noiseModule = device.createShaderModule({\n\t\t\tlabel: `noise_${format}.wgsl`,\n\t\t\tcode: NOISE_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `NoiseGeneratorPipeline_${format}`,\n\t\t\tmodule: noiseModule,\n\t\t\tlayouts: [layouts.uniformLayout, layouts.signalsLayout],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tnoisePipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsignalsLayout: layouts.signalsLayout\n\t};\n}\nfunction hexToRgba(hex) {\n\tlet h = hex.replace(\"#\", \"\");\n\tif (h.length === 3 || h.length === 4) h = h.split(\"\").map((c) => c + c).join(\"\");\n\tconst r = parseInt(h.substring(0, 2), 16) / 255;\n\tconst g = parseInt(h.substring(2, 4), 16) / 255;\n\tconst b = parseInt(h.substring(4, 6), 16) / 255;\n\tlet a = 1;\n\tif (h.length === 8) a = parseInt(h.substring(6, 8), 16) / 255;\n\treturn [\n\t\tr,\n\t\tg,\n\t\tb,\n\t\ta\n\t];\n}\nconst NoiseWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"NoiseGenerator\" || !op) return;\n\tconst { noisePipeline: pipeline, uniformLayout: uLayout, signalsLayout: sigLayout } = getNoiseResources(ctx.device, ctx.renderer.format);\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst scaleInfo = resolveSignalField(op, \"scale\", 10);\n\tconst octavesInfo = resolveSignalField(op, \"octaves\", 4);\n\tconst persistenceInfo = resolveSignalField(op, \"persistence\", .5);\n\tconst lacunarityInfo = resolveSignalField(op, \"lacunarity\", 2);\n\tconst speedInfo = resolveSignalField(op, \"speed\", 1);\n\tconst noiseTypeVal = op.noiseType === \"Simplex\" ? 1 : op.noiseType === \"Voronoi\" ? 2 : 0;\n\tconst outputTypeVal = op.outputType === \"Video\" ? 1 : 0;\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst colorStartVal = hexToRgba(op.colorStart ?? \"#000000\");\n\tconst colorEndVal = hexToRgba(op.colorEnd ?? \"#ffffff\");\n\tnoiseUniformData[0] = noiseTypeVal;\n\tnoiseUniformData[1] = outputTypeVal;\n\tnoiseUniformData[2] = elapsedSeconds;\n\tnoiseUniformData[3] = 0;\n\tnoiseUniformData[4] = scaleInfo.value;\n\tnoiseUniformData[5] = octavesInfo.value;\n\tnoiseUniformData[6] = persistenceInfo.value;\n\tnoiseUniformData[7] = lacunarityInfo.value;\n\tnoiseUniformData[8] = speedInfo.value;\n\tnoiseUniformData[9] = scaleInfo.hasSignal ? 1 : 0;\n\tnoiseUniformData[10] = octavesInfo.hasSignal ? 1 : 0;\n\tnoiseUniformData[11] = persistenceInfo.hasSignal ? 1 : 0;\n\tnoiseUniformData[12] = lacunarityInfo.hasSignal ? 1 : 0;\n\tnoiseUniformData[13] = speedInfo.hasSignal ? 1 : 0;\n\tnoiseUniformData[14] = 0;\n\tnoiseUniformData[15] = 0;\n\tnoiseUniformData[16] = colorStartVal[0];\n\tnoiseUniformData[17] = colorStartVal[1];\n\tnoiseUniformData[18] = colorStartVal[2];\n\tnoiseUniformData[19] = colorStartVal[3];\n\tnoiseUniformData[20] = colorEndVal[0];\n\tnoiseUniformData[21] = colorEndVal[1];\n\tnoiseUniformData[22] = colorEndVal[2];\n\tnoiseUniformData[23] = colorEndVal[3];\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(noiseUniformData);\n\tconst signalFields = [\n\t\t{\n\t\t\tname: \"scale\",\n\t\t\tinfo: scaleInfo\n\t\t},\n\t\t{\n\t\t\tname: \"octaves\",\n\t\t\tinfo: octavesInfo\n\t\t},\n\t\t{\n\t\t\tname: \"persistence\",\n\t\t\tinfo: persistenceInfo\n\t\t},\n\t\t{\n\t\t\tname: \"lacunarity\",\n\t\t\tinfo: lacunarityInfo\n\t\t},\n\t\t{\n\t\t\tname: \"speed\",\n\t\t\tinfo: speedInfo\n\t\t}\n\t];\n\tconst signalViews = [];\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tfor (const f of signalFields) if (!!(f.info.hasSignal && f.info.sd)) {\n\t\tconst view = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, f.info.sd?.nodeId ?? `noise_${f.name}_sig`, elapsedSeconds, durationSeconds, f.info.sd, targetWidth, targetHeight, props.renderId, frame, fps);\n\t\tsignalViews.push(view);\n\t} else signalViews.push(signalRegistry.getDummy1x1TextureView(ctx.device));\n\tpass.setPipeline(pipeline);\n\tpass.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t}));\n\tpass.setBindGroup(1, ctx.device.createBindGroup({\n\t\tlayout: sigLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: signalViews[0]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: signalViews[1]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: persistenceInfo.hasSignal ? signalViews[2] : signalViews[2]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: signalViews[3]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: signalViews[4]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 5,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t}));\n\tpass.draw(4);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: NoiseWebGPURenderer });\n\n//#endregion\nexport { NoiseWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-DdsDStam.mjs.map"],"mappings":";;;;;;AAMA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCnB,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqMvB,MAAM,mBAAmB,IAAI,aAAa,GAAG;AAC7C,MAAM,mBAAmB,WAAW,YAAY;CAC/C,eAAe,wBAAwB,QAAQ,CAAC,UAAU,CAAC;CAC3D,eAAe,eAAe,QAAQ,EAAE;CACxC,+BAA+B,IAAI,KAAK;CACxC,EAAE;AACH,SAAS,kBAAkB,QAAQ,QAAQ;CAC1C,MAAM,UAAU,iBAAiB,OAAO;CACxC,MAAM,WAAW,SAAS;CAC1B,IAAI,WAAW,QAAQ,cAAc,IAAI,SAAS;AAClD,KAAI,CAAC,UAAU;EACd,MAAM,cAAc,OAAO,mBAAmB;GAC7C,OAAO,SAAS,OAAO;GACvB,MAAM;GACN,CAAC;AACF,aAAW,yBAAyB,QAAQ;GAC3C,OAAO,0BAA0B;GACjC,QAAQ;GACR,SAAS,CAAC,QAAQ,eAAe,QAAQ,cAAc;GACvD;GACA,CAAC;AACF,UAAQ,cAAc,IAAI,UAAU,SAAS;;AAE9C,QAAO;EACN,eAAe;EACf,eAAe,QAAQ;EACvB,eAAe,QAAQ;EACvB;;AAEF,SAAS,UAAU,KAAK;CACvB,IAAI,IAAI,IAAI,QAAQ,KAAK,GAAG;AAC5B,KAAI,EAAE,WAAW,KAAK,EAAE,WAAW,EAAG,KAAI,EAAE,MAAM,GAAG,CAAC,KAAK,MAAM,IAAI,EAAE,CAAC,KAAK,GAAG;CAChF,MAAM,IAAI,SAAS,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,GAAG;CAC5C,MAAM,IAAI,SAAS,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,GAAG;CAC5C,MAAM,IAAI,SAAS,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,GAAG;CAC5C,IAAI,IAAI;AACR,KAAI,EAAE,WAAW,EAAG,KAAI,SAAS,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,GAAG;AAC1D,QAAO;EACN;EACA;EACA;EACA;EACA;;AAEF,MAAM,sBAAsB,OAAO,SAAS;CAC3C,MAAM,EAAE,KAAK,SAAS,MAAM,aAAa,cAAc,UAAU;CACjE,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,oBAAoB,CAAC,GAAI;CACxC,MAAM,EAAE,eAAe,UAAU,eAAe,SAAS,eAAe,cAAc,kBAAkB,IAAI,QAAQ,IAAI,SAAS,OAAO;CACxI,MAAM,QAAQ,MAAM,SAAS;CAC7B,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,YAAY,mBAAmB,IAAI,SAAS,GAAG;CACrD,MAAM,cAAc,mBAAmB,IAAI,WAAW,EAAE;CACxD,MAAM,kBAAkB,mBAAmB,IAAI,eAAe,GAAG;CACjE,MAAM,iBAAiB,mBAAmB,IAAI,cAAc,EAAE;CAC9D,MAAM,YAAY,mBAAmB,IAAI,SAAS,EAAE;CACpD,MAAM,eAAe,GAAG,cAAc,YAAY,IAAI,GAAG,cAAc,YAAY,IAAI;CACvF,MAAM,gBAAgB,GAAG,eAAe,UAAU,IAAI;CACtD,MAAM,EAAE,gBAAgB,oBAAoB,aAAa,OAAO,OAAO,IAAI;CAC3E,MAAM,gBAAgB,UAAU,GAAG,cAAc,UAAU;CAC3D,MAAM,cAAc,UAAU,GAAG,YAAY,UAAU;AACvD,kBAAiB,KAAK;AACtB,kBAAiB,KAAK;AACtB,kBAAiB,KAAK;AACtB,kBAAiB,KAAK;AACtB,kBAAiB,KAAK,UAAU;AAChC,kBAAiB,KAAK,YAAY;AAClC,kBAAiB,KAAK,gBAAgB;AACtC,kBAAiB,KAAK,eAAe;AACrC,kBAAiB,KAAK,UAAU;AAChC,kBAAiB,KAAK,UAAU,YAAY,IAAI;AAChD,kBAAiB,MAAM,YAAY,YAAY,IAAI;AACnD,kBAAiB,MAAM,gBAAgB,YAAY,IAAI;AACvD,kBAAiB,MAAM,eAAe,YAAY,IAAI;AACtD,kBAAiB,MAAM,UAAU,YAAY,IAAI;AACjD,kBAAiB,MAAM;AACvB,kBAAiB,MAAM;AACvB,kBAAiB,MAAM,cAAc;AACrC,kBAAiB,MAAM,cAAc;AACrC,kBAAiB,MAAM,cAAc;AACrC,kBAAiB,MAAM,cAAc;AACrC,kBAAiB,MAAM,YAAY;AACnC,kBAAiB,MAAM,YAAY;AACnC,kBAAiB,MAAM,YAAY;AACnC,kBAAiB,MAAM,YAAY;CACnC,MAAM,gBAAgB,IAAI,SAAS,mBAAmB,iBAAiB;CACvE,MAAM,eAAe;EACpB;GACC,MAAM;GACN,MAAM;GACN;EACD;GACC,MAAM;GACN,MAAM;GACN;EACD;GACC,MAAM;GACN,MAAM;GACN;EACD;GACC,MAAM;GACN,MAAM;GACN;EACD;GACC,MAAM;GACN,MAAM;GACN;EACD;CACD,MAAM,cAAc,EAAE;CACtB,MAAM,UAAU,IAAI,SAAS,aAAa,WAAW,IAAI,OAAO;AAChE,MAAK,MAAM,KAAK,aAAc,KAAI,CAAC,EAAE,EAAE,KAAK,aAAa,EAAE,KAAK,KAAK;EACpE,MAAM,OAAO,eAAe,yBAAyB,IAAI,QAAQ,SAAS,EAAE,KAAK,IAAI,UAAU,SAAS,EAAE,KAAK,OAAO,gBAAgB,iBAAiB,EAAE,KAAK,IAAI,aAAa,cAAc,MAAM,UAAU,OAAO,IAAI;AACxN,cAAY,KAAK,KAAK;OAChB,aAAY,KAAK,eAAe,uBAAuB,IAAI,OAAO,CAAC;AAC1E,MAAK,YAAY,SAAS;AAC1B,MAAK,aAAa,GAAG,IAAI,OAAO,gBAAgB;EAC/C,QAAQ;EACR,SAAS,CAAC;GACT,SAAS;GACT,UAAU,EAAE,QAAQ,eAAe;GACnC,CAAC;EACF,CAAC,CAAC;AACH,MAAK,aAAa,GAAG,IAAI,OAAO,gBAAgB;EAC/C,QAAQ;EACR,SAAS;GACR;IACC,SAAS;IACT,UAAU,YAAY;IACtB;GACD;IACC,SAAS;IACT,UAAU,YAAY;IACtB;GACD;IACC,SAAS;IACT,UAAU,gBAAgB,YAAY,YAAY,KAAK,YAAY;IACnE;GACD;IACC,SAAS;IACT,UAAU,YAAY;IACtB;GACD;IACC,SAAS;IACT,UAAU,YAAY;IACtB;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;EACD,CAAC,CAAC;AACH,MAAK,KAAK,EAAE;;AAKb,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"renderer-DYdll3xW.mjs","names":[],"sources":["../../../nodes/node-noise-generator/dist/renderers-DdsDStam.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveSignalField } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, fragmentBindGroupLayout, perDevice, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst NOISE_SHADER = `\nstruct NoiseUniforms {\n noiseType : f32, // 0 = Perlin, 1 = Simplex, 2 = Voronoi\n outputType : f32, // 0 = Image, 1 = Video\n time : f32,\n _padding : f32,\n \n scale : f32,\n octaves : f32,\n persistence : f32,\n lacunarity : f32,\n \n speed : f32,\n hasSignal_scale : f32,\n hasSignal_octaves : f32,\n hasSignal_persistence : f32,\n \n hasSignal_lacunarity : f32,\n hasSignal_speed : f32,\n _pad2 : f32,\n _pad3 : f32,\n\n colorStart : vec4<f32>,\n colorEnd : vec4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : NoiseUniforms;\n\n@group(1) @binding(0) var scaleTex : texture_2d<f32>;\n@group(1) @binding(1) var octavesTex : texture_2d<f32>;\n@group(1) @binding(2) var persistenceTex : texture_2d<f32>;\n@group(1) @binding(3) var lacunarityTex : texture_2d<f32>;\n@group(1) @binding(4) var speedTex : texture_2d<f32>;\n@group(1) @binding(5) var sigSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn hash3(p: vec3<f32>) -> vec3<f32> {\n var p3 = fract(p * vec3<f32>(0.1031, 0.11369, 0.13787));\n p3 += dot(p3, p3.yzx + 19.19);\n return fract((p3.xxy + p3.yzz) * p3.zyx) * 2.0 - 1.0;\n}\n\nfn perlin3d(p: vec3<f32>) -> f32 {\n let pi = floor(p);\n let pf = fract(p);\n \n let w = pf * pf * (3.0 - 2.0 * pf);\n \n let g000 = hash3(pi + vec3<f32>(0.0, 0.0, 0.0));\n let g100 = hash3(pi + vec3<f32>(1.0, 0.0, 0.0));\n let g010 = hash3(pi + vec3<f32>(0.0, 1.0, 0.0));\n let g110 = hash3(pi + vec3<f32>(1.0, 1.0, 0.0));\n let g001 = hash3(pi + vec3<f32>(0.0, 0.0, 1.0));\n let g101 = hash3(pi + vec3<f32>(1.0, 0.0, 1.0));\n let g011 = hash3(pi + vec3<f32>(0.0, 1.0, 1.0));\n let g111 = hash3(pi + vec3<f32>(1.0, 1.0, 1.0));\n \n let n000 = dot(g000, pf - vec3<f32>(0.0, 0.0, 0.0));\n let n100 = dot(g100, pf - vec3<f32>(1.0, 0.0, 0.0));\n let n010 = dot(g010, pf - vec3<f32>(0.0, 1.0, 0.0));\n let n110 = dot(g110, pf - vec3<f32>(1.0, 1.0, 0.0));\n let n001 = dot(g001, pf - vec3<f32>(0.0, 0.0, 1.0));\n let n101 = dot(g101, pf - vec3<f32>(1.0, 0.0, 1.0));\n let n011 = dot(g011, pf - vec3<f32>(0.0, 1.0, 1.0));\n let n111 = dot(g111, pf - vec3<f32>(1.0, 1.0, 1.0));\n \n let n_x00 = mix(n000, n100, w.x);\n let n_x10 = mix(n010, n110, w.x);\n let n_y0 = mix(n_x00, n_x10, w.y);\n \n let n_x01 = mix(n001, n101, w.x);\n let n_x11 = mix(n011, n111, w.x);\n let n_y1 = mix(n_x01, n_x11, w.y);\n \n return mix(n_y0, n_y1, w.z) * 0.5 + 0.5; // Map to [0, 1]\n}\n\nfn simplex3d(v: vec3<f32>) -> f32 {\n let skew = (v.x + v.y + v.z) * (1.0 / 3.0);\n let i = floor(v + skew);\n let unskew = (i.x + i.y + i.z) * (1.0 / 6.0);\n let x0 = v - i + unskew;\n \n var i1 = vec3<f32>(0.0);\n var i2 = vec3<f32>(0.0);\n \n if (x0.x >= x0.y) {\n if (x0.y >= x0.z) {\n i1 = vec3<f32>(1.0, 0.0, 0.0);\n i2 = vec3<f32>(1.0, 1.0, 0.0);\n } else if (x0.x >= x0.z) {\n i1 = vec3<f32>(1.0, 0.0, 0.0);\n i2 = vec3<f32>(1.0, 0.0, 1.0);\n } else {\n i1 = vec3<f32>(0.0, 0.0, 1.0);\n i2 = vec3<f32>(1.0, 0.0, 1.0);\n }\n } else {\n if (x0.y < x0.z) {\n i1 = vec3<f32>(0.0, 0.0, 1.0);\n i2 = vec3<f32>(0.0, 1.0, 1.0);\n } else if (x0.x < x0.z) {\n i1 = vec3<f32>(0.0, 1.0, 0.0);\n i2 = vec3<f32>(0.0, 1.0, 1.0);\n } else {\n i1 = vec3<f32>(0.0, 1.0, 0.0);\n i2 = vec3<f32>(1.0, 1.0, 0.0);\n }\n }\n \n let x1 = x0 - i1 + (1.0 / 6.0);\n let x2 = x0 - i2 + (1.0 / 3.0);\n let x3 = x0 - 1.0 + 0.5;\n \n var m = vec4<f32>(\n dot(x0, x0),\n dot(x1, x1),\n dot(x2, x2),\n dot(x3, x3)\n );\n m = max(0.6 - m, vec4<f32>(0.0));\n m = m * m;\n m = m * m;\n \n let g0 = dot(hash3(i + vec3<f32>(0.0)), x0);\n let g1 = dot(hash3(i + i1), x1);\n let g2 = dot(hash3(i + i2), x2);\n let g3 = dot(hash3(i + vec3<f32>(1.0)), x3);\n \n let n = dot(m, vec4<f32>(g0, g1, g2, g3));\n return 32.0 * n * 0.5 + 0.5;\n}\n\nfn voronoi3d(p: vec3<f32>) -> f32 {\n let pi = floor(p);\n let pf = fract(p);\n var min_dist = 8.0;\n \n for (var k = -1; k <= 1; k++) {\n for (var j = -1; j <= 1; j++) {\n for (var i = -1; i <= 1; i++) {\n let g = vec3<f32>(f32(i), f32(j), f32(k));\n let o = hash3(pi + g) * 0.5 + 0.5;\n let r = g + o - pf;\n let d = dot(r, r);\n if (d < min_dist) {\n min_dist = d;\n }\n }\n }\n }\n return clamp(sqrt(min_dist), 0.0, 1.0);\n}\n\nfn fbm_perlin(p: vec3<f32>, octaves: i32, persistence: f32, lacunarity: f32) -> f32 {\n var value = 0.0;\n var amp = 1.0;\n var freq = 1.0;\n var total_amp = 0.0;\n for (var i = 0; i < 8; i++) {\n if (i >= octaves) { break; }\n value += amp * perlin3d(p * freq);\n total_amp += amp;\n freq *= lacunarity;\n amp *= persistence;\n }\n return value / total_amp;\n}\n\nfn fbm_simplex(p: vec3<f32>, octaves: i32, persistence: f32, lacunarity: f32) -> f32 {\n var value = 0.0;\n var amp = 1.0;\n var freq = 1.0;\n var total_amp = 0.0;\n for (var i = 0; i < 8; i++) {\n if (i >= octaves) { break; }\n value += amp * simplex3d(p * freq);\n total_amp += amp;\n freq *= lacunarity;\n amp *= persistence;\n }\n return value / total_amp;\n}\n\nfn fbm_voronoi(p: vec3<f32>, octaves: i32, persistence: f32, lacunarity: f32) -> f32 {\n var value = 0.0;\n var amp = 1.0;\n var freq = 1.0;\n var total_amp = 0.0;\n for (var i = 0; i < 8; i++) {\n if (i >= octaves) { break; }\n value += amp * voronoi3d(p * freq);\n total_amp += amp;\n freq *= lacunarity;\n amp *= persistence;\n }\n return value / total_amp;\n}\n\nfn get_field(val: f32, hasSig: f32, tex: texture_2d<f32>, samp: sampler, uv: vec2<f32>) -> f32 {\n if (hasSig > 0.5) {\n return textureSampleLevel(tex, samp, uv, 0.0).r;\n }\n return val;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n let scale = get_field(u.scale, u.hasSignal_scale, scaleTex, sigSamp, in.uv);\n let octaves_f = get_field(u.octaves, u.hasSignal_octaves, octavesTex, sigSamp, in.uv);\n let octaves = i32(clamp(octaves_f, 1.0, 8.0));\n let persistence = get_field(u.persistence, u.hasSignal_persistence, persistenceTex, sigSamp, in.uv);\n let lacunarity = get_field(u.lacunarity, u.hasSignal_lacunarity, lacunarityTex, sigSamp, in.uv);\n let speed = get_field(u.speed, u.hasSignal_speed, speedTex, sigSamp, in.uv);\n\n let isVideo = u.outputType > 0.5;\n let z_coord = select(0.0, u.time * speed, isVideo);\n \n let coord = vec3<f32>(in.uv * scale, z_coord);\n \n var n_val = 0.0;\n if (u.noiseType < 0.5) {\n n_val = fbm_perlin(coord, octaves, persistence, lacunarity);\n } else if (u.noiseType < 1.5) {\n n_val = fbm_simplex(coord, octaves, persistence, lacunarity);\n } else {\n n_val = fbm_voronoi(coord, octaves, persistence, lacunarity);\n }\n \n return mix(u.colorStart, u.colorEnd, clamp(n_val, 0.0, 1.0));\n}\n`;\nconst noiseUniformData = new Float32Array(24);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsignalsLayout: texturesLayout(device, 5),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getNoiseResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `noise_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst noiseModule = device.createShaderModule({\n\t\t\tlabel: `noise_${format}.wgsl`,\n\t\t\tcode: NOISE_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `NoiseGeneratorPipeline_${format}`,\n\t\t\tmodule: noiseModule,\n\t\t\tlayouts: [layouts.uniformLayout, layouts.signalsLayout],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tnoisePipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsignalsLayout: layouts.signalsLayout\n\t};\n}\nfunction hexToRgba(hex) {\n\tlet h = hex.replace(\"#\", \"\");\n\tif (h.length === 3 || h.length === 4) h = h.split(\"\").map((c) => c + c).join(\"\");\n\tconst r = parseInt(h.substring(0, 2), 16) / 255;\n\tconst g = parseInt(h.substring(2, 4), 16) / 255;\n\tconst b = parseInt(h.substring(4, 6), 16) / 255;\n\tlet a = 1;\n\tif (h.length === 8) a = parseInt(h.substring(6, 8), 16) / 255;\n\treturn [\n\t\tr,\n\t\tg,\n\t\tb,\n\t\ta\n\t];\n}\nconst NoiseWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"NoiseGenerator\" || !op) return;\n\tconst { noisePipeline: pipeline, uniformLayout: uLayout, signalsLayout: sigLayout } = getNoiseResources(ctx.device, ctx.renderer.format);\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst scaleInfo = resolveSignalField(op, \"scale\", 10);\n\tconst octavesInfo = resolveSignalField(op, \"octaves\", 4);\n\tconst persistenceInfo = resolveSignalField(op, \"persistence\", .5);\n\tconst lacunarityInfo = resolveSignalField(op, \"lacunarity\", 2);\n\tconst speedInfo = resolveSignalField(op, \"speed\", 1);\n\tconst noiseTypeVal = op.noiseType === \"Simplex\" ? 1 : op.noiseType === \"Voronoi\" ? 2 : 0;\n\tconst outputTypeVal = op.outputType === \"Video\" ? 1 : 0;\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst colorStartVal = hexToRgba(op.colorStart ?? \"#000000\");\n\tconst colorEndVal = hexToRgba(op.colorEnd ?? \"#ffffff\");\n\tnoiseUniformData[0] = noiseTypeVal;\n\tnoiseUniformData[1] = outputTypeVal;\n\tnoiseUniformData[2] = elapsedSeconds;\n\tnoiseUniformData[3] = 0;\n\tnoiseUniformData[4] = scaleInfo.value;\n\tnoiseUniformData[5] = octavesInfo.value;\n\tnoiseUniformData[6] = persistenceInfo.value;\n\tnoiseUniformData[7] = lacunarityInfo.value;\n\tnoiseUniformData[8] = speedInfo.value;\n\tnoiseUniformData[9] = scaleInfo.hasSignal ? 1 : 0;\n\tnoiseUniformData[10] = octavesInfo.hasSignal ? 1 : 0;\n\tnoiseUniformData[11] = persistenceInfo.hasSignal ? 1 : 0;\n\tnoiseUniformData[12] = lacunarityInfo.hasSignal ? 1 : 0;\n\tnoiseUniformData[13] = speedInfo.hasSignal ? 1 : 0;\n\tnoiseUniformData[14] = 0;\n\tnoiseUniformData[15] = 0;\n\tnoiseUniformData[16] = colorStartVal[0];\n\tnoiseUniformData[17] = colorStartVal[1];\n\tnoiseUniformData[18] = colorStartVal[2];\n\tnoiseUniformData[19] = colorStartVal[3];\n\tnoiseUniformData[20] = colorEndVal[0];\n\tnoiseUniformData[21] = colorEndVal[1];\n\tnoiseUniformData[22] = colorEndVal[2];\n\tnoiseUniformData[23] = colorEndVal[3];\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(noiseUniformData);\n\tconst signalFields = [\n\t\t{\n\t\t\tname: \"scale\",\n\t\t\tinfo: scaleInfo\n\t\t},\n\t\t{\n\t\t\tname: \"octaves\",\n\t\t\tinfo: octavesInfo\n\t\t},\n\t\t{\n\t\t\tname: \"persistence\",\n\t\t\tinfo: persistenceInfo\n\t\t},\n\t\t{\n\t\t\tname: \"lacunarity\",\n\t\t\tinfo: lacunarityInfo\n\t\t},\n\t\t{\n\t\t\tname: \"speed\",\n\t\t\tinfo: speedInfo\n\t\t}\n\t];\n\tconst signalViews = [];\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tfor (const f of signalFields) if (!!(f.info.hasSignal && f.info.sd)) {\n\t\tconst view = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, f.info.sd?.nodeId ?? `noise_${f.name}_sig`, elapsedSeconds, durationSeconds, f.info.sd, targetWidth, targetHeight, props.renderId, frame, fps);\n\t\tsignalViews.push(view);\n\t} else signalViews.push(signalRegistry.getDummy1x1TextureView(ctx.device));\n\tpass.setPipeline(pipeline);\n\tpass.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t}));\n\tpass.setBindGroup(1, ctx.device.createBindGroup({\n\t\tlayout: sigLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: signalViews[0]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: signalViews[1]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: persistenceInfo.hasSignal ? signalViews[2] : signalViews[2]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: signalViews[3]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: signalViews[4]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 5,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t}));\n\tpass.draw(4);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: NoiseWebGPURenderer });\n\n//#endregion\nexport { NoiseWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-DdsDStam.mjs.map"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { n as defineRenderer } from "./renderer-C9r0-KY4.mjs";
|
|
2
|
-
import { Fn as signalRegistry } from "./dist-
|
|
3
|
-
import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-
|
|
2
|
+
import { Fn as signalRegistry } from "./dist-Bf0H4lp1.mjs";
|
|
3
|
+
import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CevnCkZC.mjs";
|
|
4
4
|
|
|
5
5
|
//#region ../../nodes/node-colorkey/dist/renderers-eo_mW2uK.mjs
|
|
6
6
|
const COLORKEY_SHADER = `
|
|
@@ -279,4 +279,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: ColorKeyWebGPURenderer
|
|
|
279
279
|
|
|
280
280
|
//#endregion
|
|
281
281
|
export { renderers_default as t };
|
|
282
|
-
//# sourceMappingURL=renderer-
|
|
282
|
+
//# sourceMappingURL=renderer-Datqywo_.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-BhhweLr_.mjs","names":[],"sources":["../../../nodes/node-colorkey/dist/renderers-eo_mW2uK.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst COLORKEY_SHADER = `\nstruct ColorKeyUniforms {\n\tsimilarity : f32,\n\tsmoothness : f32,\n\tspillSuppression : f32,\n\tcolorSpace : f32, // 0 for YUV, 1 for RGB\n\tspillSuppressionType : f32, // 0 for Desaturate, 1 for Neutralize, 2 for None\n\tkeyR : f32,\n\tkeyG : f32,\n\tkeyB : f32,\n\thasSimilaritySig : f32,\n\thasSmoothnessSig : f32,\n\thasSpillSig : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : ColorKeyUniforms;\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 similaritySigTex : texture_2d<f32>;\n@group(2) @binding(1) var smoothnessSigTex : texture_2d<f32>;\n@group(2) @binding(2) var spillSigTex : texture_2d<f32>;\n@group(2) @binding(3) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn rgb2yuv(rgb: vec3<f32>) -> vec3<f32> {\n\tlet y = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b;\n\tlet u = -0.169 * rgb.r - 0.331 * rgb.g + 0.500 * rgb.b;\n\tlet v = 0.500 * rgb.r - 0.419 * rgb.g - 0.081 * rgb.b;\n\treturn vec3<f32>(y, u, v);\n}\n\nfn yuv2rgb(yuv: vec3<f32>) -> vec3<f32> {\n\tlet r = yuv.x + 1.402 * yuv.z;\n\tlet g = yuv.x - 0.344 * yuv.y - 0.714 * yuv.z;\n\tlet b = yuv.x + 1.772 * yuv.y;\n\treturn vec3<f32>(r, g, b);\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet src_color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tif (src_color.a < 1e-5) {\n\t\treturn src_color;\n\t}\n\n\t// Unpremultiply alpha for keying and grading\n\tlet unpremult_rgb = src_color.rgb / src_color.a;\n\n\t// Resolve dynamic signals if connected, otherwise use static uniform values\n\tvar similarity = u.similarity;\n\tif (u.hasSimilaritySig > 0.5) {\n\t\tsimilarity = textureSampleLevel(similaritySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tvar smoothness = u.smoothness;\n\tif (u.hasSmoothnessSig > 0.5) {\n\t\tsmoothness = textureSampleLevel(smoothnessSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tvar spillSuppression = u.spillSuppression;\n\tif (u.hasSpillSig > 0.5) {\n\t\tspillSuppression = textureSampleLevel(spillSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet keyColor = vec3<f32>(u.keyR, u.keyG, u.keyB);\n\n\t// 1. Calculate similarity distance\n\tvar dist = 0.0;\n\tif (u.colorSpace < 0.5) {\n\t\t// YUV (Chroma Distance)\n\t\tlet C_yuv = rgb2yuv(unpremult_rgb);\n\t\tlet K_yuv = rgb2yuv(keyColor);\n\t\tdist = distance(C_yuv.yz, K_yuv.yz);\n\t} else {\n\t\t// RGB (Exact Distance)\n\t\tdist = distance(unpremult_rgb, keyColor);\n\t}\n\n\t// 2. Calculate transparency mask\n\tvar mask = 0.0;\n\tif (smoothness < 0.0001) {\n\t\tmask = select(0.0, 1.0, dist >= similarity);\n\t} else {\n\t\tmask = smoothstep(similarity, similarity + smoothness, dist);\n\t}\n\n\t// 3. Apply spill suppression\n\tvar final_rgb = unpremult_rgb;\n\tif (u.spillSuppressionType < 2.5) { // 0 for Desaturate, 1 for Neutralize, 2 for None\n\t\tlet C_yuv = rgb2yuv(unpremult_rgb);\n\t\tlet K_yuv = rgb2yuv(keyColor);\n\t\tlet K_chroma = K_yuv.yz;\n\t\tlet K_len_sq = dot(K_chroma, K_chroma);\n\n\t\tif (K_len_sq > 1e-6) {\n\t\t\tlet C_chroma = C_yuv.yz;\n\t\t\tlet proj = dot(C_chroma, K_chroma) / K_len_sq;\n\t\t\tif (proj > 0.0) {\n\t\t\t\tlet C_para = proj * K_chroma;\n\t\t\t\tvar C_chroma_suppressed = C_chroma;\n\n\t\t\t\tif (u.spillSuppressionType < 0.5) {\n\t\t\t\t\t// Desaturate\n\t\t\t\t\tC_chroma_suppressed = C_chroma - spillSuppression * C_para;\n\t\t\t\t} else {\n\t\t\t\t\t// Neutralize (completely shift to neutral gray chroma)\n\t\t\t\t\tC_chroma_suppressed = C_chroma - C_para;\n\t\t\t\t}\n\n\t\t\t\tfinal_rgb = yuv2rgb(vec3<f32>(C_yuv.x, C_chroma_suppressed.x, C_chroma_suppressed.y));\n\t\t\t}\n\t\t}\n\t}\n\n\tlet final_alpha = src_color.a * mask;\n\treturn vec4<f32>(clamp(final_rgb, vec3<f32>(0.0), vec3<f32>(1.0)) * final_alpha, final_alpha);\n}\n`;\nconst colorKeyData = new Float32Array(12);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 3),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getColorKeyResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `colorkey_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst colorKeyModule = device.createShaderModule({\n\t\t\tlabel: `colorkey_${format}.wgsl`,\n\t\t\tcode: COLORKEY_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `ColorKeyPipeline_${format}`,\n\t\t\tmodule: colorKeyModule,\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\tcolorKeyPipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nfunction hexToRgb(hex) {\n\tlet h = hex.replace(\"#\", \"\");\n\tif (h.length === 3) h = h.split(\"\").map((c) => c + c).join(\"\");\n\treturn [\n\t\tparseInt(h.substring(0, 2), 16) / 255,\n\t\tparseInt(h.substring(2, 4), 16) / 255,\n\t\tparseInt(h.substring(4, 6), 16) / 255\n\t];\n}\nconst ColorKeyWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ColorKey\" || !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] : \"colorkey_node\";\n\tconst similarityInput = op.similarityHandleId ? op.inputs?.[op.similarityHandleId] : null;\n\tconst hasSimilaritySig = !!(similarityInput?.connectionValid && (similarityInput.outputItem?.type === \"Signal\" || similarityInput.outputItem?.type === \"Numeric\"));\n\tconst similaritySd = hasSimilaritySig && similarityInput?.outputItem?.data ? similarityInput.outputItem.data : null;\n\tlet similarity = .4;\n\tlet hasStaticSimilaritySig = false;\n\tif (!hasSimilaritySig) if (similarityInput?.connectionValid && similarityInput.outputItem?.type === \"Number\") similarity = Math.max(0, Math.min(1, Number(similarityInput.outputItem.data ?? .4)));\n\telse similarity = Math.max(0, Math.min(1, Number(op.similarity ?? .4)));\n\telse if (similaritySd) {\n\t\tsimilarity = Math.max(0, Math.min(1, Number(similaritySd.offset ?? 0)));\n\t\thasStaticSimilaritySig = true;\n\t}\n\tconst smoothnessInput = op.smoothnessHandleId ? op.inputs?.[op.smoothnessHandleId] : null;\n\tconst hasSmoothnessSig = !!(smoothnessInput?.connectionValid && (smoothnessInput.outputItem?.type === \"Signal\" || smoothnessInput.outputItem?.type === \"Numeric\"));\n\tconst smoothnessSd = hasSmoothnessSig && smoothnessInput?.outputItem?.data ? smoothnessInput.outputItem.data : null;\n\tlet smoothness = .1;\n\tlet hasStaticSmoothnessSig = false;\n\tif (!hasSmoothnessSig) if (smoothnessInput?.connectionValid && smoothnessInput.outputItem?.type === \"Number\") smoothness = Math.max(0, Math.min(1, Number(smoothnessInput.outputItem.data ?? .1)));\n\telse smoothness = Math.max(0, Math.min(1, Number(op.smoothness ?? .1)));\n\telse if (smoothnessSd) {\n\t\tsmoothness = Math.max(0, Math.min(1, Number(smoothnessSd.offset ?? 0)));\n\t\thasStaticSmoothnessSig = true;\n\t}\n\tconst spillInput = op.spillSuppressionHandleId ? op.inputs?.[op.spillSuppressionHandleId] : null;\n\tconst hasSpillSig = !!(spillInput?.connectionValid && (spillInput.outputItem?.type === \"Signal\" || spillInput.outputItem?.type === \"Numeric\"));\n\tconst spillSd = hasSpillSig && spillInput?.outputItem?.data ? spillInput.outputItem.data : null;\n\tlet spillSuppression = .2;\n\tlet hasStaticSpillSig = false;\n\tif (!hasSpillSig) if (spillInput?.connectionValid && spillInput.outputItem?.type === \"Number\") spillSuppression = Math.max(0, Math.min(1, Number(spillInput.outputItem.data ?? .2)));\n\telse spillSuppression = Math.max(0, Math.min(1, Number(op.spillSuppression ?? .2)));\n\telse if (spillSd) {\n\t\tspillSuppression = Math.max(0, Math.min(1, Number(spillSd.offset ?? 0)));\n\t\thasStaticSpillSig = true;\n\t}\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { colorKeyPipeline: pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getColorKeyResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tlet similarityView;\n\tif (hasStaticSimilaritySig && similaritySd) similarityView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, similaritySd.nodeId ?? `${nodeId}_similarity_sig`, elapsedSeconds, durationSeconds, similaritySd, width, height, props.renderId, frame, fps);\n\telse similarityView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tlet smoothnessView;\n\tif (hasStaticSmoothnessSig && smoothnessSd) smoothnessView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, smoothnessSd.nodeId ?? `${nodeId}_smoothness_sig`, elapsedSeconds, durationSeconds, smoothnessSd, width, height, props.renderId, frame, fps);\n\telse smoothnessView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tlet spillView;\n\tif (hasStaticSpillSig && spillSd) spillView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, spillSd.nodeId ?? `${nodeId}_spill_sig`, elapsedSeconds, durationSeconds, spillSd, width, height, props.renderId, frame, fps);\n\telse spillView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tconst [keyR, keyG, keyB] = hexToRgb(op.keyColor ?? \"#00ff00\");\n\tcolorKeyData[0] = similarity;\n\tcolorKeyData[1] = smoothness;\n\tcolorKeyData[2] = spillSuppression;\n\tcolorKeyData[3] = op.colorSpace === \"RGB\" ? 1 : 0;\n\tcolorKeyData[4] = op.spillSuppressionType === \"None\" ? 2 : op.spillSuppressionType === \"Neutralize\" ? 1 : 0;\n\tcolorKeyData[5] = keyR;\n\tcolorKeyData[6] = keyG;\n\tcolorKeyData[7] = keyB;\n\tcolorKeyData[8] = hasStaticSimilaritySig ? 1 : 0;\n\tcolorKeyData[9] = hasStaticSmoothnessSig ? 1 : 0;\n\tcolorKeyData[10] = hasStaticSpillSig ? 1 : 0;\n\tcolorKeyData[11] = 0;\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst singleBuffer = ctx.renderer.getTemporaryBuffer(colorKeyData);\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: singleBuffer }\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: similarityView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: smoothnessView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: spillView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\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, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ColorKeyWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-eo_mW2uK.mjs.map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderer-Datqywo_.mjs","names":[],"sources":["../../../nodes/node-colorkey/dist/renderers-eo_mW2uK.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst COLORKEY_SHADER = `\nstruct ColorKeyUniforms {\n\tsimilarity : f32,\n\tsmoothness : f32,\n\tspillSuppression : f32,\n\tcolorSpace : f32, // 0 for YUV, 1 for RGB\n\tspillSuppressionType : f32, // 0 for Desaturate, 1 for Neutralize, 2 for None\n\tkeyR : f32,\n\tkeyG : f32,\n\tkeyB : f32,\n\thasSimilaritySig : f32,\n\thasSmoothnessSig : f32,\n\thasSpillSig : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : ColorKeyUniforms;\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 similaritySigTex : texture_2d<f32>;\n@group(2) @binding(1) var smoothnessSigTex : texture_2d<f32>;\n@group(2) @binding(2) var spillSigTex : texture_2d<f32>;\n@group(2) @binding(3) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn rgb2yuv(rgb: vec3<f32>) -> vec3<f32> {\n\tlet y = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b;\n\tlet u = -0.169 * rgb.r - 0.331 * rgb.g + 0.500 * rgb.b;\n\tlet v = 0.500 * rgb.r - 0.419 * rgb.g - 0.081 * rgb.b;\n\treturn vec3<f32>(y, u, v);\n}\n\nfn yuv2rgb(yuv: vec3<f32>) -> vec3<f32> {\n\tlet r = yuv.x + 1.402 * yuv.z;\n\tlet g = yuv.x - 0.344 * yuv.y - 0.714 * yuv.z;\n\tlet b = yuv.x + 1.772 * yuv.y;\n\treturn vec3<f32>(r, g, b);\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet src_color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tif (src_color.a < 1e-5) {\n\t\treturn src_color;\n\t}\n\n\t// Unpremultiply alpha for keying and grading\n\tlet unpremult_rgb = src_color.rgb / src_color.a;\n\n\t// Resolve dynamic signals if connected, otherwise use static uniform values\n\tvar similarity = u.similarity;\n\tif (u.hasSimilaritySig > 0.5) {\n\t\tsimilarity = textureSampleLevel(similaritySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tvar smoothness = u.smoothness;\n\tif (u.hasSmoothnessSig > 0.5) {\n\t\tsmoothness = textureSampleLevel(smoothnessSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tvar spillSuppression = u.spillSuppression;\n\tif (u.hasSpillSig > 0.5) {\n\t\tspillSuppression = textureSampleLevel(spillSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet keyColor = vec3<f32>(u.keyR, u.keyG, u.keyB);\n\n\t// 1. Calculate similarity distance\n\tvar dist = 0.0;\n\tif (u.colorSpace < 0.5) {\n\t\t// YUV (Chroma Distance)\n\t\tlet C_yuv = rgb2yuv(unpremult_rgb);\n\t\tlet K_yuv = rgb2yuv(keyColor);\n\t\tdist = distance(C_yuv.yz, K_yuv.yz);\n\t} else {\n\t\t// RGB (Exact Distance)\n\t\tdist = distance(unpremult_rgb, keyColor);\n\t}\n\n\t// 2. Calculate transparency mask\n\tvar mask = 0.0;\n\tif (smoothness < 0.0001) {\n\t\tmask = select(0.0, 1.0, dist >= similarity);\n\t} else {\n\t\tmask = smoothstep(similarity, similarity + smoothness, dist);\n\t}\n\n\t// 3. Apply spill suppression\n\tvar final_rgb = unpremult_rgb;\n\tif (u.spillSuppressionType < 2.5) { // 0 for Desaturate, 1 for Neutralize, 2 for None\n\t\tlet C_yuv = rgb2yuv(unpremult_rgb);\n\t\tlet K_yuv = rgb2yuv(keyColor);\n\t\tlet K_chroma = K_yuv.yz;\n\t\tlet K_len_sq = dot(K_chroma, K_chroma);\n\n\t\tif (K_len_sq > 1e-6) {\n\t\t\tlet C_chroma = C_yuv.yz;\n\t\t\tlet proj = dot(C_chroma, K_chroma) / K_len_sq;\n\t\t\tif (proj > 0.0) {\n\t\t\t\tlet C_para = proj * K_chroma;\n\t\t\t\tvar C_chroma_suppressed = C_chroma;\n\n\t\t\t\tif (u.spillSuppressionType < 0.5) {\n\t\t\t\t\t// Desaturate\n\t\t\t\t\tC_chroma_suppressed = C_chroma - spillSuppression * C_para;\n\t\t\t\t} else {\n\t\t\t\t\t// Neutralize (completely shift to neutral gray chroma)\n\t\t\t\t\tC_chroma_suppressed = C_chroma - C_para;\n\t\t\t\t}\n\n\t\t\t\tfinal_rgb = yuv2rgb(vec3<f32>(C_yuv.x, C_chroma_suppressed.x, C_chroma_suppressed.y));\n\t\t\t}\n\t\t}\n\t}\n\n\tlet final_alpha = src_color.a * mask;\n\treturn vec4<f32>(clamp(final_rgb, vec3<f32>(0.0), vec3<f32>(1.0)) * final_alpha, final_alpha);\n}\n`;\nconst colorKeyData = new Float32Array(12);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 3),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getColorKeyResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `colorkey_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst colorKeyModule = device.createShaderModule({\n\t\t\tlabel: `colorkey_${format}.wgsl`,\n\t\t\tcode: COLORKEY_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `ColorKeyPipeline_${format}`,\n\t\t\tmodule: colorKeyModule,\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\tcolorKeyPipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nfunction hexToRgb(hex) {\n\tlet h = hex.replace(\"#\", \"\");\n\tif (h.length === 3) h = h.split(\"\").map((c) => c + c).join(\"\");\n\treturn [\n\t\tparseInt(h.substring(0, 2), 16) / 255,\n\t\tparseInt(h.substring(2, 4), 16) / 255,\n\t\tparseInt(h.substring(4, 6), 16) / 255\n\t];\n}\nconst ColorKeyWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ColorKey\" || !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] : \"colorkey_node\";\n\tconst similarityInput = op.similarityHandleId ? op.inputs?.[op.similarityHandleId] : null;\n\tconst hasSimilaritySig = !!(similarityInput?.connectionValid && (similarityInput.outputItem?.type === \"Signal\" || similarityInput.outputItem?.type === \"Numeric\"));\n\tconst similaritySd = hasSimilaritySig && similarityInput?.outputItem?.data ? similarityInput.outputItem.data : null;\n\tlet similarity = .4;\n\tlet hasStaticSimilaritySig = false;\n\tif (!hasSimilaritySig) if (similarityInput?.connectionValid && similarityInput.outputItem?.type === \"Number\") similarity = Math.max(0, Math.min(1, Number(similarityInput.outputItem.data ?? .4)));\n\telse similarity = Math.max(0, Math.min(1, Number(op.similarity ?? .4)));\n\telse if (similaritySd) {\n\t\tsimilarity = Math.max(0, Math.min(1, Number(similaritySd.offset ?? 0)));\n\t\thasStaticSimilaritySig = true;\n\t}\n\tconst smoothnessInput = op.smoothnessHandleId ? op.inputs?.[op.smoothnessHandleId] : null;\n\tconst hasSmoothnessSig = !!(smoothnessInput?.connectionValid && (smoothnessInput.outputItem?.type === \"Signal\" || smoothnessInput.outputItem?.type === \"Numeric\"));\n\tconst smoothnessSd = hasSmoothnessSig && smoothnessInput?.outputItem?.data ? smoothnessInput.outputItem.data : null;\n\tlet smoothness = .1;\n\tlet hasStaticSmoothnessSig = false;\n\tif (!hasSmoothnessSig) if (smoothnessInput?.connectionValid && smoothnessInput.outputItem?.type === \"Number\") smoothness = Math.max(0, Math.min(1, Number(smoothnessInput.outputItem.data ?? .1)));\n\telse smoothness = Math.max(0, Math.min(1, Number(op.smoothness ?? .1)));\n\telse if (smoothnessSd) {\n\t\tsmoothness = Math.max(0, Math.min(1, Number(smoothnessSd.offset ?? 0)));\n\t\thasStaticSmoothnessSig = true;\n\t}\n\tconst spillInput = op.spillSuppressionHandleId ? op.inputs?.[op.spillSuppressionHandleId] : null;\n\tconst hasSpillSig = !!(spillInput?.connectionValid && (spillInput.outputItem?.type === \"Signal\" || spillInput.outputItem?.type === \"Numeric\"));\n\tconst spillSd = hasSpillSig && spillInput?.outputItem?.data ? spillInput.outputItem.data : null;\n\tlet spillSuppression = .2;\n\tlet hasStaticSpillSig = false;\n\tif (!hasSpillSig) if (spillInput?.connectionValid && spillInput.outputItem?.type === \"Number\") spillSuppression = Math.max(0, Math.min(1, Number(spillInput.outputItem.data ?? .2)));\n\telse spillSuppression = Math.max(0, Math.min(1, Number(op.spillSuppression ?? .2)));\n\telse if (spillSd) {\n\t\tspillSuppression = Math.max(0, Math.min(1, Number(spillSd.offset ?? 0)));\n\t\thasStaticSpillSig = true;\n\t}\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { colorKeyPipeline: pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getColorKeyResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tlet similarityView;\n\tif (hasStaticSimilaritySig && similaritySd) similarityView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, similaritySd.nodeId ?? `${nodeId}_similarity_sig`, elapsedSeconds, durationSeconds, similaritySd, width, height, props.renderId, frame, fps);\n\telse similarityView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tlet smoothnessView;\n\tif (hasStaticSmoothnessSig && smoothnessSd) smoothnessView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, smoothnessSd.nodeId ?? `${nodeId}_smoothness_sig`, elapsedSeconds, durationSeconds, smoothnessSd, width, height, props.renderId, frame, fps);\n\telse smoothnessView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tlet spillView;\n\tif (hasStaticSpillSig && spillSd) spillView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, spillSd.nodeId ?? `${nodeId}_spill_sig`, elapsedSeconds, durationSeconds, spillSd, width, height, props.renderId, frame, fps);\n\telse spillView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tconst [keyR, keyG, keyB] = hexToRgb(op.keyColor ?? \"#00ff00\");\n\tcolorKeyData[0] = similarity;\n\tcolorKeyData[1] = smoothness;\n\tcolorKeyData[2] = spillSuppression;\n\tcolorKeyData[3] = op.colorSpace === \"RGB\" ? 1 : 0;\n\tcolorKeyData[4] = op.spillSuppressionType === \"None\" ? 2 : op.spillSuppressionType === \"Neutralize\" ? 1 : 0;\n\tcolorKeyData[5] = keyR;\n\tcolorKeyData[6] = keyG;\n\tcolorKeyData[7] = keyB;\n\tcolorKeyData[8] = hasStaticSimilaritySig ? 1 : 0;\n\tcolorKeyData[9] = hasStaticSmoothnessSig ? 1 : 0;\n\tcolorKeyData[10] = hasStaticSpillSig ? 1 : 0;\n\tcolorKeyData[11] = 0;\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst singleBuffer = ctx.renderer.getTemporaryBuffer(colorKeyData);\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: singleBuffer }\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: similarityView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: smoothnessView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: spillView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\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, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ColorKeyWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-eo_mW2uK.mjs.map"],"mappings":";;;;;AAKA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;EAuBtB,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+FvB,MAAM,eAAe,IAAI,aAAa,GAAG;AACzC,MAAM,mBAAmB,WAAW,YAAY;CAC/C,eAAe,wBAAwB,QAAQ,CAAC,UAAU,CAAC;CAC3D,qBAAqB,wBAAwB,QAAQ,CAAC,WAAW,UAAU,CAAC;CAC5E,qBAAqB,eAAe,QAAQ,EAAE;CAC9C,+BAA+B,IAAI,KAAK;CACxC,EAAE;AACH,SAAS,qBAAqB,QAAQ,QAAQ;CAC7C,MAAM,UAAU,iBAAiB,OAAO;CACxC,MAAM,WAAW,YAAY;CAC7B,IAAI,WAAW,QAAQ,cAAc,IAAI,SAAS;AAClD,KAAI,CAAC,UAAU;EACd,MAAM,iBAAiB,OAAO,mBAAmB;GAChD,OAAO,YAAY,OAAO;GAC1B,MAAM;GACN,CAAC;AACF,aAAW,yBAAyB,QAAQ;GAC3C,OAAO,oBAAoB;GAC3B,QAAQ;GACR,SAAS;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR;GACD;GACA,CAAC;AACF,UAAQ,cAAc,IAAI,UAAU,SAAS;;AAE9C,QAAO;EACN,kBAAkB;EAClB,eAAe,QAAQ;EACvB,qBAAqB,QAAQ;EAC7B,qBAAqB,QAAQ;EAC7B;;AAEF,SAAS,SAAS,KAAK;CACtB,IAAI,IAAI,IAAI,QAAQ,KAAK,GAAG;AAC5B,KAAI,EAAE,WAAW,EAAG,KAAI,EAAE,MAAM,GAAG,CAAC,KAAK,MAAM,IAAI,EAAE,CAAC,KAAK,GAAG;AAC9D,QAAO;EACN,SAAS,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,GAAG;EAClC,SAAS,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,GAAG;EAClC,SAAS,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,GAAG;EAClC;;AAEF,MAAM,yBAAyB,OAAO,SAAS;CAC9C,MAAM,EAAE,KAAK,SAAS,MAAM,eAAe,aAAa,cAAc,UAAU;CAChF,MAAM,QAAQ,MAAM,SAAS;CAC7B,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,cAAc,CAAC,GAAI;CAClC,MAAM,aAAa,MAAM,aAAa,WAAW;AACjD,KAAI,CAAC,WAAY;AACjB,MAAK,KAAK;CACV,MAAM,QAAQ;CACd,MAAM,SAAS;CACf,MAAM,SAAS,GAAG,SAAS,OAAO,KAAK,GAAG,OAAO,CAAC,KAAK;CACvD,MAAM,kBAAkB,GAAG,qBAAqB,GAAG,SAAS,GAAG,sBAAsB;CACrF,MAAM,mBAAmB,CAAC,EAAE,iBAAiB,oBAAoB,gBAAgB,YAAY,SAAS,YAAY,gBAAgB,YAAY,SAAS;CACvJ,MAAM,eAAe,oBAAoB,iBAAiB,YAAY,OAAO,gBAAgB,WAAW,OAAO;CAC/G,IAAI,aAAa;CACjB,IAAI,yBAAyB;AAC7B,KAAI,CAAC,iBAAkB,KAAI,iBAAiB,mBAAmB,gBAAgB,YAAY,SAAS,SAAU,cAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,gBAAgB,WAAW,QAAQ,GAAG,CAAC,CAAC;KAC7L,cAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,GAAG,cAAc,GAAG,CAAC,CAAC;UAC9D,cAAc;AACtB,eAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,aAAa,UAAU,EAAE,CAAC,CAAC;AACvE,2BAAyB;;CAE1B,MAAM,kBAAkB,GAAG,qBAAqB,GAAG,SAAS,GAAG,sBAAsB;CACrF,MAAM,mBAAmB,CAAC,EAAE,iBAAiB,oBAAoB,gBAAgB,YAAY,SAAS,YAAY,gBAAgB,YAAY,SAAS;CACvJ,MAAM,eAAe,oBAAoB,iBAAiB,YAAY,OAAO,gBAAgB,WAAW,OAAO;CAC/G,IAAI,aAAa;CACjB,IAAI,yBAAyB;AAC7B,KAAI,CAAC,iBAAkB,KAAI,iBAAiB,mBAAmB,gBAAgB,YAAY,SAAS,SAAU,cAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,gBAAgB,WAAW,QAAQ,GAAG,CAAC,CAAC;KAC7L,cAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,GAAG,cAAc,GAAG,CAAC,CAAC;UAC9D,cAAc;AACtB,eAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,aAAa,UAAU,EAAE,CAAC,CAAC;AACvE,2BAAyB;;CAE1B,MAAM,aAAa,GAAG,2BAA2B,GAAG,SAAS,GAAG,4BAA4B;CAC5F,MAAM,cAAc,CAAC,EAAE,YAAY,oBAAoB,WAAW,YAAY,SAAS,YAAY,WAAW,YAAY,SAAS;CACnI,MAAM,UAAU,eAAe,YAAY,YAAY,OAAO,WAAW,WAAW,OAAO;CAC3F,IAAI,mBAAmB;CACvB,IAAI,oBAAoB;AACxB,KAAI,CAAC,YAAa,KAAI,YAAY,mBAAmB,WAAW,YAAY,SAAS,SAAU,oBAAmB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,WAAW,WAAW,QAAQ,GAAG,CAAC,CAAC;KAC/K,oBAAmB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,GAAG,oBAAoB,GAAG,CAAC,CAAC;UAC1E,SAAS;AACjB,qBAAmB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,QAAQ,UAAU,EAAE,CAAC,CAAC;AACxE,sBAAoB;;CAErB,MAAM,EAAE,SAAS,WAAW,MAAM,mBAAmB,MAAM,WAAW;CACtE,MAAM,EAAE,kBAAkB,UAAU,eAAe,SAAS,qBAAqB,SAAS,qBAAqB,cAAc,qBAAqB,IAAI,QAAQ,IAAI,SAAS,OAAO;CAClL,MAAM,UAAU,IAAI,SAAS,aAAa,WAAW,IAAI,OAAO;CAChE,MAAM,EAAE,gBAAgB,oBAAoB,aAAa,OAAO,OAAO,IAAI;CAC3E,IAAI;AACJ,KAAI,0BAA0B,aAAc,kBAAiB,eAAe,yBAAyB,IAAI,QAAQ,SAAS,aAAa,UAAU,GAAG,OAAO,kBAAkB,gBAAgB,iBAAiB,cAAc,OAAO,QAAQ,MAAM,UAAU,OAAO,IAAI;KACjQ,kBAAiB,eAAe,uBAAuB,IAAI,OAAO;CACvE,IAAI;AACJ,KAAI,0BAA0B,aAAc,kBAAiB,eAAe,yBAAyB,IAAI,QAAQ,SAAS,aAAa,UAAU,GAAG,OAAO,kBAAkB,gBAAgB,iBAAiB,cAAc,OAAO,QAAQ,MAAM,UAAU,OAAO,IAAI;KACjQ,kBAAiB,eAAe,uBAAuB,IAAI,OAAO;CACvE,IAAI;AACJ,KAAI,qBAAqB,QAAS,aAAY,eAAe,yBAAyB,IAAI,QAAQ,SAAS,QAAQ,UAAU,GAAG,OAAO,aAAa,gBAAgB,iBAAiB,SAAS,OAAO,QAAQ,MAAM,UAAU,OAAO,IAAI;KACnO,aAAY,eAAe,uBAAuB,IAAI,OAAO;CAClE,MAAM,CAAC,MAAM,MAAM,QAAQ,SAAS,GAAG,YAAY,UAAU;AAC7D,cAAa,KAAK;AAClB,cAAa,KAAK;AAClB,cAAa,KAAK;AAClB,cAAa,KAAK,GAAG,eAAe,QAAQ,IAAI;AAChD,cAAa,KAAK,GAAG,yBAAyB,SAAS,IAAI,GAAG,yBAAyB,eAAe,IAAI;AAC1G,cAAa,KAAK;AAClB,cAAa,KAAK;AAClB,cAAa,KAAK;AAClB,cAAa,KAAK,yBAAyB,IAAI;AAC/C,cAAa,KAAK,yBAAyB,IAAI;AAC/C,cAAa,MAAM,oBAAoB,IAAI;AAC3C,cAAa,MAAM;CACnB,MAAM,SAAS,IAAI,SAAS,oBAAoB,OAAO,QAAQ;EAC9D;EACA;EACA,GAAG,MAAM,mBAAmB,EAAE;EAC9B,CAAC;CACF,MAAM,eAAe,IAAI,SAAS,mBAAmB,aAAa;AAClE,oBAAmB,SAAS,OAAO,YAAY,EAAE,UAAU;EAC1D,IAAI,OAAO,gBAAgB;GAC1B,QAAQ;GACR,SAAS,CAAC;IACT,SAAS;IACT,UAAU,EAAE,QAAQ,cAAc;IAClC,CAAC;GACF,CAAC;EACF,IAAI,SAAS,eAAe,aAAa,IAAI,QAAQ,SAAS,QAAQ,QAAQ;EAC9E,IAAI,OAAO,gBAAgB;GAC1B,QAAQ;GACR,SAAS;IACR;KACC,SAAS;KACT,UAAU;KACV;IACD;KACC,SAAS;KACT,UAAU;KACV;IACD;KACC,SAAS;KACT,UAAU;KACV;IACD;KACC,SAAS;KACT,UAAU;KACV;IACD;GACD,CAAC;EACF,CAAC;AACF,qBAAoB,MAAM,QAAQ,GAAG,WAAW,EAAE;;AAKnD,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,wBAAwB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { n as defineRenderer, s as resolveSignalField } from "./renderer-C9r0-KY4.mjs";
|
|
2
|
-
import { Fn as signalRegistry, K as parseColor } from "./dist-
|
|
3
|
-
import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-
|
|
2
|
+
import { Fn as signalRegistry, K as parseColor } from "./dist-Bf0H4lp1.mjs";
|
|
3
|
+
import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-CevnCkZC.mjs";
|
|
4
4
|
|
|
5
5
|
//#region ../../nodes/node-refraction-caustics/dist/renderers-BuTkLbVU.mjs
|
|
6
6
|
const REFRACTION_CAUSTICS_SHADER = `
|
|
@@ -563,4 +563,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: RefractionCaustics3DWeb
|
|
|
563
563
|
|
|
564
564
|
//#endregion
|
|
565
565
|
export { renderers_default as n, RefractionCaustics3DWebGPURenderer as t };
|
|
566
|
-
//# sourceMappingURL=renderer-
|
|
566
|
+
//# sourceMappingURL=renderer-Ddg3dJmu.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-D0X7Eh-T.mjs","names":[],"sources":["../../../nodes/node-refraction-caustics/dist/renderers-BuTkLbVU.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveSignalField } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { parseColor, signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst REFRACTION_CAUSTICS_SHADER = `\nstruct RefractionCausticsUniforms {\n // vec4 0\n _pad0 : f32,\n ior : f32,\n dispersion : f32,\n refractionScale : f32,\n\n // vec4 1\n causticBrightness : f32,\n causticScale : f32,\n fluidRipples : f32,\n rippleSpeed : f32,\n\n // vec4 2\n roughness : f32,\n specularIntensity : f32,\n lightPosX : f32,\n lightPosY : f32,\n\n // vec4 3\n tintStrength : f32,\n depthInvert : f32,\n depthScale : f32,\n hasDepthMap : f32,\n\n // vec4 4\n timeProgress : f32,\n aspect : f32,\n _pad1 : f32,\n _pad2 : f32,\n\n // vec4 5: signal flags\n hasSigIOR : f32,\n hasSigDispersion : f32,\n hasSigRefractScale : f32,\n hasSigCaustic : f32,\n\n // vec4 6: signal flags\n hasSigRipples : f32,\n hasSigRoughness : f32,\n hasSigLightPosX : f32,\n hasSigLightPosY : f32,\n\n // vec4 7: reserved\n _pad3 : f32,\n _pad4 : f32,\n _pad5 : f32,\n _pad6 : f32,\n\n // vec4 8: color\n tintColor : vec4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : RefractionCausticsUniforms;\n\n@group(1) @binding(0) var srcTex : texture_2d<f32>;\n@group(1) @binding(1) var srcSamp : sampler;\n\n@group(2) @binding(0) var depthTex : texture_2d<f32>;\n@group(2) @binding(1) var depthSamp : sampler;\n\n@group(3) @binding(0) var iorSigTex : texture_2d<f32>;\n@group(3) @binding(1) var dispersionSigTex : texture_2d<f32>;\n@group(3) @binding(2) var refractScaleSigTex : texture_2d<f32>;\n@group(3) @binding(3) var causticSigTex : texture_2d<f32>;\n@group(3) @binding(4) var ripplesSigTex : texture_2d<f32>;\n@group(3) @binding(5) var roughnessSigTex : texture_2d<f32>;\n@group(3) @binding(6) var lightPosXSigTex : texture_2d<f32>;\n@group(3) @binding(7) var lightPosYSigTex : texture_2d<f32>;\n@group(3) @binding(8) var sigSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn sampleDepth(uv: vec2<f32>) -> f32 {\n let clampedUV = clamp(uv, vec2<f32>(0.0), vec2<f32>(1.0));\n var raw: f32 = 0.0;\n if (u.hasDepthMap > 0.5) {\n let dSample = textureSampleLevel(depthTex, depthSamp, clampedUV, 0.0);\n raw = dot(dSample.rgb, vec3<f32>(0.299, 0.587, 0.114));\n } else {\n let c = textureSampleLevel(srcTex, srcSamp, clampedUV, 0.0);\n raw = dot(c.rgb, vec3<f32>(0.299, 0.587, 0.114));\n }\n if (u.depthInvert > 0.5) {\n raw = 1.0 - raw;\n }\n return clamp(raw, 0.0, 1.0);\n}\n\nfn sampleSmoothDepth(uv: vec2<f32>, texelSize: vec2<f32>) -> f32 {\n let d0 = sampleDepth(uv);\n let d1 = sampleDepth(uv + vec2<f32>(texelSize.x, 0.0));\n let d2 = sampleDepth(uv - vec2<f32>(texelSize.x, 0.0));\n let d3 = sampleDepth(uv + vec2<f32>(0.0, texelSize.y));\n let d4 = sampleDepth(uv - vec2<f32>(0.0, texelSize.y));\n return (d0 * 4.0 + d1 + d2 + d3 + d4) * 0.125;\n}\n\n// Analytical fluid ripple wave height and normal gradient\nfn getFluidWave(uv: vec2<f32>, time: f32, freqScale: f32) -> vec3<f32> {\n let p = uv * freqScale * 18.0;\n let t = time * 3.0;\n\n let a1 = sin(p.x * 1.4 + p.y * 1.0 + t * 1.2);\n let a2 = sin(p.x * -1.8 + p.y * 1.6 + t * 0.9);\n let a3 = cos((p.x + p.y) * 2.2 - t * 1.4);\n\n let height = (a1 + a2 + a3) * 0.333;\n\n let dx = (1.4 * cos(p.x * 1.4 + p.y * 1.0 + t * 1.2)\n - 1.8 * cos(p.x * -1.8 + p.y * 1.6 + t * 0.9)\n - 2.2 * sin((p.x + p.y) * 2.2 - t * 1.4)) * freqScale * 18.0 * 0.333;\n\n let dy = (1.0 * cos(p.x * 1.4 + p.y * 1.0 + t * 1.2)\n + 1.6 * cos(p.x * -1.8 + p.y * 1.6 + t * 0.9)\n - 2.2 * sin((p.x + p.y) * 2.2 - t * 1.4)) * freqScale * 18.0 * 0.333;\n\n return vec3<f32>(dx, dy, height);\n}\n\n// Photometric cellular water caustic web (swimming pool / sunlight underwater filaments)\nfn getWaterCaustics(uv: vec2<f32>, time: f32, scale: f32) -> f32 {\n let p = uv * scale * 32.0;\n let t1 = time * 0.8;\n let t2 = time * 1.1;\n\n var p1 = p;\n p1.x = p1.x + sin(p.y * 0.45 + t1) * 1.6;\n p1.y = p1.y + cos(p.x * 0.45 + t1 * 0.8) * 1.6;\n\n var p2 = p * 1.2 + vec2<f32>(4.7, 2.1);\n p2.x = p2.x + cos(p2.y * 0.5 - t2 * 0.9) * 1.4;\n p2.y = p2.y + sin(p2.x * 0.5 + t2) * 1.4;\n\n let k1 = 1.0 - abs(sin(p1.x) * sin(p1.y));\n let k2 = 1.0 - abs(cos(p2.x) * cos(p2.y));\n\n // Sharp interconnected caustic web filaments\n let web = pow(k1 * k2, 3.5);\n return web;\n}\n\nfn computeSurfaceNormal(uv: vec2<f32>, texelSize: vec2<f32>, fluidRippleAmount: f32, rippleTime: f32, depthScaleVal: f32, causticScaleVal: f32) -> vec3<f32> {\n let step = texelSize * 2.0;\n let dL = sampleSmoothDepth(uv - vec2<f32>(step.x, 0.0), texelSize);\n let dR = sampleSmoothDepth(uv + vec2<f32>(step.x, 0.0), texelSize);\n let dD = sampleSmoothDepth(uv - vec2<f32>(0.0, step.y), texelSize);\n let dU = sampleSmoothDepth(uv + vec2<f32>(0.0, step.y), texelSize);\n\n var dx = (dR - dL) * depthScaleVal * 2.0;\n var dy = (dU - dD) * depthScaleVal * 2.0;\n\n if (fluidRippleAmount > 0.001) {\n let wave = getFluidWave(uv, rippleTime, causticScaleVal);\n dx = dx + wave.x * fluidRippleAmount * 0.08;\n dy = dy + wave.y * fluidRippleAmount * 0.08;\n }\n\n return normalize(vec3<f32>(-dx, -dy, 1.0));\n}\n\n// Snell's Law ray refraction with Total Internal Reflection (TIR) fallback\nfn calcRefractOffset(I: vec3<f32>, N: vec3<f32>, eta: f32, thickness: f32) -> vec2<f32> {\n let cosi = dot(-I, N);\n let cost2 = 1.0 - eta * eta * (1.0 - cosi * cosi);\n if (cost2 < 0.0) {\n // Total internal reflection -> reflect\n let R = reflect(I, N);\n return R.xy * thickness * 0.5;\n }\n let R = eta * I + (eta * cosi - sqrt(cost2)) * N;\n return R.xy * (thickness / max(0.2, abs(R.z)));\n}\n\nfn sampleAlbedoSafe(uv: vec2<f32>) -> vec4<f32> {\n if (uv.x >= 0.0 && uv.x <= 1.0 && uv.y >= 0.0 && uv.y <= 1.0) {\n return textureSampleLevel(srcTex, srcSamp, uv, 0.0);\n }\n // Mirror with subtle clamp for border inpainting / anti-tearing\n let mirroredUV = abs(fract(uv * 0.5 + 0.5) * 2.0 - 1.0);\n let clampedUV = clamp(mirroredUV, vec2<f32>(0.001), vec2<f32>(0.999));\n return textureSampleLevel(srcTex, srcSamp, clampedUV, 0.0);\n}\n\nfn spectralWavelength(t: f32) -> vec3<f32> {\n let x = clamp(t, 0.0, 1.0) * 6.0;\n var r: f32 = 0.0;\n var g: f32 = 0.0;\n var b: f32 = 0.0;\n\n if (x < 1.0) {\n r = 1.0;\n g = x;\n b = 0.0;\n } else if (x < 2.0) {\n r = 2.0 - x;\n g = 1.0;\n b = 0.0;\n } else if (x < 3.0) {\n r = 0.0;\n g = 1.0;\n b = x - 2.0;\n } else if (x < 4.0) {\n r = 0.0;\n g = 4.0 - x;\n b = 1.0;\n } else if (x < 5.0) {\n r = x - 4.0;\n g = 0.0;\n b = 1.0;\n } else {\n r = 1.0;\n g = 0.0;\n b = max(0.4, 6.0 - x);\n }\n return vec3<f32>(r, g, b);\n}\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n let dims = vec2<f32>(textureDimensions(srcTex));\n let texelSize = vec2<f32>(1.0 / dims.x, 1.0 / dims.y);\n let aspect = select(u.aspect, dims.x / max(1.0, dims.y), u.aspect <= 0.0);\n\n // Resolve signals\n var ior = u.ior;\n if (u.hasSigIOR > 0.5) {\n ior = clamp(textureSampleLevel(iorSigTex, sigSamp, in.uv, 0.0).r, 1.0, 2.5);\n }\n\n var dispersion = u.dispersion;\n if (u.hasSigDispersion > 0.5) {\n dispersion = clamp(textureSampleLevel(dispersionSigTex, sigSamp, in.uv, 0.0).r, 0.0, 0.2);\n }\n\n var refractionScale = u.refractionScale;\n if (u.hasSigRefractScale > 0.5) {\n refractionScale = clamp(textureSampleLevel(refractScaleSigTex, sigSamp, in.uv, 0.0).r, 0.0, 2.0);\n }\n\n var causticBrightness = u.causticBrightness;\n if (u.hasSigCaustic > 0.5) {\n causticBrightness = clamp(textureSampleLevel(causticSigTex, sigSamp, in.uv, 0.0).r, 0.0, 2.0);\n }\n\n var fluidRipples = u.fluidRipples;\n if (u.hasSigRipples > 0.5) {\n fluidRipples = clamp(textureSampleLevel(ripplesSigTex, sigSamp, in.uv, 0.0).r, 0.0, 1.0);\n }\n\n var roughness = u.roughness;\n if (u.hasSigRoughness > 0.5) {\n roughness = clamp(textureSampleLevel(roughnessSigTex, sigSamp, in.uv, 0.0).r, 0.0, 1.0);\n }\n\n var lightPosX = u.lightPosX;\n if (u.hasSigLightPosX > 0.5) {\n lightPosX = clamp(textureSampleLevel(lightPosXSigTex, sigSamp, in.uv, 0.0).r, 0.0, 1.0);\n }\n\n var lightPosY = u.lightPosY;\n if (u.hasSigLightPosY > 0.5) {\n lightPosY = clamp(textureSampleLevel(lightPosYSigTex, sigSamp, in.uv, 0.0).r, 0.0, 1.0);\n }\n\n let depthScaleVal = u.depthScale;\n let causticScaleVal = max(0.1, u.causticScale);\n let rippleSpeedVal = u.rippleSpeed;\n let rippleTime = u.timeProgress * rippleSpeedVal * 6.2831853;\n\n // Surface Normal & Incident Vectors\n let N = computeSurfaceNormal(in.uv, texelSize, fluidRipples, rippleTime, depthScaleVal, causticScaleVal);\n let I = vec3<f32>(0.0, 0.0, -1.0); // View vector towards surface\n let V = vec3<f32>(0.0, 0.0, 1.0); // View vector towards camera\n\n // Base Snell's Law Refraction\n let eta = 1.0 / max(1.001, ior);\n let refractVec = calcRefractOffset(I, N, eta, refractionScale * 0.16);\n let baseUV = in.uv + vec2<f32>(refractVec.x / aspect, refractVec.y);\n\n // Multi-Spectral Chromatic Rainbow Dispersion\n var accumColor = vec3<f32>(0.0);\n var accumWeight = vec3<f32>(0.0);\n var accumAlpha: f32 = 0.0;\n\n let dispersionStrength = dispersion * refractionScale * 0.6;\n let dispDirection = vec2<f32>(N.x / aspect, N.y);\n\n // 7-tap spectral rainbow integration across wavelength spectrum (Red -> Yellow -> Green -> Cyan -> Blue -> Violet)\n for (var s = 0; s < 7; s = s + 1) {\n let t = f32(s) / 6.0; // 0.0 (Red) to 1.0 (Violet)\n let specColor = spectralWavelength(t);\n let lambdaOffset = dispDirection * ((t - 0.5) * dispersionStrength);\n let sampleUV = baseUV + lambdaOffset;\n\n var sampledTex = sampleAlbedoSafe(sampleUV);\n\n // Microfacet frosted blur if roughness is enabled\n if (roughness > 0.005) {\n let blurRad = roughness * 0.018;\n let j1 = sampleAlbedoSafe(sampleUV + vec2<f32>(blurRad / aspect, blurRad * 0.5));\n let j2 = sampleAlbedoSafe(sampleUV - vec2<f32>(blurRad / aspect, blurRad * 0.5));\n sampledTex = (sampledTex * 2.0 + j1 + j2) * 0.25;\n }\n\n accumColor = accumColor + sampledTex.rgb * specColor;\n accumWeight = accumWeight + specColor;\n accumAlpha = accumAlpha + sampledTex.a;\n }\n\n let finalRefractedRGB = accumColor / max(accumWeight, vec3<f32>(0.001));\n let finalAlpha = accumAlpha / 7.0;\n\n // Incident light vector\n let lightPos3D = vec3<f32>((lightPosX - 0.5) * aspect, lightPosY - 0.5, 0.85);\n let surfPos3D = vec3<f32>((in.uv.x - 0.5) * aspect, in.uv.y - 0.5, 0.0);\n let L = normalize(lightPos3D - surfPos3D);\n\n // 1. Dynamic Fluid Caustics (active when fluidRipples > 0.001)\n var fluidCaustic = 0.0;\n if (fluidRipples > 0.001) {\n let web = getWaterCaustics(in.uv, rippleTime, causticScaleVal);\n let pLight = vec2<f32>(lightPosX, lightPosY);\n let distLight = length((in.uv - pLight) * vec2<f32>(aspect, 1.0));\n let lightAtt = 1.0 / (1.0 + distLight * distLight * 1.2);\n fluidCaustic = web * lightAtt * fluidRipples * causticBrightness * 0.45;\n }\n\n // 2. Specular Highlights & Fresnel Reflectance (Schlick's approximation)\n let f0 = pow((ior - 1.0) / (ior + 1.0), 2.0);\n let NdotV = max(dot(N, V), 0.0);\n let fresnel = f0 + (1.0 - f0) * pow(1.0 - NdotV, 5.0);\n\n let H = normalize(L + V);\n let NdotH = max(dot(N, H), 0.0);\n let specShininess = mix(256.0, 32.0, roughness);\n let specular = pow(NdotH, specShininess) * u.specularIntensity * fresnel * 1.5;\n\n // Glass Absorption & Tinting\n let tintStrengthVal = u.tintStrength;\n let tintedBase = mix(finalRefractedRGB, finalRefractedRGB * u.tintColor.rgb, tintStrengthVal);\n\n // Final Composite (Refracted Rainbow Spectrum + Fluid Caustics + Crisp Specular)\n let finalRGB = tintedBase + vec3<f32>(fluidCaustic) * u.tintColor.rgb + vec3<f32>(specular);\n\n return vec4<f32>(clamp(finalRGB, vec3<f32>(0.0), vec3<f32>(1.0)), finalAlpha);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getDeviceLayouts(device) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tres = {\n\t\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\t\tsrcTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\t\tdepthTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\t\tsignalTextureLayout: texturesLayout(device, 8),\n\t\tpipelineCache: /* @__PURE__ */ new Map()\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction getRefractionCausticsResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `refraction_caustics_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: `refraction_caustics_${format}.wgsl`,\n\t\t\tcode: REFRACTION_CAUSTICS_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `RefractionCausticsPipeline_${format}`,\n\t\t\tmodule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.srcTextureLayout,\n\t\t\t\tlayouts.depthTextureLayout,\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\tpipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsrcTextureLayout: layouts.srcTextureLayout,\n\t\tdepthTextureLayout: layouts.depthTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst RefractionCaustics3DWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 60;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"RefractionCaustics3D\" || !op) return;\n\tconst sourceMedia = props.virtualMedia.children?.[0];\n\tif (!sourceMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst { texture: srcTex } = await drawChildToTexture(args, sourceMedia, { props: {\n\t\t...props,\n\t\tvirtualMedia: sourceMedia,\n\t\tcontainerWidth: width,\n\t\tcontainerHeight: height\n\t} });\n\targs.pass.end();\n\tconst depthMedia = op.depthMedia;\n\tlet depthTex;\n\tlet hasDepthMap = false;\n\tif (depthMedia) {\n\t\t({texture: depthTex} = await drawChildToTexture(args, depthMedia, {\n\t\t\tprops: {\n\t\t\t\t...props,\n\t\t\t\tvirtualMedia: depthMedia,\n\t\t\t\tcontainerWidth: width,\n\t\t\t\tcontainerHeight: height\n\t\t\t},\n\t\t\texclude: [srcTex]\n\t\t}));\n\t\targs.pass.end();\n\t\thasDepthMap = true;\n\t} else {\n\t\tdepthTex = srcTex;\n\t\thasDepthMap = false;\n\t}\n\tconst { pipeline, uniformLayout: uLayout, srcTextureLayout: srcLayout, depthTextureLayout: depthLayout, signalTextureLayout: sigLayout } = getRefractionCausticsResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps, 4);\n\tconst timeProgress = durationSeconds > 0 ? elapsedSeconds % durationSeconds / durationSeconds : 0;\n\tconst iorInfo = resolveSignalField(op, \"ior\", 1.52, 1, 2.5);\n\tconst dispersionInfo = resolveSignalField(op, \"dispersion\", .04, 0, .2);\n\tconst refractScaleInfo = resolveSignalField(op, \"refractionScale\", .5, 0, 2);\n\tconst causticInfo = resolveSignalField(op, \"causticBrightness\", .6, 0, 2);\n\tconst causticScaleInfo = resolveSignalField(op, \"causticScale\", 1, .1, 5);\n\tconst ripplesInfo = resolveSignalField(op, \"fluidRipples\", 0, 0, 1);\n\tconst roughnessInfo = resolveSignalField(op, \"roughness\", 0, 0, 1);\n\tconst lightPosXInfo = resolveSignalField(op, \"lightPosX\", .5, 0, 1);\n\tconst lightPosYInfo = resolveSignalField(op, \"lightPosY\", .2, 0, 1);\n\tconst specularInfo = resolveSignalField(op, \"specularIntensity\", .8, 0, 2);\n\tconst depthScaleInfo = resolveSignalField(op, \"depthScale\", 1, .1, 5);\n\tconst tintStrengthInfo = resolveSignalField(op, \"tintStrength\", 0, 0, 1);\n\tconst rippleSpeedInfo = resolveSignalField(op, \"rippleSpeed\", 1, 0, 5);\n\tconst getSigTextureView = (info, fallbackId) => {\n\t\tif (info.hasSignal && info.sd) return signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, info.sd.nodeId ?? fallbackId, elapsedSeconds, durationSeconds, info.sd, width, height, props.renderId, frame, fps);\n\t\treturn signalRegistry.getDummy1x1TextureView(ctx.device);\n\t};\n\tconst sigIORView = getSigTextureView(iorInfo, \"refr_ior_sig\");\n\tconst sigDispersionView = getSigTextureView(dispersionInfo, \"refr_disp_sig\");\n\tconst sigRefractScaleView = getSigTextureView(refractScaleInfo, \"refr_scale_sig\");\n\tconst sigCausticView = getSigTextureView(causticInfo, \"refr_caust_sig\");\n\tconst sigRipplesView = getSigTextureView(ripplesInfo, \"refr_rip_sig\");\n\tconst sigRoughnessView = getSigTextureView(roughnessInfo, \"refr_rough_sig\");\n\tconst sigLightPosXView = getSigTextureView(lightPosXInfo, \"refr_lightx_sig\");\n\tconst sigLightPosYView = getSigTextureView(lightPosYInfo, \"refr_lighty_sig\");\n\tconst uniformData = new Float32Array(36);\n\tuniformData[0] = 0;\n\tuniformData[1] = iorInfo.value;\n\tuniformData[2] = dispersionInfo.value;\n\tuniformData[3] = refractScaleInfo.value;\n\tuniformData[4] = causticInfo.value;\n\tuniformData[5] = causticScaleInfo.value;\n\tuniformData[6] = ripplesInfo.value;\n\tuniformData[7] = rippleSpeedInfo.value;\n\tuniformData[8] = roughnessInfo.value;\n\tuniformData[9] = specularInfo.value;\n\tuniformData[10] = lightPosXInfo.value;\n\tuniformData[11] = lightPosYInfo.value;\n\tuniformData[12] = tintStrengthInfo.value;\n\tuniformData[13] = op.depthInvert ? 1 : 0;\n\tuniformData[14] = depthScaleInfo.value;\n\tuniformData[15] = hasDepthMap ? 1 : 0;\n\tuniformData[16] = timeProgress;\n\tuniformData[17] = width / Math.max(1, height);\n\tuniformData[18] = 0;\n\tuniformData[19] = 0;\n\tuniformData[20] = iorInfo.hasSignal ? 1 : 0;\n\tuniformData[21] = dispersionInfo.hasSignal ? 1 : 0;\n\tuniformData[22] = refractScaleInfo.hasSignal ? 1 : 0;\n\tuniformData[23] = causticInfo.hasSignal ? 1 : 0;\n\tuniformData[24] = ripplesInfo.hasSignal ? 1 : 0;\n\tuniformData[25] = roughnessInfo.hasSignal ? 1 : 0;\n\tuniformData[26] = lightPosXInfo.hasSignal ? 1 : 0;\n\tuniformData[27] = lightPosYInfo.hasSignal ? 1 : 0;\n\tuniformData[28] = 0;\n\tuniformData[29] = 0;\n\tuniformData[30] = 0;\n\tuniformData[31] = 0;\n\tconst tintParsed = parseColor(op.tintColor ?? \"#ffffff\");\n\tuniformData[32] = tintParsed.r;\n\tuniformData[33] = tintParsed.g;\n\tuniformData[34] = tintParsed.b;\n\tuniformData[35] = tintParsed.a;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tsrcTex,\n\t\tdepthTex,\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, srcLayout, srcTex, sampler),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, depthLayout, depthTex, 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: sigIORView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: sigDispersionView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: sigRefractScaleView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: sigCausticView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: sigRipplesView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: sigRoughnessView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\n\t\t\t\t\tresource: sigLightPosXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 7,\n\t\t\t\t\tresource: sigLightPosYView\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, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: RefractionCaustics3DWebGPURenderer });\n\n//#endregion\nexport { RefractionCaustics3DWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-BuTkLbVU.mjs.map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderer-Ddg3dJmu.mjs","names":[],"sources":["../../../nodes/node-refraction-caustics/dist/renderers-BuTkLbVU.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveSignalField } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { parseColor, signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst REFRACTION_CAUSTICS_SHADER = `\nstruct RefractionCausticsUniforms {\n // vec4 0\n _pad0 : f32,\n ior : f32,\n dispersion : f32,\n refractionScale : f32,\n\n // vec4 1\n causticBrightness : f32,\n causticScale : f32,\n fluidRipples : f32,\n rippleSpeed : f32,\n\n // vec4 2\n roughness : f32,\n specularIntensity : f32,\n lightPosX : f32,\n lightPosY : f32,\n\n // vec4 3\n tintStrength : f32,\n depthInvert : f32,\n depthScale : f32,\n hasDepthMap : f32,\n\n // vec4 4\n timeProgress : f32,\n aspect : f32,\n _pad1 : f32,\n _pad2 : f32,\n\n // vec4 5: signal flags\n hasSigIOR : f32,\n hasSigDispersion : f32,\n hasSigRefractScale : f32,\n hasSigCaustic : f32,\n\n // vec4 6: signal flags\n hasSigRipples : f32,\n hasSigRoughness : f32,\n hasSigLightPosX : f32,\n hasSigLightPosY : f32,\n\n // vec4 7: reserved\n _pad3 : f32,\n _pad4 : f32,\n _pad5 : f32,\n _pad6 : f32,\n\n // vec4 8: color\n tintColor : vec4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : RefractionCausticsUniforms;\n\n@group(1) @binding(0) var srcTex : texture_2d<f32>;\n@group(1) @binding(1) var srcSamp : sampler;\n\n@group(2) @binding(0) var depthTex : texture_2d<f32>;\n@group(2) @binding(1) var depthSamp : sampler;\n\n@group(3) @binding(0) var iorSigTex : texture_2d<f32>;\n@group(3) @binding(1) var dispersionSigTex : texture_2d<f32>;\n@group(3) @binding(2) var refractScaleSigTex : texture_2d<f32>;\n@group(3) @binding(3) var causticSigTex : texture_2d<f32>;\n@group(3) @binding(4) var ripplesSigTex : texture_2d<f32>;\n@group(3) @binding(5) var roughnessSigTex : texture_2d<f32>;\n@group(3) @binding(6) var lightPosXSigTex : texture_2d<f32>;\n@group(3) @binding(7) var lightPosYSigTex : texture_2d<f32>;\n@group(3) @binding(8) var sigSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn sampleDepth(uv: vec2<f32>) -> f32 {\n let clampedUV = clamp(uv, vec2<f32>(0.0), vec2<f32>(1.0));\n var raw: f32 = 0.0;\n if (u.hasDepthMap > 0.5) {\n let dSample = textureSampleLevel(depthTex, depthSamp, clampedUV, 0.0);\n raw = dot(dSample.rgb, vec3<f32>(0.299, 0.587, 0.114));\n } else {\n let c = textureSampleLevel(srcTex, srcSamp, clampedUV, 0.0);\n raw = dot(c.rgb, vec3<f32>(0.299, 0.587, 0.114));\n }\n if (u.depthInvert > 0.5) {\n raw = 1.0 - raw;\n }\n return clamp(raw, 0.0, 1.0);\n}\n\nfn sampleSmoothDepth(uv: vec2<f32>, texelSize: vec2<f32>) -> f32 {\n let d0 = sampleDepth(uv);\n let d1 = sampleDepth(uv + vec2<f32>(texelSize.x, 0.0));\n let d2 = sampleDepth(uv - vec2<f32>(texelSize.x, 0.0));\n let d3 = sampleDepth(uv + vec2<f32>(0.0, texelSize.y));\n let d4 = sampleDepth(uv - vec2<f32>(0.0, texelSize.y));\n return (d0 * 4.0 + d1 + d2 + d3 + d4) * 0.125;\n}\n\n// Analytical fluid ripple wave height and normal gradient\nfn getFluidWave(uv: vec2<f32>, time: f32, freqScale: f32) -> vec3<f32> {\n let p = uv * freqScale * 18.0;\n let t = time * 3.0;\n\n let a1 = sin(p.x * 1.4 + p.y * 1.0 + t * 1.2);\n let a2 = sin(p.x * -1.8 + p.y * 1.6 + t * 0.9);\n let a3 = cos((p.x + p.y) * 2.2 - t * 1.4);\n\n let height = (a1 + a2 + a3) * 0.333;\n\n let dx = (1.4 * cos(p.x * 1.4 + p.y * 1.0 + t * 1.2)\n - 1.8 * cos(p.x * -1.8 + p.y * 1.6 + t * 0.9)\n - 2.2 * sin((p.x + p.y) * 2.2 - t * 1.4)) * freqScale * 18.0 * 0.333;\n\n let dy = (1.0 * cos(p.x * 1.4 + p.y * 1.0 + t * 1.2)\n + 1.6 * cos(p.x * -1.8 + p.y * 1.6 + t * 0.9)\n - 2.2 * sin((p.x + p.y) * 2.2 - t * 1.4)) * freqScale * 18.0 * 0.333;\n\n return vec3<f32>(dx, dy, height);\n}\n\n// Photometric cellular water caustic web (swimming pool / sunlight underwater filaments)\nfn getWaterCaustics(uv: vec2<f32>, time: f32, scale: f32) -> f32 {\n let p = uv * scale * 32.0;\n let t1 = time * 0.8;\n let t2 = time * 1.1;\n\n var p1 = p;\n p1.x = p1.x + sin(p.y * 0.45 + t1) * 1.6;\n p1.y = p1.y + cos(p.x * 0.45 + t1 * 0.8) * 1.6;\n\n var p2 = p * 1.2 + vec2<f32>(4.7, 2.1);\n p2.x = p2.x + cos(p2.y * 0.5 - t2 * 0.9) * 1.4;\n p2.y = p2.y + sin(p2.x * 0.5 + t2) * 1.4;\n\n let k1 = 1.0 - abs(sin(p1.x) * sin(p1.y));\n let k2 = 1.0 - abs(cos(p2.x) * cos(p2.y));\n\n // Sharp interconnected caustic web filaments\n let web = pow(k1 * k2, 3.5);\n return web;\n}\n\nfn computeSurfaceNormal(uv: vec2<f32>, texelSize: vec2<f32>, fluidRippleAmount: f32, rippleTime: f32, depthScaleVal: f32, causticScaleVal: f32) -> vec3<f32> {\n let step = texelSize * 2.0;\n let dL = sampleSmoothDepth(uv - vec2<f32>(step.x, 0.0), texelSize);\n let dR = sampleSmoothDepth(uv + vec2<f32>(step.x, 0.0), texelSize);\n let dD = sampleSmoothDepth(uv - vec2<f32>(0.0, step.y), texelSize);\n let dU = sampleSmoothDepth(uv + vec2<f32>(0.0, step.y), texelSize);\n\n var dx = (dR - dL) * depthScaleVal * 2.0;\n var dy = (dU - dD) * depthScaleVal * 2.0;\n\n if (fluidRippleAmount > 0.001) {\n let wave = getFluidWave(uv, rippleTime, causticScaleVal);\n dx = dx + wave.x * fluidRippleAmount * 0.08;\n dy = dy + wave.y * fluidRippleAmount * 0.08;\n }\n\n return normalize(vec3<f32>(-dx, -dy, 1.0));\n}\n\n// Snell's Law ray refraction with Total Internal Reflection (TIR) fallback\nfn calcRefractOffset(I: vec3<f32>, N: vec3<f32>, eta: f32, thickness: f32) -> vec2<f32> {\n let cosi = dot(-I, N);\n let cost2 = 1.0 - eta * eta * (1.0 - cosi * cosi);\n if (cost2 < 0.0) {\n // Total internal reflection -> reflect\n let R = reflect(I, N);\n return R.xy * thickness * 0.5;\n }\n let R = eta * I + (eta * cosi - sqrt(cost2)) * N;\n return R.xy * (thickness / max(0.2, abs(R.z)));\n}\n\nfn sampleAlbedoSafe(uv: vec2<f32>) -> vec4<f32> {\n if (uv.x >= 0.0 && uv.x <= 1.0 && uv.y >= 0.0 && uv.y <= 1.0) {\n return textureSampleLevel(srcTex, srcSamp, uv, 0.0);\n }\n // Mirror with subtle clamp for border inpainting / anti-tearing\n let mirroredUV = abs(fract(uv * 0.5 + 0.5) * 2.0 - 1.0);\n let clampedUV = clamp(mirroredUV, vec2<f32>(0.001), vec2<f32>(0.999));\n return textureSampleLevel(srcTex, srcSamp, clampedUV, 0.0);\n}\n\nfn spectralWavelength(t: f32) -> vec3<f32> {\n let x = clamp(t, 0.0, 1.0) * 6.0;\n var r: f32 = 0.0;\n var g: f32 = 0.0;\n var b: f32 = 0.0;\n\n if (x < 1.0) {\n r = 1.0;\n g = x;\n b = 0.0;\n } else if (x < 2.0) {\n r = 2.0 - x;\n g = 1.0;\n b = 0.0;\n } else if (x < 3.0) {\n r = 0.0;\n g = 1.0;\n b = x - 2.0;\n } else if (x < 4.0) {\n r = 0.0;\n g = 4.0 - x;\n b = 1.0;\n } else if (x < 5.0) {\n r = x - 4.0;\n g = 0.0;\n b = 1.0;\n } else {\n r = 1.0;\n g = 0.0;\n b = max(0.4, 6.0 - x);\n }\n return vec3<f32>(r, g, b);\n}\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n let dims = vec2<f32>(textureDimensions(srcTex));\n let texelSize = vec2<f32>(1.0 / dims.x, 1.0 / dims.y);\n let aspect = select(u.aspect, dims.x / max(1.0, dims.y), u.aspect <= 0.0);\n\n // Resolve signals\n var ior = u.ior;\n if (u.hasSigIOR > 0.5) {\n ior = clamp(textureSampleLevel(iorSigTex, sigSamp, in.uv, 0.0).r, 1.0, 2.5);\n }\n\n var dispersion = u.dispersion;\n if (u.hasSigDispersion > 0.5) {\n dispersion = clamp(textureSampleLevel(dispersionSigTex, sigSamp, in.uv, 0.0).r, 0.0, 0.2);\n }\n\n var refractionScale = u.refractionScale;\n if (u.hasSigRefractScale > 0.5) {\n refractionScale = clamp(textureSampleLevel(refractScaleSigTex, sigSamp, in.uv, 0.0).r, 0.0, 2.0);\n }\n\n var causticBrightness = u.causticBrightness;\n if (u.hasSigCaustic > 0.5) {\n causticBrightness = clamp(textureSampleLevel(causticSigTex, sigSamp, in.uv, 0.0).r, 0.0, 2.0);\n }\n\n var fluidRipples = u.fluidRipples;\n if (u.hasSigRipples > 0.5) {\n fluidRipples = clamp(textureSampleLevel(ripplesSigTex, sigSamp, in.uv, 0.0).r, 0.0, 1.0);\n }\n\n var roughness = u.roughness;\n if (u.hasSigRoughness > 0.5) {\n roughness = clamp(textureSampleLevel(roughnessSigTex, sigSamp, in.uv, 0.0).r, 0.0, 1.0);\n }\n\n var lightPosX = u.lightPosX;\n if (u.hasSigLightPosX > 0.5) {\n lightPosX = clamp(textureSampleLevel(lightPosXSigTex, sigSamp, in.uv, 0.0).r, 0.0, 1.0);\n }\n\n var lightPosY = u.lightPosY;\n if (u.hasSigLightPosY > 0.5) {\n lightPosY = clamp(textureSampleLevel(lightPosYSigTex, sigSamp, in.uv, 0.0).r, 0.0, 1.0);\n }\n\n let depthScaleVal = u.depthScale;\n let causticScaleVal = max(0.1, u.causticScale);\n let rippleSpeedVal = u.rippleSpeed;\n let rippleTime = u.timeProgress * rippleSpeedVal * 6.2831853;\n\n // Surface Normal & Incident Vectors\n let N = computeSurfaceNormal(in.uv, texelSize, fluidRipples, rippleTime, depthScaleVal, causticScaleVal);\n let I = vec3<f32>(0.0, 0.0, -1.0); // View vector towards surface\n let V = vec3<f32>(0.0, 0.0, 1.0); // View vector towards camera\n\n // Base Snell's Law Refraction\n let eta = 1.0 / max(1.001, ior);\n let refractVec = calcRefractOffset(I, N, eta, refractionScale * 0.16);\n let baseUV = in.uv + vec2<f32>(refractVec.x / aspect, refractVec.y);\n\n // Multi-Spectral Chromatic Rainbow Dispersion\n var accumColor = vec3<f32>(0.0);\n var accumWeight = vec3<f32>(0.0);\n var accumAlpha: f32 = 0.0;\n\n let dispersionStrength = dispersion * refractionScale * 0.6;\n let dispDirection = vec2<f32>(N.x / aspect, N.y);\n\n // 7-tap spectral rainbow integration across wavelength spectrum (Red -> Yellow -> Green -> Cyan -> Blue -> Violet)\n for (var s = 0; s < 7; s = s + 1) {\n let t = f32(s) / 6.0; // 0.0 (Red) to 1.0 (Violet)\n let specColor = spectralWavelength(t);\n let lambdaOffset = dispDirection * ((t - 0.5) * dispersionStrength);\n let sampleUV = baseUV + lambdaOffset;\n\n var sampledTex = sampleAlbedoSafe(sampleUV);\n\n // Microfacet frosted blur if roughness is enabled\n if (roughness > 0.005) {\n let blurRad = roughness * 0.018;\n let j1 = sampleAlbedoSafe(sampleUV + vec2<f32>(blurRad / aspect, blurRad * 0.5));\n let j2 = sampleAlbedoSafe(sampleUV - vec2<f32>(blurRad / aspect, blurRad * 0.5));\n sampledTex = (sampledTex * 2.0 + j1 + j2) * 0.25;\n }\n\n accumColor = accumColor + sampledTex.rgb * specColor;\n accumWeight = accumWeight + specColor;\n accumAlpha = accumAlpha + sampledTex.a;\n }\n\n let finalRefractedRGB = accumColor / max(accumWeight, vec3<f32>(0.001));\n let finalAlpha = accumAlpha / 7.0;\n\n // Incident light vector\n let lightPos3D = vec3<f32>((lightPosX - 0.5) * aspect, lightPosY - 0.5, 0.85);\n let surfPos3D = vec3<f32>((in.uv.x - 0.5) * aspect, in.uv.y - 0.5, 0.0);\n let L = normalize(lightPos3D - surfPos3D);\n\n // 1. Dynamic Fluid Caustics (active when fluidRipples > 0.001)\n var fluidCaustic = 0.0;\n if (fluidRipples > 0.001) {\n let web = getWaterCaustics(in.uv, rippleTime, causticScaleVal);\n let pLight = vec2<f32>(lightPosX, lightPosY);\n let distLight = length((in.uv - pLight) * vec2<f32>(aspect, 1.0));\n let lightAtt = 1.0 / (1.0 + distLight * distLight * 1.2);\n fluidCaustic = web * lightAtt * fluidRipples * causticBrightness * 0.45;\n }\n\n // 2. Specular Highlights & Fresnel Reflectance (Schlick's approximation)\n let f0 = pow((ior - 1.0) / (ior + 1.0), 2.0);\n let NdotV = max(dot(N, V), 0.0);\n let fresnel = f0 + (1.0 - f0) * pow(1.0 - NdotV, 5.0);\n\n let H = normalize(L + V);\n let NdotH = max(dot(N, H), 0.0);\n let specShininess = mix(256.0, 32.0, roughness);\n let specular = pow(NdotH, specShininess) * u.specularIntensity * fresnel * 1.5;\n\n // Glass Absorption & Tinting\n let tintStrengthVal = u.tintStrength;\n let tintedBase = mix(finalRefractedRGB, finalRefractedRGB * u.tintColor.rgb, tintStrengthVal);\n\n // Final Composite (Refracted Rainbow Spectrum + Fluid Caustics + Crisp Specular)\n let finalRGB = tintedBase + vec3<f32>(fluidCaustic) * u.tintColor.rgb + vec3<f32>(specular);\n\n return vec4<f32>(clamp(finalRGB, vec3<f32>(0.0), vec3<f32>(1.0)), finalAlpha);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getDeviceLayouts(device) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tres = {\n\t\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\t\tsrcTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\t\tdepthTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\t\tsignalTextureLayout: texturesLayout(device, 8),\n\t\tpipelineCache: /* @__PURE__ */ new Map()\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction getRefractionCausticsResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `refraction_caustics_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: `refraction_caustics_${format}.wgsl`,\n\t\t\tcode: REFRACTION_CAUSTICS_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `RefractionCausticsPipeline_${format}`,\n\t\t\tmodule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.srcTextureLayout,\n\t\t\t\tlayouts.depthTextureLayout,\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\tpipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsrcTextureLayout: layouts.srcTextureLayout,\n\t\tdepthTextureLayout: layouts.depthTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst RefractionCaustics3DWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 60;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"RefractionCaustics3D\" || !op) return;\n\tconst sourceMedia = props.virtualMedia.children?.[0];\n\tif (!sourceMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst { texture: srcTex } = await drawChildToTexture(args, sourceMedia, { props: {\n\t\t...props,\n\t\tvirtualMedia: sourceMedia,\n\t\tcontainerWidth: width,\n\t\tcontainerHeight: height\n\t} });\n\targs.pass.end();\n\tconst depthMedia = op.depthMedia;\n\tlet depthTex;\n\tlet hasDepthMap = false;\n\tif (depthMedia) {\n\t\t({texture: depthTex} = await drawChildToTexture(args, depthMedia, {\n\t\t\tprops: {\n\t\t\t\t...props,\n\t\t\t\tvirtualMedia: depthMedia,\n\t\t\t\tcontainerWidth: width,\n\t\t\t\tcontainerHeight: height\n\t\t\t},\n\t\t\texclude: [srcTex]\n\t\t}));\n\t\targs.pass.end();\n\t\thasDepthMap = true;\n\t} else {\n\t\tdepthTex = srcTex;\n\t\thasDepthMap = false;\n\t}\n\tconst { pipeline, uniformLayout: uLayout, srcTextureLayout: srcLayout, depthTextureLayout: depthLayout, signalTextureLayout: sigLayout } = getRefractionCausticsResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps, 4);\n\tconst timeProgress = durationSeconds > 0 ? elapsedSeconds % durationSeconds / durationSeconds : 0;\n\tconst iorInfo = resolveSignalField(op, \"ior\", 1.52, 1, 2.5);\n\tconst dispersionInfo = resolveSignalField(op, \"dispersion\", .04, 0, .2);\n\tconst refractScaleInfo = resolveSignalField(op, \"refractionScale\", .5, 0, 2);\n\tconst causticInfo = resolveSignalField(op, \"causticBrightness\", .6, 0, 2);\n\tconst causticScaleInfo = resolveSignalField(op, \"causticScale\", 1, .1, 5);\n\tconst ripplesInfo = resolveSignalField(op, \"fluidRipples\", 0, 0, 1);\n\tconst roughnessInfo = resolveSignalField(op, \"roughness\", 0, 0, 1);\n\tconst lightPosXInfo = resolveSignalField(op, \"lightPosX\", .5, 0, 1);\n\tconst lightPosYInfo = resolveSignalField(op, \"lightPosY\", .2, 0, 1);\n\tconst specularInfo = resolveSignalField(op, \"specularIntensity\", .8, 0, 2);\n\tconst depthScaleInfo = resolveSignalField(op, \"depthScale\", 1, .1, 5);\n\tconst tintStrengthInfo = resolveSignalField(op, \"tintStrength\", 0, 0, 1);\n\tconst rippleSpeedInfo = resolveSignalField(op, \"rippleSpeed\", 1, 0, 5);\n\tconst getSigTextureView = (info, fallbackId) => {\n\t\tif (info.hasSignal && info.sd) return signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, info.sd.nodeId ?? fallbackId, elapsedSeconds, durationSeconds, info.sd, width, height, props.renderId, frame, fps);\n\t\treturn signalRegistry.getDummy1x1TextureView(ctx.device);\n\t};\n\tconst sigIORView = getSigTextureView(iorInfo, \"refr_ior_sig\");\n\tconst sigDispersionView = getSigTextureView(dispersionInfo, \"refr_disp_sig\");\n\tconst sigRefractScaleView = getSigTextureView(refractScaleInfo, \"refr_scale_sig\");\n\tconst sigCausticView = getSigTextureView(causticInfo, \"refr_caust_sig\");\n\tconst sigRipplesView = getSigTextureView(ripplesInfo, \"refr_rip_sig\");\n\tconst sigRoughnessView = getSigTextureView(roughnessInfo, \"refr_rough_sig\");\n\tconst sigLightPosXView = getSigTextureView(lightPosXInfo, \"refr_lightx_sig\");\n\tconst sigLightPosYView = getSigTextureView(lightPosYInfo, \"refr_lighty_sig\");\n\tconst uniformData = new Float32Array(36);\n\tuniformData[0] = 0;\n\tuniformData[1] = iorInfo.value;\n\tuniformData[2] = dispersionInfo.value;\n\tuniformData[3] = refractScaleInfo.value;\n\tuniformData[4] = causticInfo.value;\n\tuniformData[5] = causticScaleInfo.value;\n\tuniformData[6] = ripplesInfo.value;\n\tuniformData[7] = rippleSpeedInfo.value;\n\tuniformData[8] = roughnessInfo.value;\n\tuniformData[9] = specularInfo.value;\n\tuniformData[10] = lightPosXInfo.value;\n\tuniformData[11] = lightPosYInfo.value;\n\tuniformData[12] = tintStrengthInfo.value;\n\tuniformData[13] = op.depthInvert ? 1 : 0;\n\tuniformData[14] = depthScaleInfo.value;\n\tuniformData[15] = hasDepthMap ? 1 : 0;\n\tuniformData[16] = timeProgress;\n\tuniformData[17] = width / Math.max(1, height);\n\tuniformData[18] = 0;\n\tuniformData[19] = 0;\n\tuniformData[20] = iorInfo.hasSignal ? 1 : 0;\n\tuniformData[21] = dispersionInfo.hasSignal ? 1 : 0;\n\tuniformData[22] = refractScaleInfo.hasSignal ? 1 : 0;\n\tuniformData[23] = causticInfo.hasSignal ? 1 : 0;\n\tuniformData[24] = ripplesInfo.hasSignal ? 1 : 0;\n\tuniformData[25] = roughnessInfo.hasSignal ? 1 : 0;\n\tuniformData[26] = lightPosXInfo.hasSignal ? 1 : 0;\n\tuniformData[27] = lightPosYInfo.hasSignal ? 1 : 0;\n\tuniformData[28] = 0;\n\tuniformData[29] = 0;\n\tuniformData[30] = 0;\n\tuniformData[31] = 0;\n\tconst tintParsed = parseColor(op.tintColor ?? \"#ffffff\");\n\tuniformData[32] = tintParsed.r;\n\tuniformData[33] = tintParsed.g;\n\tuniformData[34] = tintParsed.b;\n\tuniformData[35] = tintParsed.a;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tsrcTex,\n\t\tdepthTex,\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, srcLayout, srcTex, sampler),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, depthLayout, depthTex, 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: sigIORView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: sigDispersionView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: sigRefractScaleView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: sigCausticView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: sigRipplesView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: sigRoughnessView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\n\t\t\t\t\tresource: sigLightPosXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 7,\n\t\t\t\t\tresource: sigLightPosYView\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, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: RefractionCaustics3DWebGPURenderer });\n\n//#endregion\nexport { RefractionCaustics3DWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-BuTkLbVU.mjs.map"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "./chunk-D7gtBK74.mjs";
|
|
2
2
|
import { n as defineRenderer } from "./renderer-C9r0-KY4.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-Bf0H4lp1.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-CevnCkZC.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-De7gno9X.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-
|
|
1
|
+
{"version":3,"file":"renderer-De7gno9X.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,6 +1,6 @@
|
|
|
1
1
|
import { n as defineRenderer } from "./renderer-C9r0-KY4.mjs";
|
|
2
|
-
import { Fn as signalRegistry, U as lutStore } from "./dist-
|
|
3
|
-
import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-
|
|
2
|
+
import { Fn as signalRegistry, U as lutStore } from "./dist-Bf0H4lp1.mjs";
|
|
3
|
+
import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CevnCkZC.mjs";
|
|
4
4
|
|
|
5
5
|
//#region ../../nodes/node-apply-lut/dist/renderers-BrWmp6fW.mjs
|
|
6
6
|
const LUT_3D_SHADER = `
|
|
@@ -219,4 +219,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: LutWebGPURenderer });
|
|
|
219
219
|
|
|
220
220
|
//#endregion
|
|
221
221
|
export { renderers_default as t };
|
|
222
|
-
//# sourceMappingURL=renderer-
|
|
222
|
+
//# sourceMappingURL=renderer-Dkt1oh9H.mjs.map
|