framefields 2.5.5 → 2.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -0
- package/dist/audio/index.mjs +10 -10
- package/dist/{audio-C9euVW4K.mjs → audio-CYrO9q9P.mjs} +3 -3
- package/dist/{audio-C9euVW4K.mjs.map → audio-CYrO9q9P.mjs.map} +1 -1
- package/dist/cli.mjs +866 -16
- package/dist/cli.mjs.map +1 -1
- package/dist/components/index.d.mts +2 -2
- package/dist/components/index.mjs +43 -43
- package/dist/{dist-DBdxM6xv.mjs → dist-DSKhnhDk.mjs} +3 -3
- package/dist/dist-DSKhnhDk.mjs.map +1 -0
- package/dist/{dist-BuirkW-f.mjs → dist-cC6nOaMR.mjs} +11 -3
- package/dist/dist-cC6nOaMR.mjs.map +1 -0
- package/dist/effects/index.mjs +34 -34
- package/dist/{effects-B263lgUi.mjs → effects-Dvdwndk0.mjs} +2 -2
- package/dist/{effects-B263lgUi.mjs.map → effects-Dvdwndk0.mjs.map} +1 -1
- package/dist/fonts/index.d.mts +1 -1
- package/dist/fonts/index.mjs +2 -2
- package/dist/{fonts-DNx6ps2p.mjs → fonts-B6a4CyoM.mjs} +7 -3
- package/dist/fonts-B6a4CyoM.mjs.map +1 -0
- package/dist/{gpu-BRBIoxMC.mjs → gpu-CrQADlcf.mjs} +2 -2
- package/dist/{gpu-BRBIoxMC.mjs.map → gpu-CrQADlcf.mjs.map} +1 -1
- package/dist/index-3Vdef2KE.d.mts.map +1 -1
- package/dist/{index-N1tMc5Z9.d.mts → index-CWG19cm-.d.mts} +821 -393
- package/dist/index-CWG19cm-.d.mts.map +1 -0
- package/dist/index-D-Gnyffj.d.mts.map +1 -1
- package/dist/{index-CalU-mpZ.d.mts → index-j5LGVVbm.d.mts} +3 -1
- package/dist/index-j5LGVVbm.d.mts.map +1 -0
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +50 -50
- package/dist/preview/index.mjs +10 -10
- package/dist/{preview-ChR8Z8Fm.mjs → preview-OTsGYyOU.mjs} +2 -2
- package/dist/{preview-ChR8Z8Fm.mjs.map → preview-OTsGYyOU.mjs.map} +1 -1
- package/dist/preview-engine/{chunk-BBHRXV75.mjs → chunk-4C26NVQY.mjs} +1 -1
- package/dist/preview-engine/chunk-5NLDETDV.mjs +1974 -0
- package/dist/preview-engine/{chunk-VY6ST4QX.mjs → chunk-AGLAJGQJ.mjs} +1 -1
- package/dist/preview-engine/{chunk-ZJLNXN7W.mjs → chunk-K3IMPV6T.mjs} +6 -6
- package/dist/preview-engine/chunk-LHCEQ77S.mjs +5 -0
- package/dist/preview-engine/{chunk-2LQCQ3OT.mjs → chunk-Q6CRERSJ.mjs} +5 -5
- package/dist/preview-engine/chunk-ZGMA27IG.mjs +3 -0
- package/dist/preview-engine/components.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-WZEV464O.mjs → renderers-IT5ISWSA.mjs} +1 -1
- package/dist/{program-O2bWX0cs.mjs → program-W4CWO2bp.mjs} +19 -3
- package/dist/program-W4CWO2bp.mjs.map +1 -0
- package/dist/registry/annotate.json +1 -1
- package/dist/registry/app-frame.json +1 -1
- package/dist/registry/backdrop.json +3 -3
- package/dist/registry/before-after.json +1 -1
- package/dist/registry/callout.json +1 -1
- package/dist/registry/captions.json +7 -1
- package/dist/registry/card-stack.json +3 -3
- package/dist/registry/chat-thread.json +7 -1
- package/dist/registry/code-block.json +8 -2
- package/dist/registry/confetti.json +1 -1
- package/dist/registry/device-frame.json +2 -1
- package/dist/registry/focus-zoom.json +1 -1
- package/dist/registry/logo-reveal.json +1 -1
- package/dist/registry/lower-third.json +1 -1
- package/dist/registry/meter.json +1 -1
- package/dist/registry/mouse-pointer.json +1 -1
- package/dist/registry/selection.json +3 -3
- package/dist/registry/spotlight.json +1 -1
- package/dist/registry/terminal.json +7 -1
- package/dist/registry/text-reveal.json +2 -1
- package/dist/registry/title-card.json +1 -1
- package/dist/registry/toasts.json +1 -1
- package/dist/registry/touch-point.json +4 -4
- package/dist/registry/waveform.json +3 -3
- package/dist/registry/word-cycle.json +2 -2
- package/dist/renderer/index.mjs +2 -2
- package/dist/{renderer-DkM6Ikdf.mjs → renderer-0W-Ty55h.mjs} +3 -3
- package/dist/{renderer-DkM6Ikdf.mjs.map → renderer-0W-Ty55h.mjs.map} +1 -1
- package/dist/{renderer-CrKYlipx.mjs → renderer-0n4A8P2_.mjs} +2 -2
- package/dist/{renderer-CrKYlipx.mjs.map → renderer-0n4A8P2_.mjs.map} +1 -1
- package/dist/{renderer-D3FJcRA3.mjs → renderer-158rymL0.mjs} +2 -2
- package/dist/{renderer-D3FJcRA3.mjs.map → renderer-158rymL0.mjs.map} +1 -1
- package/dist/{renderer-Dwh0jaor.mjs → renderer-1KfQICGK.mjs} +3 -3
- package/dist/{renderer-Dwh0jaor.mjs.map → renderer-1KfQICGK.mjs.map} +1 -1
- package/dist/renderer-8HnHWqYj.mjs +5 -0
- package/dist/renderer-8itujues.mjs +5 -0
- package/dist/{renderer-DWG6EXGj.mjs → renderer-B3gQT1uq.mjs} +3 -3
- package/dist/{renderer-DWG6EXGj.mjs.map → renderer-B3gQT1uq.mjs.map} +1 -1
- package/dist/{renderer-Bs6BaMLf.mjs → renderer-BE6K88VR.mjs} +3 -3
- package/dist/{renderer-Bs6BaMLf.mjs.map → renderer-BE6K88VR.mjs.map} +1 -1
- package/dist/{renderer-CqJou_2L.mjs → renderer-BEpA2g1_.mjs} +2 -2
- package/dist/{renderer-CqJou_2L.mjs.map → renderer-BEpA2g1_.mjs.map} +1 -1
- package/dist/renderer-BFods-7v.mjs +5 -0
- package/dist/{renderer-RbMM6Njv.mjs → renderer-BGDKxfsM.mjs} +3 -3
- package/dist/{renderer-RbMM6Njv.mjs.map → renderer-BGDKxfsM.mjs.map} +1 -1
- package/dist/{renderer-DGOY-LBR.mjs → renderer-BGnMRdUK.mjs} +2 -2
- package/dist/{renderer-DGOY-LBR.mjs.map → renderer-BGnMRdUK.mjs.map} +1 -1
- package/dist/{renderer-CpDaUeCN.mjs → renderer-BIMm7lYG.mjs} +3 -3
- package/dist/{renderer-CpDaUeCN.mjs.map → renderer-BIMm7lYG.mjs.map} +1 -1
- package/dist/{renderer-Dw3K8KT9.mjs → renderer-BKL3UEzN.mjs} +2 -2
- package/dist/{renderer-Dw3K8KT9.mjs.map → renderer-BKL3UEzN.mjs.map} +1 -1
- package/dist/{renderer-DtqiWq1m.mjs → renderer-BKhdqykZ.mjs} +3 -3
- package/dist/{renderer-DtqiWq1m.mjs.map → renderer-BKhdqykZ.mjs.map} +1 -1
- package/dist/{renderer-CnclEQdA.mjs → renderer-BO5u8eFS.mjs} +2 -2
- package/dist/{renderer-CnclEQdA.mjs.map → renderer-BO5u8eFS.mjs.map} +1 -1
- package/dist/{renderer-DTPmvL1i.mjs → renderer-BQ-pHSPI.mjs} +3 -3
- package/dist/{renderer-DTPmvL1i.mjs.map → renderer-BQ-pHSPI.mjs.map} +1 -1
- package/dist/{renderer-BStETpqC.mjs → renderer-BXGr426R.mjs} +2 -2
- package/dist/{renderer-BStETpqC.mjs.map → renderer-BXGr426R.mjs.map} +1 -1
- package/dist/{renderer-Dk0okoS3.mjs → renderer-B_Oz9L3g.mjs} +2 -2
- package/dist/{renderer-Dk0okoS3.mjs.map → renderer-B_Oz9L3g.mjs.map} +1 -1
- package/dist/renderer-BbQygRwc.mjs +5 -0
- package/dist/{renderer-PhjHSS97.mjs → renderer-BcaT2j3R.mjs} +2 -2
- package/dist/{renderer-PhjHSS97.mjs.map → renderer-BcaT2j3R.mjs.map} +1 -1
- package/dist/{renderer-C6n8y6Pw.mjs → renderer-Bh7d3RSt.mjs} +3 -3
- package/dist/{renderer-C6n8y6Pw.mjs.map → renderer-Bh7d3RSt.mjs.map} +1 -1
- package/dist/{renderer-QQDU1b0Z.mjs → renderer-BiH29MS6.mjs} +3 -3
- package/dist/{renderer-QQDU1b0Z.mjs.map → renderer-BiH29MS6.mjs.map} +1 -1
- package/dist/{renderer-DdkPY4hO.mjs → renderer-BnpMAub0.mjs} +2 -2
- package/dist/{renderer-DdkPY4hO.mjs.map → renderer-BnpMAub0.mjs.map} +1 -1
- package/dist/renderer-Bq_sPaCg.mjs +5 -0
- package/dist/renderer-BrkDrvqS.mjs +5 -0
- package/dist/{renderer-DVGVcDvB.mjs → renderer-Bt3F1tmP.mjs} +3 -3
- package/dist/{renderer-DVGVcDvB.mjs.map → renderer-Bt3F1tmP.mjs.map} +1 -1
- package/dist/{renderer-DsnV8tpW.mjs → renderer-BwnQRuce.mjs} +3 -3
- package/dist/{renderer-DsnV8tpW.mjs.map → renderer-BwnQRuce.mjs.map} +1 -1
- package/dist/renderer-C1diVT5Q.mjs +5 -0
- package/dist/{renderer-CTy0bSsl.mjs → renderer-C2O4nK9x.mjs} +3 -3
- package/dist/{renderer-CTy0bSsl.mjs.map → renderer-C2O4nK9x.mjs.map} +1 -1
- package/dist/{renderer-Cg2xS8h8.mjs → renderer-C4Jfgjm5.mjs} +2 -2
- package/dist/{renderer-Cg2xS8h8.mjs.map → renderer-C4Jfgjm5.mjs.map} +1 -1
- package/dist/renderer-C8E7ajTR.mjs +5 -0
- package/dist/renderer-CAz8JW5c.mjs +5 -0
- package/dist/{renderer-1NoJLLDa.mjs → renderer-CEvj79Wg.mjs} +3 -3
- package/dist/{renderer-1NoJLLDa.mjs.map → renderer-CEvj79Wg.mjs.map} +1 -1
- package/dist/{renderer-Bag1LFos.mjs → renderer-CFSh2eG-.mjs} +3 -3
- package/dist/{renderer-Bag1LFos.mjs.map → renderer-CFSh2eG-.mjs.map} +1 -1
- package/dist/{renderer-Daqvhwjp.mjs → renderer-CHvEgLHy.mjs} +3 -3
- package/dist/{renderer-Daqvhwjp.mjs.map → renderer-CHvEgLHy.mjs.map} +1 -1
- package/dist/renderer-CKfrUdGw.mjs +5 -0
- package/dist/renderer-CL0rqBA4.mjs +5 -0
- package/dist/{renderer-R5Lg65F8.mjs → renderer-CLP6Lm7y.mjs} +2 -2
- package/dist/{renderer-B0IJirDs.mjs → renderer-COcFh5bK.mjs} +3 -3
- package/dist/{renderer-B0IJirDs.mjs.map → renderer-COcFh5bK.mjs.map} +1 -1
- package/dist/renderer-COyavIEv.mjs +5 -0
- package/dist/{renderer-DcApNxER.mjs → renderer-CPtyQrJI.mjs} +2 -2
- package/dist/{renderer-DcApNxER.mjs.map → renderer-CPtyQrJI.mjs.map} +1 -1
- package/dist/renderer-CUrShvUZ.mjs +5 -0
- package/dist/renderer-CWvJ_GaL.mjs +5 -0
- package/dist/{renderer-B2no_9zi.mjs → renderer-CX4rvqm9.mjs} +3 -3
- package/dist/{renderer-B2no_9zi.mjs.map → renderer-CX4rvqm9.mjs.map} +1 -1
- package/dist/{renderer-C3tdjg8B.mjs → renderer-CZGpETnc.mjs} +3 -3
- package/dist/{renderer-C3tdjg8B.mjs.map → renderer-CZGpETnc.mjs.map} +1 -1
- package/dist/{renderer-DmTxEeMh.mjs → renderer-C_-hWBF1.mjs} +3 -3
- package/dist/{renderer-DmTxEeMh.mjs.map → renderer-C_-hWBF1.mjs.map} +1 -1
- package/dist/{renderer-H4-8sBjl.mjs → renderer-Cb74SQHm.mjs} +2 -2
- package/dist/{renderer-H4-8sBjl.mjs.map → renderer-Cb74SQHm.mjs.map} +1 -1
- package/dist/{renderer-DO1TeUqV.mjs → renderer-Cba208C9.mjs} +3 -3
- package/dist/{renderer-DO1TeUqV.mjs.map → renderer-Cba208C9.mjs.map} +1 -1
- package/dist/{renderer-CA_CwisV.mjs → renderer-CdJoOfQw.mjs} +2 -2
- package/dist/{renderer-CA_CwisV.mjs.map → renderer-CdJoOfQw.mjs.map} +1 -1
- package/dist/renderer-Ck0mGIo9.mjs +5 -0
- package/dist/{renderer-YBwN9uyj.mjs → renderer-CoaDDIS6.mjs} +5 -5
- package/dist/{renderer-YBwN9uyj.mjs.map → renderer-CoaDDIS6.mjs.map} +1 -1
- package/dist/renderer-CqIXqdf0.mjs +5 -0
- package/dist/renderer-Csod6biL.mjs +5 -0
- package/dist/{renderer-BMiZIGkZ.mjs → renderer-CsxO_wBG.mjs} +2 -2
- package/dist/renderer-CueO924-.mjs +5 -0
- package/dist/{renderer-x1xlZaH_.mjs → renderer-Cv6od7Be.mjs} +3 -3
- package/dist/{renderer-x1xlZaH_.mjs.map → renderer-Cv6od7Be.mjs.map} +1 -1
- package/dist/{renderer-B5ZdkcMi.mjs → renderer-Cw7R1U43.mjs} +2 -2
- package/dist/{renderer-B5ZdkcMi.mjs.map → renderer-Cw7R1U43.mjs.map} +1 -1
- package/dist/renderer-D1vM4obC.mjs +5 -0
- package/dist/{renderer-CEAmByVW.mjs → renderer-D36Pjp0B.mjs} +2 -2
- package/dist/{renderer-CEAmByVW.mjs.map → renderer-D36Pjp0B.mjs.map} +1 -1
- package/dist/{renderer-CFCR_7bq.mjs → renderer-D52KWsb8.mjs} +3 -3
- package/dist/{renderer-CFCR_7bq.mjs.map → renderer-D52KWsb8.mjs.map} +1 -1
- package/dist/renderer-DB7QUt90.mjs +5 -0
- package/dist/{renderer-BfQdc3RM.mjs → renderer-DGsWlXjl.mjs} +69 -69
- package/dist/{renderer-BfQdc3RM.mjs.map → renderer-DGsWlXjl.mjs.map} +1 -1
- package/dist/renderer-DLMDnKlA.mjs +6 -0
- package/dist/renderer-DNs7yWMr.mjs +5 -0
- package/dist/{renderer-C8pJFxcL.mjs → renderer-DORydJHm.mjs} +2 -2
- package/dist/{renderer-C8pJFxcL.mjs.map → renderer-DORydJHm.mjs.map} +1 -1
- package/dist/renderer-DOrtuoa9.mjs +5 -0
- package/dist/{renderer-Dz4muMyE.mjs → renderer-DTKtkgTO.mjs} +2 -2
- package/dist/{renderer-Dz4muMyE.mjs.map → renderer-DTKtkgTO.mjs.map} +1 -1
- package/dist/{renderer-YFHESw3v.mjs → renderer-DVdRzDwX.mjs} +3 -3
- package/dist/{renderer-YFHESw3v.mjs.map → renderer-DVdRzDwX.mjs.map} +1 -1
- package/dist/renderer-D_JgOawb.mjs +5 -0
- package/dist/renderer-DdLo1uoa.mjs +5 -0
- package/dist/renderer-DeX3JEZV.mjs +5 -0
- package/dist/{renderer-C2MaJKfY.mjs → renderer-Df-rf7RC.mjs} +3 -3
- package/dist/{renderer-C2MaJKfY.mjs.map → renderer-Df-rf7RC.mjs.map} +1 -1
- package/dist/renderer-DfgZVACG.mjs +5 -0
- package/dist/{renderer-CFRTJ7cT.mjs → renderer-DmrP4dsn.mjs} +2 -2
- package/dist/{renderer-CFRTJ7cT.mjs.map → renderer-DmrP4dsn.mjs.map} +1 -1
- package/dist/renderer-DoYG7Pn6.mjs +5 -0
- package/dist/{renderer-Bvizxddu.mjs → renderer-DqIrYB0P.mjs} +2 -2
- package/dist/{renderer-Bvizxddu.mjs.map → renderer-DqIrYB0P.mjs.map} +1 -1
- package/dist/{renderer-BrKgtYq4.mjs → renderer-DrrWvz8l.mjs} +3 -3
- package/dist/{renderer-BrKgtYq4.mjs.map → renderer-DrrWvz8l.mjs.map} +1 -1
- package/dist/{renderer-Bwxm-kWL.mjs → renderer-DuFwDHHF.mjs} +2 -2
- package/dist/{renderer-CVbNiH03.mjs → renderer-DxOJv_G7.mjs} +3 -3
- package/dist/{renderer-CVbNiH03.mjs.map → renderer-DxOJv_G7.mjs.map} +1 -1
- package/dist/{renderer-CbxfSmYE.mjs → renderer-E54Vv1_W.mjs} +3 -3
- package/dist/{renderer-CbxfSmYE.mjs.map → renderer-E54Vv1_W.mjs.map} +1 -1
- package/dist/{renderer-B7vXnBUo.mjs → renderer-FPYVmSf6.mjs} +3 -3
- package/dist/{renderer-B7vXnBUo.mjs.map → renderer-FPYVmSf6.mjs.map} +1 -1
- package/dist/{renderer-BlU3Sh_0.mjs → renderer-FgP_1OgD.mjs} +3 -3
- package/dist/{renderer-BlU3Sh_0.mjs.map → renderer-FgP_1OgD.mjs.map} +1 -1
- package/dist/{renderer-DW21AyEv.mjs → renderer-H-Adf8Za.mjs} +3 -3
- package/dist/{renderer-DW21AyEv.mjs.map → renderer-H-Adf8Za.mjs.map} +1 -1
- package/dist/{renderer-CPSg6eEQ.mjs → renderer-HPBahXjt.mjs} +2 -2
- package/dist/{renderer-CPSg6eEQ.mjs.map → renderer-HPBahXjt.mjs.map} +1 -1
- package/dist/renderer-Jwqa-BUN.mjs +5 -0
- package/dist/{renderer-BNs31kME.mjs → renderer-KkDYCAkn.mjs} +3 -3
- package/dist/{renderer-BNs31kME.mjs.map → renderer-KkDYCAkn.mjs.map} +1 -1
- package/dist/{renderer-BvA4sQz5.mjs → renderer-PDAlUGKG.mjs} +3 -3
- package/dist/{renderer-BvA4sQz5.mjs.map → renderer-PDAlUGKG.mjs.map} +1 -1
- package/dist/{renderer-C5QYI1Wu.mjs → renderer-PDs21Gsq.mjs} +2 -2
- package/dist/{renderer-C5QYI1Wu.mjs.map → renderer-PDs21Gsq.mjs.map} +1 -1
- package/dist/{renderer-DADTT3ym.mjs → renderer-Sdsy27LH.mjs} +2 -2
- package/dist/{renderer-DHdFVpdH.mjs → renderer-YEDoDnsE.mjs} +2 -2
- package/dist/{renderer-DHdFVpdH.mjs.map → renderer-YEDoDnsE.mjs.map} +1 -1
- package/dist/renderer-Z2Vs-IqP.mjs +5 -0
- package/dist/{renderer-BWNQQZ12.mjs → renderer-ZM2jwJbX.mjs} +3 -3
- package/dist/{renderer-BWNQQZ12.mjs.map → renderer-ZM2jwJbX.mjs.map} +1 -1
- package/dist/{renderer-BKJ8cywK.mjs → renderer-ZarULMvJ.mjs} +2 -2
- package/dist/{renderer-BKJ8cywK.mjs.map → renderer-ZarULMvJ.mjs.map} +1 -1
- package/dist/renderer-ZnyCpdWE.mjs +5 -0
- package/dist/{renderer-8_d6YNnE.mjs → renderer-aT6MUYPr.mjs} +2 -2
- package/dist/{renderer-8_d6YNnE.mjs.map → renderer-aT6MUYPr.mjs.map} +1 -1
- package/dist/{renderer-DkOxEQsg.mjs → renderer-dX7Fy1NR.mjs} +3 -3
- package/dist/{renderer-DkOxEQsg.mjs.map → renderer-dX7Fy1NR.mjs.map} +1 -1
- package/dist/{renderer-tcS585Iy.mjs → renderer-eQP0fvgc.mjs} +2 -2
- package/dist/{renderer-tcS585Iy.mjs.map → renderer-eQP0fvgc.mjs.map} +1 -1
- package/dist/renderer-emCnsnTH.mjs +5 -0
- package/dist/renderer-ioxa4-Dy.mjs +5 -0
- package/dist/renderer-iyIwrDWO.mjs +5 -0
- package/dist/{renderer-BZ5uOfoX.mjs → renderer-lP23pU1s.mjs} +2 -2
- package/dist/{renderer-BZ5uOfoX.mjs.map → renderer-lP23pU1s.mjs.map} +1 -1
- package/dist/{renderer-oR1LvHeO.mjs → renderer-tYmQUp4d.mjs} +2 -2
- package/dist/{renderer-oR1LvHeO.mjs.map → renderer-tYmQUp4d.mjs.map} +1 -1
- package/dist/renderer-tuudA_RZ.mjs +5 -0
- package/dist/{renderer-D8m3fuRp.mjs → renderer-wrXFfvpJ.mjs} +2 -2
- package/dist/{renderer-D8m3fuRp.mjs.map → renderer-wrXFfvpJ.mjs.map} +1 -1
- package/dist/renderer-yyn8S821.mjs +5 -0
- package/dist/{renderers-CP8CFWDs-EZZPEbhW.mjs → renderers-CP8CFWDs-CZJ7NRsl.mjs} +2 -2
- package/dist/{renderers-CP8CFWDs-EZZPEbhW.mjs.map → renderers-CP8CFWDs-CZJ7NRsl.mjs.map} +1 -1
- package/dist/signals/index.mjs +4 -4
- package/dist/{src-r7Suenhp.mjs → src-_l81YkMD.mjs} +612 -117
- package/dist/src-_l81YkMD.mjs.map +1 -0
- package/package.json +59 -58
- package/dist/dist-BuirkW-f.mjs.map +0 -1
- package/dist/dist-DBdxM6xv.mjs.map +0 -1
- package/dist/fonts-DNx6ps2p.mjs.map +0 -1
- package/dist/index-CalU-mpZ.d.mts.map +0 -1
- package/dist/index-N1tMc5Z9.d.mts.map +0 -1
- package/dist/preview-engine/chunk-2TCJSHFA.mjs +0 -1974
- package/dist/preview-engine/chunk-Q7XC3FI7.mjs +0 -3
- package/dist/preview-engine/chunk-ZZAZF6VC.mjs +0 -5
- package/dist/program-O2bWX0cs.mjs.map +0 -1
- package/dist/renderer-0441BN0U.mjs +0 -5
- package/dist/renderer-3qDgFc-W.mjs +0 -5
- package/dist/renderer-6AIqTN5Z.mjs +0 -5
- package/dist/renderer-B7MZ5R7u.mjs +0 -5
- package/dist/renderer-BE2rIA4B.mjs +0 -5
- package/dist/renderer-BIQ81ln4.mjs +0 -5
- package/dist/renderer-BKm3_Ob3.mjs +0 -5
- package/dist/renderer-BNdT1Wwf.mjs +0 -5
- package/dist/renderer-BQycs1q_.mjs +0 -5
- package/dist/renderer-Bj7MxXfk.mjs +0 -5
- package/dist/renderer-BjRAGYYC.mjs +0 -5
- package/dist/renderer-BqE2BQ_X.mjs +0 -5
- package/dist/renderer-Bz5BMkOE.mjs +0 -5
- package/dist/renderer-CDOSfB9H.mjs +0 -5
- package/dist/renderer-CT26yQT-.mjs +0 -5
- package/dist/renderer-CZeAbz48.mjs +0 -5
- package/dist/renderer-D50b7kip.mjs +0 -5
- package/dist/renderer-D5LmrO96.mjs +0 -5
- package/dist/renderer-DCvqZ5o_.mjs +0 -5
- package/dist/renderer-DJGJeGEn.mjs +0 -5
- package/dist/renderer-DONvNNXi.mjs +0 -5
- package/dist/renderer-DPaSo--Y.mjs +0 -6
- package/dist/renderer-DfYYokhr.mjs +0 -5
- package/dist/renderer-DlIJhdEM.mjs +0 -5
- package/dist/renderer-DqD3nMtv.mjs +0 -5
- package/dist/renderer-DrIl-uGt.mjs +0 -5
- package/dist/renderer-DyCB3Q1d.mjs +0 -5
- package/dist/renderer-DyJ-iSv6.mjs +0 -5
- package/dist/renderer-Dzs0jV0G.mjs +0 -5
- package/dist/renderer-HIKXw5-Y.mjs +0 -5
- package/dist/renderer-Jgt2g8Wp.mjs +0 -5
- package/dist/renderer-KnZWmT-M.mjs +0 -5
- package/dist/renderer-OMSXddG9.mjs +0 -5
- package/dist/renderer-P78xh6OV.mjs +0 -5
- package/dist/renderer-gaFP1Kak.mjs +0 -5
- package/dist/renderer-lQ8gH7Zd.mjs +0 -5
- package/dist/src-r7Suenhp.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-Cg2xS8h8.mjs","names":[],"sources":["../../../nodes/node-extract-lut/dist/renderers-CDotFzd9.mjs"],"sourcesContent":["import { getFingerprint } from \"@framefields/core\";\nimport { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { lutStore } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst extractionCache = /* @__PURE__ */ new Map();\nconst pendingExtractions = /* @__PURE__ */ new Map();\nconst latestRequestedFingerprint = /* @__PURE__ */ new Map();\nconst activeTextures = /* @__PURE__ */ new Map();\nconst pipelineCache = /* @__PURE__ */ new WeakMap();\n/**\n* Lazily compiles and caches the two WGSL compute shaders per device.\n*\n* Both shaders write a flat array of f32 triples (R,G,B) for every cell of a\n* `lutSize³` cube. The host uploads whatever small set of parameters is needed\n* (RBF weights OR LAB statistics), then reads the result back as a typed array\n* that can be forwarded to `lutStore.createOrUpdate`.\n*\n* Workgroup size 8×8×4 = 256 threads maps cleanly onto lutSize=33 with\n* ceil(33/8)=5 groups on X/Y and ceil(33/4)=9 on Z → 5×5×9 = 225 dispatches.\n*/\nfunction getOrCreatePipelines(device) {\n\tconst cached = pipelineCache.get(device);\n\tif (cached) return cached;\n\tconst pipelines = {\n\t\trbf: device.createComputePipeline({\n\t\t\tlayout: \"auto\",\n\t\t\tcompute: {\n\t\t\t\tmodule: device.createShaderModule({ code: `\nstruct Params {\n\tlutSize : u32,\n\tnumSamples : u32,\n\tepsilonSq : f32,\n}\n\n@group(0) @binding(0) var<uniform> params : Params;\n@group(0) @binding(1) var<storage, read> srcPoints : array<vec4f>; // [numSamples]\n@group(0) @binding(2) var<storage, read> weights : array<vec4f>; // [numSamples]\n@group(0) @binding(3) var<storage, read> poly : array<vec4f>; // [4]\n@group(0) @binding(4) var<storage, read_write> lut : array<f32>; // [lutSize³ * 3]\n\n@compute @workgroup_size(8, 8, 4)\nfn main(@builtin(global_invocation_id) gid : vec3u) {\n\tlet lutSize = params.lutSize;\n\tif (gid.x >= lutSize || gid.y >= lutSize || gid.z >= lutSize) { return; }\n\n\tlet inR = f32(gid.x) / f32(lutSize - 1u);\n\tlet inG = f32(gid.y) / f32(lutSize - 1u);\n\tlet inB = f32(gid.z) / f32(lutSize - 1u);\n\tlet p = vec3f(inR, inG, inB);\n\n\t// Polynomial part: poly[0] + poly[1]*r + poly[2]*g + poly[3]*b\n\tvar out = poly[0].xyz + poly[1].xyz * inR + poly[2].xyz * inG + poly[3].xyz * inB;\n\n\t// RBF sum\n\tlet eps = params.epsilonSq;\n\tlet M = params.numSamples;\n\tvar minDistSq = 1e10;\n\tvar rbfSum = vec3f(0.0);\n\tfor (var i = 0u; i < M; i++) {\n\t\tlet d = p - srcPoints[i].xyz;\n\t\tlet dSq = dot(d, d);\n\t\tminDistSq = min(minDistSq, dSq);\n\t\tlet phi = sqrt(dSq + eps);\n\t\trbfSum += weights[i].xyz * phi;\n\t}\n\n\t// Smoothly fade out RBF weight contribution for regions far from samples\n\t// starts fading at distance 0.25 (dist^2 = 0.0625), fully faded at 0.5 (dist^2 = 0.25)\n\tlet rbfFade = clamp(1.0 - (minDistSq - 0.0625) / (0.25 - 0.0625), 0.0, 1.0);\n\tout += rbfSum * rbfFade;\n\n\t// Smoothly blend the entire mapping towards identity for regions extremely far from samples\n\t// starts blending at distance 0.35 (dist^2 = 0.1225), fully identity at 0.65 (dist^2 = 0.4225)\n\tlet identityBlend = clamp((minDistSq - 0.1225) / (0.4225 - 0.1225), 0.0, 1.0);\n\tout = mix(out, p, identityBlend);\n\n\t// Clamp + write\n\tlet cell = (gid.z * lutSize * lutSize + gid.y * lutSize + gid.x) * 3u;\n\tlut[cell + 0u] = clamp(out.r, 0.0, 1.0);\n\tlut[cell + 1u] = clamp(out.g, 0.0, 1.0);\n\tlut[cell + 2u] = clamp(out.b, 0.0, 1.0);\n}` }),\n\t\t\t\tentryPoint: \"main\"\n\t\t\t}\n\t\t}),\n\t\tstatistical: device.createComputePipeline({\n\t\t\tlayout: \"auto\",\n\t\t\tcompute: {\n\t\t\t\tmodule: device.createShaderModule({ code: `\nstruct Stats {\n\tsrcMean : vec4f, // (meanL, meanA, meanB, pad) of source\n\ttgtMean : vec4f, // (meanL, meanA, meanB, pad) of target\n\tscale : vec4f, // tgtStd / srcStd per channel\n\tlutSize : u32,\n}\n\n@group(0) @binding(0) var<uniform> stats : Stats;\n@group(0) @binding(1) var<storage, read_write> lut : array<f32>;\n\n// Constants matching the Reinhard/rgbToLab implementation\nconst INV_SQRT3 : f32 = 0.57735026919; // 1 / sqrt(3)\nconst INV_SQRT6 : f32 = 0.40824829046; // 1 / sqrt(6)\nconst INV_SQRT2 : f32 = 0.70710678118; // 1 / sqrt(2)\n\nfn safeLog10(v : f32) -> f32 {\n\treturn log(max(v, 1e-5)) * 0.43429448190; // log10(x) = ln(x) / ln(10)\n}\n\nfn rgbToLab(rgb : vec3f) -> vec3f {\n\tlet R = max(rgb.r, 1e-5);\n\tlet G = max(rgb.g, 1e-5);\n\tlet B = max(rgb.b, 1e-5);\n\n\tlet Lms_L = safeLog10(0.3811 * R + 0.5783 * G + 0.0402 * B);\n\tlet Lms_M = safeLog10(0.1967 * R + 0.7244 * G + 0.0782 * B);\n\tlet Lms_S = safeLog10(0.0241 * R + 0.1288 * G + 0.8444 * B);\n\n\treturn vec3f(\n\t\t(Lms_L + Lms_M + Lms_S) * INV_SQRT3,\n\t\t(Lms_L + Lms_M - 2.0 * Lms_S) * INV_SQRT6,\n\t\t(Lms_L - Lms_M) * INV_SQRT2,\n\t);\n}\n\nfn labToRgb(lab : vec3f) -> vec3f {\n\tlet l = lab.x; let a = lab.y; let b = lab.z;\n\n\tlet L_log = l * INV_SQRT3 + a * INV_SQRT6 + b * INV_SQRT2;\n\tlet M_log = l * INV_SQRT3 + a * INV_SQRT6 - b * INV_SQRT2;\n\tlet S_log = l * INV_SQRT3 - 2.0 * a * INV_SQRT6;\n\n\tlet L = pow(10.0, L_log);\n\tlet M = pow(10.0, M_log);\n\tlet S = pow(10.0, S_log);\n\n\treturn clamp(vec3f(\n\t\t 4.4679 * L - 3.5873 * M + 0.1193 * S,\n\t\t-1.2186 * L + 2.3809 * M - 0.1624 * S,\n\t\t 0.0497 * L - 0.2439 * M + 1.2045 * S,\n\t), vec3f(0.0), vec3f(1.0));\n}\n\n@compute @workgroup_size(8, 8, 4)\nfn main(@builtin(global_invocation_id) gid : vec3u) {\n\tlet lutSize = stats.lutSize;\n\tif (gid.x >= lutSize || gid.y >= lutSize || gid.z >= lutSize) { return; }\n\n\tlet inR = f32(gid.x) / f32(lutSize - 1u);\n\tlet inG = f32(gid.y) / f32(lutSize - 1u);\n\tlet inB = f32(gid.z) / f32(lutSize - 1u);\n\n\tlet lab = rgbToLab(vec3f(inR, inG, inB));\n\tlet mapped = stats.scale.xyz * (lab - stats.srcMean.xyz) + stats.tgtMean.xyz;\n\tlet rgb = labToRgb(mapped);\n\n\tlet cell = (gid.z * lutSize * lutSize + gid.y * lutSize + gid.x) * 3u;\n\tlut[cell + 0u] = rgb.r;\n\tlut[cell + 1u] = rgb.g;\n\tlut[cell + 2u] = rgb.b;\n}` }),\n\t\t\t\tentryPoint: \"main\"\n\t\t\t}\n\t\t})\n\t};\n\tpipelineCache.set(device, pipelines);\n\treturn pipelines;\n}\nfunction solveLU(A, B, n) {\n\tconst ipiv = new Int32Array(n);\n\tfor (let i = 0; i < n; i++) ipiv[i] = i;\n\tfor (let i = 0; i < n; i++) {\n\t\tlet maxVal = 0;\n\t\tlet pivotRow = i;\n\t\tfor (let r = i; r < n; r++) {\n\t\t\tconst val = Math.abs(A[r * n + i]);\n\t\t\tif (val > maxVal) {\n\t\t\t\tmaxVal = val;\n\t\t\t\tpivotRow = r;\n\t\t\t}\n\t\t}\n\t\tif (maxVal < 1e-9) return null;\n\t\telse if (pivotRow !== i) {\n\t\t\tconst tmp = ipiv[i];\n\t\t\tipiv[i] = ipiv[pivotRow];\n\t\t\tipiv[pivotRow] = tmp;\n\t\t\tfor (let col = 0; col < n; col++) {\n\t\t\t\tconst i1 = i * n + col, i2 = pivotRow * n + col;\n\t\t\t\tconst t = A[i1];\n\t\t\t\tA[i1] = A[i2];\n\t\t\t\tA[i2] = t;\n\t\t\t}\n\t\t\tfor (let col = 0; col < 3; col++) {\n\t\t\t\tconst i1 = i * 3 + col, i2 = pivotRow * 3 + col;\n\t\t\t\tconst t = B[i1];\n\t\t\t\tB[i1] = B[i2];\n\t\t\t\tB[i2] = t;\n\t\t\t}\n\t\t}\n\t\tconst pivot = A[i * n + i];\n\t\tif (Math.abs(pivot) < 1e-9) return null;\n\t\tfor (let r = i + 1; r < n; r++) {\n\t\t\tconst factor = A[r * n + i] / pivot;\n\t\t\tA[r * n + i] = 0;\n\t\t\tfor (let col = i + 1; col < n; col++) A[r * n + col] -= factor * A[i * n + col];\n\t\t\tfor (let col = 0; col < 3; col++) B[r * 3 + col] -= factor * B[i * 3 + col];\n\t\t}\n\t}\n\tconst X = new Float64Array(n * 3);\n\tfor (let col = 0; col < 3; col++) for (let i = n - 1; i >= 0; i--) {\n\t\tlet sum = B[i * 3 + col];\n\t\tfor (let j = i + 1; j < n; j++) sum -= A[i * n + j] * X[j * 3 + col];\n\t\tconst denom = A[i * n + i];\n\t\tif (Math.abs(denom) < 1e-9) return null;\n\t\tX[i * 3 + col] = sum / denom;\n\t}\n\treturn X;\n}\nfunction hasAbsurdCoefficients(X_sol) {\n\tfor (let i = 0; i < X_sol.length; i++) {\n\t\tconst val = X_sol[i];\n\t\tif (Number.isNaN(val) || !Number.isFinite(val) || Math.abs(val) > 1e5) return true;\n\t}\n\treturn false;\n}\nfunction solveLU1D(A, B, n) {\n\tconst ipiv = new Int32Array(n);\n\tfor (let i = 0; i < n; i++) ipiv[i] = i;\n\tfor (let i = 0; i < n; i++) {\n\t\tlet maxVal = 0;\n\t\tlet pivotRow = i;\n\t\tfor (let r = i; r < n; r++) {\n\t\t\tconst val = Math.abs(A[r * n + i]);\n\t\t\tif (val > maxVal) {\n\t\t\t\tmaxVal = val;\n\t\t\t\tpivotRow = r;\n\t\t\t}\n\t\t}\n\t\tif (maxVal < 1e-9) return null;\n\t\telse if (pivotRow !== i) {\n\t\t\tconst tmp = ipiv[i];\n\t\t\tipiv[i] = ipiv[pivotRow];\n\t\t\tipiv[pivotRow] = tmp;\n\t\t\tfor (let col = 0; col < n; col++) {\n\t\t\t\tconst i1 = i * n + col, i2 = pivotRow * n + col;\n\t\t\t\tconst t$1 = A[i1];\n\t\t\t\tA[i1] = A[i2];\n\t\t\t\tA[i2] = t$1;\n\t\t\t}\n\t\t\tconst t = B[i];\n\t\t\tB[i] = B[pivotRow];\n\t\t\tB[pivotRow] = t;\n\t\t}\n\t\tconst pivot = A[i * n + i];\n\t\tif (Math.abs(pivot) < 1e-9) return null;\n\t\tfor (let r = i + 1; r < n; r++) {\n\t\t\tconst factor = A[r * n + i] / pivot;\n\t\t\tA[r * n + i] = 0;\n\t\t\tfor (let col = i + 1; col < n; col++) A[r * n + col] -= factor * A[i * n + col];\n\t\t\tB[r] -= factor * B[i];\n\t\t}\n\t}\n\tconst X = new Float64Array(n);\n\tfor (let i = n - 1; i >= 0; i--) {\n\t\tlet sum = B[i];\n\t\tfor (let j = i + 1; j < n; j++) sum -= A[i * n + j] * X[j];\n\t\tconst denom = A[i * n + i];\n\t\tif (Math.abs(denom) < 1e-9) return null;\n\t\tX[i] = sum / denom;\n\t}\n\treturn X;\n}\nfunction solve1DChannel(srcVals, tgtVals, epsilonSq) {\n\tconst M = srcVals.length;\n\tconst H = M + 2;\n\tconst K_mat = new Float64Array(H * H);\n\tconst B_rhs = new Float64Array(H);\n\tfor (let i = 0; i < M; i++) {\n\t\tconst xi = srcVals[i];\n\t\tB_rhs[i] = tgtVals[i];\n\t\tfor (let j = 0; j < M; j++) {\n\t\t\tconst dx = xi - srcVals[j];\n\t\t\tK_mat[i * H + j] = Math.sqrt(dx * dx + epsilonSq);\n\t\t}\n\t\tK_mat[i * H + M + 0] = 1;\n\t\tK_mat[i * H + M + 1] = xi;\n\t\tK_mat[(M + 0) * H + i] = 1;\n\t\tK_mat[(M + 1) * H + i] = xi;\n\t}\n\tlet diagMean = 0;\n\tfor (let i = 0; i < M; i++) diagMean += K_mat[i * H + i];\n\tdiagMean /= M;\n\tconst lambda = Math.max(1e-4, diagMean * .01);\n\tfor (let i = 0; i < M; i++) K_mat[i * H + i] += lambda;\n\tconst polyLambda = Math.max(1e-4, diagMean * .001);\n\tfor (let k = 0; k < 2; k++) K_mat[(M + k) * H + M + k] = polyLambda;\n\treturn solveLU1D(K_mat, B_rhs, H);\n}\nfunction evaluate1DChannel(srcVals, X_sol, epsilonSq, lutSize) {\n\tconst M = srcVals.length;\n\tconst out = new Float32Array(lutSize);\n\tfor (let cell = 0; cell < lutSize; cell++) {\n\t\tconst p = cell / (lutSize - 1);\n\t\tlet minDistSq = 1e10;\n\t\tfor (let i = 0; i < M; i++) {\n\t\t\tconst dx = p - srcVals[i];\n\t\t\tminDistSq = Math.min(minDistSq, dx * dx);\n\t\t}\n\t\tlet rbfSum = 0;\n\t\tfor (let i = 0; i < M; i++) {\n\t\t\tconst dx = p - srcVals[i];\n\t\t\tconst phi = Math.sqrt(dx * dx + epsilonSq);\n\t\t\trbfSum += X_sol[i] * phi;\n\t\t}\n\t\tconst rbfFade = Math.max(0, Math.min(1, 1 - (minDistSq - .0625) / .1875));\n\t\tlet val = X_sol[M + 0] + X_sol[M + 1] * p + rbfSum * rbfFade;\n\t\tconst identityBlend = Math.max(0, Math.min(1, (minDistSq - .1225) / .3));\n\t\tval = val * (1 - identityBlend) + p * identityBlend;\n\t\tout[cell] = Math.max(0, Math.min(1, val));\n\t}\n\treturn out;\n}\nfunction isSeparableOperationTree(vv, sourceMedia) {\n\tconst sourceFingerprint = getFingerprint(sourceMedia);\n\tlet current = vv;\n\twhile (current) {\n\t\tconst op = current.operation;\n\t\tif (!op) break;\n\t\tconst mediaToFingerprint = {\n\t\t\t...current,\n\t\t\tmetadata: {},\n\t\t\toperation: current.operation ? { ...current.operation } : void 0\n\t\t};\n\t\tif (mediaToFingerprint.operation) delete mediaToFingerprint.operation.lutUrl;\n\t\tif (getFingerprint(mediaToFingerprint) === sourceFingerprint) return true;\n\t\tif (op.op === \"source\") return false;\n\t\tif (op.op === \"Curves\") {\n\t\t\tif (op.curveType !== \"rgb\") return false;\n\t\t} else if (op.op === \"Levels\") {} else return false;\n\t\tif (current.children && current.children.length > 0) current = current.children[0];\n\t\telse break;\n\t}\n\treturn false;\n}\nfunction rgbToLab(r, g, b) {\n\tconst R = Math.max(1e-5, r), G = Math.max(1e-5, g), B = Math.max(1e-5, b);\n\tconst L = Math.log10(Math.max(1e-5, .3811 * R + .5783 * G + .0402 * B));\n\tconst M = Math.log10(Math.max(1e-5, .1967 * R + .7244 * G + .0782 * B));\n\tconst S = Math.log10(Math.max(1e-5, .0241 * R + .1288 * G + .8444 * B));\n\treturn [\n\t\t(L + M + S) / Math.sqrt(3),\n\t\t(L + M - 2 * S) / Math.sqrt(6),\n\t\t(L - M) / Math.sqrt(2)\n\t];\n}\nfunction getPixelRGB(pixels, idx, isBGRA) {\n\tconst o = idx * 4;\n\tconst rIdx = isBGRA ? o + 2 : o;\n\tconst bIdx = isBGRA ? o : o + 2;\n\treturn [\n\t\tpixels[rIdx] / 255,\n\t\tpixels[o + 1] / 255,\n\t\tpixels[bIdx] / 255\n\t];\n}\nfunction hashString(str) {\n\tlet hash = 5381;\n\tfor (let i = 0; i < str.length; i++) hash = hash * 33 ^ str.charCodeAt(i);\n\treturn hash >>> 0;\n}\nvar SeededRandom = class {\n\tstate;\n\tconstructor(seed) {\n\t\tthis.state = seed || 1;\n\t}\n\tnext() {\n\t\tthis.state = (this.state * 1664525 + 1013904223) % 4294967296;\n\t\treturn this.state / 4294967296;\n\t}\n};\nfunction seededShuffle(array, seed) {\n\tconst rng = new SeededRandom(seed);\n\tconst shuffled = [...array];\n\tfor (let i = shuffled.length - 1; i > 0; i--) {\n\t\tconst j = Math.floor(rng.next() * (i + 1));\n\t\tconst temp = shuffled[i];\n\t\tshuffled[i] = shuffled[j];\n\t\tshuffled[j] = temp;\n\t}\n\treturn shuffled;\n}\nfunction buildUniqueColorPool(srcPixels, tgtPixels, isBGRA, gridResolution = 20) {\n\tconst occupied = /* @__PURE__ */ new Set();\n\tconst pool = [];\n\tconst numPixels = srcPixels.length / 4;\n\tfor (let i = 0; i < numPixels; i++) {\n\t\tconst src = getPixelRGB(srcPixels, i, isBGRA);\n\t\tconst r = Math.max(0, Math.min(gridResolution - 1, Math.floor(src[0] * gridResolution)));\n\t\tconst g = Math.max(0, Math.min(gridResolution - 1, Math.floor(src[1] * gridResolution)));\n\t\tconst b = Math.max(0, Math.min(gridResolution - 1, Math.floor(src[2] * gridResolution)));\n\t\tconst cellKey = r * gridResolution * gridResolution + g * gridResolution + b;\n\t\tif (!occupied.has(cellKey)) {\n\t\t\toccupied.add(cellKey);\n\t\t\tpool.push({\n\t\t\t\tsrc,\n\t\t\t\ttgt: getPixelRGB(tgtPixels, i, isBGRA)\n\t\t\t});\n\t\t}\n\t}\n\treturn pool;\n}\n/**\n* Evaluates the fitted RBF on the GPU.\n*\n* CPU work that remains:\n* • Build K matrix O(M²) – tiny (≈ 162×162)\n* • solveLU O(M³) – tiny\n*\n* GPU work (replaces the triple-nested JS loop):\n* • 33³ = 35 937 threads × M inner iterations → ~5.7 M parallel MADs\n*\n* Returns a plain Float32Array of length lutSize³×3 for lutStore.\n*/\nasync function evaluateRbfOnGpu(device, pipelines, sampledPoints, X_sol, lutSize, epsilonSq) {\n\tconst M = sampledPoints.length;\n\tconst totalCells = lutSize * lutSize * lutSize;\n\tconst wgs = 8;\n\tconst srcPointsData = new Float32Array(M * 4);\n\tconst weightsData = new Float32Array(M * 4);\n\tfor (let i = 0; i < M; i++) {\n\t\tsrcPointsData[i * 4 + 0] = sampledPoints[i].src[0];\n\t\tsrcPointsData[i * 4 + 1] = sampledPoints[i].src[1];\n\t\tsrcPointsData[i * 4 + 2] = sampledPoints[i].src[2];\n\t\tsrcPointsData[i * 4 + 3] = 0;\n\t\tweightsData[i * 4 + 0] = X_sol[i * 3 + 0];\n\t\tweightsData[i * 4 + 1] = X_sol[i * 3 + 1];\n\t\tweightsData[i * 4 + 2] = X_sol[i * 3 + 2];\n\t\tweightsData[i * 4 + 3] = 0;\n\t}\n\tconst polyData = new Float32Array(16);\n\tfor (let k = 0; k < 4; k++) {\n\t\tpolyData[k * 4 + 0] = X_sol[(M + k) * 3 + 0];\n\t\tpolyData[k * 4 + 1] = X_sol[(M + k) * 3 + 1];\n\t\tpolyData[k * 4 + 2] = X_sol[(M + k) * 3 + 2];\n\t\tpolyData[k * 4 + 3] = 0;\n\t}\n\tconst paramsBuffer = device.createBuffer({\n\t\tsize: 16,\n\t\tusage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n\t});\n\tconst paramsData = /* @__PURE__ */ new ArrayBuffer(16);\n\tnew Uint32Array(paramsData, 0, 2).set([lutSize, M]);\n\tnew Float32Array(paramsData, 8, 1).set([epsilonSq]);\n\tdevice.queue.writeBuffer(paramsBuffer, 0, paramsData);\n\tconst srcPointsBuf = upload(device, srcPointsData);\n\tconst weightsBuf = upload(device, weightsData);\n\tconst polyBuf = upload(device, polyData);\n\tconst lutByteSize = totalCells * 3 * 4;\n\tconst lutBuf = device.createBuffer({\n\t\tsize: lutByteSize,\n\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC\n\t});\n\tconst readbackBuf = device.createBuffer({\n\t\tsize: lutByteSize,\n\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n\t});\n\tconst bg = device.createBindGroup({\n\t\tlayout: pipelines.rbf.getBindGroupLayout(0),\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: paramsBuffer }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: { buffer: srcPointsBuf }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: { buffer: weightsBuf }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: { buffer: polyBuf }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: { buffer: lutBuf }\n\t\t\t}\n\t\t]\n\t});\n\tconst enc = device.createCommandEncoder({ label: \"rbf-lut-eval\" });\n\tconst pass = enc.beginComputePass();\n\tpass.setPipeline(pipelines.rbf);\n\tpass.setBindGroup(0, bg);\n\tconst groups = Math.ceil(lutSize / wgs);\n\tpass.dispatchWorkgroups(groups, groups, Math.ceil(lutSize / 4));\n\tpass.end();\n\tenc.copyBufferToBuffer(lutBuf, 0, readbackBuf, 0, lutByteSize);\n\tdevice.queue.submit([enc.finish()]);\n\tawait readbackBuf.mapAsync(GPUMapMode.READ);\n\tconst result = new Float32Array(readbackBuf.getMappedRange().slice(0));\n\treadbackBuf.unmap();\n\tparamsBuffer.destroy();\n\tsrcPointsBuf.destroy();\n\tweightsBuf.destroy();\n\tpolyBuf.destroy();\n\tlutBuf.destroy();\n\treadbackBuf.destroy();\n\treturn result;\n}\n/**\n* Generates the statistical LAB-transfer LUT entirely on the GPU.\n* The only CPU work is computing 6 scalars (mean/std per LAB channel).\n*/\nasync function evaluateStatisticalOnGpu(device, pipelines, srcMean, tgtMean, scale, lutSize) {\n\tconst lutByteSize = lutSize * lutSize * lutSize * 3 * 4;\n\tconst statsData = /* @__PURE__ */ new ArrayBuffer(64);\n\tconst f = new Float32Array(statsData);\n\tconst u = new Uint32Array(statsData);\n\tf[0] = srcMean[0];\n\tf[1] = srcMean[1];\n\tf[2] = srcMean[2];\n\tf[4] = tgtMean[0];\n\tf[5] = tgtMean[1];\n\tf[6] = tgtMean[2];\n\tf[8] = scale[0];\n\tf[9] = scale[1];\n\tf[10] = scale[2];\n\tu[12] = lutSize;\n\tconst statsBuf = device.createBuffer({\n\t\tsize: 64,\n\t\tusage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n\t});\n\tdevice.queue.writeBuffer(statsBuf, 0, statsData);\n\tconst lutBuf = device.createBuffer({\n\t\tsize: lutByteSize,\n\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC\n\t});\n\tconst readbackBuf = device.createBuffer({\n\t\tsize: lutByteSize,\n\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n\t});\n\tconst bg = device.createBindGroup({\n\t\tlayout: pipelines.statistical.getBindGroupLayout(0),\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: statsBuf }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: { buffer: lutBuf }\n\t\t}]\n\t});\n\tconst enc = device.createCommandEncoder({ label: \"stat-lut-eval\" });\n\tconst pass = enc.beginComputePass();\n\tpass.setPipeline(pipelines.statistical);\n\tpass.setBindGroup(0, bg);\n\tconst groups = Math.ceil(lutSize / 8);\n\tpass.dispatchWorkgroups(groups, groups, Math.ceil(lutSize / 4));\n\tpass.end();\n\tenc.copyBufferToBuffer(lutBuf, 0, readbackBuf, 0, lutByteSize);\n\tdevice.queue.submit([enc.finish()]);\n\tawait readbackBuf.mapAsync(GPUMapMode.READ);\n\tconst result = new Float32Array(readbackBuf.getMappedRange().slice(0));\n\treadbackBuf.unmap();\n\tstatsBuf.destroy();\n\tlutBuf.destroy();\n\treadbackBuf.destroy();\n\treturn result;\n}\n/** Uploads a Float32Array into a storage-readable GPUBuffer. */\nfunction upload(device, data) {\n\tconst buf = device.createBuffer({\n\t\tsize: Math.max(data.byteLength, 16),\n\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST\n\t});\n\tdevice.queue.writeBuffer(buf, 0, data);\n\treturn buf;\n}\n/**\n* Converts a flat Float32Array [R0,G0,B0, R1,G1,B1 …] returned from the GPU\n* into the tuple array expected by `lutStore.createOrUpdate`.\n*/\nfunction flatToPoints(flat) {\n\tconst n = flat.length / 3;\n\tconst out = new Array(n);\n\tfor (let i = 0; i < n; i++) out[i] = [\n\t\tflat[i * 3],\n\t\tflat[i * 3 + 1],\n\t\tflat[i * 3 + 2]\n\t];\n\treturn out;\n}\nconst ExtractLutWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ExtractLUT\" || !op) return;\n\tconst nodeId = op.nodeId ?? props.renderId;\n\tconst mediaToFingerprint = {\n\t\t...props.virtualMedia,\n\t\tmetadata: {},\n\t\toperation: props.virtualMedia?.operation ? { ...props.virtualMedia.operation } : void 0\n\t};\n\tif (mediaToFingerprint.operation) {\n\t\tdelete mediaToFingerprint.operation.lutUrl;\n\t\tdelete mediaToFingerprint.operation.timeline;\n\t\tdelete mediaToFingerprint.operation.startFrame;\n\t}\n\tconst lutUrl = op.lutUrl ?? `runtime://lut/extract-lut-${nodeId}-${getFingerprint(mediaToFingerprint)}`;\n\tconst fingerprint = lutUrl.startsWith(`runtime://lut/extract-lut-${nodeId}-`) ? lutUrl.slice(`runtime://lut/extract-lut-${nodeId}-`.length) : getFingerprint(mediaToFingerprint);\n\tconst cacheKey = `${nodeId}-${fingerprint}`;\n\tconst sourceMedia = props.virtualMedia?.children?.[0];\n\tconst targetMedia = props.virtualMedia?.children?.[1];\n\tif (!sourceMedia || !targetMedia) {\n\t\tpass.end();\n\t\treturn;\n\t}\n\tconst strategy = op.strategy ?? \"deterministic\";\n\tconst samplePoints = op.samplePoints ?? 150;\n\tconst gridSize = 64;\n\tconst numPixels = gridSize * gridSize;\n\tif (extractionCache.get(nodeId) === fingerprint && lutStore.get(lutUrl, ctx.device)) {\n\t\tpass.end();\n\t\treturn;\n\t}\n\tif (pendingExtractions.has(cacheKey)) {\n\t\tpass.end();\n\t\treturn;\n\t}\n\tlatestRequestedFingerprint.set(nodeId, fingerprint);\n\tpass.end();\n\tlutStore.getOrLoad(lutUrl, ctx.device);\n\tconst prev = activeTextures.get(nodeId);\n\tif (prev) {\n\t\tconst toDestroy = prev;\n\t\tctx.device.queue.onSubmittedWorkDone().then(() => {\n\t\t\ttry {\n\t\t\t\ttoDestroy.srcTex.destroy();\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\ttoDestroy.tgtTex.destroy();\n\t\t\t} catch {}\n\t\t});\n\t\tactiveTextures.delete(nodeId);\n\t}\n\tconst srcTex = ctx.device.createTexture({\n\t\tlabel: `ExtractLUT-src-grid-${nodeId}`,\n\t\tsize: [gridSize, gridSize],\n\t\tformat: ctx.renderer.format,\n\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC\n\t});\n\tctx.renderer.beginFrame(encoder, srcTex.createView(), {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 1\n\t}, gridSize, gridSize, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: gridSize,\n\t\theight: gridSize\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(sourceMedia, {\n\t\t...props,\n\t\trenderId: `${nodeId}-c0`,\n\t\tvirtualMedia: sourceMedia,\n\t\tcontainerWidth: gridSize,\n\t\tcontainerHeight: gridSize,\n\t\tforceWait: true\n\t}, srcTex.createView(), srcTex, gridSize, gridSize);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\tconst tgtTex = ctx.device.createTexture({\n\t\tlabel: `ExtractLUT-tgt-grid-${nodeId}`,\n\t\tsize: [gridSize, gridSize],\n\t\tformat: ctx.renderer.format,\n\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC\n\t});\n\tactiveTextures.set(nodeId, {\n\t\tsrcTex,\n\t\ttgtTex\n\t});\n\tctx.renderer.beginFrame(encoder, tgtTex.createView(), {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 1\n\t}, gridSize, gridSize, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: gridSize,\n\t\theight: gridSize\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(targetMedia, {\n\t\t...props,\n\t\trenderId: `${nodeId}-c1`,\n\t\tvirtualMedia: targetMedia,\n\t\tcontainerWidth: gridSize,\n\t\tcontainerHeight: gridSize,\n\t\tforceWait: true\n\t}, tgtTex.createView(), tgtTex, gridSize, gridSize);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\tconst bytesPerPixel = 4;\n\tconst align = 256;\n\tconst unpaddedBPR = gridSize * bytesPerPixel;\n\tconst bytesPerRow = Math.ceil(unpaddedBPR / align) * align;\n\tconst stagingSize = bytesPerRow * gridSize;\n\tconst srcStagingBuffer = ctx.device.createBuffer({\n\t\tlabel: `ExtractLUT-src-staging-${nodeId}`,\n\t\tsize: stagingSize,\n\t\tusage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST\n\t});\n\tconst tgtStagingBuffer = ctx.device.createBuffer({\n\t\tlabel: `ExtractLUT-tgt-staging-${nodeId}`,\n\t\tsize: stagingSize,\n\t\tusage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST\n\t});\n\tencoder.copyTextureToBuffer({ texture: srcTex }, {\n\t\tbuffer: srcStagingBuffer,\n\t\tbytesPerRow\n\t}, [gridSize, gridSize]);\n\tencoder.copyTextureToBuffer({ texture: tgtTex }, {\n\t\tbuffer: tgtStagingBuffer,\n\t\tbytesPerRow\n\t}, [gridSize, gridSize]);\n\tlet startMapping = () => {};\n\tconst mainSubmitPromise = new Promise((resolve) => {\n\t\tstartMapping = resolve;\n\t});\n\tconst originalSubmit = ctx.device.queue.submit;\n\tctx.device.queue.submit = function(commandBuffers) {\n\t\tctx.device.queue.submit = originalSubmit;\n\t\toriginalSubmit.call(this, commandBuffers);\n\t\tstartMapping();\n\t};\n\tconst extractionPromise = (async () => {\n\t\ttry {\n\t\t\tawait mainSubmitPromise;\n\t\t\tif (latestRequestedFingerprint.get(nodeId) !== fingerprint) {\n\t\t\t\ttry {\n\t\t\t\t\tsrcStagingBuffer.destroy();\n\t\t\t\t\ttgtStagingBuffer.destroy();\n\t\t\t\t} catch {}\n\t\t\t\tlutStore.rejectRawDataPromise(lutUrl, new DOMException(\"Extraction superseded by a newer request\", \"AbortError\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait ctx.device.queue.onSubmittedWorkDone();\n\t\t\tawait Promise.all([srcStagingBuffer.mapAsync(GPUMapMode.READ), tgtStagingBuffer.mapAsync(GPUMapMode.READ)]);\n\t\t\tconst srcPixels = new Uint8Array(numPixels * bytesPerPixel);\n\t\t\tconst tgtPixels = new Uint8Array(numPixels * bytesPerPixel);\n\t\t\tconst copyRows = (src, dst) => {\n\t\t\t\tif (bytesPerRow === unpaddedBPR) dst.set(src);\n\t\t\t\telse for (let y = 0; y < gridSize; y++) dst.set(src.subarray(y * bytesPerRow, y * bytesPerRow + unpaddedBPR), y * unpaddedBPR);\n\t\t\t};\n\t\t\tcopyRows(new Uint8Array(srcStagingBuffer.getMappedRange()), srcPixels);\n\t\t\tcopyRows(new Uint8Array(tgtStagingBuffer.getMappedRange()), tgtPixels);\n\t\t\tsrcStagingBuffer.unmap();\n\t\t\tsrcStagingBuffer.destroy();\n\t\t\ttgtStagingBuffer.unmap();\n\t\t\ttgtStagingBuffer.destroy();\n\t\t\tif (latestRequestedFingerprint.get(nodeId) !== fingerprint) {\n\t\t\t\tlutStore.rejectRawDataPromise(lutUrl, new DOMException(\"Extraction superceded by a newer request\", \"AbortError\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst isBGRA = ctx.renderer.format === \"bgra8unorm\" || ctx.renderer.format === \"bgra8unorm-srgb\";\n\t\t\tconst lutSize = 33;\n\t\t\tconst pipelines = getOrCreatePipelines(ctx.device);\n\t\t\tlet flat = null;\n\t\t\tlet succeeded = false;\n\t\t\tif (strategy === \"deterministic\") {\n\t\t\t\tconst shuffled = seededShuffle(buildUniqueColorPool(srcPixels, tgtPixels, isBGRA, 20), hashString(getFingerprint({\n\t\t\t\t\t...props.virtualMedia,\n\t\t\t\t\tmetadata: {},\n\t\t\t\t\toperation: void 0\n\t\t\t\t})));\n\t\t\t\tconst sampledPoints = shuffled.slice(0, Math.min(shuffled.length, samplePoints));\n\t\t\t\tconst M = sampledPoints.length;\n\t\t\t\tif (M >= 8) {\n\t\t\t\t\tif (isSeparableOperationTree(targetMedia, sourceMedia)) {\n\t\t\t\t\t\tlet epsilonSq = .01;\n\t\t\t\t\t\tlet totalMinDist = 0;\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) {\n\t\t\t\t\t\t\tlet minD = Infinity;\n\t\t\t\t\t\t\tfor (let j = 0; j < M; j++) {\n\t\t\t\t\t\t\t\tif (i === j) continue;\n\t\t\t\t\t\t\t\tconst dx = sampledPoints[i].src[0] - sampledPoints[j].src[0];\n\t\t\t\t\t\t\t\tminD = Math.min(minD, dx * dx);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttotalMinDist += Math.sqrt(minD);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst meanNND = totalMinDist / M;\n\t\t\t\t\t\tepsilonSq = Math.max(meanNND * meanNND * 4, 1e-4);\n\t\t\t\t\t\tconst srcR = sampledPoints.map((p) => p.src[0]);\n\t\t\t\t\t\tconst tgtR = sampledPoints.map((p) => p.tgt[0]);\n\t\t\t\t\t\tconst srcG = sampledPoints.map((p) => p.src[1]);\n\t\t\t\t\t\tconst tgtG = sampledPoints.map((p) => p.tgt[1]);\n\t\t\t\t\t\tconst srcB = sampledPoints.map((p) => p.src[2]);\n\t\t\t\t\t\tconst tgtB = sampledPoints.map((p) => p.tgt[2]);\n\t\t\t\t\t\tconst X_sol_R = solve1DChannel(srcR, tgtR, epsilonSq);\n\t\t\t\t\t\tconst X_sol_G = solve1DChannel(srcG, tgtG, epsilonSq);\n\t\t\t\t\t\tconst X_sol_B = solve1DChannel(srcB, tgtB, epsilonSq);\n\t\t\t\t\t\tif (X_sol_R && !hasAbsurdCoefficients(X_sol_R) && X_sol_G && !hasAbsurdCoefficients(X_sol_G) && X_sol_B && !hasAbsurdCoefficients(X_sol_B)) {\n\t\t\t\t\t\t\tconst lutR = evaluate1DChannel(srcR, X_sol_R, epsilonSq, lutSize);\n\t\t\t\t\t\t\tconst lutG = evaluate1DChannel(srcG, X_sol_G, epsilonSq, lutSize);\n\t\t\t\t\t\t\tconst lutB = evaluate1DChannel(srcB, X_sol_B, epsilonSq, lutSize);\n\t\t\t\t\t\t\tflat = new Float32Array(lutSize * lutSize * lutSize * 3);\n\t\t\t\t\t\t\tfor (let b = 0; b < lutSize; b++) for (let g = 0; g < lutSize; g++) for (let r = 0; r < lutSize; r++) {\n\t\t\t\t\t\t\t\tconst idx = (b * lutSize * lutSize + g * lutSize + r) * 3;\n\t\t\t\t\t\t\t\tflat[idx + 0] = lutR[r];\n\t\t\t\t\t\t\t\tflat[idx + 1] = lutG[g];\n\t\t\t\t\t\t\t\tflat[idx + 2] = lutB[b];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsucceeded = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!succeeded) {\n\t\t\t\t\t\tconst H = M + 4;\n\t\t\t\t\t\tlet epsilonSq = .01;\n\t\t\t\t\t\tlet totalMinDist = 0;\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) {\n\t\t\t\t\t\t\tlet minD = Infinity;\n\t\t\t\t\t\t\tfor (let j = 0; j < M; j++) {\n\t\t\t\t\t\t\t\tif (i === j) continue;\n\t\t\t\t\t\t\t\tconst dx = sampledPoints[i].src[0] - sampledPoints[j].src[0];\n\t\t\t\t\t\t\t\tconst dy = sampledPoints[i].src[1] - sampledPoints[j].src[1];\n\t\t\t\t\t\t\t\tconst dz = sampledPoints[i].src[2] - sampledPoints[j].src[2];\n\t\t\t\t\t\t\t\tminD = Math.min(minD, dx * dx + dy * dy + dz * dz);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttotalMinDist += Math.sqrt(minD);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst meanNND = totalMinDist / M;\n\t\t\t\t\t\tepsilonSq = Math.max(meanNND * meanNND * 4, 1e-4);\n\t\t\t\t\t\tconst K_mat = new Float64Array(H * H);\n\t\t\t\t\t\tconst B_rhs = new Float64Array(H * 3);\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) {\n\t\t\t\t\t\t\tconst pi = sampledPoints[i].src;\n\t\t\t\t\t\t\tconst gi = sampledPoints[i].tgt;\n\t\t\t\t\t\t\tB_rhs[i * 3 + 0] = gi[0];\n\t\t\t\t\t\t\tB_rhs[i * 3 + 1] = gi[1];\n\t\t\t\t\t\t\tB_rhs[i * 3 + 2] = gi[2];\n\t\t\t\t\t\t\tfor (let j = 0; j < M; j++) {\n\t\t\t\t\t\t\t\tconst pj = sampledPoints[j].src;\n\t\t\t\t\t\t\t\tconst dx = pi[0] - pj[0], dy = pi[1] - pj[1], dz = pi[2] - pj[2];\n\t\t\t\t\t\t\t\tK_mat[i * H + j] = Math.sqrt(dx * dx + dy * dy + dz * dz + epsilonSq);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tK_mat[i * H + M + 0] = 1;\n\t\t\t\t\t\t\tK_mat[i * H + M + 1] = pi[0];\n\t\t\t\t\t\t\tK_mat[i * H + M + 2] = pi[1];\n\t\t\t\t\t\t\tK_mat[i * H + M + 3] = pi[2];\n\t\t\t\t\t\t\tK_mat[(M + 0) * H + i] = 1;\n\t\t\t\t\t\t\tK_mat[(M + 1) * H + i] = pi[0];\n\t\t\t\t\t\t\tK_mat[(M + 2) * H + i] = pi[1];\n\t\t\t\t\t\t\tK_mat[(M + 3) * H + i] = pi[2];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet diagMean = 0;\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) diagMean += K_mat[i * H + i];\n\t\t\t\t\t\tdiagMean /= M;\n\t\t\t\t\t\tconst lambda = Math.max(1e-4, diagMean * .01);\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) K_mat[i * H + i] += lambda;\n\t\t\t\t\t\tconst polyLambda = Math.max(1e-4, diagMean * .001);\n\t\t\t\t\t\tfor (let k = 0; k < 4; k++) K_mat[(M + k) * H + M + k] = polyLambda;\n\t\t\t\t\t\tconst X_sol = solveLU(K_mat, B_rhs, H);\n\t\t\t\t\t\tif (X_sol && !hasAbsurdCoefficients(X_sol)) try {\n\t\t\t\t\t\t\tflat = await evaluateRbfOnGpu(ctx.device, pipelines, sampledPoints, X_sol, lutSize, epsilonSq);\n\t\t\t\t\t\t\tlet hasInvalid = false;\n\t\t\t\t\t\t\tfor (let i = 0; i < flat.length; i++) {\n\t\t\t\t\t\t\t\tconst val = flat[i];\n\t\t\t\t\t\t\t\tif (Number.isNaN(val) || !Number.isFinite(val)) {\n\t\t\t\t\t\t\t\t\thasInvalid = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!hasInvalid) succeeded = true;\n\t\t\t\t\t\t} catch (gpuErr) {\n\t\t\t\t\t\t\tconsole.error(\"[ExtractLUT] RBF GPU evaluation failed:\", gpuErr);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!succeeded) {\n\t\t\t\tlet srcMeanL = 0, srcMeanA = 0, srcMeanB = 0;\n\t\t\t\tlet tgtMeanL = 0, tgtMeanA = 0, tgtMeanB = 0;\n\t\t\t\tconst srcLABs = [];\n\t\t\t\tconst tgtLABs = [];\n\t\t\t\tfor (let i = 0; i < numPixels; i++) {\n\t\t\t\t\tconst sl = rgbToLab(...getPixelRGB(srcPixels, i, isBGRA));\n\t\t\t\t\tsrcLABs.push(sl);\n\t\t\t\t\tsrcMeanL += sl[0];\n\t\t\t\t\tsrcMeanA += sl[1];\n\t\t\t\t\tsrcMeanB += sl[2];\n\t\t\t\t\tconst tl = rgbToLab(...getPixelRGB(tgtPixels, i, isBGRA));\n\t\t\t\t\ttgtLABs.push(tl);\n\t\t\t\t\ttgtMeanL += tl[0];\n\t\t\t\t\ttgtMeanA += tl[1];\n\t\t\t\t\ttgtMeanB += tl[2];\n\t\t\t\t}\n\t\t\t\tsrcMeanL /= numPixels;\n\t\t\t\tsrcMeanA /= numPixels;\n\t\t\t\tsrcMeanB /= numPixels;\n\t\t\t\ttgtMeanL /= numPixels;\n\t\t\t\ttgtMeanA /= numPixels;\n\t\t\t\ttgtMeanB /= numPixels;\n\t\t\t\tlet srcStdL = 0, srcStdA = 0, srcStdB = 0;\n\t\t\t\tlet tgtStdL = 0, tgtStdA = 0, tgtStdB = 0;\n\t\t\t\tfor (let i = 0; i < numPixels; i++) {\n\t\t\t\t\tsrcStdL += (srcLABs[i][0] - srcMeanL) ** 2;\n\t\t\t\t\tsrcStdA += (srcLABs[i][1] - srcMeanA) ** 2;\n\t\t\t\t\tsrcStdB += (srcLABs[i][2] - srcMeanB) ** 2;\n\t\t\t\t\ttgtStdL += (tgtLABs[i][0] - tgtMeanL) ** 2;\n\t\t\t\t\ttgtStdA += (tgtLABs[i][1] - tgtMeanA) ** 2;\n\t\t\t\t\ttgtStdB += (tgtLABs[i][2] - tgtMeanB) ** 2;\n\t\t\t\t}\n\t\t\t\tsrcStdL = Math.max(Math.sqrt(srcStdL / numPixels), 1e-6);\n\t\t\t\tsrcStdA = Math.max(Math.sqrt(srcStdA / numPixels), 1e-6);\n\t\t\t\tsrcStdB = Math.max(Math.sqrt(srcStdB / numPixels), 1e-6);\n\t\t\t\ttgtStdL = Math.sqrt(tgtStdL / numPixels);\n\t\t\t\ttgtStdA = Math.sqrt(tgtStdA / numPixels);\n\t\t\t\ttgtStdB = Math.sqrt(tgtStdB / numPixels);\n\t\t\t\tif (srcStdL < 1e-4 || srcMeanL < 1e-4) {\n\t\t\t\t\tflat = new Float32Array(lutSize * lutSize * lutSize * 3);\n\t\t\t\t\tfor (let b = 0; b < lutSize; b++) for (let g = 0; g < lutSize; g++) for (let r = 0; r < lutSize; r++) {\n\t\t\t\t\t\tconst idx = (b * lutSize * lutSize + g * lutSize + r) * 3;\n\t\t\t\t\t\tflat[idx + 0] = r / (lutSize - 1);\n\t\t\t\t\t\tflat[idx + 1] = g / (lutSize - 1);\n\t\t\t\t\t\tflat[idx + 2] = b / (lutSize - 1);\n\t\t\t\t\t}\n\t\t\t\t} else flat = await evaluateStatisticalOnGpu(ctx.device, pipelines, [\n\t\t\t\t\tsrcMeanL,\n\t\t\t\t\tsrcMeanA,\n\t\t\t\t\tsrcMeanB\n\t\t\t\t], [\n\t\t\t\t\ttgtMeanL,\n\t\t\t\t\ttgtMeanA,\n\t\t\t\t\ttgtMeanB\n\t\t\t\t], [\n\t\t\t\t\ttgtStdL / srcStdL,\n\t\t\t\t\ttgtStdA / srcStdA,\n\t\t\t\t\ttgtStdB / srcStdB\n\t\t\t\t], lutSize);\n\t\t\t}\n\t\t\tconst smoothedPoints = flatToPoints(flat);\n\t\t\tif (latestRequestedFingerprint.get(nodeId) !== fingerprint) {\n\t\t\t\tlutStore.rejectRawDataPromise(lutUrl, new DOMException(\"Extraction superseded by a newer request\", \"AbortError\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlutStore.createOrUpdate(lutUrl, ctx.device, smoothedPoints, lutSize, \"3D\");\n\t\t\textractionCache.set(nodeId, fingerprint);\n\t\t} catch (err) {\n\t\t\tconsole.error(\"[ExtractLUT] Async extraction error:\", err);\n\t\t\ttry {\n\t\t\t\tconst lutSize = 33;\n\t\t\t\tconst identityPoints = [];\n\t\t\t\tfor (let z = 0; z < lutSize; z++) for (let y = 0; y < lutSize; y++) for (let x = 0; x < lutSize; x++) identityPoints.push([\n\t\t\t\t\tx / (lutSize - 1),\n\t\t\t\t\ty / (lutSize - 1),\n\t\t\t\t\tz / (lutSize - 1)\n\t\t\t\t]);\n\t\t\t\tif (latestRequestedFingerprint.get(nodeId) === fingerprint) {\n\t\t\t\t\tlutStore.createOrUpdate(lutUrl, ctx.device, identityPoints, lutSize, \"3D\");\n\t\t\t\t\textractionCache.set(nodeId, fingerprint);\n\t\t\t\t}\n\t\t\t} catch (fallbackErr) {\n\t\t\t\tconsole.error(\"[ExtractLUT] Failed to write fallback identity LUT:\", fallbackErr);\n\t\t\t\tlutStore.rejectRawDataPromise(lutUrl, err);\n\t\t\t}\n\t\t} finally {\n\t\t\tpendingExtractions.delete(cacheKey);\n\t\t}\n\t})();\n\tpendingExtractions.set(cacheKey, extractionPromise);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ExtractLutWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-CDotFzd9.mjs.map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderer-C4Jfgjm5.mjs","names":[],"sources":["../../../nodes/node-extract-lut/dist/renderers-CDotFzd9.mjs"],"sourcesContent":["import { getFingerprint } from \"@framefields/core\";\nimport { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { lutStore } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst extractionCache = /* @__PURE__ */ new Map();\nconst pendingExtractions = /* @__PURE__ */ new Map();\nconst latestRequestedFingerprint = /* @__PURE__ */ new Map();\nconst activeTextures = /* @__PURE__ */ new Map();\nconst pipelineCache = /* @__PURE__ */ new WeakMap();\n/**\n* Lazily compiles and caches the two WGSL compute shaders per device.\n*\n* Both shaders write a flat array of f32 triples (R,G,B) for every cell of a\n* `lutSize³` cube. The host uploads whatever small set of parameters is needed\n* (RBF weights OR LAB statistics), then reads the result back as a typed array\n* that can be forwarded to `lutStore.createOrUpdate`.\n*\n* Workgroup size 8×8×4 = 256 threads maps cleanly onto lutSize=33 with\n* ceil(33/8)=5 groups on X/Y and ceil(33/4)=9 on Z → 5×5×9 = 225 dispatches.\n*/\nfunction getOrCreatePipelines(device) {\n\tconst cached = pipelineCache.get(device);\n\tif (cached) return cached;\n\tconst pipelines = {\n\t\trbf: device.createComputePipeline({\n\t\t\tlayout: \"auto\",\n\t\t\tcompute: {\n\t\t\t\tmodule: device.createShaderModule({ code: `\nstruct Params {\n\tlutSize : u32,\n\tnumSamples : u32,\n\tepsilonSq : f32,\n}\n\n@group(0) @binding(0) var<uniform> params : Params;\n@group(0) @binding(1) var<storage, read> srcPoints : array<vec4f>; // [numSamples]\n@group(0) @binding(2) var<storage, read> weights : array<vec4f>; // [numSamples]\n@group(0) @binding(3) var<storage, read> poly : array<vec4f>; // [4]\n@group(0) @binding(4) var<storage, read_write> lut : array<f32>; // [lutSize³ * 3]\n\n@compute @workgroup_size(8, 8, 4)\nfn main(@builtin(global_invocation_id) gid : vec3u) {\n\tlet lutSize = params.lutSize;\n\tif (gid.x >= lutSize || gid.y >= lutSize || gid.z >= lutSize) { return; }\n\n\tlet inR = f32(gid.x) / f32(lutSize - 1u);\n\tlet inG = f32(gid.y) / f32(lutSize - 1u);\n\tlet inB = f32(gid.z) / f32(lutSize - 1u);\n\tlet p = vec3f(inR, inG, inB);\n\n\t// Polynomial part: poly[0] + poly[1]*r + poly[2]*g + poly[3]*b\n\tvar out = poly[0].xyz + poly[1].xyz * inR + poly[2].xyz * inG + poly[3].xyz * inB;\n\n\t// RBF sum\n\tlet eps = params.epsilonSq;\n\tlet M = params.numSamples;\n\tvar minDistSq = 1e10;\n\tvar rbfSum = vec3f(0.0);\n\tfor (var i = 0u; i < M; i++) {\n\t\tlet d = p - srcPoints[i].xyz;\n\t\tlet dSq = dot(d, d);\n\t\tminDistSq = min(minDistSq, dSq);\n\t\tlet phi = sqrt(dSq + eps);\n\t\trbfSum += weights[i].xyz * phi;\n\t}\n\n\t// Smoothly fade out RBF weight contribution for regions far from samples\n\t// starts fading at distance 0.25 (dist^2 = 0.0625), fully faded at 0.5 (dist^2 = 0.25)\n\tlet rbfFade = clamp(1.0 - (minDistSq - 0.0625) / (0.25 - 0.0625), 0.0, 1.0);\n\tout += rbfSum * rbfFade;\n\n\t// Smoothly blend the entire mapping towards identity for regions extremely far from samples\n\t// starts blending at distance 0.35 (dist^2 = 0.1225), fully identity at 0.65 (dist^2 = 0.4225)\n\tlet identityBlend = clamp((minDistSq - 0.1225) / (0.4225 - 0.1225), 0.0, 1.0);\n\tout = mix(out, p, identityBlend);\n\n\t// Clamp + write\n\tlet cell = (gid.z * lutSize * lutSize + gid.y * lutSize + gid.x) * 3u;\n\tlut[cell + 0u] = clamp(out.r, 0.0, 1.0);\n\tlut[cell + 1u] = clamp(out.g, 0.0, 1.0);\n\tlut[cell + 2u] = clamp(out.b, 0.0, 1.0);\n}` }),\n\t\t\t\tentryPoint: \"main\"\n\t\t\t}\n\t\t}),\n\t\tstatistical: device.createComputePipeline({\n\t\t\tlayout: \"auto\",\n\t\t\tcompute: {\n\t\t\t\tmodule: device.createShaderModule({ code: `\nstruct Stats {\n\tsrcMean : vec4f, // (meanL, meanA, meanB, pad) of source\n\ttgtMean : vec4f, // (meanL, meanA, meanB, pad) of target\n\tscale : vec4f, // tgtStd / srcStd per channel\n\tlutSize : u32,\n}\n\n@group(0) @binding(0) var<uniform> stats : Stats;\n@group(0) @binding(1) var<storage, read_write> lut : array<f32>;\n\n// Constants matching the Reinhard/rgbToLab implementation\nconst INV_SQRT3 : f32 = 0.57735026919; // 1 / sqrt(3)\nconst INV_SQRT6 : f32 = 0.40824829046; // 1 / sqrt(6)\nconst INV_SQRT2 : f32 = 0.70710678118; // 1 / sqrt(2)\n\nfn safeLog10(v : f32) -> f32 {\n\treturn log(max(v, 1e-5)) * 0.43429448190; // log10(x) = ln(x) / ln(10)\n}\n\nfn rgbToLab(rgb : vec3f) -> vec3f {\n\tlet R = max(rgb.r, 1e-5);\n\tlet G = max(rgb.g, 1e-5);\n\tlet B = max(rgb.b, 1e-5);\n\n\tlet Lms_L = safeLog10(0.3811 * R + 0.5783 * G + 0.0402 * B);\n\tlet Lms_M = safeLog10(0.1967 * R + 0.7244 * G + 0.0782 * B);\n\tlet Lms_S = safeLog10(0.0241 * R + 0.1288 * G + 0.8444 * B);\n\n\treturn vec3f(\n\t\t(Lms_L + Lms_M + Lms_S) * INV_SQRT3,\n\t\t(Lms_L + Lms_M - 2.0 * Lms_S) * INV_SQRT6,\n\t\t(Lms_L - Lms_M) * INV_SQRT2,\n\t);\n}\n\nfn labToRgb(lab : vec3f) -> vec3f {\n\tlet l = lab.x; let a = lab.y; let b = lab.z;\n\n\tlet L_log = l * INV_SQRT3 + a * INV_SQRT6 + b * INV_SQRT2;\n\tlet M_log = l * INV_SQRT3 + a * INV_SQRT6 - b * INV_SQRT2;\n\tlet S_log = l * INV_SQRT3 - 2.0 * a * INV_SQRT6;\n\n\tlet L = pow(10.0, L_log);\n\tlet M = pow(10.0, M_log);\n\tlet S = pow(10.0, S_log);\n\n\treturn clamp(vec3f(\n\t\t 4.4679 * L - 3.5873 * M + 0.1193 * S,\n\t\t-1.2186 * L + 2.3809 * M - 0.1624 * S,\n\t\t 0.0497 * L - 0.2439 * M + 1.2045 * S,\n\t), vec3f(0.0), vec3f(1.0));\n}\n\n@compute @workgroup_size(8, 8, 4)\nfn main(@builtin(global_invocation_id) gid : vec3u) {\n\tlet lutSize = stats.lutSize;\n\tif (gid.x >= lutSize || gid.y >= lutSize || gid.z >= lutSize) { return; }\n\n\tlet inR = f32(gid.x) / f32(lutSize - 1u);\n\tlet inG = f32(gid.y) / f32(lutSize - 1u);\n\tlet inB = f32(gid.z) / f32(lutSize - 1u);\n\n\tlet lab = rgbToLab(vec3f(inR, inG, inB));\n\tlet mapped = stats.scale.xyz * (lab - stats.srcMean.xyz) + stats.tgtMean.xyz;\n\tlet rgb = labToRgb(mapped);\n\n\tlet cell = (gid.z * lutSize * lutSize + gid.y * lutSize + gid.x) * 3u;\n\tlut[cell + 0u] = rgb.r;\n\tlut[cell + 1u] = rgb.g;\n\tlut[cell + 2u] = rgb.b;\n}` }),\n\t\t\t\tentryPoint: \"main\"\n\t\t\t}\n\t\t})\n\t};\n\tpipelineCache.set(device, pipelines);\n\treturn pipelines;\n}\nfunction solveLU(A, B, n) {\n\tconst ipiv = new Int32Array(n);\n\tfor (let i = 0; i < n; i++) ipiv[i] = i;\n\tfor (let i = 0; i < n; i++) {\n\t\tlet maxVal = 0;\n\t\tlet pivotRow = i;\n\t\tfor (let r = i; r < n; r++) {\n\t\t\tconst val = Math.abs(A[r * n + i]);\n\t\t\tif (val > maxVal) {\n\t\t\t\tmaxVal = val;\n\t\t\t\tpivotRow = r;\n\t\t\t}\n\t\t}\n\t\tif (maxVal < 1e-9) return null;\n\t\telse if (pivotRow !== i) {\n\t\t\tconst tmp = ipiv[i];\n\t\t\tipiv[i] = ipiv[pivotRow];\n\t\t\tipiv[pivotRow] = tmp;\n\t\t\tfor (let col = 0; col < n; col++) {\n\t\t\t\tconst i1 = i * n + col, i2 = pivotRow * n + col;\n\t\t\t\tconst t = A[i1];\n\t\t\t\tA[i1] = A[i2];\n\t\t\t\tA[i2] = t;\n\t\t\t}\n\t\t\tfor (let col = 0; col < 3; col++) {\n\t\t\t\tconst i1 = i * 3 + col, i2 = pivotRow * 3 + col;\n\t\t\t\tconst t = B[i1];\n\t\t\t\tB[i1] = B[i2];\n\t\t\t\tB[i2] = t;\n\t\t\t}\n\t\t}\n\t\tconst pivot = A[i * n + i];\n\t\tif (Math.abs(pivot) < 1e-9) return null;\n\t\tfor (let r = i + 1; r < n; r++) {\n\t\t\tconst factor = A[r * n + i] / pivot;\n\t\t\tA[r * n + i] = 0;\n\t\t\tfor (let col = i + 1; col < n; col++) A[r * n + col] -= factor * A[i * n + col];\n\t\t\tfor (let col = 0; col < 3; col++) B[r * 3 + col] -= factor * B[i * 3 + col];\n\t\t}\n\t}\n\tconst X = new Float64Array(n * 3);\n\tfor (let col = 0; col < 3; col++) for (let i = n - 1; i >= 0; i--) {\n\t\tlet sum = B[i * 3 + col];\n\t\tfor (let j = i + 1; j < n; j++) sum -= A[i * n + j] * X[j * 3 + col];\n\t\tconst denom = A[i * n + i];\n\t\tif (Math.abs(denom) < 1e-9) return null;\n\t\tX[i * 3 + col] = sum / denom;\n\t}\n\treturn X;\n}\nfunction hasAbsurdCoefficients(X_sol) {\n\tfor (let i = 0; i < X_sol.length; i++) {\n\t\tconst val = X_sol[i];\n\t\tif (Number.isNaN(val) || !Number.isFinite(val) || Math.abs(val) > 1e5) return true;\n\t}\n\treturn false;\n}\nfunction solveLU1D(A, B, n) {\n\tconst ipiv = new Int32Array(n);\n\tfor (let i = 0; i < n; i++) ipiv[i] = i;\n\tfor (let i = 0; i < n; i++) {\n\t\tlet maxVal = 0;\n\t\tlet pivotRow = i;\n\t\tfor (let r = i; r < n; r++) {\n\t\t\tconst val = Math.abs(A[r * n + i]);\n\t\t\tif (val > maxVal) {\n\t\t\t\tmaxVal = val;\n\t\t\t\tpivotRow = r;\n\t\t\t}\n\t\t}\n\t\tif (maxVal < 1e-9) return null;\n\t\telse if (pivotRow !== i) {\n\t\t\tconst tmp = ipiv[i];\n\t\t\tipiv[i] = ipiv[pivotRow];\n\t\t\tipiv[pivotRow] = tmp;\n\t\t\tfor (let col = 0; col < n; col++) {\n\t\t\t\tconst i1 = i * n + col, i2 = pivotRow * n + col;\n\t\t\t\tconst t$1 = A[i1];\n\t\t\t\tA[i1] = A[i2];\n\t\t\t\tA[i2] = t$1;\n\t\t\t}\n\t\t\tconst t = B[i];\n\t\t\tB[i] = B[pivotRow];\n\t\t\tB[pivotRow] = t;\n\t\t}\n\t\tconst pivot = A[i * n + i];\n\t\tif (Math.abs(pivot) < 1e-9) return null;\n\t\tfor (let r = i + 1; r < n; r++) {\n\t\t\tconst factor = A[r * n + i] / pivot;\n\t\t\tA[r * n + i] = 0;\n\t\t\tfor (let col = i + 1; col < n; col++) A[r * n + col] -= factor * A[i * n + col];\n\t\t\tB[r] -= factor * B[i];\n\t\t}\n\t}\n\tconst X = new Float64Array(n);\n\tfor (let i = n - 1; i >= 0; i--) {\n\t\tlet sum = B[i];\n\t\tfor (let j = i + 1; j < n; j++) sum -= A[i * n + j] * X[j];\n\t\tconst denom = A[i * n + i];\n\t\tif (Math.abs(denom) < 1e-9) return null;\n\t\tX[i] = sum / denom;\n\t}\n\treturn X;\n}\nfunction solve1DChannel(srcVals, tgtVals, epsilonSq) {\n\tconst M = srcVals.length;\n\tconst H = M + 2;\n\tconst K_mat = new Float64Array(H * H);\n\tconst B_rhs = new Float64Array(H);\n\tfor (let i = 0; i < M; i++) {\n\t\tconst xi = srcVals[i];\n\t\tB_rhs[i] = tgtVals[i];\n\t\tfor (let j = 0; j < M; j++) {\n\t\t\tconst dx = xi - srcVals[j];\n\t\t\tK_mat[i * H + j] = Math.sqrt(dx * dx + epsilonSq);\n\t\t}\n\t\tK_mat[i * H + M + 0] = 1;\n\t\tK_mat[i * H + M + 1] = xi;\n\t\tK_mat[(M + 0) * H + i] = 1;\n\t\tK_mat[(M + 1) * H + i] = xi;\n\t}\n\tlet diagMean = 0;\n\tfor (let i = 0; i < M; i++) diagMean += K_mat[i * H + i];\n\tdiagMean /= M;\n\tconst lambda = Math.max(1e-4, diagMean * .01);\n\tfor (let i = 0; i < M; i++) K_mat[i * H + i] += lambda;\n\tconst polyLambda = Math.max(1e-4, diagMean * .001);\n\tfor (let k = 0; k < 2; k++) K_mat[(M + k) * H + M + k] = polyLambda;\n\treturn solveLU1D(K_mat, B_rhs, H);\n}\nfunction evaluate1DChannel(srcVals, X_sol, epsilonSq, lutSize) {\n\tconst M = srcVals.length;\n\tconst out = new Float32Array(lutSize);\n\tfor (let cell = 0; cell < lutSize; cell++) {\n\t\tconst p = cell / (lutSize - 1);\n\t\tlet minDistSq = 1e10;\n\t\tfor (let i = 0; i < M; i++) {\n\t\t\tconst dx = p - srcVals[i];\n\t\t\tminDistSq = Math.min(minDistSq, dx * dx);\n\t\t}\n\t\tlet rbfSum = 0;\n\t\tfor (let i = 0; i < M; i++) {\n\t\t\tconst dx = p - srcVals[i];\n\t\t\tconst phi = Math.sqrt(dx * dx + epsilonSq);\n\t\t\trbfSum += X_sol[i] * phi;\n\t\t}\n\t\tconst rbfFade = Math.max(0, Math.min(1, 1 - (minDistSq - .0625) / .1875));\n\t\tlet val = X_sol[M + 0] + X_sol[M + 1] * p + rbfSum * rbfFade;\n\t\tconst identityBlend = Math.max(0, Math.min(1, (minDistSq - .1225) / .3));\n\t\tval = val * (1 - identityBlend) + p * identityBlend;\n\t\tout[cell] = Math.max(0, Math.min(1, val));\n\t}\n\treturn out;\n}\nfunction isSeparableOperationTree(vv, sourceMedia) {\n\tconst sourceFingerprint = getFingerprint(sourceMedia);\n\tlet current = vv;\n\twhile (current) {\n\t\tconst op = current.operation;\n\t\tif (!op) break;\n\t\tconst mediaToFingerprint = {\n\t\t\t...current,\n\t\t\tmetadata: {},\n\t\t\toperation: current.operation ? { ...current.operation } : void 0\n\t\t};\n\t\tif (mediaToFingerprint.operation) delete mediaToFingerprint.operation.lutUrl;\n\t\tif (getFingerprint(mediaToFingerprint) === sourceFingerprint) return true;\n\t\tif (op.op === \"source\") return false;\n\t\tif (op.op === \"Curves\") {\n\t\t\tif (op.curveType !== \"rgb\") return false;\n\t\t} else if (op.op === \"Levels\") {} else return false;\n\t\tif (current.children && current.children.length > 0) current = current.children[0];\n\t\telse break;\n\t}\n\treturn false;\n}\nfunction rgbToLab(r, g, b) {\n\tconst R = Math.max(1e-5, r), G = Math.max(1e-5, g), B = Math.max(1e-5, b);\n\tconst L = Math.log10(Math.max(1e-5, .3811 * R + .5783 * G + .0402 * B));\n\tconst M = Math.log10(Math.max(1e-5, .1967 * R + .7244 * G + .0782 * B));\n\tconst S = Math.log10(Math.max(1e-5, .0241 * R + .1288 * G + .8444 * B));\n\treturn [\n\t\t(L + M + S) / Math.sqrt(3),\n\t\t(L + M - 2 * S) / Math.sqrt(6),\n\t\t(L - M) / Math.sqrt(2)\n\t];\n}\nfunction getPixelRGB(pixels, idx, isBGRA) {\n\tconst o = idx * 4;\n\tconst rIdx = isBGRA ? o + 2 : o;\n\tconst bIdx = isBGRA ? o : o + 2;\n\treturn [\n\t\tpixels[rIdx] / 255,\n\t\tpixels[o + 1] / 255,\n\t\tpixels[bIdx] / 255\n\t];\n}\nfunction hashString(str) {\n\tlet hash = 5381;\n\tfor (let i = 0; i < str.length; i++) hash = hash * 33 ^ str.charCodeAt(i);\n\treturn hash >>> 0;\n}\nvar SeededRandom = class {\n\tstate;\n\tconstructor(seed) {\n\t\tthis.state = seed || 1;\n\t}\n\tnext() {\n\t\tthis.state = (this.state * 1664525 + 1013904223) % 4294967296;\n\t\treturn this.state / 4294967296;\n\t}\n};\nfunction seededShuffle(array, seed) {\n\tconst rng = new SeededRandom(seed);\n\tconst shuffled = [...array];\n\tfor (let i = shuffled.length - 1; i > 0; i--) {\n\t\tconst j = Math.floor(rng.next() * (i + 1));\n\t\tconst temp = shuffled[i];\n\t\tshuffled[i] = shuffled[j];\n\t\tshuffled[j] = temp;\n\t}\n\treturn shuffled;\n}\nfunction buildUniqueColorPool(srcPixels, tgtPixels, isBGRA, gridResolution = 20) {\n\tconst occupied = /* @__PURE__ */ new Set();\n\tconst pool = [];\n\tconst numPixels = srcPixels.length / 4;\n\tfor (let i = 0; i < numPixels; i++) {\n\t\tconst src = getPixelRGB(srcPixels, i, isBGRA);\n\t\tconst r = Math.max(0, Math.min(gridResolution - 1, Math.floor(src[0] * gridResolution)));\n\t\tconst g = Math.max(0, Math.min(gridResolution - 1, Math.floor(src[1] * gridResolution)));\n\t\tconst b = Math.max(0, Math.min(gridResolution - 1, Math.floor(src[2] * gridResolution)));\n\t\tconst cellKey = r * gridResolution * gridResolution + g * gridResolution + b;\n\t\tif (!occupied.has(cellKey)) {\n\t\t\toccupied.add(cellKey);\n\t\t\tpool.push({\n\t\t\t\tsrc,\n\t\t\t\ttgt: getPixelRGB(tgtPixels, i, isBGRA)\n\t\t\t});\n\t\t}\n\t}\n\treturn pool;\n}\n/**\n* Evaluates the fitted RBF on the GPU.\n*\n* CPU work that remains:\n* • Build K matrix O(M²) – tiny (≈ 162×162)\n* • solveLU O(M³) – tiny\n*\n* GPU work (replaces the triple-nested JS loop):\n* • 33³ = 35 937 threads × M inner iterations → ~5.7 M parallel MADs\n*\n* Returns a plain Float32Array of length lutSize³×3 for lutStore.\n*/\nasync function evaluateRbfOnGpu(device, pipelines, sampledPoints, X_sol, lutSize, epsilonSq) {\n\tconst M = sampledPoints.length;\n\tconst totalCells = lutSize * lutSize * lutSize;\n\tconst wgs = 8;\n\tconst srcPointsData = new Float32Array(M * 4);\n\tconst weightsData = new Float32Array(M * 4);\n\tfor (let i = 0; i < M; i++) {\n\t\tsrcPointsData[i * 4 + 0] = sampledPoints[i].src[0];\n\t\tsrcPointsData[i * 4 + 1] = sampledPoints[i].src[1];\n\t\tsrcPointsData[i * 4 + 2] = sampledPoints[i].src[2];\n\t\tsrcPointsData[i * 4 + 3] = 0;\n\t\tweightsData[i * 4 + 0] = X_sol[i * 3 + 0];\n\t\tweightsData[i * 4 + 1] = X_sol[i * 3 + 1];\n\t\tweightsData[i * 4 + 2] = X_sol[i * 3 + 2];\n\t\tweightsData[i * 4 + 3] = 0;\n\t}\n\tconst polyData = new Float32Array(16);\n\tfor (let k = 0; k < 4; k++) {\n\t\tpolyData[k * 4 + 0] = X_sol[(M + k) * 3 + 0];\n\t\tpolyData[k * 4 + 1] = X_sol[(M + k) * 3 + 1];\n\t\tpolyData[k * 4 + 2] = X_sol[(M + k) * 3 + 2];\n\t\tpolyData[k * 4 + 3] = 0;\n\t}\n\tconst paramsBuffer = device.createBuffer({\n\t\tsize: 16,\n\t\tusage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n\t});\n\tconst paramsData = /* @__PURE__ */ new ArrayBuffer(16);\n\tnew Uint32Array(paramsData, 0, 2).set([lutSize, M]);\n\tnew Float32Array(paramsData, 8, 1).set([epsilonSq]);\n\tdevice.queue.writeBuffer(paramsBuffer, 0, paramsData);\n\tconst srcPointsBuf = upload(device, srcPointsData);\n\tconst weightsBuf = upload(device, weightsData);\n\tconst polyBuf = upload(device, polyData);\n\tconst lutByteSize = totalCells * 3 * 4;\n\tconst lutBuf = device.createBuffer({\n\t\tsize: lutByteSize,\n\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC\n\t});\n\tconst readbackBuf = device.createBuffer({\n\t\tsize: lutByteSize,\n\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n\t});\n\tconst bg = device.createBindGroup({\n\t\tlayout: pipelines.rbf.getBindGroupLayout(0),\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: paramsBuffer }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: { buffer: srcPointsBuf }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: { buffer: weightsBuf }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: { buffer: polyBuf }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: { buffer: lutBuf }\n\t\t\t}\n\t\t]\n\t});\n\tconst enc = device.createCommandEncoder({ label: \"rbf-lut-eval\" });\n\tconst pass = enc.beginComputePass();\n\tpass.setPipeline(pipelines.rbf);\n\tpass.setBindGroup(0, bg);\n\tconst groups = Math.ceil(lutSize / wgs);\n\tpass.dispatchWorkgroups(groups, groups, Math.ceil(lutSize / 4));\n\tpass.end();\n\tenc.copyBufferToBuffer(lutBuf, 0, readbackBuf, 0, lutByteSize);\n\tdevice.queue.submit([enc.finish()]);\n\tawait readbackBuf.mapAsync(GPUMapMode.READ);\n\tconst result = new Float32Array(readbackBuf.getMappedRange().slice(0));\n\treadbackBuf.unmap();\n\tparamsBuffer.destroy();\n\tsrcPointsBuf.destroy();\n\tweightsBuf.destroy();\n\tpolyBuf.destroy();\n\tlutBuf.destroy();\n\treadbackBuf.destroy();\n\treturn result;\n}\n/**\n* Generates the statistical LAB-transfer LUT entirely on the GPU.\n* The only CPU work is computing 6 scalars (mean/std per LAB channel).\n*/\nasync function evaluateStatisticalOnGpu(device, pipelines, srcMean, tgtMean, scale, lutSize) {\n\tconst lutByteSize = lutSize * lutSize * lutSize * 3 * 4;\n\tconst statsData = /* @__PURE__ */ new ArrayBuffer(64);\n\tconst f = new Float32Array(statsData);\n\tconst u = new Uint32Array(statsData);\n\tf[0] = srcMean[0];\n\tf[1] = srcMean[1];\n\tf[2] = srcMean[2];\n\tf[4] = tgtMean[0];\n\tf[5] = tgtMean[1];\n\tf[6] = tgtMean[2];\n\tf[8] = scale[0];\n\tf[9] = scale[1];\n\tf[10] = scale[2];\n\tu[12] = lutSize;\n\tconst statsBuf = device.createBuffer({\n\t\tsize: 64,\n\t\tusage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n\t});\n\tdevice.queue.writeBuffer(statsBuf, 0, statsData);\n\tconst lutBuf = device.createBuffer({\n\t\tsize: lutByteSize,\n\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC\n\t});\n\tconst readbackBuf = device.createBuffer({\n\t\tsize: lutByteSize,\n\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n\t});\n\tconst bg = device.createBindGroup({\n\t\tlayout: pipelines.statistical.getBindGroupLayout(0),\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: statsBuf }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: { buffer: lutBuf }\n\t\t}]\n\t});\n\tconst enc = device.createCommandEncoder({ label: \"stat-lut-eval\" });\n\tconst pass = enc.beginComputePass();\n\tpass.setPipeline(pipelines.statistical);\n\tpass.setBindGroup(0, bg);\n\tconst groups = Math.ceil(lutSize / 8);\n\tpass.dispatchWorkgroups(groups, groups, Math.ceil(lutSize / 4));\n\tpass.end();\n\tenc.copyBufferToBuffer(lutBuf, 0, readbackBuf, 0, lutByteSize);\n\tdevice.queue.submit([enc.finish()]);\n\tawait readbackBuf.mapAsync(GPUMapMode.READ);\n\tconst result = new Float32Array(readbackBuf.getMappedRange().slice(0));\n\treadbackBuf.unmap();\n\tstatsBuf.destroy();\n\tlutBuf.destroy();\n\treadbackBuf.destroy();\n\treturn result;\n}\n/** Uploads a Float32Array into a storage-readable GPUBuffer. */\nfunction upload(device, data) {\n\tconst buf = device.createBuffer({\n\t\tsize: Math.max(data.byteLength, 16),\n\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST\n\t});\n\tdevice.queue.writeBuffer(buf, 0, data);\n\treturn buf;\n}\n/**\n* Converts a flat Float32Array [R0,G0,B0, R1,G1,B1 …] returned from the GPU\n* into the tuple array expected by `lutStore.createOrUpdate`.\n*/\nfunction flatToPoints(flat) {\n\tconst n = flat.length / 3;\n\tconst out = new Array(n);\n\tfor (let i = 0; i < n; i++) out[i] = [\n\t\tflat[i * 3],\n\t\tflat[i * 3 + 1],\n\t\tflat[i * 3 + 2]\n\t];\n\treturn out;\n}\nconst ExtractLutWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ExtractLUT\" || !op) return;\n\tconst nodeId = op.nodeId ?? props.renderId;\n\tconst mediaToFingerprint = {\n\t\t...props.virtualMedia,\n\t\tmetadata: {},\n\t\toperation: props.virtualMedia?.operation ? { ...props.virtualMedia.operation } : void 0\n\t};\n\tif (mediaToFingerprint.operation) {\n\t\tdelete mediaToFingerprint.operation.lutUrl;\n\t\tdelete mediaToFingerprint.operation.timeline;\n\t\tdelete mediaToFingerprint.operation.startFrame;\n\t}\n\tconst lutUrl = op.lutUrl ?? `runtime://lut/extract-lut-${nodeId}-${getFingerprint(mediaToFingerprint)}`;\n\tconst fingerprint = lutUrl.startsWith(`runtime://lut/extract-lut-${nodeId}-`) ? lutUrl.slice(`runtime://lut/extract-lut-${nodeId}-`.length) : getFingerprint(mediaToFingerprint);\n\tconst cacheKey = `${nodeId}-${fingerprint}`;\n\tconst sourceMedia = props.virtualMedia?.children?.[0];\n\tconst targetMedia = props.virtualMedia?.children?.[1];\n\tif (!sourceMedia || !targetMedia) {\n\t\tpass.end();\n\t\treturn;\n\t}\n\tconst strategy = op.strategy ?? \"deterministic\";\n\tconst samplePoints = op.samplePoints ?? 150;\n\tconst gridSize = 64;\n\tconst numPixels = gridSize * gridSize;\n\tif (extractionCache.get(nodeId) === fingerprint && lutStore.get(lutUrl, ctx.device)) {\n\t\tpass.end();\n\t\treturn;\n\t}\n\tif (pendingExtractions.has(cacheKey)) {\n\t\tpass.end();\n\t\treturn;\n\t}\n\tlatestRequestedFingerprint.set(nodeId, fingerprint);\n\tpass.end();\n\tlutStore.getOrLoad(lutUrl, ctx.device);\n\tconst prev = activeTextures.get(nodeId);\n\tif (prev) {\n\t\tconst toDestroy = prev;\n\t\tctx.device.queue.onSubmittedWorkDone().then(() => {\n\t\t\ttry {\n\t\t\t\ttoDestroy.srcTex.destroy();\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\ttoDestroy.tgtTex.destroy();\n\t\t\t} catch {}\n\t\t});\n\t\tactiveTextures.delete(nodeId);\n\t}\n\tconst srcTex = ctx.device.createTexture({\n\t\tlabel: `ExtractLUT-src-grid-${nodeId}`,\n\t\tsize: [gridSize, gridSize],\n\t\tformat: ctx.renderer.format,\n\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC\n\t});\n\tctx.renderer.beginFrame(encoder, srcTex.createView(), {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 1\n\t}, gridSize, gridSize, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: gridSize,\n\t\theight: gridSize\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(sourceMedia, {\n\t\t...props,\n\t\trenderId: `${nodeId}-c0`,\n\t\tvirtualMedia: sourceMedia,\n\t\tcontainerWidth: gridSize,\n\t\tcontainerHeight: gridSize,\n\t\tforceWait: true\n\t}, srcTex.createView(), srcTex, gridSize, gridSize);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\tconst tgtTex = ctx.device.createTexture({\n\t\tlabel: `ExtractLUT-tgt-grid-${nodeId}`,\n\t\tsize: [gridSize, gridSize],\n\t\tformat: ctx.renderer.format,\n\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC\n\t});\n\tactiveTextures.set(nodeId, {\n\t\tsrcTex,\n\t\ttgtTex\n\t});\n\tctx.renderer.beginFrame(encoder, tgtTex.createView(), {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 1\n\t}, gridSize, gridSize, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: gridSize,\n\t\theight: gridSize\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(targetMedia, {\n\t\t...props,\n\t\trenderId: `${nodeId}-c1`,\n\t\tvirtualMedia: targetMedia,\n\t\tcontainerWidth: gridSize,\n\t\tcontainerHeight: gridSize,\n\t\tforceWait: true\n\t}, tgtTex.createView(), tgtTex, gridSize, gridSize);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\tconst bytesPerPixel = 4;\n\tconst align = 256;\n\tconst unpaddedBPR = gridSize * bytesPerPixel;\n\tconst bytesPerRow = Math.ceil(unpaddedBPR / align) * align;\n\tconst stagingSize = bytesPerRow * gridSize;\n\tconst srcStagingBuffer = ctx.device.createBuffer({\n\t\tlabel: `ExtractLUT-src-staging-${nodeId}`,\n\t\tsize: stagingSize,\n\t\tusage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST\n\t});\n\tconst tgtStagingBuffer = ctx.device.createBuffer({\n\t\tlabel: `ExtractLUT-tgt-staging-${nodeId}`,\n\t\tsize: stagingSize,\n\t\tusage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST\n\t});\n\tencoder.copyTextureToBuffer({ texture: srcTex }, {\n\t\tbuffer: srcStagingBuffer,\n\t\tbytesPerRow\n\t}, [gridSize, gridSize]);\n\tencoder.copyTextureToBuffer({ texture: tgtTex }, {\n\t\tbuffer: tgtStagingBuffer,\n\t\tbytesPerRow\n\t}, [gridSize, gridSize]);\n\tlet startMapping = () => {};\n\tconst mainSubmitPromise = new Promise((resolve) => {\n\t\tstartMapping = resolve;\n\t});\n\tconst originalSubmit = ctx.device.queue.submit;\n\tctx.device.queue.submit = function(commandBuffers) {\n\t\tctx.device.queue.submit = originalSubmit;\n\t\toriginalSubmit.call(this, commandBuffers);\n\t\tstartMapping();\n\t};\n\tconst extractionPromise = (async () => {\n\t\ttry {\n\t\t\tawait mainSubmitPromise;\n\t\t\tif (latestRequestedFingerprint.get(nodeId) !== fingerprint) {\n\t\t\t\ttry {\n\t\t\t\t\tsrcStagingBuffer.destroy();\n\t\t\t\t\ttgtStagingBuffer.destroy();\n\t\t\t\t} catch {}\n\t\t\t\tlutStore.rejectRawDataPromise(lutUrl, new DOMException(\"Extraction superseded by a newer request\", \"AbortError\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait ctx.device.queue.onSubmittedWorkDone();\n\t\t\tawait Promise.all([srcStagingBuffer.mapAsync(GPUMapMode.READ), tgtStagingBuffer.mapAsync(GPUMapMode.READ)]);\n\t\t\tconst srcPixels = new Uint8Array(numPixels * bytesPerPixel);\n\t\t\tconst tgtPixels = new Uint8Array(numPixels * bytesPerPixel);\n\t\t\tconst copyRows = (src, dst) => {\n\t\t\t\tif (bytesPerRow === unpaddedBPR) dst.set(src);\n\t\t\t\telse for (let y = 0; y < gridSize; y++) dst.set(src.subarray(y * bytesPerRow, y * bytesPerRow + unpaddedBPR), y * unpaddedBPR);\n\t\t\t};\n\t\t\tcopyRows(new Uint8Array(srcStagingBuffer.getMappedRange()), srcPixels);\n\t\t\tcopyRows(new Uint8Array(tgtStagingBuffer.getMappedRange()), tgtPixels);\n\t\t\tsrcStagingBuffer.unmap();\n\t\t\tsrcStagingBuffer.destroy();\n\t\t\ttgtStagingBuffer.unmap();\n\t\t\ttgtStagingBuffer.destroy();\n\t\t\tif (latestRequestedFingerprint.get(nodeId) !== fingerprint) {\n\t\t\t\tlutStore.rejectRawDataPromise(lutUrl, new DOMException(\"Extraction superceded by a newer request\", \"AbortError\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst isBGRA = ctx.renderer.format === \"bgra8unorm\" || ctx.renderer.format === \"bgra8unorm-srgb\";\n\t\t\tconst lutSize = 33;\n\t\t\tconst pipelines = getOrCreatePipelines(ctx.device);\n\t\t\tlet flat = null;\n\t\t\tlet succeeded = false;\n\t\t\tif (strategy === \"deterministic\") {\n\t\t\t\tconst shuffled = seededShuffle(buildUniqueColorPool(srcPixels, tgtPixels, isBGRA, 20), hashString(getFingerprint({\n\t\t\t\t\t...props.virtualMedia,\n\t\t\t\t\tmetadata: {},\n\t\t\t\t\toperation: void 0\n\t\t\t\t})));\n\t\t\t\tconst sampledPoints = shuffled.slice(0, Math.min(shuffled.length, samplePoints));\n\t\t\t\tconst M = sampledPoints.length;\n\t\t\t\tif (M >= 8) {\n\t\t\t\t\tif (isSeparableOperationTree(targetMedia, sourceMedia)) {\n\t\t\t\t\t\tlet epsilonSq = .01;\n\t\t\t\t\t\tlet totalMinDist = 0;\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) {\n\t\t\t\t\t\t\tlet minD = Infinity;\n\t\t\t\t\t\t\tfor (let j = 0; j < M; j++) {\n\t\t\t\t\t\t\t\tif (i === j) continue;\n\t\t\t\t\t\t\t\tconst dx = sampledPoints[i].src[0] - sampledPoints[j].src[0];\n\t\t\t\t\t\t\t\tminD = Math.min(minD, dx * dx);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttotalMinDist += Math.sqrt(minD);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst meanNND = totalMinDist / M;\n\t\t\t\t\t\tepsilonSq = Math.max(meanNND * meanNND * 4, 1e-4);\n\t\t\t\t\t\tconst srcR = sampledPoints.map((p) => p.src[0]);\n\t\t\t\t\t\tconst tgtR = sampledPoints.map((p) => p.tgt[0]);\n\t\t\t\t\t\tconst srcG = sampledPoints.map((p) => p.src[1]);\n\t\t\t\t\t\tconst tgtG = sampledPoints.map((p) => p.tgt[1]);\n\t\t\t\t\t\tconst srcB = sampledPoints.map((p) => p.src[2]);\n\t\t\t\t\t\tconst tgtB = sampledPoints.map((p) => p.tgt[2]);\n\t\t\t\t\t\tconst X_sol_R = solve1DChannel(srcR, tgtR, epsilonSq);\n\t\t\t\t\t\tconst X_sol_G = solve1DChannel(srcG, tgtG, epsilonSq);\n\t\t\t\t\t\tconst X_sol_B = solve1DChannel(srcB, tgtB, epsilonSq);\n\t\t\t\t\t\tif (X_sol_R && !hasAbsurdCoefficients(X_sol_R) && X_sol_G && !hasAbsurdCoefficients(X_sol_G) && X_sol_B && !hasAbsurdCoefficients(X_sol_B)) {\n\t\t\t\t\t\t\tconst lutR = evaluate1DChannel(srcR, X_sol_R, epsilonSq, lutSize);\n\t\t\t\t\t\t\tconst lutG = evaluate1DChannel(srcG, X_sol_G, epsilonSq, lutSize);\n\t\t\t\t\t\t\tconst lutB = evaluate1DChannel(srcB, X_sol_B, epsilonSq, lutSize);\n\t\t\t\t\t\t\tflat = new Float32Array(lutSize * lutSize * lutSize * 3);\n\t\t\t\t\t\t\tfor (let b = 0; b < lutSize; b++) for (let g = 0; g < lutSize; g++) for (let r = 0; r < lutSize; r++) {\n\t\t\t\t\t\t\t\tconst idx = (b * lutSize * lutSize + g * lutSize + r) * 3;\n\t\t\t\t\t\t\t\tflat[idx + 0] = lutR[r];\n\t\t\t\t\t\t\t\tflat[idx + 1] = lutG[g];\n\t\t\t\t\t\t\t\tflat[idx + 2] = lutB[b];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsucceeded = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!succeeded) {\n\t\t\t\t\t\tconst H = M + 4;\n\t\t\t\t\t\tlet epsilonSq = .01;\n\t\t\t\t\t\tlet totalMinDist = 0;\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) {\n\t\t\t\t\t\t\tlet minD = Infinity;\n\t\t\t\t\t\t\tfor (let j = 0; j < M; j++) {\n\t\t\t\t\t\t\t\tif (i === j) continue;\n\t\t\t\t\t\t\t\tconst dx = sampledPoints[i].src[0] - sampledPoints[j].src[0];\n\t\t\t\t\t\t\t\tconst dy = sampledPoints[i].src[1] - sampledPoints[j].src[1];\n\t\t\t\t\t\t\t\tconst dz = sampledPoints[i].src[2] - sampledPoints[j].src[2];\n\t\t\t\t\t\t\t\tminD = Math.min(minD, dx * dx + dy * dy + dz * dz);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttotalMinDist += Math.sqrt(minD);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst meanNND = totalMinDist / M;\n\t\t\t\t\t\tepsilonSq = Math.max(meanNND * meanNND * 4, 1e-4);\n\t\t\t\t\t\tconst K_mat = new Float64Array(H * H);\n\t\t\t\t\t\tconst B_rhs = new Float64Array(H * 3);\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) {\n\t\t\t\t\t\t\tconst pi = sampledPoints[i].src;\n\t\t\t\t\t\t\tconst gi = sampledPoints[i].tgt;\n\t\t\t\t\t\t\tB_rhs[i * 3 + 0] = gi[0];\n\t\t\t\t\t\t\tB_rhs[i * 3 + 1] = gi[1];\n\t\t\t\t\t\t\tB_rhs[i * 3 + 2] = gi[2];\n\t\t\t\t\t\t\tfor (let j = 0; j < M; j++) {\n\t\t\t\t\t\t\t\tconst pj = sampledPoints[j].src;\n\t\t\t\t\t\t\t\tconst dx = pi[0] - pj[0], dy = pi[1] - pj[1], dz = pi[2] - pj[2];\n\t\t\t\t\t\t\t\tK_mat[i * H + j] = Math.sqrt(dx * dx + dy * dy + dz * dz + epsilonSq);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tK_mat[i * H + M + 0] = 1;\n\t\t\t\t\t\t\tK_mat[i * H + M + 1] = pi[0];\n\t\t\t\t\t\t\tK_mat[i * H + M + 2] = pi[1];\n\t\t\t\t\t\t\tK_mat[i * H + M + 3] = pi[2];\n\t\t\t\t\t\t\tK_mat[(M + 0) * H + i] = 1;\n\t\t\t\t\t\t\tK_mat[(M + 1) * H + i] = pi[0];\n\t\t\t\t\t\t\tK_mat[(M + 2) * H + i] = pi[1];\n\t\t\t\t\t\t\tK_mat[(M + 3) * H + i] = pi[2];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet diagMean = 0;\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) diagMean += K_mat[i * H + i];\n\t\t\t\t\t\tdiagMean /= M;\n\t\t\t\t\t\tconst lambda = Math.max(1e-4, diagMean * .01);\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) K_mat[i * H + i] += lambda;\n\t\t\t\t\t\tconst polyLambda = Math.max(1e-4, diagMean * .001);\n\t\t\t\t\t\tfor (let k = 0; k < 4; k++) K_mat[(M + k) * H + M + k] = polyLambda;\n\t\t\t\t\t\tconst X_sol = solveLU(K_mat, B_rhs, H);\n\t\t\t\t\t\tif (X_sol && !hasAbsurdCoefficients(X_sol)) try {\n\t\t\t\t\t\t\tflat = await evaluateRbfOnGpu(ctx.device, pipelines, sampledPoints, X_sol, lutSize, epsilonSq);\n\t\t\t\t\t\t\tlet hasInvalid = false;\n\t\t\t\t\t\t\tfor (let i = 0; i < flat.length; i++) {\n\t\t\t\t\t\t\t\tconst val = flat[i];\n\t\t\t\t\t\t\t\tif (Number.isNaN(val) || !Number.isFinite(val)) {\n\t\t\t\t\t\t\t\t\thasInvalid = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!hasInvalid) succeeded = true;\n\t\t\t\t\t\t} catch (gpuErr) {\n\t\t\t\t\t\t\tconsole.error(\"[ExtractLUT] RBF GPU evaluation failed:\", gpuErr);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!succeeded) {\n\t\t\t\tlet srcMeanL = 0, srcMeanA = 0, srcMeanB = 0;\n\t\t\t\tlet tgtMeanL = 0, tgtMeanA = 0, tgtMeanB = 0;\n\t\t\t\tconst srcLABs = [];\n\t\t\t\tconst tgtLABs = [];\n\t\t\t\tfor (let i = 0; i < numPixels; i++) {\n\t\t\t\t\tconst sl = rgbToLab(...getPixelRGB(srcPixels, i, isBGRA));\n\t\t\t\t\tsrcLABs.push(sl);\n\t\t\t\t\tsrcMeanL += sl[0];\n\t\t\t\t\tsrcMeanA += sl[1];\n\t\t\t\t\tsrcMeanB += sl[2];\n\t\t\t\t\tconst tl = rgbToLab(...getPixelRGB(tgtPixels, i, isBGRA));\n\t\t\t\t\ttgtLABs.push(tl);\n\t\t\t\t\ttgtMeanL += tl[0];\n\t\t\t\t\ttgtMeanA += tl[1];\n\t\t\t\t\ttgtMeanB += tl[2];\n\t\t\t\t}\n\t\t\t\tsrcMeanL /= numPixels;\n\t\t\t\tsrcMeanA /= numPixels;\n\t\t\t\tsrcMeanB /= numPixels;\n\t\t\t\ttgtMeanL /= numPixels;\n\t\t\t\ttgtMeanA /= numPixels;\n\t\t\t\ttgtMeanB /= numPixels;\n\t\t\t\tlet srcStdL = 0, srcStdA = 0, srcStdB = 0;\n\t\t\t\tlet tgtStdL = 0, tgtStdA = 0, tgtStdB = 0;\n\t\t\t\tfor (let i = 0; i < numPixels; i++) {\n\t\t\t\t\tsrcStdL += (srcLABs[i][0] - srcMeanL) ** 2;\n\t\t\t\t\tsrcStdA += (srcLABs[i][1] - srcMeanA) ** 2;\n\t\t\t\t\tsrcStdB += (srcLABs[i][2] - srcMeanB) ** 2;\n\t\t\t\t\ttgtStdL += (tgtLABs[i][0] - tgtMeanL) ** 2;\n\t\t\t\t\ttgtStdA += (tgtLABs[i][1] - tgtMeanA) ** 2;\n\t\t\t\t\ttgtStdB += (tgtLABs[i][2] - tgtMeanB) ** 2;\n\t\t\t\t}\n\t\t\t\tsrcStdL = Math.max(Math.sqrt(srcStdL / numPixels), 1e-6);\n\t\t\t\tsrcStdA = Math.max(Math.sqrt(srcStdA / numPixels), 1e-6);\n\t\t\t\tsrcStdB = Math.max(Math.sqrt(srcStdB / numPixels), 1e-6);\n\t\t\t\ttgtStdL = Math.sqrt(tgtStdL / numPixels);\n\t\t\t\ttgtStdA = Math.sqrt(tgtStdA / numPixels);\n\t\t\t\ttgtStdB = Math.sqrt(tgtStdB / numPixels);\n\t\t\t\tif (srcStdL < 1e-4 || srcMeanL < 1e-4) {\n\t\t\t\t\tflat = new Float32Array(lutSize * lutSize * lutSize * 3);\n\t\t\t\t\tfor (let b = 0; b < lutSize; b++) for (let g = 0; g < lutSize; g++) for (let r = 0; r < lutSize; r++) {\n\t\t\t\t\t\tconst idx = (b * lutSize * lutSize + g * lutSize + r) * 3;\n\t\t\t\t\t\tflat[idx + 0] = r / (lutSize - 1);\n\t\t\t\t\t\tflat[idx + 1] = g / (lutSize - 1);\n\t\t\t\t\t\tflat[idx + 2] = b / (lutSize - 1);\n\t\t\t\t\t}\n\t\t\t\t} else flat = await evaluateStatisticalOnGpu(ctx.device, pipelines, [\n\t\t\t\t\tsrcMeanL,\n\t\t\t\t\tsrcMeanA,\n\t\t\t\t\tsrcMeanB\n\t\t\t\t], [\n\t\t\t\t\ttgtMeanL,\n\t\t\t\t\ttgtMeanA,\n\t\t\t\t\ttgtMeanB\n\t\t\t\t], [\n\t\t\t\t\ttgtStdL / srcStdL,\n\t\t\t\t\ttgtStdA / srcStdA,\n\t\t\t\t\ttgtStdB / srcStdB\n\t\t\t\t], lutSize);\n\t\t\t}\n\t\t\tconst smoothedPoints = flatToPoints(flat);\n\t\t\tif (latestRequestedFingerprint.get(nodeId) !== fingerprint) {\n\t\t\t\tlutStore.rejectRawDataPromise(lutUrl, new DOMException(\"Extraction superseded by a newer request\", \"AbortError\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlutStore.createOrUpdate(lutUrl, ctx.device, smoothedPoints, lutSize, \"3D\");\n\t\t\textractionCache.set(nodeId, fingerprint);\n\t\t} catch (err) {\n\t\t\tconsole.error(\"[ExtractLUT] Async extraction error:\", err);\n\t\t\ttry {\n\t\t\t\tconst lutSize = 33;\n\t\t\t\tconst identityPoints = [];\n\t\t\t\tfor (let z = 0; z < lutSize; z++) for (let y = 0; y < lutSize; y++) for (let x = 0; x < lutSize; x++) identityPoints.push([\n\t\t\t\t\tx / (lutSize - 1),\n\t\t\t\t\ty / (lutSize - 1),\n\t\t\t\t\tz / (lutSize - 1)\n\t\t\t\t]);\n\t\t\t\tif (latestRequestedFingerprint.get(nodeId) === fingerprint) {\n\t\t\t\t\tlutStore.createOrUpdate(lutUrl, ctx.device, identityPoints, lutSize, \"3D\");\n\t\t\t\t\textractionCache.set(nodeId, fingerprint);\n\t\t\t\t}\n\t\t\t} catch (fallbackErr) {\n\t\t\t\tconsole.error(\"[ExtractLUT] Failed to write fallback identity LUT:\", fallbackErr);\n\t\t\t\tlutStore.rejectRawDataPromise(lutUrl, err);\n\t\t\t}\n\t\t} finally {\n\t\t\tpendingExtractions.delete(cacheKey);\n\t\t}\n\t})();\n\tpendingExtractions.set(cacheKey, extractionPromise);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ExtractLutWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-CDotFzd9.mjs.map"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { n as defineRenderer, u as unwrapFrameParam } from "./renderer-BgmO1Dzw.mjs";
|
|
2
2
|
import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-BPOi5xb_.mjs";
|
|
3
|
-
import { In as signalRegistry } from "./dist-
|
|
4
|
-
import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, 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-
|
|
3
|
+
import { In as signalRegistry } from "./dist-cC6nOaMR.mjs";
|
|
4
|
+
import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, 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-CrQADlcf.mjs";
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
|
|
7
7
|
//#region ../../nodes/node-blur/dist/renderers-rcrwEq-B.mjs
|
|
@@ -845,4 +845,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: BlurWebGPURenderer });
|
|
|
845
845
|
|
|
846
846
|
//#endregion
|
|
847
847
|
export { renderers_default as t };
|
|
848
|
-
//# sourceMappingURL=renderer-
|
|
848
|
+
//# sourceMappingURL=renderer-CEvj79Wg.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-1NoJLLDa.mjs","names":[],"sources":["../../../nodes/node-blur/dist/renderers-rcrwEq-B.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { ImageResultSchema, VideoResultSchema, configBuilder, unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\nimport { z } from \"zod\";\n\n//#region src/shared/config.ts\nconst MAX_BLUR = 100;\nconst blurConfig = configBuilder().field(\"blurType\", z.enum([\n\t\"Gaussian\",\n\t\"Box\",\n\t\"Median\",\n\t\"Motion\",\n\t\"Bilateral\",\n\t\"Edge-preserving\",\n\t\"Radial\",\n\t\"Zoom\"\n]).default(\"Gaussian\"), {\n\tbindable: false,\n\tlabel: \"Blur Type\"\n}).field(\"strength\", z.number().min(0).max(MAX_BLUR).default(5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Strength Signal\",\n\tdescription: \"The intensity of the blur. 0 = no blur. Can be modulated by a static number or a dynamic signal.\"\n}).field(\"angle\", z.number().int().min(0).max(360).default(0), {\n\tbindable: false,\n\tsignal: true,\n\tlabel: \"Angle\",\n\tdescription: \"Direction of a Motion blur, in degrees.\"\n}).field(\"sigmaColor\", z.number().min(.01).max(1).default(.1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Color Sigma Signal\",\n\tdescription: \"Sigma value for color space in Bilateral / Edge-preserving blurs. Can be modulated by a static number or a dynamic signal.\"\n}).field(\"centerX\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center X Signal\",\n\tdescription: \"The X coordinate of the blur center (0.0 to 1.0). Can be modulated by a static number or a dynamic signal.\"\n}).field(\"centerY\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center Y Signal\",\n\tdescription: \"The Y coordinate of the blur center (0.0 to 1.0). Can be modulated by a static number or a dynamic signal.\"\n}).field(\"partialBlur\", z.boolean().default(false), {\n\tbindable: false,\n\tsignal: true,\n\tlabel: \"Partial Blur\",\n\tdescription: \"Blurs only a specific circular area around center point.\"\n}).field(\"radius\", z.number().min(.01).max(1).default(.3), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Partial Radius Signal\",\n\tdescription: \"Radius of the partial blur region (0.01 to 1.0). Can be modulated by a static number or a dynamic signal.\"\n}).field(\"radiusY\", z.number().min(0).max(1).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Partial Radius Y Signal\",\n\tdescription: \"Vertical radius of the partial blur region (0 to 1.0). 0 reuses the horizontal radius.\"\n}).field(\"shape\", z.enum([\n\t\"ellipse\",\n\t\"circle\",\n\t\"rect\"\n]).default(\"circle\"), {\n\tbindable: false,\n\tlabel: \"Partial Shape\",\n\tdescription: \"Shape of the partial blur region.\"\n}).build();\nconst BlurNodeConfigSchema = blurConfig.schema;\nconst BlurResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst BLUR_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_BLUR_UNIFORMS = `\nstruct BlurUniforms {\n\tdirX : f32,\n\tdirY : f32,\n\tstrength : f32,\n\tangle : f32,\n\n\tsigmaColor : f32,\n\tcenterX : f32,\n\tcenterY : f32,\n\tradius : f32,\n\n\tpartialBlur : f32,\n\thasStrengthSig : f32,\n\thasSigmaColorSig: f32,\n\thasCenterXSig : f32,\n\n\thasCenterYSig : f32,\n\thasRadiusSig : f32,\n\tradiusY : f32,\n\tshape : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : BlurUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(1) @binding(2) var origTex : texture_2d<f32>;\n\n@group(2) @binding(0) var strengthSigTex : texture_2d<f32>;\n@group(2) @binding(1) var sigmaColorSigTex : texture_2d<f32>;\n@group(2) @binding(2) var centerXSigTex : texture_2d<f32>;\n@group(2) @binding(3) var centerYSigTex : texture_2d<f32>;\n@group(2) @binding(4) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(5) var signalSamp : sampler;\n\nfn applyPartialBlur(blurred: vec4<f32>, uv: vec2<f32>, dimensions: vec2<f32>) -> vec4<f32> {\n\tif (u.partialBlur <= 0.5) {\n\t\treturn blurred;\n\t}\n\tlet orig = textureSampleLevel(origTex, samp, uv, 0.0);\n\tvar centerX = u.centerX;\n\tif (u.hasCenterXSig > 0.5) {\n\t\tcenterX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerY = u.centerY;\n\tif (u.hasCenterYSig > 0.5) {\n\t\tcenterY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar radiusX = u.radius;\n\tif (u.hasRadiusSig > 0.5) {\n\t\tradiusX = textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar radiusY = u.radiusY;\n\n\tvar mask = 0.0;\n\tif (radiusY <= 0.0) {\n\t\tlet aspect = dimensions.x / dimensions.y;\n\t\tlet diff = (uv - vec2<f32>(centerX, centerY)) * vec2<f32>(aspect, 1.0);\n\t\tlet dist = length(diff);\n\t\tlet feather = 0.05;\n\t\tmask = 1.0 - smoothstep(radiusX - feather, radiusX + feather, dist);\n\t} else {\n\t\tlet diff = abs(uv - vec2<f32>(centerX, centerY));\n\t\tif (u.shape > 0.5) {\n\t\t\tlet feather = 0.02;\n\t\t\tlet edgeX = 1.0 - smoothstep(radiusX - feather, radiusX + feather, diff.x);\n\t\t\tlet edgeY = 1.0 - smoothstep(radiusY - feather, radiusY + feather, diff.y);\n\t\t\tmask = edgeX * edgeY;\n\t\t} else {\n\t\t\tlet normDist = length(vec2<f32>(diff.x / max(1e-4, radiusX), diff.y / max(1e-4, radiusY)));\n\t\t\tlet feather = 0.08;\n\t\t\tmask = 1.0 - smoothstep(1.0 - feather, 1.0 + feather, normDist);\n\t\t}\n\t}\n\treturn mix(orig, blurred, mask);\n}\n`;\nconst GAUSSIAN_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet c = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar spatial_sigma = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tspatial_sigma = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (spatial_sigma <= 0.0) {\n\t\treturn applyPartialBlur(c, in.uv, dimensions);\n\t}\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet stepScale = max(1.0, spatial_sigma / 20.0);\n\tlet effectiveSigma = spatial_sigma / stepScale;\n\tlet radius = min(i32(ceil(3.0 * effectiveSigma)), 64);\n\t\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\t\n\tvar color = vec4<f32>(0.0);\n\tvar totalWeight = 0.0;\n\n\tfor (var i = -radius; i <= radius; i++) {\n\t\tlet offset = vec2<f32>(f32(i) * stepScale) * direction * texelSize;\n\t\tlet x = f32(i) * stepScale;\n\t\tlet weight = exp(-0.5 * (x / spatial_sigma) * (x / spatial_sigma));\n\t\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0) * weight;\n\t\ttotalWeight += weight;\n\t}\n\n\tlet blurred = color / totalWeight;\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst BOX_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet c = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tlet radius = i32(round(strength));\n\tif (radius <= 0) {\n\t\treturn applyPartialBlur(c, in.uv, dimensions);\n\t}\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\t\n\tvar color = vec4<f32>(0.0);\n\tvar count = 0.0;\n\n\tfor (var i = -radius; i <= radius; i++) {\n\t\tlet offset = vec2<f32>(f32(i)) * direction * texelSize;\n\t\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\tcount += 1.0;\n\t}\n\n\tlet blurred = color / count;\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst MEDIAN_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\nstruct Val {\n\tluma : f32,\n\tcolor : vec4<f32>,\n};\n\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tlet radius = min(i32(round(strength)), 16);\n\tif (radius <= 0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet count = radius * 2 + 1;\n\tlet texelSize = 1.0 / dimensions;\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\n\tvar values : array<Val, 33>;\n\n\tfor (var i = 0; i < 33; i++) {\n\t\tif (i >= count) { break; }\n\t\tlet offset = vec2<f32>(f32(i - radius)) * direction * texelSize;\n\t\tlet col = textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\tvalues[i] = Val(dot(col.rgb, vec3<f32>(0.299, 0.587, 0.114)), col);\n\t}\n\n\t// Selection sort\n\tfor (var i = 0; i < 33; i++) {\n\t\tif (i >= count - 1) { break; }\n\t\tvar minIdx = i;\n\t\tfor (var j = 0; j < 33; j++) {\n\t\t\tif (j <= i) { continue; }\n\t\t\tif (j >= count) { break; }\n\t\t\tif (values[j].luma < values[minIdx].luma) {\n\t\t\t\tminIdx = j;\n\t\t\t}\n\t\t}\n\t\tif (minIdx != i) {\n\t\t\tlet temp = values[i];\n\t\t\tvalues[i] = values[minIdx];\n\t\t\tvalues[minIdx] = temp;\n\t\t}\n\t}\n\n\tlet medianIdx = count / 2;\n\treturn applyPartialBlur(values[medianIdx].color, in.uv, dimensions);\n}\n`;\nconst MOTION_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet c = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (strength <= 0.0) {\n\t\treturn applyPartialBlur(c, in.uv, dimensions);\n\t}\n\n\tlet PI = 3.14159265359;\n\tlet angleRad = u.angle * PI / 180.0;\n\tlet dir = vec2<f32>(cos(angleRad), sin(angleRad));\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet step = dir * texelSize;\n\n\tlet numSamples = i32(clamp(strength, 1.0, 64.0));\n\tvar color = vec4<f32>(0.0);\n\t\n\tfor (var i = 0; i < 64; i++) {\n\t\tif (i >= numSamples) { break; }\n\t\tlet offset = f32(i - numSamples / 2) * step;\n\t\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t}\n\n\tlet blurred = color / f32(numSamples);\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst BILATERAL_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar spatial_sigma = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tspatial_sigma = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar sigmaColor = u.sigmaColor;\n\tif (u.hasSigmaColorSig > 0.5) {\n\t\tsigmaColor = textureSampleLevel(sigmaColorSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (spatial_sigma <= 0.0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet radius = min(i32(ceil(3.0 * spatial_sigma)), 32);\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\t\n\tvar color = vec4<f32>(0.0);\n\tvar totalWeight = 0.0;\n\n\tfor (var i = -32; i <= 32; i++) {\n\t\tif (i < -radius || i > radius) { continue; }\n\t\tlet offset = vec2<f32>(f32(i)) * direction * texelSize;\n\t\tlet sampleCol = textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\t\n\t\tlet spatialDistSq = f32(i * i);\n\t\tlet spatialWeight = exp(-0.5 * spatialDistSq / (spatial_sigma * spatial_sigma));\n\t\t\n\t\tlet diff = sampleCol - centerCol;\n\t\tlet colorDistSq = dot(diff, diff);\n\t\tlet rangeWeight = exp(-0.5 * colorDistSq / (sigmaColor * sigmaColor));\n\t\t\n\t\tlet weight = spatialWeight * rangeWeight;\n\t\tcolor += sampleCol * weight;\n\t\ttotalWeight += weight;\n\t}\n\n\tvar blurred = centerCol;\n\tif (totalWeight > 0.0) {\n\t\tblurred = color / totalWeight;\n\t}\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst EDGE_PRESERVING_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\t// Map strength (1-10) to radius (1-6)\n\tlet radius = i32(clamp(round(strength * 5.0 / 10.0) + 1.0, 1.0, 6.0));\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tlet texelSize = 1.0 / dimensions;\n\n\tvar m0 = vec3<f32>(0.0); var m1 = vec3<f32>(0.0); var m2 = vec3<f32>(0.0); var m3 = vec3<f32>(0.0);\n\tvar s0 = vec3<f32>(0.0); var s1 = vec3<f32>(0.0); var s2 = vec3<f32>(0.0); var s3 = vec3<f32>(0.0);\n\n\tlet n = f32((radius + 1) * (radius + 1));\n\n\tfor (var j = -6; j <= 6; j++) {\n\t\tif (j < -radius || j > radius) { continue; }\n\t\tfor (var i = -6; i <= 6; i++) {\n\t\t\tif (i < -radius || i > radius) { continue; }\n\t\t\t\n\t\t\tlet c = textureSampleLevel(tex, samp, in.uv + vec2<f32>(f32(i), f32(j)) * texelSize, 0.0).rgb;\n\t\t\t\n\t\t\tif (i <= 0 && j <= 0) {\n\t\t\t\tm0 += c;\n\t\t\t\ts0 += c * c;\n\t\t\t}\n\t\t\tif (i >= 0 && j <= 0) {\n\t\t\t\tm1 += c;\n\t\t\t\ts1 += c * c;\n\t\t\t}\n\t\t\tif (i <= 0 && j >= 0) {\n\t\t\t\tm2 += c;\n\t\t\t\ts2 += c * c;\n\t\t\t}\n\t\t\tif (i >= 0 && j >= 0) {\n\t\t\t\tm3 += c;\n\t\t\t\ts3 += c * c;\n\t\t\t}\n\t\t}\n\t}\n\n\tm0 = m0 / n; s0 = abs(s0 / n - m0 * m0);\n\tm1 = m1 / n; s1 = abs(s1 / n - m1 * m1);\n\tm2 = m2 / n; s2 = abs(s2 / n - m2 * m2);\n\tm3 = m3 / n; s3 = abs(s3 / n - m3 * m3);\n\n\tlet v0 = s0.r + s0.g + s0.b;\n\tlet v1 = s1.r + s1.g + s1.b;\n\tlet v2 = s2.r + s2.g + s2.b;\n\tlet v3 = s3.r + s3.g + s3.b;\n\n\tvar minVar = v0;\n\tvar finalCol = m0;\n\n\tif (v1 < minVar) {\n\t\tminVar = v1;\n\t\tfinalCol = m1;\n\t}\n\tif (v2 < minVar) {\n\t\tminVar = v2;\n\t\tfinalCol = m2;\n\t}\n\tif (v3 < minVar) {\n\t\tminVar = v3;\n\t\tfinalCol = m3;\n\t}\n\n\tlet blurred = vec4<f32>(finalCol, centerCol.a);\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst RADIAL_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerX = u.centerX;\n\tif (u.hasCenterXSig > 0.5) {\n\t\tcenterX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerY = u.centerY;\n\tif (u.hasCenterYSig > 0.5) {\n\t\tcenterY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (strength <= 0.0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet center = vec2<f32>(centerX, centerY);\n\tlet toPixel = in.uv - center;\n\tlet dist = length(toPixel);\n\tif (dist <= 0.0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet dir = vec2<f32>(-toPixel.y, toPixel.x);\n\tlet blurAmount = (strength / 100.0) * 0.1 * dist;\n\n\tlet numSamples = 24;\n\tvar color = vec4<f32>(0.0);\n\tlet step = dir * (blurAmount / f32(numSamples));\n\n\tfor (var i = 0; i < 24; i++) {\n\t\tlet offset = step * f32(i - 12);\n\t\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t}\n\n\tlet blurred = color / 24.0;\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst ZOOM_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerX = u.centerX;\n\tif (u.hasCenterXSig > 0.5) {\n\t\tcenterX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerY = u.centerY;\n\tif (u.hasCenterYSig > 0.5) {\n\t\tcenterY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (strength <= 0.0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet center = vec2<f32>(centerX, centerY);\n\tlet toPixel = in.uv - center;\n\tlet blurAmount = (strength / 100.0) * 0.15;\n\n\tlet numSamples = 24;\n\tvar color = vec4<f32>(0.0);\n\tlet step = toPixel * (blurAmount / f32(numSamples));\n\n\tfor (var i = 0; i < 24; i++) {\n\t\tlet offset = step * f32(i - 12);\n\t\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t}\n\n\tlet blurred = color / 24.0;\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst getDeviceLayouts = perDevice((device) => ({\n\tblurUniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\n\t\t\"texture\",\n\t\t\"sampler\",\n\t\t\"texture\"\n\t]),\n\tsignalTextureLayout: texturesLayout(device, 5),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getBlurResources(device, format, blurType) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `blur_${blurType}_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tlet code = GAUSSIAN_BLUR_SHADER;\n\t\tif (blurType === \"Box\") code = BOX_BLUR_SHADER;\n\t\telse if (blurType === \"Median\") code = MEDIAN_BLUR_SHADER;\n\t\telse if (blurType === \"Motion\") code = MOTION_BLUR_SHADER;\n\t\telse if (blurType === \"Bilateral\") code = BILATERAL_BLUR_SHADER;\n\t\telse if (blurType === \"Edge-preserving\") code = EDGE_PRESERVING_SHADER;\n\t\telse if (blurType === \"Radial\") code = RADIAL_BLUR_SHADER;\n\t\telse if (blurType === \"Zoom\") code = ZOOM_BLUR_SHADER;\n\t\tconst blurModule = device.createShaderModule({\n\t\t\tlabel: `blur_${blurType}_${format}.wgsl`,\n\t\t\tcode\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `BlurPipeline_${blurType}_${format}`,\n\t\t\tmodule: blurModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.blurUniformLayout,\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\tblurPipeline: pipeline,\n\t\tblurUniformLayout: layouts.blurUniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst BlurWebGPURenderer = 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 !== \"Blur\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst blurData = new Float32Array(16);\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst dpiScale = width / (props.containerWidth ?? ctx.surface.width / (typeof window !== \"undefined\" ? window.devicePixelRatio : 1));\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"blur_node\";\n\tconst resolveBindable = (configKey, defaultValue, minVal, maxVal, scaleByDpi = false) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && (input.outputItem?.type === \"Signal\" || input.outputItem?.type === \"Numeric\"));\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = defaultValue;\n\t\tlet hasStaticSig = false;\n\t\tlet gpuTextureView;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") {\n\t\t\tconst rawVal = Number(input.outputItem.data ?? defaultValue);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, rawVal));\n\t\t\tif (scaleByDpi) val *= dpiScale;\n\t\t} else {\n\t\t\tconst unwrapped = unwrapFrameParam(op[configKey], compositionFrame, fps);\n\t\t\tif (unwrapped.gpuTextureView) {\n\t\t\t\tgpuTextureView = unwrapped.gpuTextureView;\n\t\t\t\thasStaticSig = true;\n\t\t\t}\n\t\t\tconst rawVal = unwrapped.value;\n\t\t\tconst numVal = Number(rawVal ?? defaultValue);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, isNaN(numVal) ? defaultValue : numVal));\n\t\t\tif (scaleByDpi) val *= dpiScale;\n\t\t}\n\t\telse if (sd) {\n\t\t\tconst rawVal = Number(sd.offset ?? 0);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, rawVal));\n\t\t\tif (scaleByDpi) val *= dpiScale;\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd,\n\t\t\tgpuTextureView\n\t\t};\n\t};\n\tconst strengthRes = resolveBindable(\"strength\", 5, 0, MAX_BLUR, true);\n\tconst sigmaColorRes = resolveBindable(\"sigmaColor\", .1, .01, 1, false);\n\tconst centerXRes = resolveBindable(\"centerX\", .5, 0, 1, false);\n\tconst centerYRes = resolveBindable(\"centerY\", .5, 0, 1, false);\n\tconst radiusRes = resolveBindable(\"radius\", .3, .001, 1, false);\n\tconst radiusYRes = resolveBindable(\"radiusY\", 0, 0, 1, false);\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst blurType = op.blurType ?? \"Gaussian\";\n\tconst isSeparable = blurType === \"Gaussian\" || blurType === \"Box\" || blurType === \"Median\" || blurType === \"Bilateral\";\n\tconst { blurPipeline: pipeline, blurUniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getBlurResources(ctx.device, ctx.renderer.format, blurType);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tfor (const bindableRes of [\n\t\tstrengthRes,\n\t\tsigmaColorRes,\n\t\tcenterXRes,\n\t\tcenterYRes,\n\t\tradiusRes\n\t]) if (bindableRes.hasStaticSig && bindableRes.sd) await signalRegistry.ensureAudioSourcesExtracted(ctx.device, bindableRes.sd, fps, props.renderId);\n\tconst signalContext = {\n\t\targs,\n\t\twidth,\n\t\theight,\n\t\tframe,\n\t\tfps,\n\t\telapsedSeconds,\n\t\tdurationSeconds\n\t};\n\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\tconst strengthView = getSignalView(strengthRes, \"strength_sig\");\n\tconst sigmaColorView = getSignalView(sigmaColorRes, \"sigmacolor_sig\");\n\tconst centerXView = getSignalView(centerXRes, \"centerx_sig\");\n\tconst centerYView = getSignalView(centerYRes, \"centery_sig\");\n\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\tconst createBlurBindGroup1 = (inputTex, origTex) => ctx.device.createBindGroup({\n\t\tlayout: tLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: inputTex.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: origTex.createView()\n\t\t\t}\n\t\t]\n\t});\n\tconst isPartial = Boolean(op.partialBlur && op.partialBlur !== \"false\" && op.partialBlur !== 0);\n\tblurData[2] = strengthRes.val;\n\tblurData[3] = Number(op.angle ?? 0);\n\tblurData[4] = sigmaColorRes.val;\n\tblurData[5] = centerXRes.val;\n\tblurData[6] = centerYRes.val;\n\tblurData[7] = radiusRes.val;\n\tblurData[8] = isPartial ? 1 : 0;\n\tblurData[9] = strengthRes.hasStaticSig ? 1 : 0;\n\tblurData[10] = sigmaColorRes.hasStaticSig ? 1 : 0;\n\tblurData[11] = centerXRes.hasStaticSig ? 1 : 0;\n\tblurData[12] = centerYRes.hasStaticSig ? 1 : 0;\n\tblurData[13] = radiusRes.hasStaticSig ? 1 : 0;\n\tblurData[14] = radiusYRes.val;\n\tblurData[15] = op.shape === \"rect\" ? 1 : 0;\n\tlet outTex2;\n\tif (isSeparable) {\n\t\tconst outTex1 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t\ttmpTex,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\toutTex2 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t\ttmpTex,\n\t\t\toutTex1,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tblurData[0] = 1;\n\t\tblurData[1] = 0;\n\t\tblurData[8] = 0;\n\t\tconst hBuffer = ctx.renderer.getTemporaryBuffer(blurData);\n\t\tdrawFullscreenPass(encoder, outTex1.createView(), pipeline, [\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: uLayout,\n\t\t\t\tentries: [{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: hBuffer }\n\t\t\t\t}]\n\t\t\t}),\n\t\t\tcreateBlurBindGroup1(tmpTex, tmpTex),\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: sigLayout,\n\t\t\t\tentries: [\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 0,\n\t\t\t\t\t\tresource: strengthView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 1,\n\t\t\t\t\t\tresource: sigmaColorView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 2,\n\t\t\t\t\t\tresource: centerXView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 3,\n\t\t\t\t\t\tresource: centerYView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 4,\n\t\t\t\t\t\tresource: radiusView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 5,\n\t\t\t\t\t\tresource: sampler\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t})\n\t\t]);\n\t\tblurData[0] = 0;\n\t\tblurData[1] = 1;\n\t\tblurData[8] = isPartial ? 1 : 0;\n\t\tconst vBuffer = ctx.renderer.getTemporaryBuffer(blurData);\n\t\tdrawFullscreenPass(encoder, outTex2.createView(), pipeline, [\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: uLayout,\n\t\t\t\tentries: [{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: vBuffer }\n\t\t\t\t}]\n\t\t\t}),\n\t\t\tcreateBlurBindGroup1(outTex1, tmpTex),\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: sigLayout,\n\t\t\t\tentries: [\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 0,\n\t\t\t\t\t\tresource: strengthView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 1,\n\t\t\t\t\t\tresource: sigmaColorView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 2,\n\t\t\t\t\t\tresource: centerXView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 3,\n\t\t\t\t\t\tresource: centerYView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 4,\n\t\t\t\t\t\tresource: radiusView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 5,\n\t\t\t\t\t\tresource: sampler\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t})\n\t\t]);\n\t} else {\n\t\toutTex2 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t\ttmpTex,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tblurData[0] = 0;\n\t\tblurData[1] = 0;\n\t\tblurData[8] = isPartial ? 1 : 0;\n\t\tconst singleBuffer = ctx.renderer.getTemporaryBuffer(blurData);\n\t\tdrawFullscreenPass(encoder, outTex2.createView(), pipeline, [\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: uLayout,\n\t\t\t\tentries: [{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: singleBuffer }\n\t\t\t\t}]\n\t\t\t}),\n\t\t\tcreateBlurBindGroup1(tmpTex, tmpTex),\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: sigLayout,\n\t\t\t\tentries: [\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 0,\n\t\t\t\t\t\tresource: strengthView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 1,\n\t\t\t\t\t\tresource: sigmaColorView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 2,\n\t\t\t\t\t\tresource: centerXView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 3,\n\t\t\t\t\t\tresource: centerYView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 4,\n\t\t\t\t\t\tresource: radiusView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 5,\n\t\t\t\t\t\tresource: sampler\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t})\n\t\t]);\n\t}\n\tdrawTextureToTarget(args, outTex2, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: BlurWebGPURenderer });\n\n//#endregion\nexport { MAX_BLUR as a, BlurResultSchema as i, BLUR_OUTPUT_TYPE_MAP as n, blurConfig as o, BlurNodeConfigSchema as r, renderers_default as t };\n//# sourceMappingURL=renderers-rcrwEq-B.mjs.map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderer-CEvj79Wg.mjs","names":[],"sources":["../../../nodes/node-blur/dist/renderers-rcrwEq-B.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { ImageResultSchema, VideoResultSchema, configBuilder, unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\nimport { z } from \"zod\";\n\n//#region src/shared/config.ts\nconst MAX_BLUR = 100;\nconst blurConfig = configBuilder().field(\"blurType\", z.enum([\n\t\"Gaussian\",\n\t\"Box\",\n\t\"Median\",\n\t\"Motion\",\n\t\"Bilateral\",\n\t\"Edge-preserving\",\n\t\"Radial\",\n\t\"Zoom\"\n]).default(\"Gaussian\"), {\n\tbindable: false,\n\tlabel: \"Blur Type\"\n}).field(\"strength\", z.number().min(0).max(MAX_BLUR).default(5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Strength Signal\",\n\tdescription: \"The intensity of the blur. 0 = no blur. Can be modulated by a static number or a dynamic signal.\"\n}).field(\"angle\", z.number().int().min(0).max(360).default(0), {\n\tbindable: false,\n\tsignal: true,\n\tlabel: \"Angle\",\n\tdescription: \"Direction of a Motion blur, in degrees.\"\n}).field(\"sigmaColor\", z.number().min(.01).max(1).default(.1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Color Sigma Signal\",\n\tdescription: \"Sigma value for color space in Bilateral / Edge-preserving blurs. Can be modulated by a static number or a dynamic signal.\"\n}).field(\"centerX\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center X Signal\",\n\tdescription: \"The X coordinate of the blur center (0.0 to 1.0). Can be modulated by a static number or a dynamic signal.\"\n}).field(\"centerY\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center Y Signal\",\n\tdescription: \"The Y coordinate of the blur center (0.0 to 1.0). Can be modulated by a static number or a dynamic signal.\"\n}).field(\"partialBlur\", z.boolean().default(false), {\n\tbindable: false,\n\tsignal: true,\n\tlabel: \"Partial Blur\",\n\tdescription: \"Blurs only a specific circular area around center point.\"\n}).field(\"radius\", z.number().min(.01).max(1).default(.3), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Partial Radius Signal\",\n\tdescription: \"Radius of the partial blur region (0.01 to 1.0). Can be modulated by a static number or a dynamic signal.\"\n}).field(\"radiusY\", z.number().min(0).max(1).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Partial Radius Y Signal\",\n\tdescription: \"Vertical radius of the partial blur region (0 to 1.0). 0 reuses the horizontal radius.\"\n}).field(\"shape\", z.enum([\n\t\"ellipse\",\n\t\"circle\",\n\t\"rect\"\n]).default(\"circle\"), {\n\tbindable: false,\n\tlabel: \"Partial Shape\",\n\tdescription: \"Shape of the partial blur region.\"\n}).build();\nconst BlurNodeConfigSchema = blurConfig.schema;\nconst BlurResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst BLUR_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_BLUR_UNIFORMS = `\nstruct BlurUniforms {\n\tdirX : f32,\n\tdirY : f32,\n\tstrength : f32,\n\tangle : f32,\n\n\tsigmaColor : f32,\n\tcenterX : f32,\n\tcenterY : f32,\n\tradius : f32,\n\n\tpartialBlur : f32,\n\thasStrengthSig : f32,\n\thasSigmaColorSig: f32,\n\thasCenterXSig : f32,\n\n\thasCenterYSig : f32,\n\thasRadiusSig : f32,\n\tradiusY : f32,\n\tshape : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : BlurUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(1) @binding(2) var origTex : texture_2d<f32>;\n\n@group(2) @binding(0) var strengthSigTex : texture_2d<f32>;\n@group(2) @binding(1) var sigmaColorSigTex : texture_2d<f32>;\n@group(2) @binding(2) var centerXSigTex : texture_2d<f32>;\n@group(2) @binding(3) var centerYSigTex : texture_2d<f32>;\n@group(2) @binding(4) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(5) var signalSamp : sampler;\n\nfn applyPartialBlur(blurred: vec4<f32>, uv: vec2<f32>, dimensions: vec2<f32>) -> vec4<f32> {\n\tif (u.partialBlur <= 0.5) {\n\t\treturn blurred;\n\t}\n\tlet orig = textureSampleLevel(origTex, samp, uv, 0.0);\n\tvar centerX = u.centerX;\n\tif (u.hasCenterXSig > 0.5) {\n\t\tcenterX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerY = u.centerY;\n\tif (u.hasCenterYSig > 0.5) {\n\t\tcenterY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar radiusX = u.radius;\n\tif (u.hasRadiusSig > 0.5) {\n\t\tradiusX = textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar radiusY = u.radiusY;\n\n\tvar mask = 0.0;\n\tif (radiusY <= 0.0) {\n\t\tlet aspect = dimensions.x / dimensions.y;\n\t\tlet diff = (uv - vec2<f32>(centerX, centerY)) * vec2<f32>(aspect, 1.0);\n\t\tlet dist = length(diff);\n\t\tlet feather = 0.05;\n\t\tmask = 1.0 - smoothstep(radiusX - feather, radiusX + feather, dist);\n\t} else {\n\t\tlet diff = abs(uv - vec2<f32>(centerX, centerY));\n\t\tif (u.shape > 0.5) {\n\t\t\tlet feather = 0.02;\n\t\t\tlet edgeX = 1.0 - smoothstep(radiusX - feather, radiusX + feather, diff.x);\n\t\t\tlet edgeY = 1.0 - smoothstep(radiusY - feather, radiusY + feather, diff.y);\n\t\t\tmask = edgeX * edgeY;\n\t\t} else {\n\t\t\tlet normDist = length(vec2<f32>(diff.x / max(1e-4, radiusX), diff.y / max(1e-4, radiusY)));\n\t\t\tlet feather = 0.08;\n\t\t\tmask = 1.0 - smoothstep(1.0 - feather, 1.0 + feather, normDist);\n\t\t}\n\t}\n\treturn mix(orig, blurred, mask);\n}\n`;\nconst GAUSSIAN_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet c = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar spatial_sigma = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tspatial_sigma = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (spatial_sigma <= 0.0) {\n\t\treturn applyPartialBlur(c, in.uv, dimensions);\n\t}\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet stepScale = max(1.0, spatial_sigma / 20.0);\n\tlet effectiveSigma = spatial_sigma / stepScale;\n\tlet radius = min(i32(ceil(3.0 * effectiveSigma)), 64);\n\t\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\t\n\tvar color = vec4<f32>(0.0);\n\tvar totalWeight = 0.0;\n\n\tfor (var i = -radius; i <= radius; i++) {\n\t\tlet offset = vec2<f32>(f32(i) * stepScale) * direction * texelSize;\n\t\tlet x = f32(i) * stepScale;\n\t\tlet weight = exp(-0.5 * (x / spatial_sigma) * (x / spatial_sigma));\n\t\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0) * weight;\n\t\ttotalWeight += weight;\n\t}\n\n\tlet blurred = color / totalWeight;\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst BOX_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet c = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tlet radius = i32(round(strength));\n\tif (radius <= 0) {\n\t\treturn applyPartialBlur(c, in.uv, dimensions);\n\t}\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\t\n\tvar color = vec4<f32>(0.0);\n\tvar count = 0.0;\n\n\tfor (var i = -radius; i <= radius; i++) {\n\t\tlet offset = vec2<f32>(f32(i)) * direction * texelSize;\n\t\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\tcount += 1.0;\n\t}\n\n\tlet blurred = color / count;\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst MEDIAN_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\nstruct Val {\n\tluma : f32,\n\tcolor : vec4<f32>,\n};\n\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tlet radius = min(i32(round(strength)), 16);\n\tif (radius <= 0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet count = radius * 2 + 1;\n\tlet texelSize = 1.0 / dimensions;\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\n\tvar values : array<Val, 33>;\n\n\tfor (var i = 0; i < 33; i++) {\n\t\tif (i >= count) { break; }\n\t\tlet offset = vec2<f32>(f32(i - radius)) * direction * texelSize;\n\t\tlet col = textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\tvalues[i] = Val(dot(col.rgb, vec3<f32>(0.299, 0.587, 0.114)), col);\n\t}\n\n\t// Selection sort\n\tfor (var i = 0; i < 33; i++) {\n\t\tif (i >= count - 1) { break; }\n\t\tvar minIdx = i;\n\t\tfor (var j = 0; j < 33; j++) {\n\t\t\tif (j <= i) { continue; }\n\t\t\tif (j >= count) { break; }\n\t\t\tif (values[j].luma < values[minIdx].luma) {\n\t\t\t\tminIdx = j;\n\t\t\t}\n\t\t}\n\t\tif (minIdx != i) {\n\t\t\tlet temp = values[i];\n\t\t\tvalues[i] = values[minIdx];\n\t\t\tvalues[minIdx] = temp;\n\t\t}\n\t}\n\n\tlet medianIdx = count / 2;\n\treturn applyPartialBlur(values[medianIdx].color, in.uv, dimensions);\n}\n`;\nconst MOTION_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet c = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (strength <= 0.0) {\n\t\treturn applyPartialBlur(c, in.uv, dimensions);\n\t}\n\n\tlet PI = 3.14159265359;\n\tlet angleRad = u.angle * PI / 180.0;\n\tlet dir = vec2<f32>(cos(angleRad), sin(angleRad));\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet step = dir * texelSize;\n\n\tlet numSamples = i32(clamp(strength, 1.0, 64.0));\n\tvar color = vec4<f32>(0.0);\n\t\n\tfor (var i = 0; i < 64; i++) {\n\t\tif (i >= numSamples) { break; }\n\t\tlet offset = f32(i - numSamples / 2) * step;\n\t\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t}\n\n\tlet blurred = color / f32(numSamples);\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst BILATERAL_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar spatial_sigma = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tspatial_sigma = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar sigmaColor = u.sigmaColor;\n\tif (u.hasSigmaColorSig > 0.5) {\n\t\tsigmaColor = textureSampleLevel(sigmaColorSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (spatial_sigma <= 0.0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet radius = min(i32(ceil(3.0 * spatial_sigma)), 32);\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\t\n\tvar color = vec4<f32>(0.0);\n\tvar totalWeight = 0.0;\n\n\tfor (var i = -32; i <= 32; i++) {\n\t\tif (i < -radius || i > radius) { continue; }\n\t\tlet offset = vec2<f32>(f32(i)) * direction * texelSize;\n\t\tlet sampleCol = textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\t\n\t\tlet spatialDistSq = f32(i * i);\n\t\tlet spatialWeight = exp(-0.5 * spatialDistSq / (spatial_sigma * spatial_sigma));\n\t\t\n\t\tlet diff = sampleCol - centerCol;\n\t\tlet colorDistSq = dot(diff, diff);\n\t\tlet rangeWeight = exp(-0.5 * colorDistSq / (sigmaColor * sigmaColor));\n\t\t\n\t\tlet weight = spatialWeight * rangeWeight;\n\t\tcolor += sampleCol * weight;\n\t\ttotalWeight += weight;\n\t}\n\n\tvar blurred = centerCol;\n\tif (totalWeight > 0.0) {\n\t\tblurred = color / totalWeight;\n\t}\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst EDGE_PRESERVING_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\t// Map strength (1-10) to radius (1-6)\n\tlet radius = i32(clamp(round(strength * 5.0 / 10.0) + 1.0, 1.0, 6.0));\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tlet texelSize = 1.0 / dimensions;\n\n\tvar m0 = vec3<f32>(0.0); var m1 = vec3<f32>(0.0); var m2 = vec3<f32>(0.0); var m3 = vec3<f32>(0.0);\n\tvar s0 = vec3<f32>(0.0); var s1 = vec3<f32>(0.0); var s2 = vec3<f32>(0.0); var s3 = vec3<f32>(0.0);\n\n\tlet n = f32((radius + 1) * (radius + 1));\n\n\tfor (var j = -6; j <= 6; j++) {\n\t\tif (j < -radius || j > radius) { continue; }\n\t\tfor (var i = -6; i <= 6; i++) {\n\t\t\tif (i < -radius || i > radius) { continue; }\n\t\t\t\n\t\t\tlet c = textureSampleLevel(tex, samp, in.uv + vec2<f32>(f32(i), f32(j)) * texelSize, 0.0).rgb;\n\t\t\t\n\t\t\tif (i <= 0 && j <= 0) {\n\t\t\t\tm0 += c;\n\t\t\t\ts0 += c * c;\n\t\t\t}\n\t\t\tif (i >= 0 && j <= 0) {\n\t\t\t\tm1 += c;\n\t\t\t\ts1 += c * c;\n\t\t\t}\n\t\t\tif (i <= 0 && j >= 0) {\n\t\t\t\tm2 += c;\n\t\t\t\ts2 += c * c;\n\t\t\t}\n\t\t\tif (i >= 0 && j >= 0) {\n\t\t\t\tm3 += c;\n\t\t\t\ts3 += c * c;\n\t\t\t}\n\t\t}\n\t}\n\n\tm0 = m0 / n; s0 = abs(s0 / n - m0 * m0);\n\tm1 = m1 / n; s1 = abs(s1 / n - m1 * m1);\n\tm2 = m2 / n; s2 = abs(s2 / n - m2 * m2);\n\tm3 = m3 / n; s3 = abs(s3 / n - m3 * m3);\n\n\tlet v0 = s0.r + s0.g + s0.b;\n\tlet v1 = s1.r + s1.g + s1.b;\n\tlet v2 = s2.r + s2.g + s2.b;\n\tlet v3 = s3.r + s3.g + s3.b;\n\n\tvar minVar = v0;\n\tvar finalCol = m0;\n\n\tif (v1 < minVar) {\n\t\tminVar = v1;\n\t\tfinalCol = m1;\n\t}\n\tif (v2 < minVar) {\n\t\tminVar = v2;\n\t\tfinalCol = m2;\n\t}\n\tif (v3 < minVar) {\n\t\tminVar = v3;\n\t\tfinalCol = m3;\n\t}\n\n\tlet blurred = vec4<f32>(finalCol, centerCol.a);\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst RADIAL_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerX = u.centerX;\n\tif (u.hasCenterXSig > 0.5) {\n\t\tcenterX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerY = u.centerY;\n\tif (u.hasCenterYSig > 0.5) {\n\t\tcenterY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (strength <= 0.0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet center = vec2<f32>(centerX, centerY);\n\tlet toPixel = in.uv - center;\n\tlet dist = length(toPixel);\n\tif (dist <= 0.0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet dir = vec2<f32>(-toPixel.y, toPixel.x);\n\tlet blurAmount = (strength / 100.0) * 0.1 * dist;\n\n\tlet numSamples = 24;\n\tvar color = vec4<f32>(0.0);\n\tlet step = dir * (blurAmount / f32(numSamples));\n\n\tfor (var i = 0; i < 24; i++) {\n\t\tlet offset = step * f32(i - 12);\n\t\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t}\n\n\tlet blurred = color / 24.0;\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst ZOOM_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerX = u.centerX;\n\tif (u.hasCenterXSig > 0.5) {\n\t\tcenterX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerY = u.centerY;\n\tif (u.hasCenterYSig > 0.5) {\n\t\tcenterY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (strength <= 0.0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet center = vec2<f32>(centerX, centerY);\n\tlet toPixel = in.uv - center;\n\tlet blurAmount = (strength / 100.0) * 0.15;\n\n\tlet numSamples = 24;\n\tvar color = vec4<f32>(0.0);\n\tlet step = toPixel * (blurAmount / f32(numSamples));\n\n\tfor (var i = 0; i < 24; i++) {\n\t\tlet offset = step * f32(i - 12);\n\t\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t}\n\n\tlet blurred = color / 24.0;\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst getDeviceLayouts = perDevice((device) => ({\n\tblurUniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\n\t\t\"texture\",\n\t\t\"sampler\",\n\t\t\"texture\"\n\t]),\n\tsignalTextureLayout: texturesLayout(device, 5),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getBlurResources(device, format, blurType) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `blur_${blurType}_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tlet code = GAUSSIAN_BLUR_SHADER;\n\t\tif (blurType === \"Box\") code = BOX_BLUR_SHADER;\n\t\telse if (blurType === \"Median\") code = MEDIAN_BLUR_SHADER;\n\t\telse if (blurType === \"Motion\") code = MOTION_BLUR_SHADER;\n\t\telse if (blurType === \"Bilateral\") code = BILATERAL_BLUR_SHADER;\n\t\telse if (blurType === \"Edge-preserving\") code = EDGE_PRESERVING_SHADER;\n\t\telse if (blurType === \"Radial\") code = RADIAL_BLUR_SHADER;\n\t\telse if (blurType === \"Zoom\") code = ZOOM_BLUR_SHADER;\n\t\tconst blurModule = device.createShaderModule({\n\t\t\tlabel: `blur_${blurType}_${format}.wgsl`,\n\t\t\tcode\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `BlurPipeline_${blurType}_${format}`,\n\t\t\tmodule: blurModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.blurUniformLayout,\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\tblurPipeline: pipeline,\n\t\tblurUniformLayout: layouts.blurUniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst BlurWebGPURenderer = 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 !== \"Blur\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst blurData = new Float32Array(16);\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst dpiScale = width / (props.containerWidth ?? ctx.surface.width / (typeof window !== \"undefined\" ? window.devicePixelRatio : 1));\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"blur_node\";\n\tconst resolveBindable = (configKey, defaultValue, minVal, maxVal, scaleByDpi = false) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && (input.outputItem?.type === \"Signal\" || input.outputItem?.type === \"Numeric\"));\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = defaultValue;\n\t\tlet hasStaticSig = false;\n\t\tlet gpuTextureView;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") {\n\t\t\tconst rawVal = Number(input.outputItem.data ?? defaultValue);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, rawVal));\n\t\t\tif (scaleByDpi) val *= dpiScale;\n\t\t} else {\n\t\t\tconst unwrapped = unwrapFrameParam(op[configKey], compositionFrame, fps);\n\t\t\tif (unwrapped.gpuTextureView) {\n\t\t\t\tgpuTextureView = unwrapped.gpuTextureView;\n\t\t\t\thasStaticSig = true;\n\t\t\t}\n\t\t\tconst rawVal = unwrapped.value;\n\t\t\tconst numVal = Number(rawVal ?? defaultValue);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, isNaN(numVal) ? defaultValue : numVal));\n\t\t\tif (scaleByDpi) val *= dpiScale;\n\t\t}\n\t\telse if (sd) {\n\t\t\tconst rawVal = Number(sd.offset ?? 0);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, rawVal));\n\t\t\tif (scaleByDpi) val *= dpiScale;\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd,\n\t\t\tgpuTextureView\n\t\t};\n\t};\n\tconst strengthRes = resolveBindable(\"strength\", 5, 0, MAX_BLUR, true);\n\tconst sigmaColorRes = resolveBindable(\"sigmaColor\", .1, .01, 1, false);\n\tconst centerXRes = resolveBindable(\"centerX\", .5, 0, 1, false);\n\tconst centerYRes = resolveBindable(\"centerY\", .5, 0, 1, false);\n\tconst radiusRes = resolveBindable(\"radius\", .3, .001, 1, false);\n\tconst radiusYRes = resolveBindable(\"radiusY\", 0, 0, 1, false);\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst blurType = op.blurType ?? \"Gaussian\";\n\tconst isSeparable = blurType === \"Gaussian\" || blurType === \"Box\" || blurType === \"Median\" || blurType === \"Bilateral\";\n\tconst { blurPipeline: pipeline, blurUniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getBlurResources(ctx.device, ctx.renderer.format, blurType);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tfor (const bindableRes of [\n\t\tstrengthRes,\n\t\tsigmaColorRes,\n\t\tcenterXRes,\n\t\tcenterYRes,\n\t\tradiusRes\n\t]) if (bindableRes.hasStaticSig && bindableRes.sd) await signalRegistry.ensureAudioSourcesExtracted(ctx.device, bindableRes.sd, fps, props.renderId);\n\tconst signalContext = {\n\t\targs,\n\t\twidth,\n\t\theight,\n\t\tframe,\n\t\tfps,\n\t\telapsedSeconds,\n\t\tdurationSeconds\n\t};\n\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\tconst strengthView = getSignalView(strengthRes, \"strength_sig\");\n\tconst sigmaColorView = getSignalView(sigmaColorRes, \"sigmacolor_sig\");\n\tconst centerXView = getSignalView(centerXRes, \"centerx_sig\");\n\tconst centerYView = getSignalView(centerYRes, \"centery_sig\");\n\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\tconst createBlurBindGroup1 = (inputTex, origTex) => ctx.device.createBindGroup({\n\t\tlayout: tLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: inputTex.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: origTex.createView()\n\t\t\t}\n\t\t]\n\t});\n\tconst isPartial = Boolean(op.partialBlur && op.partialBlur !== \"false\" && op.partialBlur !== 0);\n\tblurData[2] = strengthRes.val;\n\tblurData[3] = Number(op.angle ?? 0);\n\tblurData[4] = sigmaColorRes.val;\n\tblurData[5] = centerXRes.val;\n\tblurData[6] = centerYRes.val;\n\tblurData[7] = radiusRes.val;\n\tblurData[8] = isPartial ? 1 : 0;\n\tblurData[9] = strengthRes.hasStaticSig ? 1 : 0;\n\tblurData[10] = sigmaColorRes.hasStaticSig ? 1 : 0;\n\tblurData[11] = centerXRes.hasStaticSig ? 1 : 0;\n\tblurData[12] = centerYRes.hasStaticSig ? 1 : 0;\n\tblurData[13] = radiusRes.hasStaticSig ? 1 : 0;\n\tblurData[14] = radiusYRes.val;\n\tblurData[15] = op.shape === \"rect\" ? 1 : 0;\n\tlet outTex2;\n\tif (isSeparable) {\n\t\tconst outTex1 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t\ttmpTex,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\toutTex2 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t\ttmpTex,\n\t\t\toutTex1,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tblurData[0] = 1;\n\t\tblurData[1] = 0;\n\t\tblurData[8] = 0;\n\t\tconst hBuffer = ctx.renderer.getTemporaryBuffer(blurData);\n\t\tdrawFullscreenPass(encoder, outTex1.createView(), pipeline, [\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: uLayout,\n\t\t\t\tentries: [{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: hBuffer }\n\t\t\t\t}]\n\t\t\t}),\n\t\t\tcreateBlurBindGroup1(tmpTex, tmpTex),\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: sigLayout,\n\t\t\t\tentries: [\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 0,\n\t\t\t\t\t\tresource: strengthView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 1,\n\t\t\t\t\t\tresource: sigmaColorView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 2,\n\t\t\t\t\t\tresource: centerXView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 3,\n\t\t\t\t\t\tresource: centerYView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 4,\n\t\t\t\t\t\tresource: radiusView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 5,\n\t\t\t\t\t\tresource: sampler\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t})\n\t\t]);\n\t\tblurData[0] = 0;\n\t\tblurData[1] = 1;\n\t\tblurData[8] = isPartial ? 1 : 0;\n\t\tconst vBuffer = ctx.renderer.getTemporaryBuffer(blurData);\n\t\tdrawFullscreenPass(encoder, outTex2.createView(), pipeline, [\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: uLayout,\n\t\t\t\tentries: [{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: vBuffer }\n\t\t\t\t}]\n\t\t\t}),\n\t\t\tcreateBlurBindGroup1(outTex1, tmpTex),\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: sigLayout,\n\t\t\t\tentries: [\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 0,\n\t\t\t\t\t\tresource: strengthView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 1,\n\t\t\t\t\t\tresource: sigmaColorView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 2,\n\t\t\t\t\t\tresource: centerXView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 3,\n\t\t\t\t\t\tresource: centerYView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 4,\n\t\t\t\t\t\tresource: radiusView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 5,\n\t\t\t\t\t\tresource: sampler\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t})\n\t\t]);\n\t} else {\n\t\toutTex2 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t\ttmpTex,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tblurData[0] = 0;\n\t\tblurData[1] = 0;\n\t\tblurData[8] = isPartial ? 1 : 0;\n\t\tconst singleBuffer = ctx.renderer.getTemporaryBuffer(blurData);\n\t\tdrawFullscreenPass(encoder, outTex2.createView(), pipeline, [\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: uLayout,\n\t\t\t\tentries: [{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: singleBuffer }\n\t\t\t\t}]\n\t\t\t}),\n\t\t\tcreateBlurBindGroup1(tmpTex, tmpTex),\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: sigLayout,\n\t\t\t\tentries: [\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 0,\n\t\t\t\t\t\tresource: strengthView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 1,\n\t\t\t\t\t\tresource: sigmaColorView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 2,\n\t\t\t\t\t\tresource: centerXView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 3,\n\t\t\t\t\t\tresource: centerYView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 4,\n\t\t\t\t\t\tresource: radiusView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 5,\n\t\t\t\t\t\tresource: sampler\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t})\n\t\t]);\n\t}\n\tdrawTextureToTarget(args, outTex2, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: BlurWebGPURenderer });\n\n//#endregion\nexport { MAX_BLUR as a, BlurResultSchema as i, BLUR_OUTPUT_TYPE_MAP as n, blurConfig as o, BlurNodeConfigSchema as r, renderers_default as t };\n//# sourceMappingURL=renderers-rcrwEq-B.mjs.map"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { c as resolveSignalField, n as defineRenderer } from "./renderer-BgmO1Dzw.mjs";
|
|
2
|
-
import { In as signalRegistry, q 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 { In as signalRegistry, q as parseColor } from "./dist-cC6nOaMR.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-CrQADlcf.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-CFSh2eG-.mjs.map
|