From 6bb68704aa6b4d8dfb0dea87b7d7157e8fb5b79b Mon Sep 17 00:00:00 2001 From: takuma-hmng8 Date: Tue, 27 Feb 2024 15:18:02 +0900 Subject: [PATCH] type modification --- app/apple-icon.jpg | Bin 0 -> 194713 bytes app/gradation/Playground.tsx | 21 ++++++++++-------- .../use-shader-fx/build/use-shader-fx.js.map | 2 +- .../build/use-shader-fx.umd.cjs.map | 2 +- packages/use-shader-fx/package-lock.json | 4 ++-- packages/use-shader-fx/package.json | 2 +- .../src/fxs/interactions/useBrush/index.ts | 7 ++++-- .../src/fxs/interactions/useBrush/useMesh.ts | 2 +- .../src/fxs/interactions/useFluid/index.ts | 7 ++++-- .../useFluid/materials/useSplatMaterial.ts | 2 +- .../fxs/interactions/useBrush/index.d.ts | 2 +- .../fxs/interactions/useBrush/useMesh.d.ts | 2 +- .../fxs/interactions/useFluid/index.d.ts | 2 +- .../useFluid/materials/useSplatMaterial.d.ts | 2 +- 14 files changed, 33 insertions(+), 24 deletions(-) create mode 100644 app/apple-icon.jpg diff --git a/app/apple-icon.jpg b/app/apple-icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6df009c36ae30d9734cfdaa6a9827ca1a40e506f GIT binary patch literal 194713 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 x{HkA`$h(UM@dlzf%2disU%{muU0z%zrI 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�-ltiO%j*4|-X&;k`4nW%Z`y3HWNj4!z0mi8k98dTZ!m78|9=v$) zLcIK%=CvNGhYhr18r(JO&_`CtS7Co)hEDKbjZnF_wOwyRZ*X+^ zyvTC!j5pS!V|8PbVmK@D(y^i$m^%iAtpA;Iza|7UPS-EeG(rpA<{rxCe~U0u;vv)^ z_l}j`*H5fh?|mE}*MB>4n;=bomsF6+`YZYy%Ixlg?whb?Nvg>8wV@+!z^n44oUe%0 zTLMOFDOTARMzFN3Y+QC1$?;{C=lSUjmko0-Q^w(VlB=f?>;$xd8YVfG7g<}(YVc&` zxlRf(eecb?XhejU(m4`W`A3fp^sXsJ*At_rY=R{wo%^t=B`kwxKs**1=tocJ68`h^09Qk3(- zn;IhDF$A+T5-og`2QJN(v#;$*Jt?+%w?4diQF)>{bQ6k*pw0wT zJS76y^{1H91$QwCMWM6GsH0sAXlYs1f`P7$rFt4arb++?e z(lt=aY1jF3;zDhG{yl+CTghOHRK|PkJ}k-Z8NiW8alUSvTy?G^V!v!`+uMyQ>S$nN7`I4iJ z$$h&NLzkvm6k-*R68^ZU;8lfux9du`G$-5@=C*D+L+~DD7pVM{FrG{6prc@JW$ykr z`0RHMApD}s?)Z@Hrv%+O4L4IXJ&mgifpm>R9FZymJ<{KHu(`p+B-90&ALOFp@Ye{ zwKE#zrWr(tyjKz;8!qlD<>XX$75Z*p8%sH|?|zS9^(7`+4`tVN1{%W0%X+W{XVVUp zDXp@TFollDvCsOVoBGdvzfNV=lg+?C)3FV{`@>e3RU4OXGFlMtX34|pV-8YReCWMk z!P9C|SPO}}WA5{EVoZ(vK#_?_^RUQa7z?^1PUmS-@2{S<#%wd!=uHJpS^qy110*Gj z%F>c2se=VvkWQszipdV6gEO9xPVDpAs5O)fpbd!VM;Ohq=hgj7MDwc(q`DW!&jdBs zPM*R^+!uy9W{?cp+?SwD?p0^b?>XOQvz;RBXKo+PZE+b;rpYCRQWxZuz4I2wNrbdA zEy^IVK7Y}HFaIZs;XkU3o>@uqV+%v;C*iGj5{(v@aMM=3sZrlJm>$eURGlp&6{`ek zm=L9DtmyxALphx*{3DIW0nGm#|wXM*Oyd>Zuy+C>J}{vLYQXbSNsfraoa=~rR*9|NaG!b2v74h>gTKz zxTtOciW8+^d-(#d2RX*)&xOWxtX=VuX?)lKe&diHB~$%mFvToZ;BZhg9~QewKwXvl zPxvL+C-11UhxyS^Nx!`D{VBx{OX>k+kV_dDqG@7t)da+~%|L?&Tl{|R){R$wLtg(3 zDR&w5iyy6ns#Zo{u8L^sC&WICbL+_~JFgB=-$*+V8@dav*=rG12v?*b!QKetCvN;T zX=^RzLYL?goo5dNaa9L90f!#7u{x@oIR%YnRTQH8pUbzWH+3a!K-l`N^H;ITHUu6H1%WO1PHH0`o|1P}7@*6T>F@4;hrn zhR@O#3UtMb3>n{Mr1%EoBdQt-!r()VZefnQw}b6Z0~WNyXu$Q>5my5Ker@tfDFn|} z*Q!LecW9RUoTr7{`b+ncy&dXcW}MKDoAH8dumJ1!VbT-%MYoqj><(Wsh)+ABlI;_w z(Pt#Nk9E`DPPc;oME}v`Ni!sGv9f-A8yZGyHe|wrbZ4q3^SNOhDWvWD1qC(eI z5ZiyWQA7%ZQn)h(i)9$4tR+3VEqTQm^AyxrR6o1thdhHe+*2mUB@KtSzte7c!Q#*7 zj5`9nlqTT!kL!wHPHic4#{g#@9#ZnS-;-o z$H5qf9NSAN0F{>3feUzjw==7Wv$MnlC0J~3n!YJiRm(KcV{8yZ8NvImRi=gcS<-1H zE)%nppMW;B+%33VDtbrEr%FV|2U~(S!duI^-)n~Zv&j|uLlV1sfL&w$TITiOPGeNa zkx5PBY>2ee=XC#q)DI!~9M?3LHwnWJd2T0?sQKTv}tPs5c~Or8s!t zxG~;dEb9}h#T0~(e1eMGv_$p_rP?);&`!^Rkk4hjxL@8>h%OU}P0tg6rXAFnDnQ2zJD4R!mf- z=LH;InrPz;Z}qceA)q#m?imh^ zHSEYl?(&Vrc}3L2kvO($yiZVA8%Ik0W<~GR&;X3_`zHy-5ZN1ub^60eCm)8a5u#IW z&G^L-<6}fHI_%HlI-n+mw3`H_>r?dF7zp}~t3SKq2v{}o)wB8*d>EE1>G0tVs|R#p z8DWRqV_xtKkeb!xW|KdmsNnW=*|eM}FL|^7GpP)lcq4!H@1-+Ci7Sok=w;Z@s>b@` z|0iI}cdf5$;BVLvR_{M5ARmh_IQ0NOmtJ$8nsej1_g}r{=Nv8THS*awQVF^#&`L-pd&bH4lv zDM}PXy$M-re$?T!q%a>NG5bSls?aLRd2s?XyPU0ITUk?HlQHH9eerF0kgf7eI;dlG zAAz$K_u(n8t-c!g3`Mw9V}v%R4%9N;j+<~KSR3 z7OzldrU1sY&WAM9H#=)wF+rMyCPXjfD2R?$E4GpK1}{kdMxgy8km~jLq&yem%SHXy z685Prj;^a2%{;-@*|xm=mx0wX(la*90|G8&Rn>Xj`OlZsX`iAsV{&MWJuehZm{0<6 z{@{$Z?!>v_oJM=-)qB77834omMOUXX6Eo;S>FD1I>Rmq z@6?Z+*OX5Fk4m)VVqIeK0xyIZbCJlB58K~I;+}~ejh0!9^WpbGU$cG z9WIxt)6Z@zr}FPyjvr%J&pG4-N=yO-DZ8bq>9P#-p+6PboLSNpg9}Lsto!kuBl2D+ z8j2d6fC#??23q+N=Nc2gUBBXk$$^O!AKlGacgF^Er!5FZGE9w>U7lwlJeL(DoSR(# zI_Bg_k)nw3T1*R|zDC6nd8%n0=U+0d%`Eip z@1M-X-CTXy0k@1aQ^J6sj_GBtY{EU!$Y=5LUPW#ucRKgA2xaCQHQ1VZj{B6`9iN~V z6Dpdf2bGw0J|TK|_K64i!P0A_$pzVnF{z(Z1sero?1wcB1PEl(frfe;n`3)0=46ano^VZDZdKD=N|Rrp8x~j z`o|uOHDCh$u4*c+3I@`WavCz-?i?VZ|7uVUr=+PiB537q6ukMeVOV^bA}>Wx;qhNq zU!{-#5<5Xr6% z+`aY`tu3k#PCD(Kn|GA`@)u;gpQT|vEc`c(NUtnd85NO2M6l|a(%_22j|(-k*m&pB z6h5_|KK#A9M(YoVeLQ35mZB|3u8O3N680~2+cb#39Fbvd^R0I3IA*pTF5 zbCnHcN|4Ij{j)XotJ>bXWfu<1mqzB1FUARMlC40o?*2El@dE!88m(&eG`tAM08?M^ z?2OdUU6PUX-`cc-GZa)oeZH89LnZ3kVJ_%JuO5~Cb@7C@g1#NOveP9)Ylb*n)--u+ zkU9$HY7UtXsrjcZqq{3xp53eVu>1J;5YD@`dSuM(Oc+ojR;1RGpPg}zY0uxIqImic z30G5H3)CFn2YlZCbeRkBJM*1FB#4?kz2x|dSwH`NNAoO#*lDsx(Ss{dCugumS+GZQ>6{@KGV$Y5?~tjIx4HbQ9pbT-%81Sxaxr z-SsQg$x;W`f3N-V^k2s(c2RRCn+`ULx;gb@E<;%|g6{Q*Sh}y{M=vcdqpCD~hNh6m z{dfZL&}fnP5_h(b$;M%^7m@(z zvUrE%Y42ogb+I;`oRk(U8OnKY!E?%3zL)&LMmDle59>By1Gt2hk%%YLnzamvkRgm}x03x2##QF(=pYn6_~Uh4>x--vD3%Ejr4+vc*s0bS#60Ennev z8$jy>>A<;?1tit!?PV)=d-=pj?|AFB^K`I*hSD^O>zJe>(O>KVK+1tFayi6(1@c@k zwA%qv>hzgw#$uX5a<*G4j4@V+0!qG!YQik+BJt2V+W)64wBSZ${~BVPA^Eqh{lqK9 zu|B=@vyJ^-$T?3MS!1I~e)#8JV#3RjBl0s~kiJim`8xuNk~)o5VOzRY@5UK_v%R0~ z;k&zWEAD;eRveB2v{GwktRz`2I0)7@oHBd20oz-o?3X@Ya~wif)#fD2YAI(^DLYc6 z!vzmSVD&+AUS{N)S!_88OH@DybMHy5R%6>5ejE)wo_ohT+Lq@r=}dh7xE&_kSnP&M zWsEh5coole@K^`+7JEn?4dCyb8sN2#T+@@geg69mf<}c%9bn?z?j9{gp{aW|(3u;=-CovS8dUS< zuH2c;w=mx?byQBDVLD+d3;ROs*7SOJ-@Y1yrOX5r>&_2IBQTR!p#IZjnZe@0G8-t| zyrKBL+tb`JP=Up-exX6H| zmoNoIzqcZy`umrAYuGVA?4ua+(q=ygbj|GToRG~+zubMu`|%0xe(-e}dy zj|YRA-jCf3bVx`mobS4BUI7?+s3jOY+y)DtAl!Y|vLMYAtpa^$-qP>&&uxoLw1EU< zTQv5vih`%T(l{?oi}EVnLCb#FJ9dn0WIUACw= zjC|5@QeGVx5AqU3Q&6#JJ^kv+3Vg+%mWCwXXvfFlJ@Ero(ACN1HS)h@w+W{k>u34g zWx=i*vl~o78H#BQm(C%VR4`XxE-n)rw*2f_;^sO0j>@`~l^VV33yIK@F_js=q zKLrVWvbX!qW>kx?nGuRDQ1NqD{NcRf+?puj0Js0f47!{9DOy#?XggRupvf;%zetbm z>+0$$>&j^IE@pP!Ro8j%O8tkS_j-7nVG*;XRu-RX!K@T}vtR#Z_-W7HjbppZGG#l_ zuUGdkk%tugX@^ss7O5s_uSwBT#QRdEBb$wSFs=25K78jzT_fJjM}hgH>Pp0_lj-6e zJEJi4qMKMwEXsr$l(%8K3NAKG_Mk`!EEZNnO}M7P;PX)9j$q~=AH)nD;_qsse(X{5MT@nN@tm_OkHxdb=RVW~gX}%G99uT)a*JCD&4#cC-%& z^j$e$Ax(V#9(b^os5jD-kOAgGx{K;mT{SrkPGq>JQqm`st_-K}mHl8?WP<;SM}qkG zyMSfoEI&N(tN~&CN+-B!|Jv?&ja)ZDClBh~r8jhO8B+1q0_N&s0)T~VFyH;(egFS6 z%6m$+N^ZM2{`X!;Gu_5Nv)*TnFE~Aux|e-#Yf|56{)bL4bgga+!qJDys*+!>KVy$s z#*@DQ8K_lftv~S~CssE4!t}s{~rq$2R&tD{mKFSyoXAoYrulQO5XQ+&u0| zop{Es8P{*gntOxU0B+iuuRsqeer1W)(G01{9DX%c4PqB1+k_I7xK4YPTvbePO>iNk z_>}33YtOOwjX70SX~J)DA>15gdBLEI8_Yj!E1@4rwLN5){o$>hHcL*X?KSf4%`d2^wvmX|53$Sf8Lkd zv5dq3jm3x^eWvqnmJJx??D}lsQfHae-BnF@Ax}ZckfOUjsge=lqI(~W9S0Y)x_qhV zPnhn9up}8o{ztXLL5QoKBU82-?RK7MG=#S*an-$HG(7%6byQ+n z%QSM7^X;Sk#=EZglOQkT9FIBj$9ae&wM>z&Hmnq4SdCHxu30Z4b=b$1Zpbeb%XSYI z|GQxnJYJ$DnyNc-vVc|3wl?3S3=R1Y&^@iQst0dRIm^WK6GFGB^mvnDp_sezZA(>9 z1P?mUYxr#c#0vZ|R42oJvcJYF-o@`{rhai+{k%@ov*2xSf=s$c`HvNw*9!+wuZh!d zLrO7w$6!O<0bxr_h|=;JL=z?G9pt{!P(wa)vM%;V8tlQLe)aZ4u7OM+;m^1vlA`6h z0ZB;_1v%7Ql*6|aHs;nR@funZ1||k^z)ya_O3*8OJzj-{p4Ex@cQs$HWL#V&bZG|x z@-v7V^9@xkyi)M*T2e44oMKJ0$;Q=j+v5{Yh#u0}#dg!bZUR%sg}2$#2KWG-->ZU3 z_7U#aSL%d6>MHQHyl*vZH-cNJvOHRay7XWLQYSQVAfSowW|;aXYYwLXl#sMO!q&;E z^r`bgxv_m6h33Q}>D!QE3`<3$)_xMeS!$Ma)U#B~F3U#M5V-o&Gs074* zjh*LYYf1Hfe+Lu2c+NqvusYl5n_3j8Ppe!F9Ux=0L6=I)M{Y8ZmkWey?pIs3d;4F& ztKKQccNGPvr)D>GsI_gE48X73a1nxM)7d%$djI(PVTgg5op<<`j z)9*RK_=yhDy8(+2cq`4#E+-D~7{iXv)ykZqp=W+T0vQdgsaufm{8}zq)-T3Id{z!k znr2!@+|Qoz6x{kXIpmxh;O&l8S%>IXZ)561tgUbfEIaL;+iFx)9ua}ib>4`k*+5^6 z6&$iZh4cB3N-6DPNZuRa3-YU&zUYOxczr?U@P^B?2VN?cm>J_8DD+m?nZ=J09iqcr z=UDU)d(ImXZ{%3nXYPB_dQE=85$ETbC)ZJbZ5+MS+c9Q?Drib^iTy@8L7n8xzUaKZgqonEHs)jmbw> z)e}V|5y>3>-x%MCL`d`C&TNyDq<}-h&eZRXnfu;KXUm+;*c|3^tr?H>E(A#j+E{W z7{8Tx`kMokZ-Qcj_J_$e2N2&ao&6tG$k2##mtit zS`>_I+A;`Lw4sL+UCq_~wx!}nS< z*u?3K3|3vzffc6oc*M+Tqp;4EZ4p9`F9t4wF{EB zAlt6_p zus**!IgtCOpVqm>xlkrgza&`HMzb?HO{k<-Y191g6&|k>T%{DTXA-fJY2VM~plW#{ z`5+FtG@Y12B|e%Q;nfK_KpcEU-CWeQXdJ01pdJu}K#n%bGX5scoSL*DURlbY78dOj zti~%VrevHoH&#mymE!(*Hx$COh2;m*;V}evnkBxgk7q(1pGAUetnR#ke}WvawmqXs zKAx=a6`p+?2Va{H>%usuli8`Mk3h=6zP&!!y;L9KPjf*9w{uL=#NYAb8owsjm9vK& z>EQYi6b4hWS2nQ}LkY_L%PQp?T9uNOqMh<*EYZzD>+!U||y zMDkFmxgnDZ>j|&^K`*JV?St9unQ4GJ8z!`o@u)dA=;EYqQ~BP-jis&ps|i8jQjx`o zDDE^adb#IBxf{F*vNO83f+rr6fMyi;ntkLlKdNuQduMystzPuhtspmPuf_(b3@R>G zlk{6z_0=x8kUN&4loOYmV_4!7s&gQq==3m~mx{QtyiUev8bb6b*P`DWCyca&jMPf) z2RJ>n*;?Z46EW*D!dL3$S}W~_!Eyb*uh-vtZ{m&lrNI1Mx~Y0SZq<0NzW=D)+&>4( z5OWq4wU;q%@htONm-)e*`BL-k?zG_8KW(JA*Of665Q1A43%V*)dc;OO`^@$63-lDl z*5SB0$D4fa*H$J4%@V>&l+ZaCroIyB)!Iwb7}#~fmtQn2ImJlk(4=Qu>bi>f0aI+J zJ%I4hKxNB|(lA-WZ;#bAO+LnIX_V5`OCTh~0MR!ewk#A4y%jvaO(VjOHkh^)hU7P9 zT{#`-fVCtlbz~b}jb&6;)`tMc$=mO}4(ym(Y>wnuDW0W#NSUB&)5*ks`H=oB26=Yh z_H{S&)_Ew$`bcRHPNex|4)-_SqCETA+5cY-l41|MmGYtG{ytUrdNvZn_8*n}gQ6a8 zCtQZ=*IGw5S!(7kgEw9K6qzlG+sExho)2d^Z+Falb%#ur{)=Q*lAjL-o+jB*F62(= z%_-j4>dD=gk0&>;xOx3z4$Xf0P6@qPO4F~48rN7cH~o-gs>{&KM^aXf)`ZuK!OQ)p zTahAr`IrF(DN6t6Wb8!Qd~fsIQhx{g{`R&-5CleD|bDx{U7zx?f> zu}wCbPUH)m#hXw70-Em0wy)MOl=hCq_&V^r28h@H` zuz}4vvm}9B?Q}CBXk+ejO(UkCKg5!fm0u-2ce<1R_O-F2L9sM~N^ry9>Zy3IcpIT1 zu3GC`0llI~=57rJLJZ1oa*8ba0xbXu#A0{GN@s#D&&_w0)W?J0VK^%rF$Z=c9V$0! zp`Le#tWLKTm92g|3_gn0VyqYzBut|-FOrow7~`RiqdVgpHN;DqOJ`4st%tqltX_W* z2Y(RD7}l$ht?6i5ea%;8WI;DFh42dm#Qqo)arfQ4lnSJLH2?8oI)p z*cvVSkto|Ww{T?ehG-QfZ?tz9f`Yt)kAh6xeNMTct+dZa0-q;bVS*u1aQ#*vjJ2_|Qza^k6j>a;Y=^kkC<{*A=~9E3yE7qmShC8Z98PuJqluipyoS_K#`y4_%A ziMw4i6k?$`rHZzb#ge=fc%KGu$+YQctJcBh%z1w`QXEDg`?mY^=3v%*Qj zaqBIy(X|mCfdHrM22oM3O`nP{>_rp-dbTGDfTf)f9)UpI6;3M{725EcorRJF!2PuXj-Z^MqBPBt9+JD^x{t75Gb-`kX}WX@ z_WJn9&RoE3>&I_nr@bqZBF1t@oXu<{?Io(6SOQ+%wXv~=vR-m-iv=KFe91_zLRfPJ zV%@L}^H{fa<&}-^0}f6Q54O=F7O9!x?;pr2;Z}S?L` zzzviJ1E#yNzM9Ww8WBK}DhO~pGd^sn)C*}G8Wo*%Z%sOlSz?UwUMtVIu&@GgenoR3 zBEe5Sx#nJzzOK9fkdIdu)8RiaUZV2A%6t9JXz&F#MYOmoa5toC=8_}&*9b;AG+x)7 zx4&rA zPwHc8UQM!t<*}^$>(L#sbF}D54iqg&p4p@rgQT3~OCFA-&}+2nB1L5yAUvrFUA=wu zowC7O^m;eK(O+AHR6=`=gmv%+F1ivPIzdgx=b$i=0d_S>1Uw|54KmftC~uB{46Oy0%xm_xo}>5vzXG4uA4_2*;9vuYSbKN zF(v(JLEH!C*|(fk75tjlvE7{sEr4*k z>DBfARNz226PU3%Tn)y!RjozrJoAPv3SUo;jCJjMOe*`+(d}}!VYG0?(N}(u^JA=o zq$5xJI7=%zk=rHqAYM2mODrX+h34tK|=N4kHT{!!=hzCKG0px_}8hxuKw6!#xIe#WP8_PA=xzjn@gV# zxvfxgMi~Z~2JyS&=UaY%j{Qr7{R2~vjcw~J?8x;5hc8ZF;) zKXz_?2Wm`d0d!_=8}xEe<+SAhRi((;X8O8mI5hfa17TY6{BL59q(E>*3Jm`9yrUqj z&f0oQWvFaa2uiP^D)gRVb|0p3f6>I_Ml0-4dKn@^F|{p?=c-ibtCh^hV;+M#6OBKj%h0 z0oKJwicFC6IkKba!^(bT|4{{n zs*UjrjG}&?7*C*xmw`yLi<_r?rKdFW?Q^>SKF3>Y!q$!%J;z71QY+pjg(O~Q=1N_( z{TAF^ATq?7SD6o4JWY=Jbv7<@BNok6{HYXIsp%yv9N>0I49?C5A&Wk#Gxu?J9|TuC zK??Z%6pmUP8qz=fkFtd8{gQ{RQj4zboHT z=UlD~6>rrqGQSsD!ZGV5P@4d0MKq^Azy$ogdWNzOMYgiDEPFH!JxhOI#Ns38q)u}s z@ZD|4*z&S_`^++L46pvv-+ED7lMxxbH#z;z?jFOK_4`Mh7M|#=cI1x;O~CR2U>?dD zpcVmlff+P35QAp((Wvd3KUd$nYvq|t)ibi>AI4Myp^O4!W_%}qXS0zpm=I*^)ie9A zUB`I|vp*B$d;u>I0=xbLwJI-5G~PA8ik*M;mYSxIw2w}A)a;coI-8xz^&P3188U9x zQ9xR3tWE`=xnPaaPuY|3-gVxGzJIknmfGtMT!kJh1aT)d!mAUv$v+3x787OeFZ-+c z8V&Y4(MNh>b&BD6o5q#8hHh3zM=nG(x;n;CGRm~x=y{QfvldfqXS-}&ui%fVN zb25QZ|J-D%E&LqE}1zd4uHF83LapeYnb>6;$AN-MBMG_@JR6bmd$_@VpNn> zlhAxaIL0*y6C0GeA}fUC+YQiAeZ+d-&=5udVuh2&8}BRYmt7d|HN4wXga7MqryXtS z`_AkrUMIoUPUvF^*bQpw;WDqBzS_lAR^FYE>&($B%D)7)3bGdKFHbgQDzo5uM(i9o zFv_%a5%rvdw`z^VlDfe^JaITzvOE_Dk%cD-)=%U1L4FvFk2k@vBabN9KXJOZQ5pz<0>wMa3 zU4OYbN{R23t;Cr?MBv{9xqeC$pEv8iulqJ__StXFE-pzo<9!V(713R)Ha_y)_2pe6 z&4_+U@6y8ZGjh-TfElQ(!>Nv&<~z?N?b!Bqqpy3 z$>pQH<*&;~`#(|OgJrSQC`~P^!+&8b$-ps4UudfG5Qg4ge{U{ub0k0KOXq=6{?82k zECLLK3q0H!=~@f*)I8eQk@y5T^l8MItR(hy_s7ceBD~ix_;}Ml0(oWGQ~tk$I*O^D zP9>U^H1`=j>|kDUBSCx~;e~8j%E|S$a?+7DT+!?$C zehhMU;FGIan_#)R#A@GMe&^#xMApd}$CMJS!~3=sQ~l$p2EIcdGgeF|nW#eL5@OX;uFjUT`JZF%Rzoh$El2Mz+fn6Fdoi5?QJ z97-@72j0|(W76VT=W+frx9p#T>~_M zZrzHs)#UnAYG#Z|`u?Cx@k~uGX7MjT`jJ*FTHmO!F4HsXC&sU)_ZZuT9)vnN2#u+s zd{~O_b~03G$#1xkuR`>`g>s(4U449ieSQSwp~BqzEql!TqM3FMPHv_MoNH)gzx6cv z>|jf#%g!w>g1$-0;ydM^Qi9O$O0$Uj_11fOpH7wc8rrTz_b7SEZvdULFemfZ!_$Q6 zH&WP4;r7irLoMzkwhwAl4ev05R4qKrEKQRCi>~vIX1fpnzP383(pD9vw6%BbO{+JG zikh(%MTyvZw)R#lYTrf>MC{mUji_BSB#4+bg4p~1<&Wo_=Q-y&zrS+wPjZs)=X|g4 zbzQIb`yGFp#-6qe`y@6;Q)|fOZwOQJ>v|YB#hqq84qOHFn;9jKok~ZD&8-Vp{#cVi zS>OJm2c?=F(6PTFBFd}|cGDIMBE6oo9av0WIznes4sec;v*t-*+nG?me_JE0TY2o} z8&hI5-rd>1_Pz2NI-oIRWne8}kcTp3Qdf%sR*uru@n+JP(!L4dn*)0WPBxYH#(pXz zx=^YzU1&vsA`x^lxvxy@;2&6BMt1shn7oeInKKam6`C%*eWQ)_bIJ_;5&a;^djkfD zuoX58mc!XCVDSC^1+NKei6;D#=0zprj`%Dqt>aepNVUx%#?0jym3j0x@Q0ulQbZgd*oi7z3g#hzej|oneLnDgH27e~_UB)* zfCL8$hd;p8tVaGHzC3p(%ttVea7)N_=fTF_L8Obpvd_4NS?Cr@Kj(CVgg6H8J&k7z zC#j6D_hfhR27(2;E1mLRP8fXO?l1q{CYT=O{=`G@KMHc&=y5YlslFRPMUqxR3-(2C zwWEXqq8UNXYc&}i#6rz+y#SD~;n;yw5b(J}J45Oxr_d_Nzkym3HIqa^^SsUhqo7V; zeK6fH*`T$LFxmrbR;G3JW|2u)9{1h7I2F1w#0NZ%{D{5$ki@n}ua!M!PvB9x0oKk*z75(-hbwky>s zY1CR2o^1q?wh%eO>~%* znHP&|b$RAHK)rl=>Q{0g}@((T)r8Xf0X*O#K*4llbTwv|J+-Iz{7eC7@z&7@?v)vJ`l1#z1VCO z?ZC_XIfGt5nN-VQCxpu2^KKm5yk<_CBBxX+a22BqC;L75=ldz&`5fOgSxKbYz8B*l z%fkumvp?`!nhL@{GS$;tjg;o%Q|6+Q$kaX$C}?xj2{#bm==#_XTdb)VDHVAP>q>Zm z>E)YR&48~QZs0fZQDpQHp}<#x>$R<_c+biSIcI*anb%Wgv-INg1-^TY;?CW-DQDBx z8GQ_Djha6K($j#3q8{sHUw3Ii+?eTg*`~Q_7u$n9+M5}y>W|vV&aFHWuvJ+h4PLeW zke!eLrw0d?(jc9m*Kl%`&3tB+82aV@*1dMmC8KeL2W9=>HSFAG3QOCJ?@e3BvR0Lt z)6X92SyA%(-l57%m8K^z?9mDJ4{XrE}t-7Q`PT*dO9gd$vt#8PIEqF zTGrQ~rmH35bGA%&L~NqCvzNE^$Qgy`aF2I2PgQSFIXj%RuSeC*)m7D7vM(t}Nr^eZ zojbkfHv3&gY<78sfzXD=(bb@WSkg=%%^fggvMATwaj95yth3*6jLY}9dcILPDm3{& zio1vgAv1lP?Tawk(i`oi)C1M0-L_0GJQLQF8c*gV6OS8s2f)1z4OrmnEd2V)B{_Gr z94)yi0}xi!3ot#NINySujV&dLY-4B>e#plx^9Q8lD+8KG;UQ@eId$~`m0S4pi}L~o z3yTH({klLr&~C+jTB>d5X6|<;5zdvBuR1kMGUu3Jtu7&$)b>e;*){h^q*y0@x@-!6 z_wtr|^(N#ISN;3c;m4^Dkw9I{WNNVJADd1AMRI|&C;AS|w-U*+xv5d;0IUn{x1 z9W(x~2F-nDJ9XSk-~eLHK&;h2A|I5yK4V^gAJ71e?rKGKz_yQ0rc>iG4j0z3OZ9PC zUJ#3nRc}$_=zABY0}r}{jZP)pT{|o0=^{~!6`hPzN_YGa=Im5K<|j%tQ;2F2Gr+`= zjIWutz`)R}K;{IYCn`pd96)L%uv-b&?5PfC_O89N$H0VNfctdG-y_9+d`cp<4cI z6RPe~k|Z@&&r02aH-7LZ71W}oTI?HE8&*M{0#=u!448I#$$?=vuVJZU@qWL5Eg2C* zV-ldGtd|Ud6oA{ofV)zWvTC^kOT5}%x$6`Cy9cfZigO1)Sy^9C^!(}mIP_(ILDFsK zv9_Y?PSbSuHt|5A;Nu?&!yxVA632F`XDnGyDpu~=>HSNe@VzZl*(={esqOxcrL_jM ztcBG=1Y0~f>omlh0MUu?<`V2s<(|;=j7T#z9acviwV=&6EZMJ?gEK#d@#b=-qPzY{ zEWxk(XPp@q*fQwNf)g0!HP}`KEfvuZH1h!c7wz+qcrD_U`DLFd!IBj!1&{AG&|8pB z*EhrAftc$X8RQ+uB%{ln44A4yl1CGUqL+i!tuPi#O#6D*2rb&{9qOo=vA`Ws$be8_ zmoUod5V6DjAz4wW)rZddXYe01UPS`8*T$!~0!tTAQLS4hhr{nQ@)jqFJPl-I^t1lz zQ%*12bhJ8Gl=vhm1uov6$W< zPYop`j%UTJf8bC%&=_{e$DidX*WeO#kJ!4bVBd?IbV@H<#qa(LT%pb#5`$CMqf!JPz;aVV{;VUr4wbdCo~0)JAkXlpZnptk4-PyE za7&heGH*R?Gm%FIas^K%x3r7j{mDMN)vdLJh((C>B*$ic!p)xQt7>T_)10cUD12Dj zHO{LRJVHHGzZFCVGMkzw8vJSEi2gn?v1iksI&r6ntN7?*)-vJpIgq_^2|;dbH3Oc1>tpSZ zskF~T>z90%`w13DV-4A+@V0{Fb=fMrgzV&QDv4CQy6Xn}8}efn-Na=u0*8ok2vmGZ zQ9nP&OS{Ij8uP;@u_=~2&-kAd*xY?aj+OOAg||bMD}HhXAHxuduwiP6Da`IOM@@jh zd&}WA$IhWEj_#^Vy8I=@YS{`uQw@Npht~V8&uxu3tDX}xy0FeCQwok%bBGu)Sb@EC zQ~G;fRX@MRD{SBMx#OYopLW$xWo*0nKHALJIFP>ZZdhJ8&A{vW4VlQ<7H# z@29H44TI|tEY*N2e_rIY6#w&%8D35bV7Y!0XmfAYg@-x3O#jhaHTZiz&Byh+=^4c8 z4JERudH+YII#nV}>%RO%Lax5{Y{|)ijv=UxfE>w^ig?g;5@SIpPa)$FU(3vWYDL* z^pIDlwi21O;oJpI4#;~bak<`S<+MF%87k#e%Ho$_T{uG=3CE#w%z4txTXHE;=Vm#L z$aL(R^-5K(wL~vdM@@QZA4$28n^=@f*Hgnk_suYQY?EWHcpdPg=OVl=`;Vk_^ z4VoIK#)r|}^b234GZ)-nRE6>W3F{TTF7V^ZAIW!!C|SG8m&z$q0?T&v%bZ}%I|JB% zFUap*DUic8L{p-7-5z_tB!}em;lv3TgB4$aZCiK1sEbO5WN%F4zkx*b6*%zxuB5 z5^B{rok8BQP>>Z~j0SIHto| z4IZKVh1J%Z0SROeu-d_8JM9*y2H@HGF-|)f_l02hBk&+Q!3c7ly>$}YXZ5dCeCY=A z7|HnbFFB#K$9X#^d}S}EfF>`7;I zbBX#ivt%LaJtjosUq z7KJ&fH)KcrUwB6TLf=4$uqO|4#K7dzIdq$L=FF=*fT|NMyPsaq=5$XKYcc4h+ob90 zH5LFt*ADtp(QvNj3yY&(G%$5&n~H<-tB&F~9@$%LrR`sq_a0YGQ5!5FpsA=~auuTu zR-?b2>|;nSEAyNPA(nm2(V;A4q9jS>N1x13%AmQGgRO7dif@Ml3QQA<@}@5qPX40q z9uQ$$>J*FfOW4jFcmOEa7q2>Z$WBE?+pUT58)g}{obj`db+C^Xto8{TT5?-?b{+^2BGi<=W52Gq*cNoYfwjW8-8a>Q_-;$u|JrZ|U!!NboTr zcoo3|U5uM1B1=n!y(;_HzJ2zH7ZhNv!wED|{;q4F{t#kjBOlA8eBNI7d3yuh5S+XG zbbCT?YMy+pTm>wG2|5hG`+7`q-u(I*e0=<|%_#4A4as_=)`fXGoq`@DBP7&e+GuBU zfpYEmj(*h)FRMh%oRiPu<6oRsvQNUsYgjLjK0y3TlZ>DKd)BfZ0jp*!>NwQC-qham z!FCRsu@~9Rfz=rY^~FmUUP;XJ`}flMKGzhI!NQA0T%Tkc>FOOgA7o|zlfAKn*Vn>1 z!;GJDhgrl(RcPE8ymPNu)`n`GGc74o0TfqCR=xo%4pCz1kA0>em`Jny*Z@`4>aMb z^dgjGo*3q!JWpuCqdevivuf4Uoq;)DDn8YWrqO8}CTh;rmyw}t7a`}&cUUh}bT&LY zxY%S;L6jirp8D+$tRk!=-(ch{XtBmbn!>P2Sb#vv)rqPM@cSTToo&#Oj?H)`e2&j{ z13~6pUGj7=`&D%G>X{evulnn>wx~yvm0k&eT2oaQwm$jQgYqKh_A`O>a5rkaW!Gb&v za&yGclGhFH_S{s^djzPFgrmm0rPc1Y=#tB9pCid2WfIFj<1R%O!sv+)u}l&k5f&s` zDQPz6?HOv%q$-0o2v3Bkxv974j~2it5ukxS-p+2s_%@ZTohI~s^`IJ&akewJ^X3Vy z`~!ar6H?sF2riSV^cufXHY0oH)8TIYRHDSZY9-<0E`6m6n8J983gnWIy}kCOry7GT zVdRgixhwG4M83VMf-BLWmi(dJtVo80?#aH1j1T;2e#zDs6(cw``ZlLsc=q3*PVkb_ za{}n&!0SE3?9~X;#CflXG;gO-TcyP4-(3QEP!M`7YDHs)xAb#G=W|ZlHl)gzl6Yc; zj(Fc>P%~r;1hZlPRE^~&aq77lb0nfW2VW6J?*6uWmM-J^JQl7)sEqBsFeYD*3Mvqo z91QgB)Y3c8T}{ptsxWvXvW!gfbP-yF^N)k}H!6aK{rZSENcXR)dM_+46(%q56Luds zqNtTbHjnqa7l%V6_ZvWoE+4Lvx($teaPgpitKXnlO^y5Mp^}qKTRVJJ;bQLOczK`z zdS1pLA{VAPay_D}YpU2Oq;P)uPjRkwnKbYbt3BIvc3wvj#v7qtJul=^ws%I_de^z< znsf;yDB7Sc#7*|rS}OixtMfeCcz0ZC6S;QD@4}b9Mm!|Wp z!rrNGG+qZH1iV`M^jzEn=Bz&Tq%&w`f3a-0D z9+UCmkn0{4B|HdBI#3_Ges!rQ{e4CuyO)sSa)hew_H}n4B-3T2a*cTvnPRnFHkpmC zSD#xqbF#c|-u$%RE=*mj{JLAvYho3usShkL>vd&VM{1>3t})csbXg0?J=yi2j03BT z8U}72;?|CpB2Qz<3n1gGw8l0EjiB4h$#ff0zY53yqaZvdp^jg5rTnz{CJ3%33)E~M zv^zh7@DjVeN_Fl5LSKwD10(B){@GkQ^<~rsdZcBr+C%_zZI(|#n}^CK{o+Fx!ceWv z*-q;EG6oi#*DfX4xG_M`<_@ldZe8TK?y90ekL8Q@rYVO< z%q#oi!KJesr1v2s)=5@!{ZuKIZ+x0n_dE~}JTBQ@p(bJaNeqKI52$)uCzq!son(c5 z8Zj9zA;@sjEjrUAHs*BxzK5xiPN#BY1S>yxub6?Sv28oV!>Lm!+@d*@DATYtnfj(q zTSD*6?!oO(JdXr#jPkg1K5vU3_j%i2k&to0_eyc^V7I)z`D4pYW7YQ$F41h1^Vqa)e@6wmUIligFoNB8TdPpFDO3&xM?bZ!|hq)gs|#1;qt*wj&2T<1aE zr%~jrP+fkl-Bt#$#HIl;grwR-AB!PzOPM8_5B!VGX)gxq{mU=-T4zjjd)1^glw7>G z*ROdO&Q0<);D4v)d zs9IJDG5->3`4G;3gIq-tJMcqNS;|!3rX&%xoDSx zokx_O3lIgo*cJlS>SyeKR4R=VYt-I76f<-D7|vPK&(5o~;b@CyEOM@_t&4$v&~w)qEYl5!mPug8S<=dOKyJl%zMpYj>Ef@5Kc$^G7mU7D1JTlWmC?klm)pBDE#bh2cgZdWbB>6DyGVW&z+msp=-q1FvKe9v$GRs#xiYa*FPTo?QRPu#+^AEpg6bD&e}8m4uwKuScoZsCs?oZuZk6XAl|d5mRE96)!Gd>(88(l{`N7F;a57_+GWa^7GX3K}!e`0UaGA zH9GLuA5ZZcq?hJt=q#kK%;PdnwmKu@AK0(IYpI(&1Rs0O_CFXBS4|W3vy|2&;ssmy zZ-x&nCQvW-5WcKQfUMo!6E(d#%r#$7${Ujnl$gX5iBG6A@aHDy`sRMvh+U`4C@) zOe-kBd-?WIPF>@*z!^e($&>P=wK5{H#M7-O!9m7De4}3>iDGp1A^@ftMJw#7YYqdg zvv=F>{}{_~HqSN0!MNf6o;+OMSnT2c+0_HWOpu0c8MHHp^Ei=HMOyTGne*4XqaMtF ziSQ(!#VFZJoG1)}=@}_~sRD(1dzWT5FKuj(!A2s)>eJSDwQgBuWw** zj@MjfQj7tKbG0c4{}`vUQrvmVLGkbj?Hw7knu1(&RV~@;JQ~W3@Xa6C;GWJrSm^7B zD9h1QXmpo^0z9UrgHXPg>}1C;_2$5T-}~Au7G%21a2}vN)R)iK$In+dG-gZS3wX(E z^%ixJlYi&@p~04@#KX>u0=>(Jd*GeIa{iLXGPiw$5|OF*?!HJkk{Pw6L#?z2=l?DOdZ6pOm*QsyHSCm^H0PpW`)iM3j|IeQx_DXhHPG&9 zeWkAjPRo*;!(>Jsql@*i08d9X5zGN`ee%5Gqe0P1RW-a5Kh?OkuarvK?Nh$7aZNep z1Nm#6wUk+Hmsbg(NO{l%A zQAU;+U6?E%chxeP;#M5(5A3+5bDAZRd?^$dfCZ#272G^s2cX*Cr@nOnDMuYKKXVn< zZ-mS*nc!HmAc_@jadH1qs0N8eexMcMYsY$#o(Rt)>?cjn=JDsK1F~k+MJ6FyA~J2Q z+prE(;*v-F8!AH13a>6)v|{qh{MDMHP9_hcjw*@IHjOPfqf7*=pV15Iu!#LwrRFpj z530K5!9=%9>o=*XJ0%%-g4(zW_>Us@KrcMqGEvElBiXZmnKC4F{cK2 zFLWhj5rhEm5gk^50Ih85OVgjc9`Nt)B!>;}8%N?;;mr%2@}ewxGiUFsDtiYK#(^Eh zF4gCuR^xK7A%=@M4YmEYS&vOJwtLQY)fw`#H}pdM`WG_bpIuL|@-L89TNpe8MApj3 z1|JN!Ftg?6-RgMNvc(cWiU_zD3jvemVeBLwQ zf9I`3TkN`ethGeHyfOoZmy?R(Bqm!0l>3Q(z=YYZD@`^G8c| zLP#dlI$h~cR@H?HkJ>d83IuBXD|7(YO=coi9A~?9kt>Bm@H<7-3j+%QTd2JAzus7eGjSE^ zyK4N16M&(KT9=uu?k}_~OUv`zPf$r=BPcRscEw(DovEC^CYPrz-WO$`KM3;u>uvQg zC|C#+b2wNDGK@BukhlOT8ttezw8k4H$$xn|u95Nx75uz<%im&dUie{Dl;1a?QFeJQ z(ov?Y!WB9XhfWs==d`!hcMr~v9H;4P$YaIogAfLX8-G6gu(6ZCgPTgM;TK{DUqJAu z$5wK(IvI}vgPyEL1C@ek^@yU74Q7rXSvMd$a!|RrR73j};?A&;&2n9^Af~!+`jdM@ zxvj0?Te-ggb6wA1(rq(T!bf0prSZ>l3|V~2e>cUP(@hbGCy?#u7*cV6Cf=FEJN zyb~rc2(cYn2T05>p4sVtspP7d?Q9b|Q8xOu2VqO3Hc8@n1b_?LDZ7UMD%}Lan2~HI zl77G5cC0OJBR~>?qg{wQoB6!$qMJgZ4o!ZCr(+Q5r`z2`y;x3Q($nCSsLU%{fk)5Y zZ<~bNjXzCIqN9NVG%CdOU_)4d&x!4qT~LQq>*RGFS@yg0YAI--lU=Y&CCWPYPaZ4x zE5xhwQd+&_re0~;z$E^G+~P{TR>iiS*5n8!CgVgl`y}Shk#TcJxuAV)6@~Ch;8xF_ z%^klSjqkWHAgze!XPsJiClW+pA<#0Lr78)KJXSr`24BT|W|e=7tK# zt7AokM=SdjmyE5~W6_@`q147Q`_gKXl@sZoE2eVt((Q(-5TKbez;Yip3hwKJb-x~% zfaaS#JGm9)_Wey$oXLr{+fK8+g9C>QrEM~X&+Url0l($Epe6Ui1jRT_(e#4L_Dr7E z)XsQckeTOcGX2tyZI4Wqmq!^J+i!=sN{cliKFugL*0Cgdnp%yK;vC(y@(GR2lI@6m zoN@M{@n82o*!+7tMxaruRQVq*Rygao>LQaWldK{~N(ct{@JH5X6RFqLyOq{8hs!{A zBPKtXlBsrud%A1UYPjKZNOtKovR>(#xqgrAF~=jwo|M*)b(z*geaIJ>VXvVlCcg+C zr}tBD%_pd$#3(a4V{MPP5Yv?A1Wa*Ebbs+cvZvGo{&loPh;lqiC_(K)s_E@V#sr@1 zPo&2%om&9oSbeSc)y6n5>zPXivTc9v02AJB7YU2*BUL+u5ptDmrJWibj;b`vaXytg zcZq)|(pnpynO67tmpVNQj<~5My*xc4*u8yTs}V%k^DrlL?I25%?f9V(~B#wjGo zJEZUTl8n8Z;TOXO)}?i=C)r+`mi$^;c#DFzja9O>-)*XCVqUd&G4#|x8w}jx;c&u z$rjT2O={S*u9d8rsQ0SSkg6^&b|Q^g__Vgk>ddIChnt;lO8WO3?y-j}0GI7Diu_Hn z>sqy1AhXqbr0u}_i7N8F-+bZsS2mb6o3P%tlG9hLlY{}OyL0-J+r^cfwd%<5fR|@pB z$^4qG=UC?#m4WBuJD22YJ$sZa_*3_z<%qDywE$4l!>FUp)uq6HtrZcwK(MDVS^0Ex zaIG$#A{CdJ5tQ`0=Qi#X=)*4TmTqn(7&5-WGch`jFV~c{6BOpp`Q>R-!P_qN5}>s? zmyACl0~5pSz6$_crMUEm@k@=$%X5(|&zDAg_p&*CZhS-c&+7i-Vdjcu^+ zaZ6T!RQdL`do3JyRi)R3QYX*z85VaR9q^)2_hfC)ibrYg_v)7EnJ4YLLt`tcjmV~Q z3n|4{^<E0zeau7abYk21eDti-eT@HGietEU5}_RuQ* z^mO54H`ox;XG{{2a^Y~(?@zt5W2U<=&F8au>h!4!BjW(^9^T4}_n0nTLp@zBjed>B zHIQGl$=>ae%vPD|ZKw&s#OrKu-Ymk`&VMm0wgveGz~~&!#hm5)P;~HXm-}sncM+Q^ zRTfeNOQ}e;rL>jw#|A4U?Ky`ncyx2Y9Z#C#t*j9G*MzxonF^<-#}6=FcIG_pXB z_5pl_afW|A1D`dRMZlEfB(1%s^5aWK;T=liJ%}3zmr13DWd77J>k}#cuT9MvR6vkh z{D#TfiE8LwB1^rKZYn@nX&)$ad(WWt@hsTi!vHOB_lFHo7DA9iFkO%)`sncs+pe;X#R5eAr?+jzQLGxmT6 zTZZLT#nis_=`LqG3$?q2hYNY+2IuBAntjGn@ie8>kxls&@9WA2UkttTp=Oiq`JPv^ zcLS#JH#gq3!V)KX;7rKoK{mCUnGG7|8!Pl&w6og7qyYouOT$2Jq{F^T zU;;EAt-|167@>c)&T+Ci5k8(B%ppYY?s&Ex&|vM#@4B(T@Cy>+_Ky9y6aXFUI^-uBc@-GOqS zA1wCH?v4@s@*p+T(!NL+hV_^o`cKMH@Vf$5m)H$=)mPe+e?Xl3? zYC`@AQ3}Xt=~7^Otd;ZrdiFV9QB(hXu)HLbXU0rfKA22o4%zZqe=5`-p_M9A0wP^N zW&qq7+vuLil0Cdsz50~xcnA2W@xil;3$YQSo~J+?6K|>yZ|FMY2R%lVW9R+Rw}bA+ zFf$0ElPt11I~y}?ID|i^r9ov)x_0dtg$L~{hYRrhADgq?)XsM!EqVaQfi3&=bMtDp~0YggPZ0`V72@n;I^M% z5?ditrw=Y9z;bkS@Vv9&t-4eW2=dhQZ+q)i-#FXtRJ=u`^^f9)xVGj^&BOJpo#-+} z(EiBF$PY~buU!Tz#ilLSOl{wN<+uHnef0Mb4QD~;JST_SZ3UXAR*Tn(etK$+Mq&?V zoxjUai{CMy(SHbgib_ zUv`Uk5y}Uu^s;r$IH%)B^%v_|%{gRe=PkB^$w>&Am(L&kM{#3NGBc`E;Ivdn(q?bH z%QZ%N|3lo@=ulcKQ&lRFpW?&btS=r61$F<_o4F1nd{C|*di`iiP?aU91ZjFm_Wl;i zT+a264ezgiI)CPNlw;~0Uw7TgK9Wh)wv{R%b@v`)#Hgx=5s|{K=4!RF9UXf4#tD4CzSpx0KkdV2<-2AysIn7x+$A0}Ix7gglMPrJP3r$;)Nrf$)NxsUG}`K+0?RU7IR`~`n)V)Jqo1oOu{Gnu8A1FkZy(FX-3`O8 z)6hPUN{fJy6*n;5Ou@8^E4n$?Cr&yfkz?x#2{Ww&7%u1uN%3^gVk#nbvwSlF_g}#o4=1MW3|XMgVxh3hU9Z=Q?|Reqyr+ba9G|k-CmuRhVu#i z=;xTL&Y0du3%%HuJ9Y)`st`-t_A9yemEQhoaJ10uwCJ|weC!_PbH3+)sF0Mg*Am4& zC80TLA#o{hwmx~)CK&W5S$x8RSV_dJhU6u-CDT~c-1>dylkc;*k}96$x9QL7g^*%S ze@W6Z!w>4TogXTesYvSS#_0@_JN&(Q_C@y-%V*ir-l;qvQM^B8coh9uNnhRZNk^Mw z!`8fI%)%G*m{!@O-DDXI1+;Nc9 zM0R>-S~PW(S-7&w1iQ3>4+8So;uWWprAO}?gND}221jL-HiKnl zB+u9%?b+r!nBB`b3W97-1cW@hc9>fYdN;64ed4%-n(UGZOhH7s!78LQm&QnWAQ41A9Ve066*Q4z$yN5z=F#{x#oV~N=KnmFGs^<#&cxw# z$og&fT$@#)yfqD`>?kXhzbU6!)VS4lHghSjv=k>B4viXg6A&8Q7_^_iVwws@I&dbg@w<;X>e5R)gig2cGg09^%yI__TKt+g%iD_}}QKUEu{DnJF0lM=`ti z!;esORK9s&2tskS`Cs29np2U7E9%>pR&+Zu4s4XKhnCRF3_;luWy(!xpFnmuV7YfS@4|E+v-?b zN2E@cr(sb`t|St5yAIg6OP;8n=ilA)Weha!WO8RUQhxBc**3;WErBF4zIHqtB2}`f ziImD;uTRXWT~d0vXBBhJ2CC}=i{ay4`HChFy9Jvjx;fnelqq#zRVw*MDJ#%?hN-HL z(VIDB__lXK4{9nNF*V(fD-PBV4yNlr*r8hze$u1$py2b5_9q0xE<>KX{Is~{sl>^Q zyt8amug>}VP7nQ}E_5b^z&zi^r);KPH19VxPKrdQm~v6Rli@wh=gpIrY;C^==844r zc-xgbj+B_pPB$8L5K@3wbe8>PV^;+tqEjo08(q4Z874?JgTpcgfq7Y;Ayh_zW-^QE zrSiCNyM~~9udh;0>C8qGuNa1r+V~(y!0&SgS@qh6*buZJ>XHSMQ_=} zUyl-eQ4vTc=j}M>Q?64{jAEmd&4JA5qhhrr+xUL5Dn#^ttA^|nN$(f=Np_BN{?ez0%uuJI2Q}@Hq1ND|q zVSTy&1s_LhOoEw#WnCuR;wSfKr<}a_Z9YvTzXImn)_|E*Zh3^VY#x;VA+|sK^H)wb zPFAFZS4y5KnB3z}`Z;v{VyCEnIL zvo4|_Ukwsa2nkS2FmhecdO6Qu?y(tDCfMuN2NQz4cy{vI-vi1I=B>13+v(hz)lyx+ z$DUa+t{;i|DF7Q`MsB$qOXk8@Z^!cC=>*r$^Bo)BmnX!a`-lz5uCGVaurr*#zs~!> zO(l&dlQ(eyCSxP!!9?NT$8Gzqs^hP|<*tP7_`J_XARF>7N!UD3PO{b|2YzIlD6^oS zJIP@O$F(=?Z+|+i=puYhGJb4y$5G|X-|hwKxvWAe-SdF_2eujf)wvyTMOF?6m$)mX zEhfKtbsnffC*0Y*dg7m{nu)9SK8djAvjPf^w%({E*z?P#>}jh9IrAAd=x73t*&_wo$>{ zHqf(OBE!-Wv@s0gnFv|WyL2NjROvbegVgpcB72YzzgWtW?9*HYOmdjH8Yd))DqUFp zPv%!S!$~*fekKeueSg7u%Su!(=tp*goj*U_EII(nWw*<<4q~626cvT1eiG;99lM?_ zB4zwlGapFb9atU)`@@Iuo_+b#=WkS01zwNteJu(0JU#fc7Yr)ODSHYplSYmuzQ_$oU%gUfZ ztD?=m2}#`PcDvdGd|HbdaE!xR)68`ifeQ1x^0V>j#J{kQUctr1x>q(QaUJhDQ9ckj zJ|s`4CP>)l683pZjSNM0sSW z|C%s)rlna~F%c@qlBD^1)frWE)U^*hHb5FedJ9|Etk+)XQTc&`59-vX;i=Pv%kk(o zJ(&uZX28U*Bo`{UAny{9EtkJdeQP_d&y@GsrYn%HS#uSONgU=Gy5Fe~v9MnMPB3ux zvka43<`w1A^Bp4m-=&kLlY@Qb^4BPJ#DnHr6t(%nBqJV%EVGl@J31ntVUATHNb1~? zkEZ+kLVD`Cr_;(&=LzU#mC45YR2-jDOwAEk!k1-LoqY4+m*9U>gGPTGDJ*Y_C8$4s z_aTIy&Pa$yE`1HwFWs8(!~#EbN#8@0`HQ*^1`MljUlz!dOOkM7I`=^9xogaiGUyeh zv#vV0sBaa?5LtReXFqst5I?oordpJQ-6~Xm;b&fM-Td7rm-ddDAHs_9+j*B^vFum{ zq-hrKEjc|uI@;_SU;KTf)FP?Nx;~*AZso73VGyBT4~xna@O9j{?P8z$HyJRN^FHZ% zJXj3-1(`Q{06mpnqBL)pTp2irtYg9c zy`mRcwtV8BZx#L9qjRwE6@fxG?*dqquSc51%XuG%JiaKf+haYm2A_|L*nh<5A{i;*jMG zmXT%k%zwKl>i2iMs$t{rRnRDi?i(ZrH*)0_EFYpi7D|iA{HG;KLynJG@0}fBK~}*d zz_v_w!z$ZdjeYCTNrjqNhV=G@ws||ut{f!Mx`B~Trj91gG1p92bf^BL``r^}Z=X+& zz2&)qeAou~l{iOA3zJ*tbZEJ@Te4&xA{eCJ%g`$p?rjGdz zd5*btl6@G&`S?7s_N9`!=GWCI&tH^ZJpgL5JV<562tv>Vy(xbwn_IHfeta9oVRgL& zzK`t$MThyO;)*qnF-7FQZDlkD_3&TFk{@je4IlS-tjNIo-xMjoep7zGt4L>hg@|kx z^WvaREgY6+vFJMPL|#6&>@4eAn|r6JKr&>t$)CfL`{g3MK3XEr18+DvKK`eX90B#n zM|jEjP-a=CpCci6WnbVZNLW`vQl|BLgJD`LvW)!2QA*PEdE?dCaP8Tx;OFEHGA#Ir zBu)Up_7KNvZ77mZnqz8^U9&WHYHC31{$JFcYt{wF>ldUZxL@C366Lgr{)fGVOd1!5 zNrd-3;tQjcuU3=I^gOV*p_Ya%jcrA5SC7c2!w&kiR>r zNlCUD{9oiA?Ej)_Ly7tX*N79Oihj17Z{`PAJI2+?*^#wuoO?^-F( zujy|Km(jB=+9orrdW&FQ3oY4{b6))r zSPedT$1o>9F3@H_%hmW3_Lh%bGbBiDV(-Krq5pjUkAL6agWuESIC9*_edm3>-}iN$ z=j+VwHIC;azhioNg9AWA#RuGtqk>74AOpVVHqCN@a?nxRZR&jg&%T-BZHuklN`fx1 zf1Dx?h7Po}=7jL%ya=}cxgh`ha6qNRJpaIIYuUIV{36}3u>5BTOOsH8syo*lInjn zne~n##KHSX&NoJ_Rb(tuxo8@M)rL-bZT!|!k?3D*5?iok3RFLx*zH<3eJ!LBXpxZ@ zvx@7c>R&(+V!JF`f=!vuX*ceDh$^7yoUW4^hW``ww0B&iv9?cSy5Z_8+S5F9hWvT8mGvCOB$G-7{I5zc0eR zbYhW0&mU?6w0^B@?zoG`ol>ycv~90>9BD_t?FdSkq|9?RmVG^5LhlwHNlWr~aNW{< zTPuM2D8}0LY%-}?fW!FDmiyNrdDobX7}GmZT9730?5jRfb&Hvjdo6%SkNBrtLC@Zt z(U$S-5B}$d9nJtIs;Ajp6RX|(+xC|2x;Z<_?PqFgSwWk6=gs6d9Dgdr>~B#+e@1u< zn{?FKQqb}}-Dz8(-o6kE3#jtZZQ=@>UC~JU^3X@Aocp&}t!+R`Bim{=Q1PHmG)hNZ zD(y0|5^01M7~>-+yUOsI-lQU-WH-Y++$OHolu}!Athc9R4}S%*{Q@7FUn=98=B9O( z5a{>s{bQ(-WMk&!)O#h#@io`6q9=z;@Lm>D^x*yp%kt!kq0L@!EiaxhbdHU$lwcvo zSv_uYLkzV#dKX0IMg8_E9w944>ClS^@`zjMuG^8;ha*rf>Oa6|9iV)*{m5^tX$Gqe zLZf>C{DLtg@b%7L8r^1vB&Tb#a~Mtl4Jn{)ktyNvLM6SmyT6S76f}2xO&FIV9b;3} z(jC>I40yBd-8b)f?KcT1*KU-bXXx06VEwXq^n-j{wWOfg<61O$YXD`bA@@PNE7{G% z%M({3@^GN4<}h5Ac`)CjPqgw8C%56wKm#Akwb65OF7fu+o2^NS2jlLKO|>d&Uk7x%6(FVM4W zadzwY*cU5wndyV2YsRK)ch^Iv*x#E#jwMSJAw^n&fm-<)G zYoIT&O}d3HT-UOhW{3U_VW}Q6Q%7>G->_=)1yAW&+OE15{~bMo+33t9;0WIq zPx^8}+e*4a<(YPHgessf2rc461$YYGTsQ2gY2C351JVVEWj+2Vc%}pLihZLyyryWG zQO$ilpswL{z=Ow|>+@t*VdGTd`dP|PiebC4f76Or4M9p<7azjkTb~p3(1|PUG9szX z(ACtrI2DwrDUiKA&z6iYuBTK|w8r!*iM*D^X-;)@BL{SS8;H-gew9|%Q<^~B@4qx1 zI8DG4o?T6JabHo7ny+|L!r5d{=+O=go7ABzCn-B|as-^{GsWO!xOvTW8glv!@si?D zI=V>JGa!vKPZQwx=Jz_sn>a#UlIK8vDaK1?JSPN3ji6I8IT!~D zpZNzm@$(0A5xX_ci}tex5ya?rk(HPciVjRx@CoJRaVYNL<8`i@0**U@>21T(@HoW? zE7vqP$hDDJ{@nO~eK8(tZmegWjyqmp;XPZ)_WcCr1+G6JNY5VQjNRLbHa+9YANiwe zWzM9T-P#v(h-t|VE(d}lYzp)-JHS~ahKSQwre!u91W7Q+pG|t3I53O-UaE|9N*Z^q zQqea0D8aMuP*@GNeroFv59Zm74^4{4TQO#9+x_vp8X1|4=Um|6d5^2n0w#NvAw{g$8%c|YM2#ldY=o9t@7px;ZGAg#*;Qe{I#CBN5=&W^ z1DGQE18#H#Ih{>v0`4Z(QLekC;Zd2!R758PZ0$O+nKN;|a&UAl@H4_rUW_#rpY;>p zq3UzA!~N89*02&%&|nUdgE0^~fu&E=?ob<2 zrt991Lg~vs-p>h8jVtOILMe_c!joe>?^M~W56DolkcJCQ8=_su=9$ZWWRn?>^r2pI zo%yY*?;ux>CMAWDhzqgQ1^F@!QvL*xyCX~vx)$_-FhbjMv+6RX3 zpS|L6U%Ymgh*9m`m7jC%t+`d|E@Od#83lZ3*wCG}I1SIFK)Z8# zRO#07-FWZLVLcI>94Q1+PBcVK%VXN2(C*mYZg?kj(FFzM( zXR@)};!sO=@Aa=Jhk_1#fe*`v;(?~u^jrZeLg329=t-<3jX%}}NyCg5rH$5rNXdX8Y*5lUpI&ZN+Q{8*gmxf7@7jVt^`Lxoc? zbWMsV!T3Y6p5OYOaRU6gNBPNL8f4%e2=8HoZTIG8zVzH@G3d;^?(XI0)1+Yg0yAMi z8?g|z4CRI9nIwk|sK_52$n*d$i0;u>EJf$6c!Albk@;jOi*n@y476@UQ+`Gg16O!@ zcH52Gh=l5@YS(<-hU(&Em$BBE2XB14dHfF0MjwT*e2B=4YVS%)_+0fPJ3XiDLZj6w zQ<#M;Ar$oGpXGzSTh*3X!~(O*<>X*rbu(Sr?HrW3ujqyrsT zqTtdZeNF&hJzqw5sh?;@af7w0k{5bu7L!RVQMobKCcfE#Z0!XxV=Y)-b+$`g-djPzfqK{Z;OpM?SRo zV6}ZxNfAy$+2cHXB?pftZO+*#3gdk&4HjVJe$`WMF9vJNce@R3H*W~joa-xLJ}vAG zibX&REY;{5LDO5vgL5fSqMfSbjMn-Y>W_A_Doi}wH*h}j(j|VELE0XG3+Dwh%v+OK z{XM0fsei-JY-51$Z0Fn`*rW#&HLMb?9(FxAOHkeD=6jIZFMFCgq}suwDME8)@cJgy z^SbZsNUl9&d%d5D)z9ZL=yp~ZOqM!;>x2kN70h#0RN{KA&z^3d!Y1J$Aw=nhuex*2 zwlCoNgwJBu!tj@;zn-k$fLP<&?N+-+!0NfvZsL3`$ZQ@{ty-wF+_YSA3zm|3W=K7h z9G-vn!*aUik}AU zciE$R*O#m9)uGDh_xcFdPe~Q=(gdm4U-!pPz)ZRm(Tp;%I0yCN(%N}#1Ct6exwy7}^^)tbN4ggDA$ ze)8$QVs7I@0{aPpom@RAr9j|uC49P@Lh7sGsG zYM+>&*+zT)?g($01+4?uLUkOkM$!B)@5$<+H_r=!;UuB;5M9C2&=+&fMnT>D=6J{Xmf!m?kI=8*1b&*CNw$}y;Yr~Dr=7TG%U6E(cE_!U)th9ydODN3btH;j6 z6pO13gs7%9VCSQWK!jF}R67IN^NQ_S;xA3XfaHJDlK1Gb?VFBrB5&Ym{z_h!?CMdE z@Z%d><2A)BLAvYAl*eLcwhabDr`l3O+l@r=ka{YpzhiDWN zo^kSANgmlByaplkiTG@}9aLwZZ5{KH2gEw3n`QmMYXrA6W2@?~EX{ZX@Lj7WLrC14 zMH=Bo3Jwwc6hu$&NCN+@w3|= zhiKs>9q|XcDrPlJwayxmn@M?T&)R8%0w?R3IRma6aqu`{g4-8<1r|Rljqbps^dNCR zMixReg~|{ZQ<$7eMtQxbbDC*3y%Sr(t*^=PE3~^c2;HJii?YFu=VN?)IlJqEL(&)~ z{XlD*$<4F?F$Mc~g+e!ZT6Vn+e6#4Orn(XYgeo-J0eeuVOcD0coeK|ow6e0StVatT z$d7L$z(`o5Ows;q`xk0%ZS8S2#0zy_tB5n0Nsoo>SC>+vo^@43-J$v(L1C4#LPMQirytyX|eas?E+bMidEKOz@ z)(okjZW3Zo`NNO7553MaF^!%5k zzCrW3bR{1eGzDi0AW+W@0T1Noe+^e)s)*&ogMw?}^LS6=B$(g^(l)UNLB0^?*JJq} z**Z83iPyL1GKj|=<@KgcjBZgM#cKFO{yB7oH7OAXYK0Mm?MkqS~9qD&` z!5_HydTifP^{V@kuW|+4v!KWp7!NI;g}t{4h`LtyUaPH1s%ItcCnki$fa*hnsM4aH z8+?*0e6wmjEp2+&codwO=XNuj)PPDB3r@MUWt(|Ihl}P%Mh(>^`;8hz;ZHJ*@4X=Y zze25R$Lxa21V2*s#DSGM8UM8A8I)HOucbq7U83XsLd|d|G=J=+zCp)t1*U?O6!d zBuF+3AbbDPSp4$5`qZ6QUo7Q(8RxOuD7=DMw2NNod1Lw7+$M|LYJ|9>TlJS_WimA8 zOg61qcUq-;ma5Ob%AU*7q;(i(|6_K|_SVaOrkj&uokf8$U0xDz82OB~KE!p!HnHt~ zstuBvETlr;zpopSo#oqFHE2OCoKI`He7tp=Ck_2~PT@WjlVc{1#In$Ea|-jT(3xvEqqoGlLtI)5q4(wsMqqS z6&7(hnBAV;*)~(*z&Jfn%THHkKmQi0E1c*`_$rq`p`Cxl_U0F&Za$6h@5F{SOGeIv z@gG#*_b9ei=w68roDMazw;mXsJy0K_mu7|Y!9(-bv$xQ{lll&GjydO#Cv@o!&GFUK zFWjU9_?eZ(0x=!_k6yins!C%SK*x_gS+v@m65KEu$n;cIFqO77ZzlnMk=cAFL~t20 zx-ck^Wn%ZGNL_I+M3y)S^DH@AwW8kDi1*Z_uk+O9Y*HB`O(6}Jx?HW{QIwZHXHiUSw^YbKP^@Ru| zVIk5bIBn?)=`VmMzdJJsi1TztuxOIae!+l9{$Tu^0N%C8-+PcX)M zNx}mju0Vv7bAncKnnNz^bHqlzKi7C!>Im~Y3AYVHO0S1M8Qp)vWk}Wi)^h;A>iMW( zaSh;BU-yR05L?NSq&|aYyyq75w(|ON*F|sOcFB(WO4`^qZke6=1;hh#Mc@~fC8k2- zp=Sl)r{kMvG8pliik(6tlot=OT)fZ)^`9mY4ttK#uxrie4(q4?&T`(XdCn5Re+T%4 zuLvD#&94c4vhIh7HCT z6kQe0Hzlc7*Y;pf7I2=|!m$3Fs-y>;XNil)ru79rA=-ZStBOi@ zHGQf3(O7=cz8CIjSKZ)G-9)VpMIeP#oOh>nL1WAr^?z@~p)7VWaC8TgJC_^RAXxsY zO$M0&1eE+vwzqE-$f3glJK}u>Tm+-CTjMjOc)fEpA`l+!rzfX5GyI)=V(n_`X`-RE z`u>M_jgW$+iv5S3WV$&4tYE`&-@^4&dx1Cia$7IhM{R^2w|-q?jFBb_*!WsqS=xl~ z7|M?GnZ2$h6-RT9f zT!t&N@WX%|WNOo3Z;mqA25^g17YB9LPBbzwi2YKjk4P=t^7IN4FSCD@dkqbE9zf1B zNOEMZ=_WCLV(w&ha7cK3|CJ{fI4@4`PvvX#fzMoTFI-}WkjZW7tvzgGrQ$G&Gk)F`jkDpb6EqbrGFeR(L&oPZKg}ku0jbXXrvoN&ewkST1V{)Jh6#sCllv!NhmEeYw=Mu{Euy)GRTW7S z1k+)(N-aZlp<9Dag>*yMccCl+a{(*eAeSv?KIvVps`V~N2PgtpdaXosr+51xE-&vW zK-1PYS(bdAv(tr0mJe$3;1n?^?Ya8hBgi403=nQen_NEtvMtQ*w1&sRXOP01xny+f zg|N#C*j<^AViSR#cTU(LCfn1&l&U8;ycjl)ZtdJxW6LawT}!)j_m`0gXO6Cn(6m}q}oP%;IEVazyw*#>qv+r{GDOYipfh%*!FHMs4 zZyq<-l9nh9x@}7u2)AO($sYRvuY0Ml;1k;}2%kr986WG5eb=(uMJjtH0RJ_e3QMxL(GpbyFz$B59W2^ zQ~6D(W#c%HfVX%`RKBw)yVrIrUERL>rK~g>GiZ4r=$}-r>LUDyw@bnzrAZ#+!U4$V z^A!{A03_2Em4%`_CCI##(C`^Fd^&5iAXJ>bh{zUJ+XS0d1emWK-YdpuD6X{ zNs~LGIB_@PX;RP)Ua{aHSuQyrxUX50<;*mE7qe2nJcfms8Xfvg#D>T@G|t*?_^M8} z=KgaqU0>DE{)?&uhijbF%0A<+P&Q&Pg>-E-Mg`!%N8~sEK~C@1Ols$8&K>}ZGqN1b z2NWKt*#@bJ+ak=Yp@cr)KcRrLyA(@u2OKdWR<$)6NmGT{S-qs-LEn5Jf|nmc4%!qEt);l*2$+~hq_ zBf_c5ua~2dH3sn`B`_sx!%^TexTWr?rAPG$iEL%jo*^TT-k zc+NPe|DSW^XL8HL(f8T))zzP~U37ExHVtNut=#py?VXll!7gYAI|u!}4KxMMr1*hzL7u9A78o zhSyPs$da+>>Tw&(%oIQAgH9jbopV=Ax{4C<#f78O#e7j8j z4uf=s=X?oZy-5B!3r-*69hw0j`HoM&guSh+O;WH|UZ2CI*b9QyG?hk@+{n^Vpp^Uq zz5IE>sytz~W-ez;px0sjc>(Z2VrM?ZiQH5B>E-<@DqmM-Qtclx0WEQ8^~l|cn0{6r z2O5YCR3}%gY{&dsbTX#1hh_V;*8WdBL@3~cZGC^ap>`fhL=0-?RhB!7wZT){6+djN z9GKNlrwQ+xK&+~-fX_*LZJYSH`#WhK65To(zx%izCRB*My7J_XSXJsWQC{PI*<>1f zYV9FcT-b)n#$rfDIFo!XLsEi_o|vPN_~s5yJFJ0MH=4qt-Lb(!TS~ce{2bNCWVF}r zNaPhM{MTE%pru~)#@%m5?+yJ!hwB4`2huM&_ymg%fmV^TOL^8$`TBvciLV6;4uUK; zT>ZUzTAcsVFrr_&c2Z4|*N2vp!}88#C@LA!m*uo2nU5>}wSW5sY|P)pfU2@;shijFYb+*j#WF?B#aFo?jLNLQ`C75sxPq7 zn&PDe)B}tyNe5Jvr_st(=tG9 zB616MrW@+E2RP0p6NmwE?t+Q=in2uuypH=1jx-iiV_$yU78e!ReHQx`bd@%>i(_RB zsj139m$|>3e3ai<+eqC)RV-OHbWO6}AVBI_K>(IU3HWB9PQ%vXPn2K>y4;(t{>=?} zo(pSz9){5rZOpxBMuD6j{WNUzPZ)Rbn65ph48W5_-C>YD|qMSt*Ia2)Hg zZvMTJz87Z6GV@F^7a2CbLg4J?JC|~E5lBZvz5b0BXxdph4@#7dyuq=m9^TF?8ks2* zR`VxXSfPiqD%H6C3VptvCoFJqxX4339x_Tz&1pfC1exg__W8f43@xZcFX`YjrK^Yi zHs$57+$+xsUZ~yZ<}VORH^I;}zzoh;;;1o8un;ZC|q0?u{y{#-8szEBPa!Cw#96v^yAykt%79MxfpR!JOb|pgSUv=7lv=olNF>N4U zlx3<0mh+7FZ00}sUd=TaSD#|9vOQoUIe&)mPd7VHS=Y}%o&wwF#$I&WOhvN&$lB%8^pU~Ig2MY zM~(gj+sy4Z$H}bk8w#RYHMOCNz?rm0JQnuFnS`dWpyzg?el3YEisP(vFHFdw?469a7T_y#TOKiK{0cTe!N{okTIoGR>zc1u_lu2mTq%K=T zk1v3KJURih{5#Ph2-n4>?;__9Ee6;*O~BeGr3I&JW!WCz*Cknf%PcVt#qO8@==jD! z0IXY$T6A2FHIZK%oHwtKz&M#idk;(EjSgK^Cqe7`Nlr1_!!~MW+%*Ca=1Z@V>Ea1A zi+^d{CbZp<64ND^8x42|ciE zX>j`2WG(rFdz1Nw~Ut)*l;1 zT?YJts7|izkmLF8~uMo4&S2XWq5EY;L&z??%ua6zQJ%B zo#c_^XSDwxQ2Z?s_m0O_rR~WM_Jp!}DYR>W$DRtB+c1z3itJbFp*+SCCMkPk@AtIp zf=W+U${6v0+JohH%VGK>PWnZZRRJlOE{))S>+H|F`io&W9U S|C{RWf4mL<_YZ0Qj{iSDk|qHF literal 0 HcmV?d00001 diff --git a/app/gradation/Playground.tsx b/app/gradation/Playground.tsx index f5325f02..2733d014 100644 --- a/app/gradation/Playground.tsx +++ b/app/gradation/Playground.tsx @@ -1,7 +1,7 @@ "use client"; import * as THREE from "three"; -import { useEffect, useRef } from "react"; +import { useCallback, useEffect, useRef } from "react"; import { useFrame, useThree, extend } from "@react-three/fiber"; import { useNoise, @@ -36,14 +36,17 @@ const setConfig = (key: "marble" | "colorStrata" | "hsv") => { function useDownloadCanvas() { const { gl } = useThree(); - const downloadImage = (filename = "image.png") => { - const image = gl.domElement.toDataURL("image/png"); - const link = document.createElement("a"); - link.download = filename; - link.href = image; - link.click(); - link.remove(); - }; + const downloadImage = useCallback( + (filename = "image.png") => { + const image = gl.domElement.toDataURL("image/png"); + const link = document.createElement("a"); + link.download = filename; + link.href = image; + link.click(); + link.remove(); + }, + [gl] + ); return downloadImage; } diff --git a/packages/use-shader-fx/build/use-shader-fx.js.map b/packages/use-shader-fx/build/use-shader-fx.js.map index 76fb7221..6f1eb500 100644 --- a/packages/use-shader-fx/build/use-shader-fx.js.map +++ b/packages/use-shader-fx/build/use-shader-fx.js.map @@ -1 +1 @@ -{"version":3,"file":"use-shader-fx.js","sources":["../src/fxs/interactions/useBrush/shader/main.vert","../src/fxs/interactions/useBrush/shader/main.frag","../src/utils/useResolution.ts","../src/utils/useAddMesh.ts","../src/utils/setUniforms.ts","../src/fxs/interactions/useBrush/useMesh.ts","../src/utils/useCamera.ts","../src/misc/usePointer.ts","../src/utils/useParams.ts","../src/utils/useSingleFBO.ts","../src/utils/useDoubleFBO.ts","../src/fxs/interactions/useBrush/index.ts","../src/fxs/interactions/useFluid/shaders/main.vert","../src/fxs/interactions/useFluid/shaders/init.frag","../src/fxs/interactions/useFluid/materials/useInitialMaterial.ts","../src/fxs/interactions/useFluid/shaders/advection.frag","../src/fxs/interactions/useFluid/materials/useAdvectionMaterial.ts","../src/fxs/interactions/useFluid/shaders/divergence.frag","../src/fxs/interactions/useFluid/materials/useDivergenceMaterial.ts","../src/fxs/interactions/useFluid/shaders/pressure.frag","../src/fxs/interactions/useFluid/materials/usePressureMaterial.ts","../src/fxs/interactions/useFluid/shaders/curl.frag","../src/fxs/interactions/useFluid/materials/useCurlMaterial.ts","../src/fxs/interactions/useFluid/shaders/vorticity.frag","../src/fxs/interactions/useFluid/materials/useVorticityMaterial.ts","../src/fxs/interactions/useFluid/shaders/clear.frag","../src/fxs/interactions/useFluid/materials/useClearMaterial.ts","../src/fxs/interactions/useFluid/shaders/gradientSubtract.frag","../src/fxs/interactions/useFluid/materials/useGradientSubtractMaterial.ts","../src/fxs/interactions/useFluid/shaders/splat.frag","../src/fxs/interactions/useFluid/materials/useSplatMaterial.ts","../src/fxs/interactions/useFluid/useMesh.ts","../src/fxs/interactions/useFluid/index.ts","../src/fxs/interactions/useRipple/useMesh.ts","../src/fxs/interactions/useRipple/index.ts","../src/fxs/noises/useNoise/shader/main.vert","../src/fxs/noises/useNoise/shader/main.frag","../src/fxs/noises/useNoise/useMesh.ts","../src/fxs/noises/useNoise/index.ts","../src/fxs/noises/useColorStrata/shader/main.vert","../src/fxs/noises/useColorStrata/shader/main.frag","../src/fxs/noises/useColorStrata/useMesh.ts","../src/fxs/noises/useColorStrata/index.ts","../src/fxs/noises/useMarble/shader/main.vert","../src/fxs/noises/useMarble/shader/main.frag","../src/fxs/noises/useMarble/useMesh.ts","../src/fxs/noises/useMarble/index.ts","../src/fxs/noises/useCosPalette/shader/main.vert","../src/fxs/noises/useCosPalette/shader/main.frag","../src/fxs/noises/useCosPalette/useMesh.ts","../src/fxs/noises/useCosPalette/index.ts","../src/fxs/utils/useDuoTone/shader/main.vert","../src/fxs/utils/useDuoTone/shader/main.frag","../src/fxs/utils/useDuoTone/useMesh.ts","../src/fxs/utils/useDuoTone/index.ts","../src/fxs/utils/useBlending/shader/main.vert","../src/fxs/utils/useBlending/shader/main.frag","../src/fxs/utils/useBlending/useMesh.ts","../src/fxs/utils/useBlending/index.ts","../src/fxs/utils/useFxTexture/shader/main.vert","../src/fxs/utils/useFxTexture/shader/main.frag","../src/fxs/utils/useFxTexture/useMesh.ts","../src/fxs/utils/useFxTexture/index.ts","../src/fxs/utils/useBrightnessPicker/shader/main.vert","../src/fxs/utils/useBrightnessPicker/shader/main.frag","../src/fxs/utils/useBrightnessPicker/useMesh.ts","../src/fxs/utils/useBrightnessPicker/index.ts","../src/fxs/utils/useFxBlending/shader/main.vert","../src/fxs/utils/useFxBlending/shader/main.frag","../src/fxs/utils/useFxBlending/useMesh.ts","../src/fxs/utils/useFxBlending/index.ts","../src/fxs/utils/useAlphaBlending/shader/main.vert","../src/fxs/utils/useAlphaBlending/shader/main.frag","../src/fxs/utils/useAlphaBlending/useMesh.ts","../src/fxs/utils/useAlphaBlending/index.ts","../src/fxs/utils/useHSV/shader/main.vert","../src/fxs/utils/useHSV/shader/main.frag","../src/fxs/utils/useHSV/useMesh.ts","../src/fxs/utils/useHSV/index.ts","../src/fxs/utils/useCoverTexture/shader/main.vert","../src/fxs/utils/useCoverTexture/shader/main.frag","../src/fxs/utils/useCoverTexture/useMesh.ts","../src/fxs/utils/useCoverTexture/index.ts","../src/fxs/effects/useSimpleBlur/shader/main.vert","../src/fxs/effects/useSimpleBlur/shader/main.frag","../src/fxs/effects/useSimpleBlur/useMesh.ts","../src/fxs/effects/useSimpleBlur/index.ts","../src/fxs/effects/useWave/shader/main.vert","../src/fxs/effects/useWave/shader/main.frag","../src/fxs/effects/useWave/useMesh.ts","../src/fxs/effects/useWave/index.ts","../src/fxs/misc/useChromaKey/shader/main.vert","../src/fxs/misc/useChromaKey/shader/main.frag","../src/fxs/misc/useChromaKey/useMesh.ts","../src/fxs/misc/useChromaKey/index.ts","../src/utils/useCopyTexture.ts","../src/libs/easing.ts","../src/misc/useBeat.ts","../src/misc/useFPSLimiter.ts","../src/misc/useDomSyncer/utils/errorHandler.ts","../src/misc/useDomSyncer/shader/main.vert","../src/misc/useDomSyncer/shader/main.frag","../src/misc/useDomSyncer/utils/createMesh.ts","../src/misc/useDomSyncer/utils/useIntersectionHandler.ts","../src/misc/useDomSyncer/utils/useUpdateDomRect.ts","../src/misc/useDomSyncer/utils/useIsIntersecting.ts","../src/misc/useDomSyncer/utils/createUseDomView.ts","../src/misc/useDomSyncer/index.ts"],"sourcesContent":["varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nuniform sampler2D uBuffer;\nuniform sampler2D uTexture;\nuniform bool uIsTexture;\nuniform sampler2D uMap;\nuniform bool uIsMap;\nuniform float uMapIntensity;\nuniform float uRadius;\nuniform float uDissipation;\nuniform vec2 uResolution;\nuniform float uSmudge;\nuniform vec2 uMouse;\nuniform vec2 uPrevMouse;\nuniform vec2 uVelocity;\nuniform vec3 uColor;\nuniform float uMotionBlur;\nuniform int uMotionSample;\nuniform bool uIsCursor;\nuniform float uPressureStart;\nuniform float uPressureEnd;\n\nvarying vec2 vUv;\n\nfloat isOnLine(vec2 point, vec2 start, vec2 end, float radius, float pressureStart, float pressureEnd) {\n\t\n\tfloat aspect = uResolution.x / uResolution.y;\n\n\tpoint.x *= aspect;\n\tstart.x *= aspect;\n\tend.x *= aspect;\n\n\tvec2 dir = normalize(end - start);\n\tvec2 n = vec2(dir.y, -dir.x);\n\tvec2 p0 = point - start;\n\t\n\tfloat distToLine = abs(dot(p0, n));\n\tfloat distAlongLine = dot(p0, dir);\n\tfloat totalLength = length(end - start);\n\n\tfloat progress = clamp(distAlongLine / totalLength, 0.0, 1.0);\n\tfloat pressure = mix(pressureStart, pressureEnd, progress);\n\tradius = min(radius,radius * pressure);\n\n\tfloat distFromStart = length(point - start);\n\tfloat distFromEnd = length(point - end);\n\t\n\tbool withinLine = (distToLine < radius && distAlongLine > 0.0 && distAlongLine < totalLength) || distFromStart < radius || distFromEnd < radius;\n\n\treturn float(withinLine);\n}\n\nvec4 createSmudge(vec2 uv){\n\tvec2 offsets[9];\n\toffsets[0] = vec2(-1, -1); offsets[1] = vec2( 0, -1); offsets[2] = vec2( 1, -1);\n\toffsets[3] = vec2(-1, 0); offsets[4] = vec2( 0, 0); offsets[5] = vec2( 1, 0);\n\toffsets[6] = vec2(-1, 1); offsets[7] = vec2( 0, 1); offsets[8] = vec2( 1, 1);\n\n\tfor(int i = 0; i < 9; i++) {\n\t\toffsets[i] = (offsets[i] * uSmudge) / uResolution;\n\t}\t\n\tvec4 smudgedColor = vec4(0.);\n\tfor(int i = 0; i < 9; i++) {\n\t\tsmudgedColor += texture2D(uBuffer, uv + offsets[i]);\n\t}\n\treturn smudgedColor / 9.0;\n}\n\nvec4 createMotionBlur(vec2 uv , vec4 baseColor, vec2 velocity) {\n\tvec2 scaledV = velocity * uMotionBlur;\n\tfor(int i = 1; i < uMotionSample; i++) {\n\t\tfloat t = float(i) / float(uMotionSample - 1);\n\t\tvec2 offset = t * scaledV / uResolution;\n\t\tbaseColor += texture2D(uBuffer, uv + offset);\n\t}\n\treturn baseColor / float(uMotionSample);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\tif(uIsMap){\n\t\tvec2 mapColor = texture2D(uMap, uv).rg;\n\t\tvec2 normalizedMap = mapColor * 2.0 - 1.0;\n\t\tuv = uv * 2.0 - 1.0;\n\t\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), uMapIntensity);\n\t\tuv = (uv + 1.0) / 2.0;\n\t}\n\tvec2 suv = uv*2.-1.;\n\n\tvec2 velocity = uVelocity * uResolution;\n\n\tfloat radius = max(0.0,uRadius);\n\t\n\tvec4 smudgedColor = uSmudge > 0. ? createSmudge(uv) : texture2D(uBuffer, uv);\n\n\tvec4 motionBlurredColor = uMotionBlur > 0. ? createMotionBlur(uv,smudgedColor, velocity) : smudgedColor;\n\n\tvec4 bufferColor = motionBlurredColor;\n\tbufferColor.a = bufferColor.a < 1e-10 ? 0.0 : bufferColor.a * uDissipation;\n\t\n\tvec4 brushColor = uIsTexture ? texture2D(uTexture, uv) : vec4(uColor,1.);\n\t\n\tfloat onLine = isOnLine(suv, uPrevMouse, uMouse, radius, uPressureStart,uPressureEnd);\n\tfloat isOnLine = length(velocity) > 0. ? onLine : uIsCursor ? onLine : 0.;\n\n\tvec4 finalColor = mix(bufferColor, brushColor, isOnLine);\n\n\tgl_FragColor = finalColor;\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\n/**\n * @params dpr if dpr is set, it returns the resolution which is size multiplied by dpr.\n */\nexport const useResolution = (size: Size, dpr: number | false = false) => {\n const _width = dpr ? size.width * dpr : size.width;\n const _height = dpr ? size.height * dpr : size.height;\n const resolution = useMemo(\n () => new THREE.Vector2(_width, _height),\n [_width, _height]\n );\n return resolution;\n};\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\n/** Generate mesh from geometry and material and add to scene */\nexport const useAddMesh = (\n scene: THREE.Scene,\n geometry: THREE.BufferGeometry,\n material: THREE.Material\n) => {\n const mesh = useMemo(\n () => new THREE.Mesh(geometry, material),\n [geometry, material]\n );\n\n useEffect(() => {\n scene.add(mesh);\n }, [scene, mesh]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","type UniformValue =\n | THREE.CubeTexture\n | THREE.Texture\n | Int32Array\n | Float32Array\n | THREE.Matrix4\n | THREE.Matrix3\n | THREE.Quaternion\n | THREE.Vector4\n | THREE.Vector3\n | THREE.Vector2\n | THREE.Color\n | number\n | boolean\n | Array\n | null;\ntype UniformObject = { [key: string]: { value: UniformValue } };\n\nexport const setUniform = (\n material: { uniforms: T },\n key: keyof T,\n value: UniformValue\n) => {\n if (\n material.uniforms &&\n material.uniforms[key] &&\n value !== undefined &&\n value !== null\n ) {\n material.uniforms[key].value = value;\n } else {\n console.error(\n `Uniform key \"${String(\n key\n )}\" does not exist in the material. or \"${String(\n key\n )}\" is null | undefined`\n );\n }\n};\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useEffect, useMemo } from \"react\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class BrushMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uBuffer: { value: THREE.Texture };\n uTexture: { value: THREE.Texture };\n uIsTexture: { value: boolean };\n uMap: { value: THREE.Texture };\n uIsMap: { value: boolean };\n uMapIntensity: { value: number };\n uResolution: { value: THREE.Texture };\n uRadius: { value: number };\n uSmudge: { value: number };\n uDissipation: { value: number };\n uMotionBlur: { value: number };\n uMotionSample: { value: number };\n uMouse: { value: number };\n uPrevMouse: { value: number };\n uVelocity: { value: number };\n uColor: { value: THREE.Vector3 };\n uIsCursor: { value: boolean };\n uPressureStart: { value: number };\n uPressureEnd: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uBuffer: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uTexture: { value: new THREE.Texture() },\n uIsTexture: { value: false },\n uMap: { value: new THREE.Texture() },\n uIsMap: { value: false },\n uMapIntensity: { value: 0.0 },\n uRadius: { value: 0.0 },\n uSmudge: { value: 0.0 },\n uDissipation: { value: 0.0 },\n uMotionBlur: { value: 0.0 },\n uMotionSample: { value: 0 },\n uMouse: { value: new THREE.Vector2(-10, -10) },\n uPrevMouse: { value: new THREE.Vector2(-10, -10) },\n uVelocity: { value: new THREE.Vector2(0, 0) },\n uColor: { value: new THREE.Vector3(1, 0, 0) },\n uIsCursor: { value: false },\n uPressureStart: { value: 1.0 },\n uPressureEnd: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as BrushMaterial;\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material;\n};\n","import * as THREE from \"three\";\nimport { useResolution } from \"./useResolution\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\nconst getCameraProps = (width: number, height: number) => {\n const frustumSize = height;\n const aspect = width / height;\n const [w, h] = [(frustumSize * aspect) / 2, frustumSize / 2];\n return { width: w, height: h, near: -1000, far: 1000 };\n};\n\nexport const useCamera = (size: Size) => {\n const resolution = useResolution(size);\n const { width, height, near, far } = getCameraProps(\n resolution.x,\n resolution.y\n );\n const camera = useMemo(\n () =>\n new THREE.OrthographicCamera(\n -width,\n width,\n height,\n -height,\n near,\n far\n ),\n [width, height, near, far]\n );\n return camera;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useRef } from \"react\";\n\nexport type PointerValues = {\n currentPointer: THREE.Vector2;\n prevPointer: THREE.Vector2;\n diffPointer: THREE.Vector2;\n velocity: THREE.Vector2;\n isVelocityUpdate: boolean;\n};\n\ntype UpdatePointer = (currentPointer: THREE.Vector2) => PointerValues;\n\n/**\n * @description When given the pointer vector2 from r3f's RootState, it generates an update function that returns {`currentPointer`, `prevPointer`, `diffPointer`, `isVelocityUpdate`, `velocity`}.\n * @description When calling custom in a `useFrame` loop, you can avoid duplication of execution by passing `pointerValues` to the update function of a Pointer-activated fxHook, such as `useBrush`.\n * @param lerp 0~1, lerp intensity (0 to less than 1) , default: 0\n */\nexport const usePointer = (lerp: number = 0): UpdatePointer => {\n const prevPointer = useRef(new THREE.Vector2(0, 0));\n const diffPointer = useRef(new THREE.Vector2(0, 0));\n const lerpPointer = useRef(new THREE.Vector2(0, 0));\n const lastUpdateTime = useRef(0);\n const velocity = useRef(new THREE.Vector2(0, 0));\n const isMoved = useRef(false);\n\n const updatePointer = useCallback(\n (currentPointer: THREE.Vector2) => {\n const now = performance.now();\n\n // lerp\n let current: THREE.Vector2;\n if (isMoved.current && lerp) {\n lerpPointer.current = lerpPointer.current.lerp(\n currentPointer,\n 1 - lerp\n );\n current = lerpPointer.current.clone();\n } else {\n current = currentPointer.clone();\n lerpPointer.current = current;\n }\n\n // first frame\n if (lastUpdateTime.current === 0) {\n lastUpdateTime.current = now;\n prevPointer.current = current;\n }\n const deltaTime = Math.max(1, now - lastUpdateTime.current);\n lastUpdateTime.current = now;\n\n // get velocity\n velocity.current\n .copy(current)\n .sub(prevPointer.current)\n .divideScalar(deltaTime);\n const isUpdate = velocity.current.length() > 0;\n\n //set prev temp pos\n const prevTemp = isMoved.current\n ? prevPointer.current.clone()\n : current;\n if (!isMoved.current && isUpdate) {\n isMoved.current = true;\n }\n prevPointer.current = current;\n\n return {\n currentPointer: current,\n prevPointer: prevTemp,\n diffPointer: diffPointer.current.subVectors(current, prevTemp),\n velocity: velocity.current,\n isVelocityUpdate: isUpdate,\n };\n },\n [lerp]\n );\n\n return updatePointer;\n};\n","import { useCallback, useRef } from \"react\";\n\ntype UseParamsReturn = [T, (params: Partial) => void];\n\n/**\n * @param params Receives an initial value object. With structuredClone, deep copy and set, but if the object contains a function, just set it.\n */\nexport const useParams = (params: T): UseParamsReturn => {\n const isContainsFunctions = (obj: object): boolean =>\n Object.values(obj).some((value) => typeof value === \"function\");\n const paramsRef = useRef(\n isContainsFunctions(params) ? params : structuredClone(params)\n );\n\n const setParams = useCallback((updateParams: Partial) => {\n for (const key in updateParams) {\n const paramKey = key as keyof T;\n if (\n paramKey in paramsRef.current &&\n updateParams[paramKey] !== undefined &&\n updateParams[paramKey] !== null\n ) {\n paramsRef.current[paramKey] = updateParams[paramKey]!;\n } else {\n console.error(\n `\"${String(\n paramKey\n )}\" does not exist in the params. or \"${String(\n paramKey\n )}\" is null | undefined`\n );\n }\n }\n }, []);\n return [paramsRef.current, setParams];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default:false */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. Default is 0. */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, Default is false. */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. Default is false. */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\n\nexport type BrushParams = {\n /** Texture applied to the brush, If texture is true, it will take precedence over color , default:false */\n texture?: THREE.Texture | false;\n /** You can attach an fx map , default:false */\n map?: THREE.Texture | false;\n /** map intensity , default:0.1 */\n mapIntensity?: number;\n /** size of the stamp, percentage of the size ,default:0.05 */\n radius?: number;\n /** Strength of smudge effect , default:0.0*/\n smudge?: number;\n /** dissipation rate. If set to 1, it will remain. ,default:1.0 */\n dissipation?: number;\n /** Strength of motion blur , default:0.0 */\n motionBlur?: number;\n /** Number of motion blur samples. Affects performance default: 5 */\n motionSample?: number;\n /** brush color , it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default:THREE.Vector3(1.0, 1.0, 1.0) */\n color?: ((velocity: THREE.Vector2) => THREE.Vector3) | THREE.Vector3;\n /** Follows the cursor even if it loses speed , default:false */\n isCursor?: boolean;\n /** brush pressure (0 to 1) , default : 1.0 */\n pressure?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default:false */\n pointerValues?: PointerValues | false;\n};\n\nexport type BrushObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRUSH_PARAMS: BrushParams = {\n texture: false,\n map: false,\n mapIntensity: 0.1,\n radius: 0.05,\n smudge: 0.0,\n dissipation: 1.0,\n motionBlur: 0.0,\n motionSample: 5,\n color: new THREE.Vector3(1.0, 0.0, 0.0),\n isCursor: false,\n pressure: 1.0,\n pointerValues: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrush = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrushParams) => {\n const { gl, pointer } = props;\n\n updateParams && setParams(updateParams);\n\n if (params.texture!) {\n setUniform(material, \"uIsTexture\", true);\n setUniform(material, \"uTexture\", params.texture!);\n } else {\n setUniform(material, \"uIsTexture\", false);\n }\n\n if (params.map!) {\n setUniform(material, \"uIsMap\", true);\n setUniform(material, \"uMap\", params.map!);\n setUniform(material, \"uMapIntensity\", params.mapIntensity!);\n } else {\n setUniform(material, \"uIsMap\", false);\n }\n\n setUniform(material, \"uRadius\", params.radius!);\n setUniform(material, \"uSmudge\", params.smudge!);\n setUniform(material, \"uDissipation\", params.dissipation!);\n setUniform(material, \"uMotionBlur\", params.motionBlur!);\n setUniform(material, \"uMotionSample\", params.motionSample!);\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n setUniform(material, \"uMouse\", pointerValues.currentPointer);\n setUniform(material, \"uPrevMouse\", pointerValues.prevPointer);\n }\n setUniform(material, \"uVelocity\", pointerValues.velocity);\n\n const color: THREE.Vector3 =\n typeof params.color === \"function\"\n ? params.color(pointerValues.velocity)\n : params.color!;\n setUniform(material, \"uColor\", color);\n\n setUniform(material, \"uIsCursor\", params.isCursor!);\n\n // pressure\n setUniform(material, \"uPressureEnd\", params.pressure!);\n if (pressureEnd.current === null) {\n pressureEnd.current = params.pressure!;\n }\n setUniform(material, \"uPressureStart\", pressureEnd.current);\n pressureEnd.current = params.pressure!;\n\n return updateRenderTarget(gl, ({ read }) => {\n setUniform(material, \"uBuffer\", read);\n });\n },\n [material, updatePointer, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","varying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform vec2 texelSize;\n\nvoid main () {\n\tvUv = uv;\n\tvL = vUv - vec2(texelSize.x, 0.0);\n\tvR = vUv + vec2(texelSize.x, 0.0);\n\tvT = vUv + vec2(0.0, texelSize.y);\n\tvB = vUv - vec2(0.0, texelSize.y);\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvoid main(){\n\tgl_FragColor = vec4(0.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/init.frag\";\n\nexport const useInitialMaterial = () => {\n const initialMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n depthTest: false,\n depthWrite: false,\n }),\n []\n );\n\n return initialMaterial as THREE.ShaderMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uVelocity;\nuniform sampler2D uSource;\nuniform vec2 texelSize;\nuniform float dt;\nuniform float dissipation;\n\nvoid main () {\n\tvec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize;\n\tgl_FragColor = dissipation * texture2D(uSource, coord);\n\tgl_FragColor.a = 1.0;\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/advection.frag\";\n\nexport class AdvectionMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uSource: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n dt: { value: number };\n dissipation: { value: number };\n };\n}\n\nexport const useAdvectionMaterial = () => {\n const advectionMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: new THREE.Texture() },\n uSource: { value: new THREE.Texture() },\n texelSize: { value: new THREE.Vector2() },\n dt: { value: 0.0 },\n dissipation: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return advectionMaterial as AdvectionMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvec2 sampleVelocity (in vec2 uv) {\n\tvec2 multiplier = vec2(1.0, 1.0);\n\tif (uv.x < 0.0) { uv.x = 0.0; multiplier.x = -1.0; }\n\tif (uv.x > 1.0) { uv.x = 1.0; multiplier.x = -1.0; }\n\tif (uv.y < 0.0) { uv.y = 0.0; multiplier.y = -1.0; }\n\tif (uv.y > 1.0) { uv.y = 1.0; multiplier.y = -1.0; }\n\treturn multiplier * texture2D(uVelocity, uv).xy;\n}\n\nvoid main () {\n\tfloat L = sampleVelocity(vL).x;\n\tfloat R = sampleVelocity(vR).x;\n\tfloat T = sampleVelocity(vT).y;\n\tfloat B = sampleVelocity(vB).y;\n\tfloat div = 0.5 * (R - L + T - B);\n\tgl_FragColor = vec4(div, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/divergence.frag\";\n\nexport class DivergenceMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useDivergenceMaterial = () => {\n const divergenceMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return divergenceMaterial as DivergenceMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uPressure;\nuniform sampler2D uDivergence;\n\nvec2 boundary (in vec2 uv) {\n\tuv = min(max(uv, 0.0), 1.0);\n\treturn uv;\n}\n\nvoid main () {\n\tfloat L = texture2D(uPressure, boundary(vL)).x;\n\tfloat R = texture2D(uPressure, boundary(vR)).x;\n\tfloat T = texture2D(uPressure, boundary(vT)).x;\n\tfloat B = texture2D(uPressure, boundary(vB)).x;\n\tfloat C = texture2D(uPressure, vUv).x;\n\tfloat divergence = texture2D(uDivergence, vUv).x;\n\tfloat pressure = (L + R + B + T - divergence) * 0.25;\n\tgl_FragColor = vec4(pressure, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/pressure.frag\";\n\nexport class PressureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uDivergence: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const usePressureMaterial = () => {\n const pressureMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: null },\n uDivergence: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return pressureMaterial as PressureMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvoid main () {\n\tfloat L = texture2D(uVelocity, vL).y;\n\tfloat R = texture2D(uVelocity, vR).y;\n\tfloat T = texture2D(uVelocity, vT).x;\n\tfloat B = texture2D(uVelocity, vB).x;\n\tfloat vorticity = R - L - T + B;\n\tgl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/curl.frag\";\n\nexport class CurlMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useCurlMaterial = () => {\n const curlMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return curlMaterial as CurlMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\nuniform sampler2D uCurl;\nuniform float curl;\nuniform float dt;\n\nvoid main () {\n\tfloat T = texture2D(uCurl, vT).x;\n\tfloat B = texture2D(uCurl, vB).x;\n\tfloat C = texture2D(uCurl, vUv).x;\n\tvec2 force = vec2(abs(T) - abs(B), 0.0);\n\tforce *= 1.0 / length(force + 0.00001) * curl * C;\n\tvec2 vel = texture2D(uVelocity, vUv).xy;\n\tgl_FragColor = vec4(vel + force * dt, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/vorticity.frag\";\n\nexport class VorticityMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uCurl: { value: THREE.Texture };\n curl: { value: number };\n dt: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useVorticityMaterial = () => {\n const vorticityMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: 0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return vorticityMaterial as VorticityMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float value;\n\nvoid main () {\n\tgl_FragColor = value * texture2D(uTexture, vUv);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/clear.frag\";\n\nexport class ClearMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n value: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useClearMaterial = () => {\n const advectionMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return advectionMaterial as ClearMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uPressure;\nuniform sampler2D uVelocity;\n\nvec2 boundary (in vec2 uv) {\n\tuv = min(max(uv, 0.0), 1.0);\n\treturn uv;\n}\n\nvoid main () {\n\tfloat L = texture2D(uPressure, boundary(vL)).x;\n\tfloat R = texture2D(uPressure, boundary(vR)).x;\n\tfloat T = texture2D(uPressure, boundary(vT)).x;\n\tfloat B = texture2D(uPressure, boundary(vB)).x;\n\tvec2 velocity = texture2D(uVelocity, vUv).xy;\n\tvelocity.xy -= vec2(R - L, T - B);\n\tgl_FragColor = vec4(velocity, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/gradientSubtract.frag\";\n\nexport class GradientSubtractMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useGradientSubtractMaterial = () => {\n const gradientSubtractMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: new THREE.Texture() },\n uVelocity: { value: new THREE.Texture() },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return gradientSubtractMaterial as GradientSubtractMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTarget;\nuniform float aspectRatio;\nuniform vec3 color;\nuniform vec2 point;\nuniform float radius;\n\nvoid main () {\n\tvec2 nPoint = (point + vec2(1.0)) * 0.5;\n\tvec2 p = vUv - nPoint.xy;\n\tp.x *= aspectRatio;\n\tvec3 splat = exp(-dot(p, p) / radius) * color;\n\tvec3 base = texture2D(uTarget, vUv).xyz;\n\tgl_FragColor = vec4(base + splat, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/splat.frag\";\n\nexport class SplatMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTarget: { value: THREE.Texture };\n aspectRatio: { value: number };\n color: { value: THREE.Vector3 };\n point: { value: THREE.Vector2 };\n radius: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useSplateMaterial = () => {\n const splatMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTarget: { value: new THREE.Texture() },\n aspectRatio: { value: 0 },\n color: { value: new THREE.Vector3() },\n point: { value: new THREE.Vector2() },\n radius: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return splatMaterial as SplatMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { useInitialMaterial } from \"./materials/useInitialMaterial\";\nimport {\n AdvectionMaterial,\n useAdvectionMaterial,\n} from \"./materials/useAdvectionMaterial\";\nimport {\n DivergenceMaterial,\n useDivergenceMaterial,\n} from \"./materials/useDivergenceMaterial\";\nimport {\n PressureMaterial,\n usePressureMaterial,\n} from \"./materials/usePressureMaterial\";\nimport { CurlMaterial, useCurlMaterial } from \"./materials/useCurlMaterial\";\nimport {\n VorticityMaterial,\n useVorticityMaterial,\n} from \"./materials/useVorticityMaterial\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { ClearMaterial, useClearMaterial } from \"./materials/useClearMaterial\";\nimport {\n GradientSubtractMaterial,\n useGradientSubtractMaterial,\n} from \"./materials/useGradientSubtractMaterial\";\nimport { SplatMaterial, useSplateMaterial } from \"./materials/useSplatMaterial\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\ntype TMaterials =\n | AdvectionMaterial\n | DivergenceMaterial\n | CurlMaterial\n | PressureMaterial\n | ClearMaterial\n | GradientSubtractMaterial\n | SplatMaterial;\n\nexport type FluidMaterials = {\n vorticityMaterial: VorticityMaterial;\n curlMaterial: CurlMaterial;\n advectionMaterial: AdvectionMaterial;\n divergenceMaterial: DivergenceMaterial;\n pressureMaterial: PressureMaterial;\n clearMaterial: ClearMaterial;\n gradientSubtractMaterial: GradientSubtractMaterial;\n splatMaterial: SplatMaterial;\n};\ntype TUseMeshReturnType = [FluidMaterials, (material: TMaterials) => void];\n\n/**\n * Returns the material update function in the second argument\n */\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}): TUseMeshReturnType => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const initialMaterial = useInitialMaterial();\n const updateMaterial = initialMaterial.clone();\n const curlMaterial = useCurlMaterial();\n const vorticityMaterial = useVorticityMaterial();\n const advectionMaterial = useAdvectionMaterial();\n const divergenceMaterial = useDivergenceMaterial();\n const pressureMaterial = usePressureMaterial();\n const clearMaterial = useClearMaterial();\n const gradientSubtractMaterial = useGradientSubtractMaterial();\n const splatMaterial = useSplateMaterial();\n const materials = useMemo(\n () => ({\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n }),\n [\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n ]\n );\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(\n materials.splatMaterial,\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(\n material,\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddMesh(scene, geometry, initialMaterial);\n useEffect(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return [materials, setMeshMaterial];\n};\n","import * as THREE from \"three\";\nimport { FluidMaterials, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { UseFboProps } from \"../../../utils/useSingleFBO\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\n\nexport type FluidParams = {\n /** density disspation , default:0.98 */\n density_dissipation?: number;\n /** velocity dissipation , default:0.99 */\n velocity_dissipation?: number;\n /** velocity acceleration , default:10.0 */\n velocity_acceleration?: number;\n /** pressure dissipation , default:0.9 */\n pressure_dissipation?: number;\n /** pressure iterations. affects performance , default:20 */\n pressure_iterations?: number;\n /** curl_strength , default:35 */\n curl_strength?: number;\n /** splat radius , default:0.002 */\n splat_radius?: number;\n /** Fluid Color.THREE.Vector3 Alternatively, it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default:THREE.Vector3(1.0, 1.0, 1.0) */\n fluid_color?: ((velocity: THREE.Vector2) => THREE.Vector3) | THREE.Vector3;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default:false */\n pointerValues?: PointerValues | false;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n materials: FluidMaterials;\n camera: THREE.Camera;\n renderTarget: {\n velocity: DoubleRenderTarget;\n density: DoubleRenderTarget;\n curl: THREE.WebGLRenderTarget;\n divergence: THREE.WebGLRenderTarget;\n pressure: DoubleRenderTarget;\n };\n output: THREE.Texture;\n};\n\nexport const FLUID_PARAMS: FluidParams = {\n density_dissipation: 0.98,\n velocity_dissipation: 0.99,\n velocity_acceleration: 10.0,\n pressure_dissipation: 0.9,\n pressure_iterations: 20,\n curl_strength: 35,\n splat_radius: 0.002,\n fluid_color: new THREE.Vector3(1.0, 1.0, 1.0),\n pointerValues: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const [materials, setMeshMaterial] = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n samples,\n }),\n [scene, camera, size, samples]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const lastTime = useRef(0);\n const scaledDiffVec = useRef(new THREE.Vector2(0, 0));\n const spaltVec = useRef(new THREE.Vector3(0, 0, 0));\n\n const [params, setParams] = useParams(FLUID_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FluidParams) => {\n const { gl, pointer, clock, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (lastTime.current === 0) {\n lastTime.current = clock.getElapsedTime();\n }\n const dt = Math.min(\n (clock.getElapsedTime() - lastTime.current) / 3,\n 0.02\n );\n lastTime.current = clock.getElapsedTime();\n\n // update velocity\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", read);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(materials.advectionMaterial, \"dt\", dt);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.velocity_dissipation!\n );\n });\n\n // update density\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", velocityTex);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.density_dissipation!\n );\n });\n\n // update splatting\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n setUniform(materials.splatMaterial, \"uTarget\", read);\n setUniform(\n materials.splatMaterial,\n \"point\",\n pointerValues.currentPointer\n );\n const scaledDiff = pointerValues.diffPointer.multiply(\n scaledDiffVec.current\n .set(size.width, size.height)\n .multiplyScalar(params.velocity_acceleration!)\n );\n setUniform(\n materials.splatMaterial,\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n setUniform(\n materials.splatMaterial,\n \"radius\",\n params.splat_radius!\n );\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n setUniform(materials.splatMaterial, \"uTarget\", read);\n const color: THREE.Vector3 =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(pointerValues.velocity)\n : params.fluid_color!;\n setUniform(materials.splatMaterial, \"color\", color);\n });\n }\n\n // update curl\n const curlTex = updateCurlFBO(gl, () => {\n setMeshMaterial(materials.curlMaterial);\n setUniform(materials.curlMaterial, \"uVelocity\", velocityTex);\n });\n\n // update vorticity\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.vorticityMaterial);\n setUniform(materials.vorticityMaterial, \"uVelocity\", read);\n setUniform(materials.vorticityMaterial, \"uCurl\", curlTex);\n setUniform(\n materials.vorticityMaterial,\n \"curl\",\n params.curl_strength!\n );\n setUniform(materials.vorticityMaterial, \"dt\", dt);\n });\n\n // update divergence\n const divergenceTex = updateDivergenceFBO(gl, () => {\n setMeshMaterial(materials.divergenceMaterial);\n setUniform(materials.divergenceMaterial, \"uVelocity\", velocityTex);\n });\n\n // update pressure\n updatePressureFBO(gl, ({ read }) => {\n setMeshMaterial(materials.clearMaterial);\n setUniform(materials.clearMaterial, \"uTexture\", read);\n setUniform(\n materials.clearMaterial,\n \"value\",\n params.pressure_dissipation!\n );\n });\n\n // solve pressure iterative (Gauss-Seidel)\n setMeshMaterial(materials.pressureMaterial);\n setUniform(materials.pressureMaterial, \"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressure_iterations!; i++) {\n pressureTexTemp = updatePressureFBO(gl, ({ read }) => {\n setUniform(materials.pressureMaterial, \"uPressure\", read);\n });\n }\n\n // update gradienSubtract\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.gradientSubtractMaterial);\n setUniform(\n materials.gradientSubtractMaterial,\n \"uPressure\",\n pressureTexTemp\n );\n setUniform(materials.gradientSubtractMaterial, \"uVelocity\", read);\n });\n\n return densityTex;\n },\n [\n materials,\n setMeshMaterial,\n updateCurlFBO,\n updateDensityFBO,\n updateDivergenceFBO,\n updatePointer,\n updatePressureFBO,\n updateVelocityFBO,\n setParams,\n params,\n ]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n materials: materials,\n camera: camera,\n renderTarget: {\n velocity: velocityFBO,\n density: densityFBO,\n curl: curlFBO,\n divergence: divergenceFBO,\n pressure: pressureFBO,\n },\n output: densityFBO.read.texture,\n },\n ];\n};\n","import { useEffect, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\n\ntype UseMeshProps = {\n scale: number;\n max: number;\n texture?: THREE.Texture;\n scene: THREE.Scene;\n};\n\nexport const useMesh = ({ scale, max, texture, scene }: UseMeshProps) => {\n const meshArr = useRef([]);\n const geometry = useMemo(\n () => new THREE.PlaneGeometry(scale, scale),\n [scale]\n );\n const material = useMemo(\n () =>\n new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthTest: false,\n depthWrite: false,\n }),\n [texture]\n );\n\n useEffect(() => {\n for (let i = 0; i < max; i++) {\n const mesh = new THREE.Mesh(geometry.clone(), material.clone());\n mesh.rotateZ(2 * Math.PI * Math.random());\n mesh.visible = false;\n scene.add(mesh);\n meshArr.current.push(mesh);\n }\n }, [geometry, material, scene, max]);\n\n useEffect(() => {\n return () => {\n meshArr.current.forEach((mesh) => {\n mesh.geometry.dispose();\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((material) => material.dispose());\n } else {\n mesh.material.dispose();\n }\n scene.remove(mesh);\n });\n meshArr.current = [];\n };\n }, [scene]);\n\n return meshArr.current;\n};\n","import { useCallback, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { usePointer, PointerValues } from \"../../../misc/usePointer\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type RippleParams = {\n /** How often ripples appear,default:0.01 */\n frequency?: number;\n /** rotation rate,default:0.05 */\n rotation?: number;\n /** fadeout speed,default:0.9 */\n fadeout_speed?: number;\n /** scale rate,default:0.3 */\n scale?: number;\n /** alpha,default:0.6 */\n alpha?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default:false */\n pointerValues?: PointerValues | false;\n};\n\nexport type RippleObject = {\n scene: THREE.Scene;\n meshArr: THREE.Mesh[];\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const RIPPLE_PARAMS: RippleParams = {\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n pointerValues: false,\n};\n\ninterface UseRippleProps extends HooksProps {\n /** texture applied to ripple */\n texture?: THREE.Texture;\n /** ripple size, default:64 */\n scale?: number;\n /** ripple max length, default:100 */\n max?: number;\n}\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useRipple = ({\n texture = new THREE.Texture(),\n scale = 64,\n max = 100,\n size,\n dpr,\n samples = 0,\n}: UseRippleProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: RippleParams) => {\n const { gl, pointer, size } = props;\n\n updateParams && setParams(updateParams);\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (params.frequency! < pointerValues.diffPointer.length()) {\n const mesh = meshArr[currentWave.current];\n mesh.visible = true;\n mesh.position.set(\n pointerValues.currentPointer.x * (size.width / 2),\n pointerValues.currentPointer.y * (size.height / 2),\n 0\n );\n mesh.scale.x = mesh.scale.y = 0.0;\n (mesh.material as THREE.MeshBasicMaterial).opacity = params.alpha!;\n currentWave.current = (currentWave.current + 1) % max;\n }\n meshArr.forEach((mesh) => {\n if (mesh.visible) {\n const material = mesh.material as THREE.MeshBasicMaterial;\n mesh.rotation.z += params.rotation!;\n material.opacity *= params.fadeout_speed!;\n mesh.scale.x =\n params.fadeout_speed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n if (material.opacity < 0.002) mesh.visible = false;\n }\n });\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, meshArr, updatePointer, max, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n camera: camera,\n meshArr: meshArr,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform float uTime;\nuniform float timeStrength;\nuniform int noiseOctaves;\nuniform int fbmOctaves;\nuniform int warpOctaves;\nuniform vec2 warpDirection;\nuniform float warpStrength;\nuniform float scale;\n\nconst float per = 0.5;\nconst float PI = 3.14159265359;\n\nfloat rnd(vec2 n) {\n\tfloat a = 0.129898;\n\tfloat b = 0.78233;\n\tfloat c = 437.585453;\n\tfloat dt= dot(n ,vec2(a, b));\n\tfloat sn= mod(dt, PI);\n\treturn fract(sin(sn) * c);\n}\n\nfloat interpolate(float a, float b, float x){\n float f = (1.0 - cos(x * PI)) * 0.5;\n return a * (1.0 - f) + b * f;\n}\n\nfloat irnd(vec2 p){\n\tvec2 i = floor(p);\n\tvec2 f = fract(p);\n\tvec4 v = vec4(rnd(vec2(i.x,i.y)),rnd(vec2(i.x + 1.0,i.y)),rnd(vec2(i.x,i.y + 1.0)),rnd(vec2(i.x + 1.0, i.y + 1.0)));\n\treturn interpolate(interpolate(v.x, v.y, f.x), interpolate(v.z, v.w, f.x), f.y);\n}\n\n// Based on The Book of Shaders\n// https://thebookofshaders.com/13/\nfloat noise(vec2 p, float time){\n\tfloat t = 0.0;\n\tfor(int i = 0; i < noiseOctaves; i++){\n\t\tfloat freq = pow(2.0, float(i));\n\t\tfloat amp = pow(per, float(noiseOctaves - i));\n\t\tt += irnd(vec2(p.y / freq + time, p.x / freq + time)) * amp;\n\t}\n\treturn t;\n}\n\nfloat fbm(vec2 x, float time) {\n\tfloat v = 0.0;\n\tfloat a = 0.5;\n\tvec2 shift = vec2(100);\n\tmat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5));\n\tfloat sign = 1.0;\n\tfor (int i = 0; i < fbmOctaves; ++i) {\n\t\tv += a * noise(x, time * sign);\n\t\tx = rot * x * 2.0 + shift;\n\t\ta *= 0.5;\n\t\tsign *= -1.0;\n\t}\n\treturn v;\n}\n\nfloat warp(vec2 x, float g,float time){\n\tfloat val = 0.0;\n\tfor (int i = 0; i < warpOctaves; i++){\n\t\tval = fbm(x + g * vec2(cos(warpDirection.x * val), sin(warpDirection.y * val)), time);\n\t}\n\treturn val;\n}\n\nvoid main() {\n\tfloat noise = warp(gl_FragCoord.xy * scale ,warpStrength,uTime * timeStrength);\n\tgl_FragColor = vec4(vec3(noise),1.0);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class NoiseMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTime: { value: number };\n scale: { value: number };\n timeStrength: { value: number };\n noiseOctaves: { value: number };\n fbmOctaves: { value: number };\n warpOctaves: { value: number };\n warpDirection: { value: THREE.Vector2 };\n warpStrength: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: 0.0 },\n timeStrength: { value: 0.0 },\n noiseOctaves: { value: 0 },\n fbmOctaves: { value: 0 },\n warpOctaves: { value: 0 },\n warpDirection: { value: new THREE.Vector2() },\n warpStrength: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as NoiseMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\n\nexport type NoiseParams = {\n /** noise scale , default:0.004 */\n scale?: number;\n /** time factor default:0.3 */\n timeStrength?: number;\n /** noiseOctaves, affects performance default:2 */\n noiseOctaves?: number;\n /** fbmOctaves, affects performance default:2 */\n fbmOctaves?: number;\n /** domain warping octaves , affects performance default:2 */\n warpOctaves?: number;\n /** direction of domain warping , default:(2.0,2,0) */\n warpDirection?: THREE.Vector2;\n /** strength of domain warping , default:8.0 */\n warpStrength?: number;\n /** you can get into the rhythm ♪ , default:false */\n beat?: number | false;\n};\n\nexport type NoiseObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const NOISE_PARAMS: NoiseParams = {\n scale: 0.004,\n timeStrength: 0.3,\n noiseOctaves: 2,\n fbmOctaves: 2,\n warpOctaves: 2,\n warpDirection: new THREE.Vector2(2.0, 2.0),\n warpStrength: 8.0,\n beat: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n *\n * It is a basic value noise with `fbm` and `domain warping`\n */\nexport const useNoise = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: NoiseParams) => {\n const { gl, clock } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"scale\", params.scale!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n setUniform(material, \"noiseOctaves\", params.noiseOctaves!);\n setUniform(material, \"fbmOctaves\", params.fbmOctaves!);\n setUniform(material, \"warpOctaves\", params.warpOctaves!);\n setUniform(material, \"warpDirection\", params.warpDirection!);\n setUniform(material, \"warpStrength\", params.warpStrength!);\n\n setUniform(material, \"uTime\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D uTexture;\nuniform bool isTexture;\nuniform sampler2D noise;\nuniform bool isNoise;\nuniform vec2 noiseStrength;\nuniform float laminateLayer;\nuniform vec2 laminateInterval;\nuniform vec2 laminateDetail;\nuniform vec2 distortion;\nuniform vec3 colorFactor;\nuniform float uTime;\nuniform vec2 timeStrength;\nuniform float scale;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 pos = isTexture ? texture2D(uTexture, uv).rg : uv * scale;\n\tvec2 noise = isNoise ? texture2D(noise, uv).rg : vec2(0.0);\n\tfloat alpha = isTexture ? texture2D(uTexture, uv).a : 1.0;\n\t\n\t// Avoid floating point bugs caused by GPU drivers.\n\talpha = (alpha < 1e-10) ? 0.0 : alpha;\n\n\tvec3 col;\n\tfor(float j = 0.0; j < 3.0; j++){\n\t\tfor(float i = 1.0; i < laminateLayer; i++){\n\t\t\tfloat timeNoiseSin = sin(uTime / (i + j)) * timeStrength.x + noise.r * noiseStrength.x;\n\t\t\tfloat timeNoiseCos = cos(uTime / (i + j)) * timeStrength.y + noise.g * noiseStrength.y;\n\t\t\tpos.x += laminateInterval.x / (i + j) * cos(i * distortion.x * pos.y + timeNoiseSin + sin(i + j));\n\t\t\tpos.y += laminateInterval.y / (i + j) * cos(i * distortion.y * pos.x + timeNoiseCos + sin(i + j));\n\t\t}\n\t\tcol[int(j)] = sin(pow(pos.x, 2.) * pow(laminateDetail.x, 2.)) + sin(pow(pos.y, 2.) * pow(laminateDetail.y, 2.));\n\t}\n\n\tcol *= colorFactor * alpha;\n\tcol = clamp(col, 0.0, 1.0);\n\t\n\tgl_FragColor = vec4(col, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class ColorStrataMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n isTexture: { value: boolean };\n scale: { value: number };\n noise: { value: THREE.Texture };\n noiseStrength: { value: THREE.Vector2 };\n isNoise: { value: boolean };\n laminateLayer: { value: number };\n laminateInterval: { value: THREE.Vector2 };\n laminateDetail: { value: THREE.Vector2 };\n distortion: { value: THREE.Vector2 };\n colorFactor: { value: THREE.Vector3 };\n uTime: { value: number };\n timeStrength: { value: THREE.Vector2 };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n isTexture: { value: false },\n scale: { value: 1.0 },\n noise: { value: new THREE.Texture() },\n noiseStrength: { value: new THREE.Vector2(0, 0) },\n isNoise: { value: false },\n laminateLayer: { value: 1.0 },\n laminateInterval: { value: new THREE.Vector2(0.1, 0.1) },\n laminateDetail: { value: new THREE.Vector2(1, 1) },\n distortion: { value: new THREE.Vector2(0, 0) },\n colorFactor: { value: new THREE.Vector3(1, 1, 1) },\n uTime: { value: 0 },\n timeStrength: { value: new THREE.Vector2(0, 0) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as ColorStrataMaterial;\n\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type ColorStrataParams = {\n /** default: null */\n texture?: THREE.Texture | false;\n /** Valid when texture is false. default : 1 */\n scale?: number;\n /** default: 1.0 */\n laminateLayer?: number;\n /** default: (0.1, 0.1) */\n laminateInterval?: THREE.Vector2;\n /** default: (1.0, 1.0) */\n laminateDetail?: THREE.Vector2;\n /** default: (0.0, 0.0) */\n distortion?: THREE.Vector2;\n /** default: (1.0, 1.0,1.0) */\n colorFactor?: THREE.Vector3;\n /** default: (0.0, 0.0) */\n timeStrength?: THREE.Vector2;\n /** default:false */\n noise?: THREE.Texture | false;\n /** default : (0.0,0.0) */\n noiseStrength?: THREE.Vector2;\n /** you can get into the rhythm ♪ , default:false */\n beat?: number | false;\n};\n\nexport type ColorStrataObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COLORSTRATA_PARAMS: ColorStrataParams = {\n texture: false,\n scale: 1.0,\n laminateLayer: 1.0,\n laminateInterval: new THREE.Vector2(0.1, 0.1),\n laminateDetail: new THREE.Vector2(1, 1),\n distortion: new THREE.Vector2(0, 0),\n colorFactor: new THREE.Vector3(1, 1, 1),\n timeStrength: new THREE.Vector2(0, 0),\n noise: false,\n noiseStrength: new THREE.Vector2(0, 0),\n beat: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useColorStrata = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ColorStrataParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n if (params.texture) {\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"isTexture\", true);\n } else {\n setUniform(material, \"isTexture\", false);\n setUniform(material, \"scale\", params.scale!);\n }\n\n if (params.noise) {\n setUniform(material, \"noise\", params.noise);\n setUniform(material, \"isNoise\", true);\n setUniform(material, \"noiseStrength\", params.noiseStrength!);\n } else {\n setUniform(material, \"isNoise\", false);\n }\n\n setUniform(material, \"uTime\", params.beat || clock.getElapsedTime());\n\n setUniform(material, \"laminateLayer\", params.laminateLayer!);\n setUniform(material, \"laminateInterval\", params.laminateInterval!);\n setUniform(material, \"laminateDetail\", params.laminateDetail!);\n setUniform(material, \"distortion\", params.distortion!);\n setUniform(material, \"colorFactor\", params.colorFactor!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform float u_time;\nuniform float u_pattern;\nuniform float u_complexity;\nuniform float u_complexityAttenuation;\nuniform float u_iterations;\nuniform float u_timeStrength;\nuniform float u_scale;\n\nvec3 marble(vec3 p){\n\tvec4 n;\n\tfor(float i;i {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_time: { value: 0 },\n u_pattern: { value: 0 },\n u_complexity: { value: 0 },\n u_complexityAttenuation: { value: 0 },\n u_iterations: { value: 0 },\n u_timeStrength: { value: 0 },\n u_scale: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as MarbleMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type MarbleParams = {\n /** You can add random patterns to noise by passing random numbers ,default:0 */\n pattern?: number;\n /** default:2 */\n complexity?: number;\n /** default:0.2 */\n complexityAttenuation?: number;\n /** default:8 */\n iterations?: number;\n /** default:0.2 */\n timeStrength?: number;\n /** default:0.002 */\n scale?: number;\n /** you can get into the rhythm ♪ , default:false */\n beat?: number | false;\n};\n\nexport type MarbleObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MARBLE_PARAMS: MarbleParams = {\n pattern: 0,\n complexity: 2,\n complexityAttenuation: 0.2,\n iterations: 8,\n timeStrength: 0.2,\n scale: 0.002,\n beat: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMarble = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: MarbleParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n setUniform(material, \"u_pattern\", params.pattern!);\n setUniform(material, \"u_complexity\", params.complexity!);\n setUniform(\n material,\n \"u_complexityAttenuation\",\n params.complexityAttenuation!\n );\n setUniform(material, \"u_iterations\", params.iterations!);\n setUniform(material, \"u_timeStrength\", params.timeStrength!);\n setUniform(material, \"u_scale\", params.scale!);\n\n setUniform(material, \"u_time\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\nuniform vec3 uColor4;\nuniform vec3 uRgbWeight;\n\n\n// Based on glsl-cos-palette by Erkaman\n// https://github.com/Erkaman/glsl-cos-palette\nvec3 cosPalette( float t, vec3 color1, vec3 color2, vec3 color3, vec3 color4 ){\n return color1 + color2 * cos( 6.28318 * ( color3 * t + color4) );\n}\n\nvoid main() {\n\n\tvec4 tex = texture2D(uTexture, vUv);\n\tfloat gray = dot(tex.rgb, uRgbWeight);\t\t\n\n\tvec3 outColor = cosPalette(\n\t\tgray,\n\t\tuColor1,\n\t\tuColor2,\n\t\tuColor3,\n\t\tuColor4\n\t);\n\n\tgl_FragColor = vec4(outColor, tex.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class CosPaletteMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uRgbWeight: { value: THREE.Vector3 };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColor4: { value: THREE.Color };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uRgbWeight: { value: new THREE.Vector3(0.299, 0.587, 0.114) },\n uColor1: { value: new THREE.Color().set(0.5, 0.5, 0.5) },\n uColor2: { value: new THREE.Color().set(0.5, 0.5, 0.5) },\n uColor3: { value: new THREE.Color().set(1, 1, 1) },\n uColor4: { value: new THREE.Color().set(0, 0.1, 0.2) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as CosPaletteMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\n\nexport type CosPaletteParams = {\n /** color1, default:rgb(50%, 50%, 50%) */\n color1?: THREE.Color;\n /** color2, default:rgb(50%, 50%, 50%) */\n color2?: THREE.Color;\n /** color3, default:rgb(100%, 100%, 100%) */\n color3?: THREE.Color;\n /** color4, default:rgb(0%, 10%, 20%) */\n color4?: THREE.Color;\n /** texture to be used as a palette */\n texture?: THREE.Texture;\n /** weight of the rgb, default:THREE.Vector3(1.0,0.0,0.0) */\n rgbWeight?: THREE.Vector3;\n};\n\nexport type ColorPaletteObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COSPALETTE_PARAMS: CosPaletteParams = {\n texture: new THREE.Texture(),\n color1: new THREE.Color().set(0.5, 0.5, 0.5),\n color2: new THREE.Color().set(0.5, 0.5, 0.5),\n color3: new THREE.Color().set(1, 1, 1),\n color4: new THREE.Color().set(0, 0.1, 0.2),\n rgbWeight: new THREE.Vector3(0.299, 0.587, 0.114),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCosPalette = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: CosPaletteParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor1\", params.color1!);\n setUniform(material, \"uColor2\", params.color2!);\n setUniform(material, \"uColor3\", params.color3!);\n setUniform(material, \"uColor4\", params.color4!);\n setUniform(material, \"uRgbWeight\", params.rgbWeight!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 texColor = texture2D(uTexture, uv);\n\tfloat grayscale = dot(texColor.rgb, vec3(0.299, 0.587, 0.114));\n\tvec3 duotone = mix(uColor0, uColor1, grayscale);\n\tgl_FragColor = vec4(duotone, texColor.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class DuoToneMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uColor0: { value: new THREE.Color(0xffffff) },\n uColor1: { value: new THREE.Color(0x000000) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as DuoToneMaterial;\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { DuoToneMaterial, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** 1st color , Default:new THREE.Color(0xffffff) */\n color0?: THREE.Color;\n /** 2nd color , Default: new THREE.Color(0x000000) */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n material: DuoToneMaterial;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const DUOTONE_PARAMS: DuoToneParams = {\n texture: new THREE.Texture(),\n color0: new THREE.Color(0xffffff),\n color1: new THREE.Color(0x000000),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useDuoTone = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DuoToneParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor0\", params.color0!);\n setUniform(material, \"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D u_map;\nuniform bool u_isAlphaMap;\nuniform sampler2D u_alphaMap;\nuniform float u_mapIntensity;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\nuniform vec3 u_dodgeColor;\nuniform bool u_isDodgeColor;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\t// fx blending\n\tvec3 mapColor = texture2D(u_map, uv).rgb;\n\tvec3 normalizedMap = mapColor * 2.0 - 1.0;\n\n\tuv = uv * 2.0 - 1.0;\n\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), u_mapIntensity);\n\tuv = (uv + 1.0) / 2.0;\n\n\t// colro blending\n\tfloat brightness = dot(mapColor,u_brightness);\n\tvec4 textureMap = texture2D(u_texture, uv);\n\tfloat blendValue = smoothstep(u_min, u_max, brightness);\n\n\t// set dodge color\n\tvec3 dodgeColor = u_isDodgeColor ? u_dodgeColor : mapColor;\n\tvec3 outputColor = blendValue * dodgeColor + (1.0 - blendValue) * textureMap.rgb;\n\t\n\t// alpha blending\n\tfloat alpha = u_isAlphaMap ? texture2D(u_alphaMap, uv).a : textureMap.a;\n\tfloat mixValue = u_isAlphaMap ? alpha : 0.0;\n\tvec3 alphColor = mix(outputColor,mapColor,mixValue);\n\n\tgl_FragColor = vec4(alphColor, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class BlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_map: { value: THREE.Texture };\n u_alphaMap: { value: THREE.Texture };\n u_isAlphaMap: { value: boolean };\n u_mapIntensity: { value: number };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n u_dodgeColor: { value: THREE.Color };\n u_isDodgeColor: { value: boolean };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_map: { value: new THREE.Texture() },\n u_alphaMap: { value: new THREE.Texture() },\n u_isAlphaMap: { value: false },\n u_mapIntensity: { value: 0.0 },\n u_brightness: { value: new THREE.Vector3() },\n u_min: { value: 0.0 },\n u_max: { value: 0.9 },\n u_dodgeColor: { value: new THREE.Color(0xffffff) },\n u_isDodgeColor: { value: false },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as BlendingMaterial;\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type BlendingParams = {\n /** Make this texture Blending , default:THREE.Texture */\n texture?: THREE.Texture;\n /** map texture, default:THREE.Texture */\n map?: THREE.Texture;\n /** map strength , r,g value are affecting , default:0.3 */\n mapIntensity?: number;\n /** Alpha blending is performed using the alpha of the set texture. , default:false */\n alphaMap?: THREE.Texture | false;\n /** default:(0.5,0.5,0.5) */\n brightness?: THREE.Vector3;\n /** default:0.0 */\n min?: number;\n /** default:1.0 */\n max?: number;\n /** If set, this value will apply color dodge , default: false */\n dodgeColor?: THREE.Color | false;\n};\n\nexport type BlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BLENDING_PARAMS: BlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n alphaMap: false,\n mapIntensity: 0.3,\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n dodgeColor: false,\n};\n\n/**\n * Blend map to texture. You can set the threshold for blending with brightness. You can set the dodge color by setting color. \nIf you don't want to reflect the map's color, you can use useFxBlending instead.\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n\n if (params.alphaMap) {\n setUniform(material, \"u_alphaMap\", params.alphaMap!);\n setUniform(material, \"u_isAlphaMap\", true);\n } else {\n setUniform(material, \"u_isAlphaMap\", false);\n }\n\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n if (params.dodgeColor) {\n setUniform(material, \"u_dodgeColor\", params.dodgeColor);\n setUniform(material, \"u_isDodgeColor\", true);\n } else {\n setUniform(material, \"u_isDodgeColor\", false);\n }\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture0;\nuniform sampler2D uTexture1;\nuniform sampler2D uMap;\nuniform float mapIntensity;\nuniform float edgeIntensity;\nuniform float progress;\nuniform float dirX;\nuniform float dirY;\nuniform vec2 epicenter;\nuniform float padding;\n\nbool isInPaddingArea(vec2 uv) {\n return uv.x < padding || uv.x > 1.0 - padding || uv.y < padding || uv.y > 1.0 - padding;\n}\n\nvoid main() {\n\tfloat screenAspect = uResolution.x / uResolution.y;\n\tfloat textureAspect = uTextureResolution.x / uTextureResolution.y;\n\tvec2 aspectRatio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\tvec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;\n\n\t// fx map\n\tvec2 map = texture2D(uMap, uv).rg;\n\tvec2 normalizedMap = map * 2.0 - 1.0;\n\n\t// multiply edge fx\n\tuv = uv * 2.0 - 1.0;\n\tuv *= map * distance(epicenter, uv) * edgeIntensity + 1.0;\n\tuv = (uv + 1.0) / 2.0;\n\n\t// padding\n\tif (isInPaddingArea(uv)) {\n\t\tgl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n\t\treturn;\n\t}\n\tvec2 paddedUV = uv * (1.0 - 2.0 * padding * -1.) + padding * -1.;\n\n\t// centered uv\n\tvec2 centeredUV = paddedUV - vec2(0.5);\n\n\t// multiply map fx\n\tcenteredUV *= normalizedMap * map * mapIntensity + 1.0;\n\n\t// texture 0\n\tfloat xOffsetTexture0 = 0.5 - dirX * progress;\n\tfloat yOffsetTexture0 = 0.5 - dirY * progress;\n\tvec2 samplePosTexture0 = vec2(xOffsetTexture0, yOffsetTexture0) + centeredUV;\n\n\t//texture 1\n\tfloat xOffsetTexture1 = 0.5 + dirX * (1.0 - progress);\n\tfloat yOffsetTexture1 = 0.5 + dirY * (1.0 - progress);\n\tvec2 samplePosTexture1 = vec2(xOffsetTexture1, yOffsetTexture1) + centeredUV;\n\n\tvec4 color0 = texture2D(uTexture0, samplePosTexture0);\n\tvec4 color1 = texture2D(uTexture1, samplePosTexture1);\n\n\tgl_FragColor = mix(color0, color1, progress);\n\n}","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class FxTextureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uTextureResolution: { value: THREE.Vector2 };\n uTexture0: { value: THREE.Texture };\n uTexture1: { value: THREE.Texture };\n padding: { value: number };\n uMap: { value: THREE.Texture };\n edgeIntensity: { value: number };\n mapIntensity: { value: number };\n epicenter: { value: THREE.Vector2 };\n progress: { value: number };\n dirX: { value: number };\n dirY: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: new THREE.Texture() },\n uTexture1: { value: new THREE.Texture() },\n padding: { value: 0.0 },\n uMap: { value: new THREE.Texture() },\n edgeIntensity: { value: 0.0 },\n mapIntensity: { value: 0.0 },\n epicenter: { value: new THREE.Vector2(0.0, 0.0) },\n progress: { value: 0.0 },\n dirX: { value: 0.0 },\n dirY: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type FxTextureParams = {\n /** 1st texture , default:THREE.Texture() */\n texture0?: THREE.Texture;\n /** 2nd texture , default:THREE.Texture() */\n texture1?: THREE.Texture;\n /** add transparent padding, 0.0 ~ 1.0 , default:0.0 */\n padding?: number;\n /** The color map. The uv value is affected according to this rbg , default:THREE.Texture() */\n map?: THREE.Texture;\n /** intensity of map , r,g value are affecting , default:0.0 */\n mapIntensity?: number;\n /** Intensity of effect on edges , default:0.0 */\n edgeIntensity?: number;\n /** epicenter of fx, -1 ~ 1 , default:vec2(0.0,0.0)*/\n epicenter?: THREE.Vector2;\n /** Switch value to switch between texture0 and texture1 , 0 ~ 1 , default : 0 */\n progress?: number;\n /** direction of transition , default: THREE.Vector2(0, 0) */\n dir?: THREE.Vector2;\n};\n\nexport type FxTextureObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const FXTEXTURE_PARAMS: FxTextureParams = {\n texture0: new THREE.Texture(),\n texture1: new THREE.Texture(),\n padding: 0.0,\n map: new THREE.Texture(),\n mapIntensity: 0.0,\n edgeIntensity: 0.0,\n epicenter: new THREE.Vector2(0, 0),\n progress: 0.0,\n dir: new THREE.Vector2(0, 0),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxTexture = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture0\", params.texture0!);\n setUniform(material, \"uTexture1\", params.texture1!);\n\n setUniform(material, \"progress\", params.progress!);\n\n // calculate resolution by linear interpolation.\n const tex0Res = [\n params.texture0!?.image?.width || 0,\n params.texture0!?.image?.height || 0,\n ];\n const tex1Res = [\n params.texture1!?.image?.width || 0,\n params.texture1!?.image?.height || 0,\n ];\n const interpolatedResolution = tex0Res.map((value, index) => {\n return value + (tex1Res[index] - value) * params.progress!;\n });\n setUniform(material, \"uTextureResolution\", interpolatedResolution);\n\n setUniform(material, \"padding\", params.padding!);\n setUniform(material, \"uMap\", params.map!);\n setUniform(material, \"mapIntensity\", params.mapIntensity!);\n setUniform(material, \"edgeIntensity\", params.edgeIntensity!);\n setUniform(material, \"epicenter\", params.epicenter!);\n setUniform(material, \"dirX\", params.dir!.x);\n setUniform(material, \"dirY\", params.dir!.y);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec3 color = texture2D(u_texture, uv).rgb;\n\tfloat brightness = dot(color,u_brightness);\n\tfloat alpha = clamp(smoothstep(u_min, u_max, brightness),0.0,1.0);\n\tgl_FragColor = vec4(color, alpha);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class BrightnessPickerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_brightness: { value: new THREE.Vector3() },\n u_min: { value: 0.0 },\n u_max: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as BrightnessPickerMaterial;\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type BrightnessPickerParams = {\n /** pick brightness from this texture , default:THREE.Texture */\n texture?: THREE.Texture;\n /** default:(0.5,0.5,0.5) */\n brightness?: THREE.Vector3;\n /** default:0.0 */\n min?: number;\n /** default:1.0 */\n max?: number;\n};\n\nexport type BrightnessPickerObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRIGHTNESSPICKER_PARAMS: BrightnessPickerParams = {\n texture: new THREE.Texture(),\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrightnessPicker = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrightnessPickerParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D u_map;\nuniform float u_mapIntensity;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 mapColor = texture2D(u_map, uv).rg;\n\tvec2 normalizedMap = mapColor * 2.0 - 1.0;\n\t\n\tuv = uv * 2.0 - 1.0;\n\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), u_mapIntensity);\n\tuv = (uv + 1.0) / 2.0;\n\n\tgl_FragColor = texture2D(u_texture, uv);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class FxBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_map: { value: THREE.Texture };\n u_mapIntensity: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_map: { value: new THREE.Texture() },\n u_mapIntensity: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as FxBlendingMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type FxBlendingParams = {\n /** Make this texture Blending , default:THREE.Texture */\n texture?: THREE.Texture;\n /** map texture, default:THREE.Texture */\n map?: THREE.Texture;\n /** map strength , r,g value are affecting , default:0.3 */\n mapIntensity?: number;\n};\n\nexport type FxBlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const FXBLENDING_PARAMS: FxBlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n mapIntensity: 0.3,\n};\n\n/**\n * Blend map to texture. You can change the intensity of fx applied by the rg value of map. Unlike \"useBlending\", the map color is not reflected.\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxBlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n const bufferTexture = updateRenderTarget(gl);\n return bufferTexture;\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nuniform sampler2D uTexture;\nuniform sampler2D uMap;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 tex = texture2D(uTexture, uv);\n\tvec4 map = texture2D(uMap, uv);\n\tgl_FragColor = mix(tex,map,map.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class AlphaBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uMap: { value: THREE.Texture };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uMap: { value: new THREE.Texture() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as AlphaBlendingMaterial;\n\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\n\nexport type AlphaBlendingParams = {\n /** default:THREE.Texture()*/\n texture?: THREE.Texture;\n /** alpha map , default:THREE.Texture() */\n map?: THREE.Texture;\n};\n\nexport type AlphaBlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const ALPHABLENDING_PARAMS: AlphaBlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useAlphaBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] =\n useParams(ALPHABLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: AlphaBlendingParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uMap\", params.map!);\n\n return updateRenderTarget(gl);\n },\n [material, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform float u_brightness;\nuniform float u_saturation;\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class HSVMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: number };\n u_saturation: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_brightness: { value: 1 },\n u_saturation: { value: 1 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as HSVMaterial;\n\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\n\nexport type HSVParams = {\n /** default:THREE.Texture() */\n texture?: THREE.Texture;\n /** default:1 */\n brightness?: number;\n /** default:1 */\n saturation?: number;\n};\n\nexport type HSVObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const HSV_PARAMS: HSVParams = {\n texture: new THREE.Texture(),\n brightness: 1,\n saturation: 1,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useHSV = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(HSV_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: HSVParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_saturation\", params.saturation!);\n\n return updateRenderTarget(gl);\n },\n [material, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture;\n\nvoid main() {\n\tfloat screenAspect = uResolution.x / uResolution.y;\n\tfloat textureAspect = uTextureResolution.x / uTextureResolution.y;\n\tvec2 aspectRatio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\tvec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;\n\t\n\tgl_FragColor = texture2D(uTexture, uv);\n\n}","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class FxTextureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uTextureResolution: { value: THREE.Vector2 };\n uTexture: { value: THREE.Texture };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture: { value: new THREE.Texture() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type CoverTextureParams = {\n /** Textures that you want to display exactly on the screen , default:THREE.Texture() */\n texture?: THREE.Texture;\n};\n\nexport type CoverTextureObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COVERTEXTURE_PARAMS: CoverTextureParams = {\n texture: new THREE.Texture(),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCoverTexture = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: CoverTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uTextureResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","precision mediump float;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision mediump float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec2 uResolution;\nuniform float uBlurSize;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec2 perDivSize = uBlurSize / uResolution;\n\n\t// calc average color value from adjacent point\n\tvec4 outColor = vec4(\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, -1.0)) +\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 1.0))\n\t\t) / 9.0;\n\t\n\tgl_FragColor = outColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\n\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class SampleMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uResolution: { value: THREE.Vector2 };\n uBlurSize: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uBlurSize: { value: 1 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as SampleMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../../types\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** blurSize, default:3 */\n blurSize?: number;\n /** blurPower, affects performance default:5 */\n blurPower?: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const SIMPLEBLUR_PARAMS: SimpleBlurParams = {\n texture: new THREE.Texture(),\n blurSize: 3,\n blurPower: 5,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useSimpleBlur = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr,\n samples,\n }),\n [scene, camera, size, dpr, samples]\n );\n const [renderTarget, updateRenderTarget] = useSingleFBO(fboProps);\n const [_, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: SimpleBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n setUniform(material, \"uBlurSize\", params.blurSize!);\n\n let _tempTexture: THREE.Texture = updateTempTexture(gl);\n\n const iterations = params.blurPower!;\n for (let i = 0; i < iterations; i++) {\n setUniform(material, \"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateTempTexture, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform float uProgress;\nuniform float uStrength;\nuniform float uWidth;\nuniform vec2 uEpicenter;\nuniform int uMode;\n\nfloat PI = 3.141592653589;\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tfloat progress = min(uProgress, 1.0);\n\tfloat progressFactor = sin(progress * PI);\n\n\tfloat border = progress - progress * progressFactor * uWidth;\n\tfloat blur = uStrength * progressFactor;\n\t\n\t// 0 ~ 1\n\tvec2 normalizeCenter = (uEpicenter + 1.0) / 2.0;\n\n\t// 0:center 1:horizontal 2:vertical\n\tfloat dist = uMode == 0 ? length(uv - normalizeCenter) : uMode == 1 ? length(uv.x - normalizeCenter.x) : length(uv.y - normalizeCenter.y);\n\n\t// Calculate the maximum distance to the four corners of the screen\n\tfloat maxDistance = max(\n\t\tlength(vec2(0.0, 0.0) - normalizeCenter),\n\t\tmax(\n\t\t\t\tlength(vec2(1.0, 0.0) - normalizeCenter),\n\t\t\t\tmax(\n\t\t\t\t\tlength(vec2(0.0, 1.0) - normalizeCenter),\n\t\t\t\t\tlength(vec2(1.0, 1.0) - normalizeCenter)\n\t\t\t\t)\n\t\t)\n\t);\n\n\t// Scale distance so that waves extend to the edge of the screen\n\tdist = maxDistance > 0.0 ? dist / maxDistance : dist;\n\n\tvec3 color = vec3(smoothstep(border - blur, border, dist) -\n smoothstep(progress, progress + blur, dist));\n\t\n\t// Ensure color is 0 when progress is 0,1\n\tcolor *= progressFactor;\n\n\tgl_FragColor = vec4(color, 1.0);\n}\n\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class WaveMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uEpicenter: { value: THREE.Vector2 };\n uProgress: { value: number };\n uStrength: { value: number };\n uWidth: { value: number };\n uMode: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uEpicenter: { value: new THREE.Vector2(0.0, 0.0) },\n uProgress: { value: 0.0 },\n uStrength: { value: 0.0 },\n uWidth: { value: 0.0 },\n uMode: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n useAddMesh(scene, geometry, material);\n\n return material as WaveMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\n\nexport type WaveParams = {\n /** -1.0 ~ 1.0 , default:vec2(0.0,0.0) */\n epicenter?: THREE.Vector2;\n /** 0.0 ~ 1.0 , default:0.0 */\n progress?: number;\n /** default:0.0 */\n width?: number;\n /** default:0.0 */\n strength?: number;\n /** default:center */\n mode?: \"center\" | \"horizontal\" | \"vertical\";\n};\n\nexport type WaveObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WAVE_PARAMS: WaveParams = {\n epicenter: new THREE.Vector2(0.0, 0.0),\n progress: 0.0,\n width: 0.0,\n strength: 0.0,\n mode: \"center\",\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useWave = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: WaveParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uEpicenter\", params.epicenter!);\n setUniform(material, \"uProgress\", params.progress!);\n setUniform(material, \"uWidth\", params.width!);\n setUniform(material, \"uStrength\", params.strength!);\n setUniform(\n material,\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D u_texture;\nuniform vec2 u_resolution;\nuniform vec3 u_keyColor;\nuniform float u_similarity;\nuniform float u_smoothness;\nuniform float u_spill;\n\nuniform vec4 u_color;\nuniform float u_contrast;\nuniform float u_brightness;\nuniform float u_gamma;\n\n// From https://github.com/libretro/glsl-shaders/blob/master/nnedi3/shaders/rgb-to-yuv.glsl\nvec2 RGBtoUV(vec3 rgb) {\n return vec2(\n rgb.r * -0.169 + rgb.g * -0.331 + rgb.b * 0.5 + 0.5,\n rgb.r * 0.5 + rgb.g * -0.419 + rgb.b * -0.081 + 0.5\n );\n}\nfloat getChromeDist(vec3 texColor){\n\tfloat chromaDist = distance(RGBtoUV(texColor), RGBtoUV(u_keyColor));\n\treturn chromaDist;\n}\n\nfloat getBoxFilteredChromaDist(vec3 rgb, vec2 uv)\n{\n\tvec2 pixel_size = vec2(1.) / u_resolution;\n\tvec2 h_pixel_size = pixel_size / 2.0;\n\tvec2 point_0 = vec2(pixel_size.x, h_pixel_size.y);\n\tvec2 point_1 = vec2(h_pixel_size.x, -pixel_size.y);\n\tfloat distVal = getChromeDist(texture2D(u_texture,uv-point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv-point_1).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_1).rgb);\n\tdistVal *= 2.0;\n\tdistVal += getChromeDist(rgb);\n\treturn distVal / 9.0;\n}\n\nvec4 CalcColor(vec4 rgba)\n{\n\treturn vec4(pow(rgba.rgb, vec3(u_gamma, u_gamma, u_gamma)) * u_contrast + u_brightness, rgba.a);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tvec4 texColor = texture2D(u_texture, uv);\n\ttexColor.rgb *= (texColor.a > 0.) ? (1. / texColor.a) : 0.;\n\n\tfloat chromaDist = getBoxFilteredChromaDist(texColor.rgb,uv);\n\t\n\tfloat baseMask = chromaDist - u_similarity;\n\tfloat fullMask = pow(clamp(baseMask / u_smoothness, 0., 1.), 1.5);\n\t\n\ttexColor.rgba *= u_color;\n\ttexColor.a = fullMask;\n\n\tfloat spillVal = pow(clamp(baseMask / u_spill, 0., 1.), 1.5);\n\tfloat desat = clamp(texColor.r * 0.2126 + texColor.g * 0.7152 + texColor.b * 0.0722, 0., 1.);\n\ttexColor.rgb = mix(vec3(desat, desat, desat), texColor.rgb, spillVal);\n\n\tvec4 finColor = CalcColor(texColor);\n\n\tgl_FragColor = finColor;\n}","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useResolution } from \"../../../utils/useResolution\";\n\nexport class ChromaKeyMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_resolution: { value: THREE.Vector2 };\n u_keyColor: { value: THREE.Color };\n u_similarity: { value: number };\n u_smoothness: { value: number };\n u_spill: { value: number };\n u_color: { value: THREE.Vector4 };\n u_contrast: { value: number };\n u_brightness: { value: number };\n u_gamma: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_resolution: { value: new THREE.Vector2() },\n u_keyColor: { value: new THREE.Color() },\n u_similarity: { value: 0 },\n u_smoothness: { value: 0 },\n u_spill: { value: 0 },\n u_color: { value: new THREE.Vector4() },\n u_contrast: { value: 0 },\n u_brightness: { value: 0 },\n u_gamma: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as ChromaKeyMaterial;\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"u_resolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type ChromaKeyParams = {\n /** Process this texture with chroma key , default:THREE.Texture */\n texture?: THREE.Texture;\n /** key color for chromakey processing , default: THREE.Color(0x00ff00) */\n keyColor?: THREE.Color;\n /** If the similarity with the key color exceeds this value, it becomes transparent. , default: 0.2 */\n similarity?: number;\n /** smoothness , default : 0.1 */\n smoothness?: number;\n /** spill , default : 0.2 */\n spill?: number;\n /** tone correction , default : THREE.Vector4(1.0, 1.0, 1.0, 1.0) */\n color?: THREE.Vector4;\n /** contrast , default : 1.0 */\n contrast?: number;\n /** brightness , default : 0.0 */\n brightness?: number;\n /** gamma correction , default : 1.0 */\n gamma?: number;\n};\n\nexport type ChromaKeyObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const CHROMAKEY_PARAMS: ChromaKeyParams = {\n texture: new THREE.Texture(),\n keyColor: new THREE.Color(0x00ff00),\n similarity: 0.2,\n smoothness: 0.1,\n spill: 0.2,\n color: new THREE.Vector4(1.0, 1.0, 1.0, 1.0),\n contrast: 1.0,\n brightness: 0.0,\n gamma: 1.0,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useChromaKey = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ChromaKeyParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_keyColor\", params.keyColor!);\n setUniform(material, \"u_similarity\", params.similarity!);\n setUniform(material, \"u_smoothness\", params.smoothness!);\n setUniform(material, \"u_spill\", params.spill!);\n setUniform(material, \"u_color\", params.color!);\n setUniform(material, \"u_contrast\", params.contrast!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_gamma\", params.gamma!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { UseFboProps, renderFBO, FBO_OPTION } from \"./useSingleFBO\";\n\ntype UpdateCopyFunction = (\n gl: THREE.WebGLRenderer,\n index: number,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseCopyTextureReturn = [THREE.WebGLRenderTarget[], UpdateCopyFunction];\n\n/**\n * Generate an FBO array to copy the texture.\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @param length The number of FBOs to create\n * @returns [THREE.WebGLRenderTarget[] , updateCopyTexture] -Receives the RenderTarget array as the first argument and the update function as the second argument. updateCopyTexture() receives gl as the first argument and the index of the texture you want to copy as the second argument.\n */\nexport const useCopyTexture = (\n {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n }: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const renderTargetArr = useRef([]);\n const resolution = useResolution(size, dpr);\n\n renderTargetArr.current = useMemo(() => {\n return Array.from({ length }, () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n","export type EasingTypes =\n | \"easeInSine\"\n | \"easeOutSine\"\n | \"easeInOutSine\"\n | \"easeInQuad\"\n | \"easeOutQuad\"\n | \"easeInOutQuad\"\n | \"easeInCubic\"\n | \"easeOutCubic\"\n | \"easeInOutCubic\"\n | \"easeInQuart\"\n | \"easeOutQuart\"\n | \"easeInOutQuart\"\n | \"easeInQuint\"\n | \"easeOutQuint\"\n | \"easeInOutQuint\"\n | \"easeInExpo\"\n | \"easeOutExpo\"\n | \"easeInOutExpo\"\n | \"easeInCirc\"\n | \"easeOutCirc\"\n | \"easeInOutCirc\"\n | \"easeInBack\"\n | \"easeOutBack\"\n | \"easeInOutBack\"\n | \"easeInElastic\"\n | \"easeOutElastic\"\n | \"easeInOutElastic\"\n | \"easeInBounce\"\n | \"easeOutBounce\"\n | \"easeInOutBounce\";\n\ntype EasingFunctions = {\n [K in EasingTypes]: (x: number) => number;\n};\n\n/**\n * from https://github.com/ai/easings.net\n */\nexport const Easing: EasingFunctions = Object.freeze({\n easeInSine(x: number): number {\n return 1 - Math.cos((x * Math.PI) / 2);\n },\n easeOutSine(x: number): number {\n return Math.sin((x * Math.PI) / 2);\n },\n easeInOutSine(x: number): number {\n return -(Math.cos(Math.PI * x) - 1) / 2;\n },\n easeInQuad(x: number): number {\n return x * x;\n },\n easeOutQuad(x: number): number {\n return 1 - (1 - x) * (1 - x);\n },\n easeInOutQuad(x: number): number {\n return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2;\n },\n easeInCubic(x: number): number {\n return x * x * x;\n },\n easeOutCubic(x: number): number {\n return 1 - Math.pow(1 - x, 3);\n },\n easeInOutCubic(x: number): number {\n return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2;\n },\n easeInQuart(x: number): number {\n return x * x * x * x;\n },\n easeOutQuart(x: number): number {\n return 1 - Math.pow(1 - x, 4);\n },\n easeInOutQuart(x: number): number {\n return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2;\n },\n easeInQuint(x: number): number {\n return x * x * x * x * x;\n },\n easeOutQuint(x: number): number {\n return 1 - Math.pow(1 - x, 5);\n },\n easeInOutQuint(x: number): number {\n return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2;\n },\n easeInExpo(x: number): number {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n },\n easeOutExpo(x: number): number {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n },\n easeInOutExpo(x: number): number {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n },\n easeInCirc(x: number): number {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n },\n easeOutCirc(x: number): number {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n },\n easeInOutCirc(x: number): number {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n },\n easeInBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return c3 * x * x * x - c1 * x * x;\n },\n easeOutBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2);\n },\n easeInOutBack(x: number): number {\n const c1 = 1.70158;\n const c2 = c1 * 1.525;\n\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n },\n easeInElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n },\n easeOutElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;\n },\n easeInOutElastic(x: number): number {\n const c5 = (2 * Math.PI) / 4.5;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2\n : (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 +\n 1;\n },\n easeInBounce(x: number): number {\n return 1 - Easing.easeOutBounce(1 - x);\n },\n easeOutBounce(x: number): number {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n },\n easeInOutBounce(x: number): number {\n return x < 0.5\n ? (1 - Easing.easeOutBounce(1 - 2 * x)) / 2\n : (1 + Easing.easeOutBounce(2 * x - 1)) / 2;\n },\n});\n","import * as THREE from \"three\";\nimport { Easing, EasingTypes } from \"../libs/easing\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : 60\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\n\nexport class DomSyncerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_textureResolution: { value: THREE.Vector2 };\n u_resolution: { value: THREE.Vector2 };\n u_borderRadius: { value: number };\n };\n}\n\nexport const createMesh = ({\n params,\n size,\n scene,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n}) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mesh = new THREE.Mesh(\n new THREE.PlaneGeometry(1, 1),\n new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n transparent: true,\n uniforms: {\n u_texture: { value: texture },\n u_textureResolution: {\n value: new THREE.Vector2(0, 0),\n },\n u_resolution: { value: new THREE.Vector2(0, 0) },\n u_borderRadius: {\n value: params.boderRadius![i] ? params.boderRadius![i] : 0.0,\n },\n },\n })\n );\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { DomSyncerMaterial } from \"./createMesh\";\nimport { useCallback, useRef } from \"react\";\n\ntype UpdateDomRect = ({\n params,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n}: {\n params: DomSyncerParams;\n size: Size;\n resolutionRef: React.MutableRefObject;\n scene: THREE.Scene;\n isIntersectingRef: React.MutableRefObject;\n}) => void;\n\ntype UseUpdateDomRectReturn = [DOMRect[], UpdateDomRect];\n\nexport const useUpdateDomRect = (): UseUpdateDomRectReturn => {\n const domRects = useRef([]);\n\n const updateDomRects: UpdateDomRect = useCallback(\n ({ params, size, resolutionRef, scene, isIntersectingRef }) => {\n // Initialize domRects if the number of children in the scene is different from the number of DOMRect\n if (scene.children.length !== domRects.current!.length) {\n domRects.current = new Array(scene.children.length);\n }\n\n scene.children.forEach((mesh, i) => {\n const domElement = params.dom![i];\n if (!domElement) {\n return;\n }\n\n // DOMRect is updated even outside the intersection\n const rect = domElement.getBoundingClientRect();\n domRects.current[i] = rect;\n\n // Intersection cannot be determined accurately depending on the mobile navigation bar, so it seems better to update it constantly\n mesh.scale.set(rect.width, rect.height, 1.0);\n mesh.position.set(\n rect.left + rect.width * 0.5 - size.width * 0.5,\n -rect.top - rect.height * 0.5 + size.height * 0.5,\n 0.0\n );\n\n if (isIntersectingRef.current[i]) {\n if (params.rotation![i]) {\n mesh.rotation.copy(params.rotation![i]);\n }\n\n if (mesh instanceof THREE.Mesh) {\n const material: DomSyncerMaterial = mesh.material;\n setUniform(material, \"u_texture\", params.texture![i]);\n setUniform(material, \"u_textureResolution\", [\n params.texture![i]?.source?.data?.width || 0,\n params.texture![i]?.source?.data?.height || 0,\n ]);\n setUniform(\n material,\n \"u_resolution\",\n resolutionRef.current.set(rect.width, rect.height)\n );\n setUniform(\n material,\n \"u_borderRadius\",\n params.boderRadius![i] ? params.boderRadius![i] : 0.0\n );\n }\n }\n });\n },\n []\n );\n\n return [domRects.current, updateDomRects];\n};\n","import { useCallback, useRef } from \"react\";\n\nexport type IsIntersecting = (\n index: number,\n once?: boolean\n) => boolean[] | boolean;\n\nexport const useIsIntersecting = () => {\n const isIntersectingRef = useRef([]);\n const isIntersectingOnceRef = useRef([]);\n\n const isIntersecting: IsIntersecting = useCallback((index, once = false) => {\n isIntersectingRef.current.forEach((value, i) => {\n if (value) {\n isIntersectingOnceRef.current[i] = true;\n }\n });\n const temp = once\n ? [...isIntersectingOnceRef.current]\n : [...isIntersectingRef.current];\n return index < 0 ? temp : temp[index];\n }, []);\n\n return {\n isIntersectingRef,\n isIntersectingOnceRef,\n isIntersecting,\n };\n};\n","import { useEffect, useRef } from \"react\";\n\nexport type UseDomViewProps = {\n onView?: () => void;\n onHidden?: () => void;\n};\n\nexport type UseDomView = (props: UseDomViewProps) => void;\n\nexport const createUseDomView = (\n isIntersectingRef: React.MutableRefObject\n): UseDomView => {\n const useDomView = ({ onView, onHidden }: UseDomViewProps) => {\n const isView = useRef(false);\n useEffect(() => {\n let id: number;\n const filterIntersection = () => {\n if (isIntersectingRef.current.some((item) => item)) {\n if (!isView.current) {\n onView && onView();\n isView.current = true;\n }\n } else {\n if (isView.current) {\n onHidden && onHidden();\n isView.current = false;\n }\n }\n id = requestAnimationFrame(filterIntersection);\n };\n id = requestAnimationFrame(filterIntersection);\n return () => {\n cancelAnimationFrame(id);\n };\n }, [onView, onHidden]);\n };\n return useDomView;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef, useState, Key } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../../fxs/types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { errorHandler } from \"./utils/errorHandler\";\nimport { createMesh } from \"./utils/createMesh\";\nimport { useIntersectionHandler } from \"./utils/useIntersectionHandler\";\nimport { useUpdateDomRect } from \"./utils/useUpdateDomRect\";\nimport { useIsIntersecting, IsIntersecting } from \"./utils/useIsIntersecting\";\nimport { UseDomView, createUseDomView } from \"./utils/createUseDomView\";\n\nexport type DomSyncerParams = {\n /** DOM array you want to synchronize */\n dom?: (HTMLElement | Element | null)[];\n /** Texture array that you want to synchronize with the DOM rectangle */\n texture?: THREE.Texture[];\n /** default:0.0[] */\n boderRadius?: number[];\n /** the angle you want to rotate */\n rotation?: THREE.Euler[];\n /** Array of callback functions when crossed */\n onIntersect?: ((entry: IntersectionObserverEntry) => void)[];\n /** Because DOM rendering and React updates occur asynchronously, there may be a lag between updating dependent arrays and setting DOM arrays. That's what the Key is for. If the dependent array is updated but the Key is not, the loop will skip and return an empty texture. By updating the timing key when DOM acquisition is complete, you can perfectly synchronize DOM and Mesh updates.updateKey must be a unique value for each update, for example `performance.now()`.*/\n updateKey?: Key;\n};\n\nexport type DomSyncerObject = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n /**\n * A function that returns a determination whether the DOM intersects or not.\n * The boolean will be updated after executing the onIntersect function.\n * @param index - Index of the dom for which you want to return an intersection decision. -1 will return the entire array.\n * @param once - If set to true, it will continue to return true once crossed.\n */\n isIntersecting: IsIntersecting;\n /** target's DOMRect[] */\n DOMRects: DOMRect[];\n /** target's intersetions boolean[] */\n intersections: boolean[];\n /** You can set callbacks for when at least one DOM is visible and when it is completely hidden. */\n useDomView: UseDomView;\n};\n\nexport const DOMSYNCER_PARAMS: DomSyncerParams = {\n texture: [],\n dom: [],\n boderRadius: [],\n rotation: [],\n onIntersect: [],\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usedomsyncer\n * @param dependencies - When this dependency array is changed, the mesh and intersection judgment will be updated according to the passed DOM array.\n */\nexport const useDomSyncer = (\n { size, dpr, samples = 0 }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\n });\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useEffect(() => {\n setRefreshTrigger(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => new THREE.Texture(), []);\n\n // set intersection\n const intersectionHandler = useIntersectionHandler();\n const { isIntersectingOnceRef, isIntersectingRef, isIntersecting } =\n useIsIntersecting();\n\n // create useDomView\n const useDomView = createUseDomView(isIntersectingRef);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DomSyncerParams) => {\n const { gl, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (errorHandler(params)) {\n return emptyTexture;\n }\n\n if (refreshTrigger) {\n if (updateKey.current === params.updateKey) {\n return emptyTexture;\n } else {\n updateKey.current = params.updateKey!;\n }\n }\n\n if (refreshTrigger) {\n createMesh({\n params,\n size,\n scene,\n });\n\n intersectionHandler({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n });\n\n setRefreshTrigger(false);\n }\n\n updateDomRects({\n params,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n });\n\n return updateRenderTarget(gl);\n },\n [\n updateRenderTarget,\n setParams,\n intersectionHandler,\n updateDomRects,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n emptyTexture,\n ]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene,\n camera,\n renderTarget,\n output: renderTarget.texture,\n isIntersecting,\n DOMRects,\n intersections: isIntersectingRef.current,\n useDomView,\n },\n ];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","useAddMesh","scene","geometry","material","mesh","useEffect","setUniform","key","value","useMesh","vertexShader","fragmentShader","resolution","getCameraProps","width","height","frustumSize","aspect","w","h","useCamera","near","far","usePointer","lerp","prevPointer","useRef","diffPointer","lerpPointer","lastUpdateTime","velocity","isMoved","useCallback","currentPointer","now","current","deltaTime","isUpdate","prevTemp","useParams","params","paramsRef","obj","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","useLayoutEffect","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","BRUSH_PARAMS","useBrush","updatePointer","pressureEnd","props","pointer","pointerValues","color","init_default","useInitialMaterial","advection_default","useAdvectionMaterial","divergence_default","useDivergenceMaterial","pressure_default","usePressureMaterial","curl_default","useCurlMaterial","vorticity_default","useVorticityMaterial","clear_default","useClearMaterial","gradientSubtract_default","useGradientSubtractMaterial","splat_default","useSplateMaterial","initialMaterial","updateMaterial","curlMaterial","vorticityMaterial","advectionMaterial","divergenceMaterial","pressureMaterial","clearMaterial","gradientSubtractMaterial","splatMaterial","materials","setMeshMaterial","FLUID_PARAMS","useFluid","fboProps","velocityFBO","updateVelocityFBO","densityFBO","updateDensityFBO","curlFBO","updateCurlFBO","divergenceFBO","updateDivergenceFBO","pressureFBO","updatePressureFBO","lastTime","scaledDiffVec","spaltVec","clock","dt","velocityTex","densityTex","scaledDiff","curlTex","divergenceTex","pressureTexTemp","i","scale","max","texture","meshArr","RIPPLE_PARAMS","useRipple","currentWave","NOISE_PARAMS","useNoise","COLORSTRATA_PARAMS","useColorStrata","MARBLE_PARAMS","useMarble","COSPALETTE_PARAMS","useCosPalette","DUOTONE_PARAMS","useDuoTone","BLENDING_PARAMS","useBlending","FXTEXTURE_PARAMS","useFxTexture","tex0Res","_d","_c","tex1Res","_f","_e","_h","_g","interpolatedResolution","index","BRIGHTNESSPICKER_PARAMS","useBrightnessPicker","FXBLENDING_PARAMS","useFxBlending","ALPHABLENDING_PARAMS","useAlphaBlending","HSV_PARAMS","useHSV","COVERTEXTURE_PARAMS","useCoverTexture","SIMPLEBLUR_PARAMS","useSimpleBlur","_","updateTempTexture","_tempTexture","iterations","WAVE_PARAMS","useWave","CHROMAKEY_PARAMS","useChromaKey","useCopyTexture","length","renderTargetArr","updateCopyTexture","Easing","x","c2","c4","c5","getHash","input","n","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","hash","useFPSLimiter","fps","interval","prevTime","tick","errorHandler","domLength","textureLength","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","DOMRects","refreshTrigger","setRefreshTrigger","useState","updateKey","emptyTexture","intersectionHandler","useDomView"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"use-shader-fx.js","sources":["../src/fxs/interactions/useBrush/shader/main.vert","../src/fxs/interactions/useBrush/shader/main.frag","../src/utils/useResolution.ts","../src/utils/useAddMesh.ts","../src/utils/setUniforms.ts","../src/fxs/interactions/useBrush/useMesh.ts","../src/utils/useCamera.ts","../src/misc/usePointer.ts","../src/utils/useParams.ts","../src/utils/useSingleFBO.ts","../src/utils/useDoubleFBO.ts","../src/fxs/interactions/useBrush/index.ts","../src/fxs/interactions/useFluid/shaders/main.vert","../src/fxs/interactions/useFluid/shaders/init.frag","../src/fxs/interactions/useFluid/materials/useInitialMaterial.ts","../src/fxs/interactions/useFluid/shaders/advection.frag","../src/fxs/interactions/useFluid/materials/useAdvectionMaterial.ts","../src/fxs/interactions/useFluid/shaders/divergence.frag","../src/fxs/interactions/useFluid/materials/useDivergenceMaterial.ts","../src/fxs/interactions/useFluid/shaders/pressure.frag","../src/fxs/interactions/useFluid/materials/usePressureMaterial.ts","../src/fxs/interactions/useFluid/shaders/curl.frag","../src/fxs/interactions/useFluid/materials/useCurlMaterial.ts","../src/fxs/interactions/useFluid/shaders/vorticity.frag","../src/fxs/interactions/useFluid/materials/useVorticityMaterial.ts","../src/fxs/interactions/useFluid/shaders/clear.frag","../src/fxs/interactions/useFluid/materials/useClearMaterial.ts","../src/fxs/interactions/useFluid/shaders/gradientSubtract.frag","../src/fxs/interactions/useFluid/materials/useGradientSubtractMaterial.ts","../src/fxs/interactions/useFluid/shaders/splat.frag","../src/fxs/interactions/useFluid/materials/useSplatMaterial.ts","../src/fxs/interactions/useFluid/useMesh.ts","../src/fxs/interactions/useFluid/index.ts","../src/fxs/interactions/useRipple/useMesh.ts","../src/fxs/interactions/useRipple/index.ts","../src/fxs/noises/useNoise/shader/main.vert","../src/fxs/noises/useNoise/shader/main.frag","../src/fxs/noises/useNoise/useMesh.ts","../src/fxs/noises/useNoise/index.ts","../src/fxs/noises/useColorStrata/shader/main.vert","../src/fxs/noises/useColorStrata/shader/main.frag","../src/fxs/noises/useColorStrata/useMesh.ts","../src/fxs/noises/useColorStrata/index.ts","../src/fxs/noises/useMarble/shader/main.vert","../src/fxs/noises/useMarble/shader/main.frag","../src/fxs/noises/useMarble/useMesh.ts","../src/fxs/noises/useMarble/index.ts","../src/fxs/noises/useCosPalette/shader/main.vert","../src/fxs/noises/useCosPalette/shader/main.frag","../src/fxs/noises/useCosPalette/useMesh.ts","../src/fxs/noises/useCosPalette/index.ts","../src/fxs/utils/useDuoTone/shader/main.vert","../src/fxs/utils/useDuoTone/shader/main.frag","../src/fxs/utils/useDuoTone/useMesh.ts","../src/fxs/utils/useDuoTone/index.ts","../src/fxs/utils/useBlending/shader/main.vert","../src/fxs/utils/useBlending/shader/main.frag","../src/fxs/utils/useBlending/useMesh.ts","../src/fxs/utils/useBlending/index.ts","../src/fxs/utils/useFxTexture/shader/main.vert","../src/fxs/utils/useFxTexture/shader/main.frag","../src/fxs/utils/useFxTexture/useMesh.ts","../src/fxs/utils/useFxTexture/index.ts","../src/fxs/utils/useBrightnessPicker/shader/main.vert","../src/fxs/utils/useBrightnessPicker/shader/main.frag","../src/fxs/utils/useBrightnessPicker/useMesh.ts","../src/fxs/utils/useBrightnessPicker/index.ts","../src/fxs/utils/useFxBlending/shader/main.vert","../src/fxs/utils/useFxBlending/shader/main.frag","../src/fxs/utils/useFxBlending/useMesh.ts","../src/fxs/utils/useFxBlending/index.ts","../src/fxs/utils/useAlphaBlending/shader/main.vert","../src/fxs/utils/useAlphaBlending/shader/main.frag","../src/fxs/utils/useAlphaBlending/useMesh.ts","../src/fxs/utils/useAlphaBlending/index.ts","../src/fxs/utils/useHSV/shader/main.vert","../src/fxs/utils/useHSV/shader/main.frag","../src/fxs/utils/useHSV/useMesh.ts","../src/fxs/utils/useHSV/index.ts","../src/fxs/utils/useCoverTexture/shader/main.vert","../src/fxs/utils/useCoverTexture/shader/main.frag","../src/fxs/utils/useCoverTexture/useMesh.ts","../src/fxs/utils/useCoverTexture/index.ts","../src/fxs/effects/useSimpleBlur/shader/main.vert","../src/fxs/effects/useSimpleBlur/shader/main.frag","../src/fxs/effects/useSimpleBlur/useMesh.ts","../src/fxs/effects/useSimpleBlur/index.ts","../src/fxs/effects/useWave/shader/main.vert","../src/fxs/effects/useWave/shader/main.frag","../src/fxs/effects/useWave/useMesh.ts","../src/fxs/effects/useWave/index.ts","../src/fxs/misc/useChromaKey/shader/main.vert","../src/fxs/misc/useChromaKey/shader/main.frag","../src/fxs/misc/useChromaKey/useMesh.ts","../src/fxs/misc/useChromaKey/index.ts","../src/utils/useCopyTexture.ts","../src/libs/easing.ts","../src/misc/useBeat.ts","../src/misc/useFPSLimiter.ts","../src/misc/useDomSyncer/utils/errorHandler.ts","../src/misc/useDomSyncer/shader/main.vert","../src/misc/useDomSyncer/shader/main.frag","../src/misc/useDomSyncer/utils/createMesh.ts","../src/misc/useDomSyncer/utils/useIntersectionHandler.ts","../src/misc/useDomSyncer/utils/useUpdateDomRect.ts","../src/misc/useDomSyncer/utils/useIsIntersecting.ts","../src/misc/useDomSyncer/utils/createUseDomView.ts","../src/misc/useDomSyncer/index.ts"],"sourcesContent":["varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nuniform sampler2D uBuffer;\nuniform sampler2D uTexture;\nuniform bool uIsTexture;\nuniform sampler2D uMap;\nuniform bool uIsMap;\nuniform float uMapIntensity;\nuniform float uRadius;\nuniform float uDissipation;\nuniform vec2 uResolution;\nuniform float uSmudge;\nuniform vec2 uMouse;\nuniform vec2 uPrevMouse;\nuniform vec2 uVelocity;\nuniform vec3 uColor;\nuniform float uMotionBlur;\nuniform int uMotionSample;\nuniform bool uIsCursor;\nuniform float uPressureStart;\nuniform float uPressureEnd;\n\nvarying vec2 vUv;\n\nfloat isOnLine(vec2 point, vec2 start, vec2 end, float radius, float pressureStart, float pressureEnd) {\n\t\n\tfloat aspect = uResolution.x / uResolution.y;\n\n\tpoint.x *= aspect;\n\tstart.x *= aspect;\n\tend.x *= aspect;\n\n\tvec2 dir = normalize(end - start);\n\tvec2 n = vec2(dir.y, -dir.x);\n\tvec2 p0 = point - start;\n\t\n\tfloat distToLine = abs(dot(p0, n));\n\tfloat distAlongLine = dot(p0, dir);\n\tfloat totalLength = length(end - start);\n\n\tfloat progress = clamp(distAlongLine / totalLength, 0.0, 1.0);\n\tfloat pressure = mix(pressureStart, pressureEnd, progress);\n\tradius = min(radius,radius * pressure);\n\n\tfloat distFromStart = length(point - start);\n\tfloat distFromEnd = length(point - end);\n\t\n\tbool withinLine = (distToLine < radius && distAlongLine > 0.0 && distAlongLine < totalLength) || distFromStart < radius || distFromEnd < radius;\n\n\treturn float(withinLine);\n}\n\nvec4 createSmudge(vec2 uv){\n\tvec2 offsets[9];\n\toffsets[0] = vec2(-1, -1); offsets[1] = vec2( 0, -1); offsets[2] = vec2( 1, -1);\n\toffsets[3] = vec2(-1, 0); offsets[4] = vec2( 0, 0); offsets[5] = vec2( 1, 0);\n\toffsets[6] = vec2(-1, 1); offsets[7] = vec2( 0, 1); offsets[8] = vec2( 1, 1);\n\n\tfor(int i = 0; i < 9; i++) {\n\t\toffsets[i] = (offsets[i] * uSmudge) / uResolution;\n\t}\t\n\tvec4 smudgedColor = vec4(0.);\n\tfor(int i = 0; i < 9; i++) {\n\t\tsmudgedColor += texture2D(uBuffer, uv + offsets[i]);\n\t}\n\treturn smudgedColor / 9.0;\n}\n\nvec4 createMotionBlur(vec2 uv , vec4 baseColor, vec2 velocity) {\n\tvec2 scaledV = velocity * uMotionBlur;\n\tfor(int i = 1; i < uMotionSample; i++) {\n\t\tfloat t = float(i) / float(uMotionSample - 1);\n\t\tvec2 offset = t * scaledV / uResolution;\n\t\tbaseColor += texture2D(uBuffer, uv + offset);\n\t}\n\treturn baseColor / float(uMotionSample);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\tif(uIsMap){\n\t\tvec2 mapColor = texture2D(uMap, uv).rg;\n\t\tvec2 normalizedMap = mapColor * 2.0 - 1.0;\n\t\tuv = uv * 2.0 - 1.0;\n\t\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), uMapIntensity);\n\t\tuv = (uv + 1.0) / 2.0;\n\t}\n\tvec2 suv = uv*2.-1.;\n\n\tvec2 velocity = uVelocity * uResolution;\n\n\tfloat radius = max(0.0,uRadius);\n\t\n\tvec4 smudgedColor = uSmudge > 0. ? createSmudge(uv) : texture2D(uBuffer, uv);\n\n\tvec4 motionBlurredColor = uMotionBlur > 0. ? createMotionBlur(uv,smudgedColor, velocity) : smudgedColor;\n\n\tvec4 bufferColor = motionBlurredColor;\n\tbufferColor.a = bufferColor.a < 1e-10 ? 0.0 : bufferColor.a * uDissipation;\n\t\n\tvec4 brushColor = uIsTexture ? texture2D(uTexture, uv) : vec4(uColor,1.);\n\t\n\tfloat onLine = isOnLine(suv, uPrevMouse, uMouse, radius, uPressureStart,uPressureEnd);\n\tfloat isOnLine = length(velocity) > 0. ? onLine : uIsCursor ? onLine : 0.;\n\n\tvec4 finalColor = mix(bufferColor, brushColor, isOnLine);\n\n\tgl_FragColor = finalColor;\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\n/**\n * @params dpr if dpr is set, it returns the resolution which is size multiplied by dpr.\n */\nexport const useResolution = (size: Size, dpr: number | false = false) => {\n const _width = dpr ? size.width * dpr : size.width;\n const _height = dpr ? size.height * dpr : size.height;\n const resolution = useMemo(\n () => new THREE.Vector2(_width, _height),\n [_width, _height]\n );\n return resolution;\n};\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\n/** Generate mesh from geometry and material and add to scene */\nexport const useAddMesh = (\n scene: THREE.Scene,\n geometry: THREE.BufferGeometry,\n material: THREE.Material\n) => {\n const mesh = useMemo(\n () => new THREE.Mesh(geometry, material),\n [geometry, material]\n );\n\n useEffect(() => {\n scene.add(mesh);\n }, [scene, mesh]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","type UniformValue =\n | THREE.CubeTexture\n | THREE.Texture\n | Int32Array\n | Float32Array\n | THREE.Matrix4\n | THREE.Matrix3\n | THREE.Quaternion\n | THREE.Vector4\n | THREE.Vector3\n | THREE.Vector2\n | THREE.Color\n | number\n | boolean\n | Array\n | null;\ntype UniformObject = { [key: string]: { value: UniformValue } };\n\nexport const setUniform = (\n material: { uniforms: T },\n key: keyof T,\n value: UniformValue\n) => {\n if (\n material.uniforms &&\n material.uniforms[key] &&\n value !== undefined &&\n value !== null\n ) {\n material.uniforms[key].value = value;\n } else {\n console.error(\n `Uniform key \"${String(\n key\n )}\" does not exist in the material. or \"${String(\n key\n )}\" is null | undefined`\n );\n }\n};\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useEffect, useMemo } from \"react\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class BrushMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uBuffer: { value: THREE.Texture };\n uTexture: { value: THREE.Texture };\n uIsTexture: { value: boolean };\n uMap: { value: THREE.Texture };\n uIsMap: { value: boolean };\n uMapIntensity: { value: number };\n uResolution: { value: THREE.Texture };\n uRadius: { value: number };\n uSmudge: { value: number };\n uDissipation: { value: number };\n uMotionBlur: { value: number };\n uMotionSample: { value: number };\n uMouse: { value: number };\n uPrevMouse: { value: number };\n uVelocity: { value: number };\n uColor: { value: THREE.Vector3 | THREE.Color };\n uIsCursor: { value: boolean };\n uPressureStart: { value: number };\n uPressureEnd: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uBuffer: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uTexture: { value: new THREE.Texture() },\n uIsTexture: { value: false },\n uMap: { value: new THREE.Texture() },\n uIsMap: { value: false },\n uMapIntensity: { value: 0.0 },\n uRadius: { value: 0.0 },\n uSmudge: { value: 0.0 },\n uDissipation: { value: 0.0 },\n uMotionBlur: { value: 0.0 },\n uMotionSample: { value: 0 },\n uMouse: { value: new THREE.Vector2(-10, -10) },\n uPrevMouse: { value: new THREE.Vector2(-10, -10) },\n uVelocity: { value: new THREE.Vector2(0, 0) },\n uColor: { value: new THREE.Vector3(1, 0, 0) },\n uIsCursor: { value: false },\n uPressureStart: { value: 1.0 },\n uPressureEnd: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as BrushMaterial;\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material;\n};\n","import * as THREE from \"three\";\nimport { useResolution } from \"./useResolution\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\nconst getCameraProps = (width: number, height: number) => {\n const frustumSize = height;\n const aspect = width / height;\n const [w, h] = [(frustumSize * aspect) / 2, frustumSize / 2];\n return { width: w, height: h, near: -1000, far: 1000 };\n};\n\nexport const useCamera = (size: Size) => {\n const resolution = useResolution(size);\n const { width, height, near, far } = getCameraProps(\n resolution.x,\n resolution.y\n );\n const camera = useMemo(\n () =>\n new THREE.OrthographicCamera(\n -width,\n width,\n height,\n -height,\n near,\n far\n ),\n [width, height, near, far]\n );\n return camera;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useRef } from \"react\";\n\nexport type PointerValues = {\n currentPointer: THREE.Vector2;\n prevPointer: THREE.Vector2;\n diffPointer: THREE.Vector2;\n velocity: THREE.Vector2;\n isVelocityUpdate: boolean;\n};\n\ntype UpdatePointer = (currentPointer: THREE.Vector2) => PointerValues;\n\n/**\n * @description When given the pointer vector2 from r3f's RootState, it generates an update function that returns {`currentPointer`, `prevPointer`, `diffPointer`, `isVelocityUpdate`, `velocity`}.\n * @description When calling custom in a `useFrame` loop, you can avoid duplication of execution by passing `pointerValues` to the update function of a Pointer-activated fxHook, such as `useBrush`.\n * @param lerp 0~1, lerp intensity (0 to less than 1) , default: 0\n */\nexport const usePointer = (lerp: number = 0): UpdatePointer => {\n const prevPointer = useRef(new THREE.Vector2(0, 0));\n const diffPointer = useRef(new THREE.Vector2(0, 0));\n const lerpPointer = useRef(new THREE.Vector2(0, 0));\n const lastUpdateTime = useRef(0);\n const velocity = useRef(new THREE.Vector2(0, 0));\n const isMoved = useRef(false);\n\n const updatePointer = useCallback(\n (currentPointer: THREE.Vector2) => {\n const now = performance.now();\n\n // lerp\n let current: THREE.Vector2;\n if (isMoved.current && lerp) {\n lerpPointer.current = lerpPointer.current.lerp(\n currentPointer,\n 1 - lerp\n );\n current = lerpPointer.current.clone();\n } else {\n current = currentPointer.clone();\n lerpPointer.current = current;\n }\n\n // first frame\n if (lastUpdateTime.current === 0) {\n lastUpdateTime.current = now;\n prevPointer.current = current;\n }\n const deltaTime = Math.max(1, now - lastUpdateTime.current);\n lastUpdateTime.current = now;\n\n // get velocity\n velocity.current\n .copy(current)\n .sub(prevPointer.current)\n .divideScalar(deltaTime);\n const isUpdate = velocity.current.length() > 0;\n\n //set prev temp pos\n const prevTemp = isMoved.current\n ? prevPointer.current.clone()\n : current;\n if (!isMoved.current && isUpdate) {\n isMoved.current = true;\n }\n prevPointer.current = current;\n\n return {\n currentPointer: current,\n prevPointer: prevTemp,\n diffPointer: diffPointer.current.subVectors(current, prevTemp),\n velocity: velocity.current,\n isVelocityUpdate: isUpdate,\n };\n },\n [lerp]\n );\n\n return updatePointer;\n};\n","import { useCallback, useRef } from \"react\";\n\ntype UseParamsReturn = [T, (params: Partial) => void];\n\n/**\n * @param params Receives an initial value object. With structuredClone, deep copy and set, but if the object contains a function, just set it.\n */\nexport const useParams = (params: T): UseParamsReturn => {\n const isContainsFunctions = (obj: object): boolean =>\n Object.values(obj).some((value) => typeof value === \"function\");\n const paramsRef = useRef(\n isContainsFunctions(params) ? params : structuredClone(params)\n );\n\n const setParams = useCallback((updateParams: Partial) => {\n for (const key in updateParams) {\n const paramKey = key as keyof T;\n if (\n paramKey in paramsRef.current &&\n updateParams[paramKey] !== undefined &&\n updateParams[paramKey] !== null\n ) {\n paramsRef.current[paramKey] = updateParams[paramKey]!;\n } else {\n console.error(\n `\"${String(\n paramKey\n )}\" does not exist in the params. or \"${String(\n paramKey\n )}\" is null | undefined`\n );\n }\n }\n }, []);\n return [paramsRef.current, setParams];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default:false */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. Default is 0. */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, Default is false. */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. Default is false. */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\n\nexport type BrushParams = {\n /** Texture applied to the brush, If texture is true, it will take precedence over color , default:false */\n texture?: THREE.Texture | false;\n /** You can attach an fx map , default:false */\n map?: THREE.Texture | false;\n /** map intensity , default:0.1 */\n mapIntensity?: number;\n /** size of the stamp, percentage of the size ,default:0.05 */\n radius?: number;\n /** Strength of smudge effect , default:0.0*/\n smudge?: number;\n /** dissipation rate. If set to 1, it will remain. ,default:1.0 */\n dissipation?: number;\n /** Strength of motion blur , default:0.0 */\n motionBlur?: number;\n /** Number of motion blur samples. Affects performance default: 5 */\n motionSample?: number;\n /** brush color , it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default:THREE.Vector3(1.0, 1.0, 1.0) */\n color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** Follows the cursor even if it loses speed , default:false */\n isCursor?: boolean;\n /** brush pressure (0 to 1) , default : 1.0 */\n pressure?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default:false */\n pointerValues?: PointerValues | false;\n};\n\nexport type BrushObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRUSH_PARAMS: BrushParams = {\n texture: false,\n map: false,\n mapIntensity: 0.1,\n radius: 0.05,\n smudge: 0.0,\n dissipation: 1.0,\n motionBlur: 0.0,\n motionSample: 5,\n color: new THREE.Vector3(1.0, 0.0, 0.0),\n isCursor: false,\n pressure: 1.0,\n pointerValues: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrush = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrushParams) => {\n const { gl, pointer } = props;\n\n updateParams && setParams(updateParams);\n\n if (params.texture!) {\n setUniform(material, \"uIsTexture\", true);\n setUniform(material, \"uTexture\", params.texture!);\n } else {\n setUniform(material, \"uIsTexture\", false);\n }\n\n if (params.map!) {\n setUniform(material, \"uIsMap\", true);\n setUniform(material, \"uMap\", params.map!);\n setUniform(material, \"uMapIntensity\", params.mapIntensity!);\n } else {\n setUniform(material, \"uIsMap\", false);\n }\n\n setUniform(material, \"uRadius\", params.radius!);\n setUniform(material, \"uSmudge\", params.smudge!);\n setUniform(material, \"uDissipation\", params.dissipation!);\n setUniform(material, \"uMotionBlur\", params.motionBlur!);\n setUniform(material, \"uMotionSample\", params.motionSample!);\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n setUniform(material, \"uMouse\", pointerValues.currentPointer);\n setUniform(material, \"uPrevMouse\", pointerValues.prevPointer);\n }\n setUniform(material, \"uVelocity\", pointerValues.velocity);\n\n const color: THREE.Vector3 | THREE.Color =\n typeof params.color === \"function\"\n ? params.color(pointerValues.velocity)\n : params.color!;\n setUniform(material, \"uColor\", color);\n\n setUniform(material, \"uIsCursor\", params.isCursor!);\n\n // pressure\n setUniform(material, \"uPressureEnd\", params.pressure!);\n if (pressureEnd.current === null) {\n pressureEnd.current = params.pressure!;\n }\n setUniform(material, \"uPressureStart\", pressureEnd.current);\n pressureEnd.current = params.pressure!;\n\n return updateRenderTarget(gl, ({ read }) => {\n setUniform(material, \"uBuffer\", read);\n });\n },\n [material, updatePointer, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","varying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform vec2 texelSize;\n\nvoid main () {\n\tvUv = uv;\n\tvL = vUv - vec2(texelSize.x, 0.0);\n\tvR = vUv + vec2(texelSize.x, 0.0);\n\tvT = vUv + vec2(0.0, texelSize.y);\n\tvB = vUv - vec2(0.0, texelSize.y);\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvoid main(){\n\tgl_FragColor = vec4(0.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/init.frag\";\n\nexport const useInitialMaterial = () => {\n const initialMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n depthTest: false,\n depthWrite: false,\n }),\n []\n );\n\n return initialMaterial as THREE.ShaderMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uVelocity;\nuniform sampler2D uSource;\nuniform vec2 texelSize;\nuniform float dt;\nuniform float dissipation;\n\nvoid main () {\n\tvec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize;\n\tgl_FragColor = dissipation * texture2D(uSource, coord);\n\tgl_FragColor.a = 1.0;\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/advection.frag\";\n\nexport class AdvectionMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uSource: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n dt: { value: number };\n dissipation: { value: number };\n };\n}\n\nexport const useAdvectionMaterial = () => {\n const advectionMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: new THREE.Texture() },\n uSource: { value: new THREE.Texture() },\n texelSize: { value: new THREE.Vector2() },\n dt: { value: 0.0 },\n dissipation: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return advectionMaterial as AdvectionMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvec2 sampleVelocity (in vec2 uv) {\n\tvec2 multiplier = vec2(1.0, 1.0);\n\tif (uv.x < 0.0) { uv.x = 0.0; multiplier.x = -1.0; }\n\tif (uv.x > 1.0) { uv.x = 1.0; multiplier.x = -1.0; }\n\tif (uv.y < 0.0) { uv.y = 0.0; multiplier.y = -1.0; }\n\tif (uv.y > 1.0) { uv.y = 1.0; multiplier.y = -1.0; }\n\treturn multiplier * texture2D(uVelocity, uv).xy;\n}\n\nvoid main () {\n\tfloat L = sampleVelocity(vL).x;\n\tfloat R = sampleVelocity(vR).x;\n\tfloat T = sampleVelocity(vT).y;\n\tfloat B = sampleVelocity(vB).y;\n\tfloat div = 0.5 * (R - L + T - B);\n\tgl_FragColor = vec4(div, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/divergence.frag\";\n\nexport class DivergenceMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useDivergenceMaterial = () => {\n const divergenceMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return divergenceMaterial as DivergenceMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uPressure;\nuniform sampler2D uDivergence;\n\nvec2 boundary (in vec2 uv) {\n\tuv = min(max(uv, 0.0), 1.0);\n\treturn uv;\n}\n\nvoid main () {\n\tfloat L = texture2D(uPressure, boundary(vL)).x;\n\tfloat R = texture2D(uPressure, boundary(vR)).x;\n\tfloat T = texture2D(uPressure, boundary(vT)).x;\n\tfloat B = texture2D(uPressure, boundary(vB)).x;\n\tfloat C = texture2D(uPressure, vUv).x;\n\tfloat divergence = texture2D(uDivergence, vUv).x;\n\tfloat pressure = (L + R + B + T - divergence) * 0.25;\n\tgl_FragColor = vec4(pressure, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/pressure.frag\";\n\nexport class PressureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uDivergence: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const usePressureMaterial = () => {\n const pressureMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: null },\n uDivergence: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return pressureMaterial as PressureMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvoid main () {\n\tfloat L = texture2D(uVelocity, vL).y;\n\tfloat R = texture2D(uVelocity, vR).y;\n\tfloat T = texture2D(uVelocity, vT).x;\n\tfloat B = texture2D(uVelocity, vB).x;\n\tfloat vorticity = R - L - T + B;\n\tgl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/curl.frag\";\n\nexport class CurlMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useCurlMaterial = () => {\n const curlMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return curlMaterial as CurlMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\nuniform sampler2D uCurl;\nuniform float curl;\nuniform float dt;\n\nvoid main () {\n\tfloat T = texture2D(uCurl, vT).x;\n\tfloat B = texture2D(uCurl, vB).x;\n\tfloat C = texture2D(uCurl, vUv).x;\n\tvec2 force = vec2(abs(T) - abs(B), 0.0);\n\tforce *= 1.0 / length(force + 0.00001) * curl * C;\n\tvec2 vel = texture2D(uVelocity, vUv).xy;\n\tgl_FragColor = vec4(vel + force * dt, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/vorticity.frag\";\n\nexport class VorticityMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uCurl: { value: THREE.Texture };\n curl: { value: number };\n dt: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useVorticityMaterial = () => {\n const vorticityMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: 0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return vorticityMaterial as VorticityMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float value;\n\nvoid main () {\n\tgl_FragColor = value * texture2D(uTexture, vUv);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/clear.frag\";\n\nexport class ClearMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n value: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useClearMaterial = () => {\n const advectionMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return advectionMaterial as ClearMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uPressure;\nuniform sampler2D uVelocity;\n\nvec2 boundary (in vec2 uv) {\n\tuv = min(max(uv, 0.0), 1.0);\n\treturn uv;\n}\n\nvoid main () {\n\tfloat L = texture2D(uPressure, boundary(vL)).x;\n\tfloat R = texture2D(uPressure, boundary(vR)).x;\n\tfloat T = texture2D(uPressure, boundary(vT)).x;\n\tfloat B = texture2D(uPressure, boundary(vB)).x;\n\tvec2 velocity = texture2D(uVelocity, vUv).xy;\n\tvelocity.xy -= vec2(R - L, T - B);\n\tgl_FragColor = vec4(velocity, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/gradientSubtract.frag\";\n\nexport class GradientSubtractMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useGradientSubtractMaterial = () => {\n const gradientSubtractMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: new THREE.Texture() },\n uVelocity: { value: new THREE.Texture() },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return gradientSubtractMaterial as GradientSubtractMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTarget;\nuniform float aspectRatio;\nuniform vec3 color;\nuniform vec2 point;\nuniform float radius;\n\nvoid main () {\n\tvec2 nPoint = (point + vec2(1.0)) * 0.5;\n\tvec2 p = vUv - nPoint.xy;\n\tp.x *= aspectRatio;\n\tvec3 splat = exp(-dot(p, p) / radius) * color;\n\tvec3 base = texture2D(uTarget, vUv).xyz;\n\tgl_FragColor = vec4(base + splat, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/splat.frag\";\n\nexport class SplatMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTarget: { value: THREE.Texture };\n aspectRatio: { value: number };\n color: { value: THREE.Vector3 | THREE.Color };\n point: { value: THREE.Vector2 };\n radius: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useSplateMaterial = () => {\n const splatMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTarget: { value: new THREE.Texture() },\n aspectRatio: { value: 0 },\n color: { value: new THREE.Vector3() },\n point: { value: new THREE.Vector2() },\n radius: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return splatMaterial as SplatMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { useInitialMaterial } from \"./materials/useInitialMaterial\";\nimport {\n AdvectionMaterial,\n useAdvectionMaterial,\n} from \"./materials/useAdvectionMaterial\";\nimport {\n DivergenceMaterial,\n useDivergenceMaterial,\n} from \"./materials/useDivergenceMaterial\";\nimport {\n PressureMaterial,\n usePressureMaterial,\n} from \"./materials/usePressureMaterial\";\nimport { CurlMaterial, useCurlMaterial } from \"./materials/useCurlMaterial\";\nimport {\n VorticityMaterial,\n useVorticityMaterial,\n} from \"./materials/useVorticityMaterial\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { ClearMaterial, useClearMaterial } from \"./materials/useClearMaterial\";\nimport {\n GradientSubtractMaterial,\n useGradientSubtractMaterial,\n} from \"./materials/useGradientSubtractMaterial\";\nimport { SplatMaterial, useSplateMaterial } from \"./materials/useSplatMaterial\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\ntype TMaterials =\n | AdvectionMaterial\n | DivergenceMaterial\n | CurlMaterial\n | PressureMaterial\n | ClearMaterial\n | GradientSubtractMaterial\n | SplatMaterial;\n\nexport type FluidMaterials = {\n vorticityMaterial: VorticityMaterial;\n curlMaterial: CurlMaterial;\n advectionMaterial: AdvectionMaterial;\n divergenceMaterial: DivergenceMaterial;\n pressureMaterial: PressureMaterial;\n clearMaterial: ClearMaterial;\n gradientSubtractMaterial: GradientSubtractMaterial;\n splatMaterial: SplatMaterial;\n};\ntype TUseMeshReturnType = [FluidMaterials, (material: TMaterials) => void];\n\n/**\n * Returns the material update function in the second argument\n */\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}): TUseMeshReturnType => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const initialMaterial = useInitialMaterial();\n const updateMaterial = initialMaterial.clone();\n const curlMaterial = useCurlMaterial();\n const vorticityMaterial = useVorticityMaterial();\n const advectionMaterial = useAdvectionMaterial();\n const divergenceMaterial = useDivergenceMaterial();\n const pressureMaterial = usePressureMaterial();\n const clearMaterial = useClearMaterial();\n const gradientSubtractMaterial = useGradientSubtractMaterial();\n const splatMaterial = useSplateMaterial();\n const materials = useMemo(\n () => ({\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n }),\n [\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n ]\n );\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(\n materials.splatMaterial,\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(\n material,\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddMesh(scene, geometry, initialMaterial);\n useEffect(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return [materials, setMeshMaterial];\n};\n","import * as THREE from \"three\";\nimport { FluidMaterials, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { UseFboProps } from \"../../../utils/useSingleFBO\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\n\nexport type FluidParams = {\n /** density disspation , default:0.98 */\n density_dissipation?: number;\n /** velocity dissipation , default:0.99 */\n velocity_dissipation?: number;\n /** velocity acceleration , default:10.0 */\n velocity_acceleration?: number;\n /** pressure dissipation , default:0.9 */\n pressure_dissipation?: number;\n /** pressure iterations. affects performance , default:20 */\n pressure_iterations?: number;\n /** curl_strength , default:35 */\n curl_strength?: number;\n /** splat radius , default:0.002 */\n splat_radius?: number;\n /** Fluid Color.THREE.Vector3 Alternatively, it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default:THREE.Vector3(1.0, 1.0, 1.0) */\n fluid_color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default:false */\n pointerValues?: PointerValues | false;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n materials: FluidMaterials;\n camera: THREE.Camera;\n renderTarget: {\n velocity: DoubleRenderTarget;\n density: DoubleRenderTarget;\n curl: THREE.WebGLRenderTarget;\n divergence: THREE.WebGLRenderTarget;\n pressure: DoubleRenderTarget;\n };\n output: THREE.Texture;\n};\n\nexport const FLUID_PARAMS: FluidParams = {\n density_dissipation: 0.98,\n velocity_dissipation: 0.99,\n velocity_acceleration: 10.0,\n pressure_dissipation: 0.9,\n pressure_iterations: 20,\n curl_strength: 35,\n splat_radius: 0.002,\n fluid_color: new THREE.Vector3(1.0, 1.0, 1.0),\n pointerValues: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const [materials, setMeshMaterial] = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n samples,\n }),\n [scene, camera, size, samples]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const lastTime = useRef(0);\n const scaledDiffVec = useRef(new THREE.Vector2(0, 0));\n const spaltVec = useRef(new THREE.Vector3(0, 0, 0));\n\n const [params, setParams] = useParams(FLUID_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FluidParams) => {\n const { gl, pointer, clock, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (lastTime.current === 0) {\n lastTime.current = clock.getElapsedTime();\n }\n const dt = Math.min(\n (clock.getElapsedTime() - lastTime.current) / 3,\n 0.02\n );\n lastTime.current = clock.getElapsedTime();\n\n // update velocity\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", read);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(materials.advectionMaterial, \"dt\", dt);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.velocity_dissipation!\n );\n });\n\n // update density\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", velocityTex);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.density_dissipation!\n );\n });\n\n // update splatting\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n setUniform(materials.splatMaterial, \"uTarget\", read);\n setUniform(\n materials.splatMaterial,\n \"point\",\n pointerValues.currentPointer\n );\n const scaledDiff = pointerValues.diffPointer.multiply(\n scaledDiffVec.current\n .set(size.width, size.height)\n .multiplyScalar(params.velocity_acceleration!)\n );\n setUniform(\n materials.splatMaterial,\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n setUniform(\n materials.splatMaterial,\n \"radius\",\n params.splat_radius!\n );\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n setUniform(materials.splatMaterial, \"uTarget\", read);\n const color: THREE.Vector3 | THREE.Color =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(pointerValues.velocity)\n : params.fluid_color!;\n setUniform(materials.splatMaterial, \"color\", color);\n });\n }\n\n // update curl\n const curlTex = updateCurlFBO(gl, () => {\n setMeshMaterial(materials.curlMaterial);\n setUniform(materials.curlMaterial, \"uVelocity\", velocityTex);\n });\n\n // update vorticity\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.vorticityMaterial);\n setUniform(materials.vorticityMaterial, \"uVelocity\", read);\n setUniform(materials.vorticityMaterial, \"uCurl\", curlTex);\n setUniform(\n materials.vorticityMaterial,\n \"curl\",\n params.curl_strength!\n );\n setUniform(materials.vorticityMaterial, \"dt\", dt);\n });\n\n // update divergence\n const divergenceTex = updateDivergenceFBO(gl, () => {\n setMeshMaterial(materials.divergenceMaterial);\n setUniform(materials.divergenceMaterial, \"uVelocity\", velocityTex);\n });\n\n // update pressure\n updatePressureFBO(gl, ({ read }) => {\n setMeshMaterial(materials.clearMaterial);\n setUniform(materials.clearMaterial, \"uTexture\", read);\n setUniform(\n materials.clearMaterial,\n \"value\",\n params.pressure_dissipation!\n );\n });\n\n // solve pressure iterative (Gauss-Seidel)\n setMeshMaterial(materials.pressureMaterial);\n setUniform(materials.pressureMaterial, \"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressure_iterations!; i++) {\n pressureTexTemp = updatePressureFBO(gl, ({ read }) => {\n setUniform(materials.pressureMaterial, \"uPressure\", read);\n });\n }\n\n // update gradienSubtract\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.gradientSubtractMaterial);\n setUniform(\n materials.gradientSubtractMaterial,\n \"uPressure\",\n pressureTexTemp\n );\n setUniform(materials.gradientSubtractMaterial, \"uVelocity\", read);\n });\n\n return densityTex;\n },\n [\n materials,\n setMeshMaterial,\n updateCurlFBO,\n updateDensityFBO,\n updateDivergenceFBO,\n updatePointer,\n updatePressureFBO,\n updateVelocityFBO,\n setParams,\n params,\n ]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n materials: materials,\n camera: camera,\n renderTarget: {\n velocity: velocityFBO,\n density: densityFBO,\n curl: curlFBO,\n divergence: divergenceFBO,\n pressure: pressureFBO,\n },\n output: densityFBO.read.texture,\n },\n ];\n};\n","import { useEffect, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\n\ntype UseMeshProps = {\n scale: number;\n max: number;\n texture?: THREE.Texture;\n scene: THREE.Scene;\n};\n\nexport const useMesh = ({ scale, max, texture, scene }: UseMeshProps) => {\n const meshArr = useRef([]);\n const geometry = useMemo(\n () => new THREE.PlaneGeometry(scale, scale),\n [scale]\n );\n const material = useMemo(\n () =>\n new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthTest: false,\n depthWrite: false,\n }),\n [texture]\n );\n\n useEffect(() => {\n for (let i = 0; i < max; i++) {\n const mesh = new THREE.Mesh(geometry.clone(), material.clone());\n mesh.rotateZ(2 * Math.PI * Math.random());\n mesh.visible = false;\n scene.add(mesh);\n meshArr.current.push(mesh);\n }\n }, [geometry, material, scene, max]);\n\n useEffect(() => {\n return () => {\n meshArr.current.forEach((mesh) => {\n mesh.geometry.dispose();\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((material) => material.dispose());\n } else {\n mesh.material.dispose();\n }\n scene.remove(mesh);\n });\n meshArr.current = [];\n };\n }, [scene]);\n\n return meshArr.current;\n};\n","import { useCallback, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { usePointer, PointerValues } from \"../../../misc/usePointer\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type RippleParams = {\n /** How often ripples appear,default:0.01 */\n frequency?: number;\n /** rotation rate,default:0.05 */\n rotation?: number;\n /** fadeout speed,default:0.9 */\n fadeout_speed?: number;\n /** scale rate,default:0.3 */\n scale?: number;\n /** alpha,default:0.6 */\n alpha?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default:false */\n pointerValues?: PointerValues | false;\n};\n\nexport type RippleObject = {\n scene: THREE.Scene;\n meshArr: THREE.Mesh[];\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const RIPPLE_PARAMS: RippleParams = {\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n pointerValues: false,\n};\n\ninterface UseRippleProps extends HooksProps {\n /** texture applied to ripple */\n texture?: THREE.Texture;\n /** ripple size, default:64 */\n scale?: number;\n /** ripple max length, default:100 */\n max?: number;\n}\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useRipple = ({\n texture = new THREE.Texture(),\n scale = 64,\n max = 100,\n size,\n dpr,\n samples = 0,\n}: UseRippleProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: RippleParams) => {\n const { gl, pointer, size } = props;\n\n updateParams && setParams(updateParams);\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (params.frequency! < pointerValues.diffPointer.length()) {\n const mesh = meshArr[currentWave.current];\n mesh.visible = true;\n mesh.position.set(\n pointerValues.currentPointer.x * (size.width / 2),\n pointerValues.currentPointer.y * (size.height / 2),\n 0\n );\n mesh.scale.x = mesh.scale.y = 0.0;\n (mesh.material as THREE.MeshBasicMaterial).opacity = params.alpha!;\n currentWave.current = (currentWave.current + 1) % max;\n }\n meshArr.forEach((mesh) => {\n if (mesh.visible) {\n const material = mesh.material as THREE.MeshBasicMaterial;\n mesh.rotation.z += params.rotation!;\n material.opacity *= params.fadeout_speed!;\n mesh.scale.x =\n params.fadeout_speed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n if (material.opacity < 0.002) mesh.visible = false;\n }\n });\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, meshArr, updatePointer, max, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n camera: camera,\n meshArr: meshArr,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform float uTime;\nuniform float timeStrength;\nuniform int noiseOctaves;\nuniform int fbmOctaves;\nuniform int warpOctaves;\nuniform vec2 warpDirection;\nuniform float warpStrength;\nuniform float scale;\n\nconst float per = 0.5;\nconst float PI = 3.14159265359;\n\nfloat rnd(vec2 n) {\n\tfloat a = 0.129898;\n\tfloat b = 0.78233;\n\tfloat c = 437.585453;\n\tfloat dt= dot(n ,vec2(a, b));\n\tfloat sn= mod(dt, PI);\n\treturn fract(sin(sn) * c);\n}\n\nfloat interpolate(float a, float b, float x){\n float f = (1.0 - cos(x * PI)) * 0.5;\n return a * (1.0 - f) + b * f;\n}\n\nfloat irnd(vec2 p){\n\tvec2 i = floor(p);\n\tvec2 f = fract(p);\n\tvec4 v = vec4(rnd(vec2(i.x,i.y)),rnd(vec2(i.x + 1.0,i.y)),rnd(vec2(i.x,i.y + 1.0)),rnd(vec2(i.x + 1.0, i.y + 1.0)));\n\treturn interpolate(interpolate(v.x, v.y, f.x), interpolate(v.z, v.w, f.x), f.y);\n}\n\n// Based on The Book of Shaders\n// https://thebookofshaders.com/13/\nfloat noise(vec2 p, float time){\n\tfloat t = 0.0;\n\tfor(int i = 0; i < noiseOctaves; i++){\n\t\tfloat freq = pow(2.0, float(i));\n\t\tfloat amp = pow(per, float(noiseOctaves - i));\n\t\tt += irnd(vec2(p.y / freq + time, p.x / freq + time)) * amp;\n\t}\n\treturn t;\n}\n\nfloat fbm(vec2 x, float time) {\n\tfloat v = 0.0;\n\tfloat a = 0.5;\n\tvec2 shift = vec2(100);\n\tmat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5));\n\tfloat sign = 1.0;\n\tfor (int i = 0; i < fbmOctaves; ++i) {\n\t\tv += a * noise(x, time * sign);\n\t\tx = rot * x * 2.0 + shift;\n\t\ta *= 0.5;\n\t\tsign *= -1.0;\n\t}\n\treturn v;\n}\n\nfloat warp(vec2 x, float g,float time){\n\tfloat val = 0.0;\n\tfor (int i = 0; i < warpOctaves; i++){\n\t\tval = fbm(x + g * vec2(cos(warpDirection.x * val), sin(warpDirection.y * val)), time);\n\t}\n\treturn val;\n}\n\nvoid main() {\n\tfloat noise = warp(gl_FragCoord.xy * scale ,warpStrength,uTime * timeStrength);\n\tgl_FragColor = vec4(vec3(noise),1.0);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class NoiseMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTime: { value: number };\n scale: { value: number };\n timeStrength: { value: number };\n noiseOctaves: { value: number };\n fbmOctaves: { value: number };\n warpOctaves: { value: number };\n warpDirection: { value: THREE.Vector2 };\n warpStrength: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: 0.0 },\n timeStrength: { value: 0.0 },\n noiseOctaves: { value: 0 },\n fbmOctaves: { value: 0 },\n warpOctaves: { value: 0 },\n warpDirection: { value: new THREE.Vector2() },\n warpStrength: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as NoiseMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\n\nexport type NoiseParams = {\n /** noise scale , default:0.004 */\n scale?: number;\n /** time factor default:0.3 */\n timeStrength?: number;\n /** noiseOctaves, affects performance default:2 */\n noiseOctaves?: number;\n /** fbmOctaves, affects performance default:2 */\n fbmOctaves?: number;\n /** domain warping octaves , affects performance default:2 */\n warpOctaves?: number;\n /** direction of domain warping , default:(2.0,2,0) */\n warpDirection?: THREE.Vector2;\n /** strength of domain warping , default:8.0 */\n warpStrength?: number;\n /** you can get into the rhythm ♪ , default:false */\n beat?: number | false;\n};\n\nexport type NoiseObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const NOISE_PARAMS: NoiseParams = {\n scale: 0.004,\n timeStrength: 0.3,\n noiseOctaves: 2,\n fbmOctaves: 2,\n warpOctaves: 2,\n warpDirection: new THREE.Vector2(2.0, 2.0),\n warpStrength: 8.0,\n beat: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n *\n * It is a basic value noise with `fbm` and `domain warping`\n */\nexport const useNoise = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: NoiseParams) => {\n const { gl, clock } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"scale\", params.scale!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n setUniform(material, \"noiseOctaves\", params.noiseOctaves!);\n setUniform(material, \"fbmOctaves\", params.fbmOctaves!);\n setUniform(material, \"warpOctaves\", params.warpOctaves!);\n setUniform(material, \"warpDirection\", params.warpDirection!);\n setUniform(material, \"warpStrength\", params.warpStrength!);\n\n setUniform(material, \"uTime\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D uTexture;\nuniform bool isTexture;\nuniform sampler2D noise;\nuniform bool isNoise;\nuniform vec2 noiseStrength;\nuniform float laminateLayer;\nuniform vec2 laminateInterval;\nuniform vec2 laminateDetail;\nuniform vec2 distortion;\nuniform vec3 colorFactor;\nuniform float uTime;\nuniform vec2 timeStrength;\nuniform float scale;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 pos = isTexture ? texture2D(uTexture, uv).rg : uv * scale;\n\tvec2 noise = isNoise ? texture2D(noise, uv).rg : vec2(0.0);\n\tfloat alpha = isTexture ? texture2D(uTexture, uv).a : 1.0;\n\t\n\t// Avoid floating point bugs caused by GPU drivers.\n\talpha = (alpha < 1e-10) ? 0.0 : alpha;\n\n\tvec3 col;\n\tfor(float j = 0.0; j < 3.0; j++){\n\t\tfor(float i = 1.0; i < laminateLayer; i++){\n\t\t\tfloat timeNoiseSin = sin(uTime / (i + j)) * timeStrength.x + noise.r * noiseStrength.x;\n\t\t\tfloat timeNoiseCos = cos(uTime / (i + j)) * timeStrength.y + noise.g * noiseStrength.y;\n\t\t\tpos.x += laminateInterval.x / (i + j) * cos(i * distortion.x * pos.y + timeNoiseSin + sin(i + j));\n\t\t\tpos.y += laminateInterval.y / (i + j) * cos(i * distortion.y * pos.x + timeNoiseCos + sin(i + j));\n\t\t}\n\t\tcol[int(j)] = sin(pow(pos.x, 2.) * pow(laminateDetail.x, 2.)) + sin(pow(pos.y, 2.) * pow(laminateDetail.y, 2.));\n\t}\n\n\tcol *= colorFactor * alpha;\n\tcol = clamp(col, 0.0, 1.0);\n\t\n\tgl_FragColor = vec4(col, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class ColorStrataMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n isTexture: { value: boolean };\n scale: { value: number };\n noise: { value: THREE.Texture };\n noiseStrength: { value: THREE.Vector2 };\n isNoise: { value: boolean };\n laminateLayer: { value: number };\n laminateInterval: { value: THREE.Vector2 };\n laminateDetail: { value: THREE.Vector2 };\n distortion: { value: THREE.Vector2 };\n colorFactor: { value: THREE.Vector3 };\n uTime: { value: number };\n timeStrength: { value: THREE.Vector2 };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n isTexture: { value: false },\n scale: { value: 1.0 },\n noise: { value: new THREE.Texture() },\n noiseStrength: { value: new THREE.Vector2(0, 0) },\n isNoise: { value: false },\n laminateLayer: { value: 1.0 },\n laminateInterval: { value: new THREE.Vector2(0.1, 0.1) },\n laminateDetail: { value: new THREE.Vector2(1, 1) },\n distortion: { value: new THREE.Vector2(0, 0) },\n colorFactor: { value: new THREE.Vector3(1, 1, 1) },\n uTime: { value: 0 },\n timeStrength: { value: new THREE.Vector2(0, 0) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as ColorStrataMaterial;\n\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type ColorStrataParams = {\n /** default: null */\n texture?: THREE.Texture | false;\n /** Valid when texture is false. default : 1 */\n scale?: number;\n /** default: 1.0 */\n laminateLayer?: number;\n /** default: (0.1, 0.1) */\n laminateInterval?: THREE.Vector2;\n /** default: (1.0, 1.0) */\n laminateDetail?: THREE.Vector2;\n /** default: (0.0, 0.0) */\n distortion?: THREE.Vector2;\n /** default: (1.0, 1.0,1.0) */\n colorFactor?: THREE.Vector3;\n /** default: (0.0, 0.0) */\n timeStrength?: THREE.Vector2;\n /** default:false */\n noise?: THREE.Texture | false;\n /** default : (0.0,0.0) */\n noiseStrength?: THREE.Vector2;\n /** you can get into the rhythm ♪ , default:false */\n beat?: number | false;\n};\n\nexport type ColorStrataObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COLORSTRATA_PARAMS: ColorStrataParams = {\n texture: false,\n scale: 1.0,\n laminateLayer: 1.0,\n laminateInterval: new THREE.Vector2(0.1, 0.1),\n laminateDetail: new THREE.Vector2(1, 1),\n distortion: new THREE.Vector2(0, 0),\n colorFactor: new THREE.Vector3(1, 1, 1),\n timeStrength: new THREE.Vector2(0, 0),\n noise: false,\n noiseStrength: new THREE.Vector2(0, 0),\n beat: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useColorStrata = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ColorStrataParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n if (params.texture) {\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"isTexture\", true);\n } else {\n setUniform(material, \"isTexture\", false);\n setUniform(material, \"scale\", params.scale!);\n }\n\n if (params.noise) {\n setUniform(material, \"noise\", params.noise);\n setUniform(material, \"isNoise\", true);\n setUniform(material, \"noiseStrength\", params.noiseStrength!);\n } else {\n setUniform(material, \"isNoise\", false);\n }\n\n setUniform(material, \"uTime\", params.beat || clock.getElapsedTime());\n\n setUniform(material, \"laminateLayer\", params.laminateLayer!);\n setUniform(material, \"laminateInterval\", params.laminateInterval!);\n setUniform(material, \"laminateDetail\", params.laminateDetail!);\n setUniform(material, \"distortion\", params.distortion!);\n setUniform(material, \"colorFactor\", params.colorFactor!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform float u_time;\nuniform float u_pattern;\nuniform float u_complexity;\nuniform float u_complexityAttenuation;\nuniform float u_iterations;\nuniform float u_timeStrength;\nuniform float u_scale;\n\nvec3 marble(vec3 p){\n\tvec4 n;\n\tfor(float i;i {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_time: { value: 0 },\n u_pattern: { value: 0 },\n u_complexity: { value: 0 },\n u_complexityAttenuation: { value: 0 },\n u_iterations: { value: 0 },\n u_timeStrength: { value: 0 },\n u_scale: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as MarbleMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type MarbleParams = {\n /** You can add random patterns to noise by passing random numbers ,default:0 */\n pattern?: number;\n /** default:2 */\n complexity?: number;\n /** default:0.2 */\n complexityAttenuation?: number;\n /** default:8 */\n iterations?: number;\n /** default:0.2 */\n timeStrength?: number;\n /** default:0.002 */\n scale?: number;\n /** you can get into the rhythm ♪ , default:false */\n beat?: number | false;\n};\n\nexport type MarbleObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MARBLE_PARAMS: MarbleParams = {\n pattern: 0,\n complexity: 2,\n complexityAttenuation: 0.2,\n iterations: 8,\n timeStrength: 0.2,\n scale: 0.002,\n beat: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMarble = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: MarbleParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n setUniform(material, \"u_pattern\", params.pattern!);\n setUniform(material, \"u_complexity\", params.complexity!);\n setUniform(\n material,\n \"u_complexityAttenuation\",\n params.complexityAttenuation!\n );\n setUniform(material, \"u_iterations\", params.iterations!);\n setUniform(material, \"u_timeStrength\", params.timeStrength!);\n setUniform(material, \"u_scale\", params.scale!);\n\n setUniform(material, \"u_time\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\nuniform vec3 uColor4;\nuniform vec3 uRgbWeight;\n\n\n// Based on glsl-cos-palette by Erkaman\n// https://github.com/Erkaman/glsl-cos-palette\nvec3 cosPalette( float t, vec3 color1, vec3 color2, vec3 color3, vec3 color4 ){\n return color1 + color2 * cos( 6.28318 * ( color3 * t + color4) );\n}\n\nvoid main() {\n\n\tvec4 tex = texture2D(uTexture, vUv);\n\tfloat gray = dot(tex.rgb, uRgbWeight);\t\t\n\n\tvec3 outColor = cosPalette(\n\t\tgray,\n\t\tuColor1,\n\t\tuColor2,\n\t\tuColor3,\n\t\tuColor4\n\t);\n\n\tgl_FragColor = vec4(outColor, tex.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class CosPaletteMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uRgbWeight: { value: THREE.Vector3 };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColor4: { value: THREE.Color };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uRgbWeight: { value: new THREE.Vector3(0.299, 0.587, 0.114) },\n uColor1: { value: new THREE.Color().set(0.5, 0.5, 0.5) },\n uColor2: { value: new THREE.Color().set(0.5, 0.5, 0.5) },\n uColor3: { value: new THREE.Color().set(1, 1, 1) },\n uColor4: { value: new THREE.Color().set(0, 0.1, 0.2) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as CosPaletteMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\n\nexport type CosPaletteParams = {\n /** color1, default:rgb(50%, 50%, 50%) */\n color1?: THREE.Color;\n /** color2, default:rgb(50%, 50%, 50%) */\n color2?: THREE.Color;\n /** color3, default:rgb(100%, 100%, 100%) */\n color3?: THREE.Color;\n /** color4, default:rgb(0%, 10%, 20%) */\n color4?: THREE.Color;\n /** texture to be used as a palette */\n texture?: THREE.Texture;\n /** weight of the rgb, default:THREE.Vector3(1.0,0.0,0.0) */\n rgbWeight?: THREE.Vector3;\n};\n\nexport type ColorPaletteObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COSPALETTE_PARAMS: CosPaletteParams = {\n texture: new THREE.Texture(),\n color1: new THREE.Color().set(0.5, 0.5, 0.5),\n color2: new THREE.Color().set(0.5, 0.5, 0.5),\n color3: new THREE.Color().set(1, 1, 1),\n color4: new THREE.Color().set(0, 0.1, 0.2),\n rgbWeight: new THREE.Vector3(0.299, 0.587, 0.114),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCosPalette = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: CosPaletteParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor1\", params.color1!);\n setUniform(material, \"uColor2\", params.color2!);\n setUniform(material, \"uColor3\", params.color3!);\n setUniform(material, \"uColor4\", params.color4!);\n setUniform(material, \"uRgbWeight\", params.rgbWeight!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 texColor = texture2D(uTexture, uv);\n\tfloat grayscale = dot(texColor.rgb, vec3(0.299, 0.587, 0.114));\n\tvec3 duotone = mix(uColor0, uColor1, grayscale);\n\tgl_FragColor = vec4(duotone, texColor.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class DuoToneMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uColor0: { value: new THREE.Color(0xffffff) },\n uColor1: { value: new THREE.Color(0x000000) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as DuoToneMaterial;\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { DuoToneMaterial, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** 1st color , Default:new THREE.Color(0xffffff) */\n color0?: THREE.Color;\n /** 2nd color , Default: new THREE.Color(0x000000) */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n material: DuoToneMaterial;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const DUOTONE_PARAMS: DuoToneParams = {\n texture: new THREE.Texture(),\n color0: new THREE.Color(0xffffff),\n color1: new THREE.Color(0x000000),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useDuoTone = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DuoToneParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor0\", params.color0!);\n setUniform(material, \"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D u_map;\nuniform bool u_isAlphaMap;\nuniform sampler2D u_alphaMap;\nuniform float u_mapIntensity;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\nuniform vec3 u_dodgeColor;\nuniform bool u_isDodgeColor;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\t// fx blending\n\tvec3 mapColor = texture2D(u_map, uv).rgb;\n\tvec3 normalizedMap = mapColor * 2.0 - 1.0;\n\n\tuv = uv * 2.0 - 1.0;\n\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), u_mapIntensity);\n\tuv = (uv + 1.0) / 2.0;\n\n\t// colro blending\n\tfloat brightness = dot(mapColor,u_brightness);\n\tvec4 textureMap = texture2D(u_texture, uv);\n\tfloat blendValue = smoothstep(u_min, u_max, brightness);\n\n\t// set dodge color\n\tvec3 dodgeColor = u_isDodgeColor ? u_dodgeColor : mapColor;\n\tvec3 outputColor = blendValue * dodgeColor + (1.0 - blendValue) * textureMap.rgb;\n\t\n\t// alpha blending\n\tfloat alpha = u_isAlphaMap ? texture2D(u_alphaMap, uv).a : textureMap.a;\n\tfloat mixValue = u_isAlphaMap ? alpha : 0.0;\n\tvec3 alphColor = mix(outputColor,mapColor,mixValue);\n\n\tgl_FragColor = vec4(alphColor, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class BlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_map: { value: THREE.Texture };\n u_alphaMap: { value: THREE.Texture };\n u_isAlphaMap: { value: boolean };\n u_mapIntensity: { value: number };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n u_dodgeColor: { value: THREE.Color };\n u_isDodgeColor: { value: boolean };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_map: { value: new THREE.Texture() },\n u_alphaMap: { value: new THREE.Texture() },\n u_isAlphaMap: { value: false },\n u_mapIntensity: { value: 0.0 },\n u_brightness: { value: new THREE.Vector3() },\n u_min: { value: 0.0 },\n u_max: { value: 0.9 },\n u_dodgeColor: { value: new THREE.Color(0xffffff) },\n u_isDodgeColor: { value: false },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as BlendingMaterial;\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type BlendingParams = {\n /** Make this texture Blending , default:THREE.Texture */\n texture?: THREE.Texture;\n /** map texture, default:THREE.Texture */\n map?: THREE.Texture;\n /** map strength , r,g value are affecting , default:0.3 */\n mapIntensity?: number;\n /** Alpha blending is performed using the alpha of the set texture. , default:false */\n alphaMap?: THREE.Texture | false;\n /** default:(0.5,0.5,0.5) */\n brightness?: THREE.Vector3;\n /** default:0.0 */\n min?: number;\n /** default:1.0 */\n max?: number;\n /** If set, this value will apply color dodge , default: false */\n dodgeColor?: THREE.Color | false;\n};\n\nexport type BlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BLENDING_PARAMS: BlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n alphaMap: false,\n mapIntensity: 0.3,\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n dodgeColor: false,\n};\n\n/**\n * Blend map to texture. You can set the threshold for blending with brightness. You can set the dodge color by setting color. \nIf you don't want to reflect the map's color, you can use useFxBlending instead.\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n\n if (params.alphaMap) {\n setUniform(material, \"u_alphaMap\", params.alphaMap!);\n setUniform(material, \"u_isAlphaMap\", true);\n } else {\n setUniform(material, \"u_isAlphaMap\", false);\n }\n\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n if (params.dodgeColor) {\n setUniform(material, \"u_dodgeColor\", params.dodgeColor);\n setUniform(material, \"u_isDodgeColor\", true);\n } else {\n setUniform(material, \"u_isDodgeColor\", false);\n }\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture0;\nuniform sampler2D uTexture1;\nuniform sampler2D uMap;\nuniform float mapIntensity;\nuniform float edgeIntensity;\nuniform float progress;\nuniform float dirX;\nuniform float dirY;\nuniform vec2 epicenter;\nuniform float padding;\n\nbool isInPaddingArea(vec2 uv) {\n return uv.x < padding || uv.x > 1.0 - padding || uv.y < padding || uv.y > 1.0 - padding;\n}\n\nvoid main() {\n\tfloat screenAspect = uResolution.x / uResolution.y;\n\tfloat textureAspect = uTextureResolution.x / uTextureResolution.y;\n\tvec2 aspectRatio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\tvec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;\n\n\t// fx map\n\tvec2 map = texture2D(uMap, uv).rg;\n\tvec2 normalizedMap = map * 2.0 - 1.0;\n\n\t// multiply edge fx\n\tuv = uv * 2.0 - 1.0;\n\tuv *= map * distance(epicenter, uv) * edgeIntensity + 1.0;\n\tuv = (uv + 1.0) / 2.0;\n\n\t// padding\n\tif (isInPaddingArea(uv)) {\n\t\tgl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n\t\treturn;\n\t}\n\tvec2 paddedUV = uv * (1.0 - 2.0 * padding * -1.) + padding * -1.;\n\n\t// centered uv\n\tvec2 centeredUV = paddedUV - vec2(0.5);\n\n\t// multiply map fx\n\tcenteredUV *= normalizedMap * map * mapIntensity + 1.0;\n\n\t// texture 0\n\tfloat xOffsetTexture0 = 0.5 - dirX * progress;\n\tfloat yOffsetTexture0 = 0.5 - dirY * progress;\n\tvec2 samplePosTexture0 = vec2(xOffsetTexture0, yOffsetTexture0) + centeredUV;\n\n\t//texture 1\n\tfloat xOffsetTexture1 = 0.5 + dirX * (1.0 - progress);\n\tfloat yOffsetTexture1 = 0.5 + dirY * (1.0 - progress);\n\tvec2 samplePosTexture1 = vec2(xOffsetTexture1, yOffsetTexture1) + centeredUV;\n\n\tvec4 color0 = texture2D(uTexture0, samplePosTexture0);\n\tvec4 color1 = texture2D(uTexture1, samplePosTexture1);\n\n\tgl_FragColor = mix(color0, color1, progress);\n\n}","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class FxTextureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uTextureResolution: { value: THREE.Vector2 };\n uTexture0: { value: THREE.Texture };\n uTexture1: { value: THREE.Texture };\n padding: { value: number };\n uMap: { value: THREE.Texture };\n edgeIntensity: { value: number };\n mapIntensity: { value: number };\n epicenter: { value: THREE.Vector2 };\n progress: { value: number };\n dirX: { value: number };\n dirY: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: new THREE.Texture() },\n uTexture1: { value: new THREE.Texture() },\n padding: { value: 0.0 },\n uMap: { value: new THREE.Texture() },\n edgeIntensity: { value: 0.0 },\n mapIntensity: { value: 0.0 },\n epicenter: { value: new THREE.Vector2(0.0, 0.0) },\n progress: { value: 0.0 },\n dirX: { value: 0.0 },\n dirY: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type FxTextureParams = {\n /** 1st texture , default:THREE.Texture() */\n texture0?: THREE.Texture;\n /** 2nd texture , default:THREE.Texture() */\n texture1?: THREE.Texture;\n /** add transparent padding, 0.0 ~ 1.0 , default:0.0 */\n padding?: number;\n /** The color map. The uv value is affected according to this rbg , default:THREE.Texture() */\n map?: THREE.Texture;\n /** intensity of map , r,g value are affecting , default:0.0 */\n mapIntensity?: number;\n /** Intensity of effect on edges , default:0.0 */\n edgeIntensity?: number;\n /** epicenter of fx, -1 ~ 1 , default:vec2(0.0,0.0)*/\n epicenter?: THREE.Vector2;\n /** Switch value to switch between texture0 and texture1 , 0 ~ 1 , default : 0 */\n progress?: number;\n /** direction of transition , default: THREE.Vector2(0, 0) */\n dir?: THREE.Vector2;\n};\n\nexport type FxTextureObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const FXTEXTURE_PARAMS: FxTextureParams = {\n texture0: new THREE.Texture(),\n texture1: new THREE.Texture(),\n padding: 0.0,\n map: new THREE.Texture(),\n mapIntensity: 0.0,\n edgeIntensity: 0.0,\n epicenter: new THREE.Vector2(0, 0),\n progress: 0.0,\n dir: new THREE.Vector2(0, 0),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxTexture = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture0\", params.texture0!);\n setUniform(material, \"uTexture1\", params.texture1!);\n\n setUniform(material, \"progress\", params.progress!);\n\n // calculate resolution by linear interpolation.\n const tex0Res = [\n params.texture0!?.image?.width || 0,\n params.texture0!?.image?.height || 0,\n ];\n const tex1Res = [\n params.texture1!?.image?.width || 0,\n params.texture1!?.image?.height || 0,\n ];\n const interpolatedResolution = tex0Res.map((value, index) => {\n return value + (tex1Res[index] - value) * params.progress!;\n });\n setUniform(material, \"uTextureResolution\", interpolatedResolution);\n\n setUniform(material, \"padding\", params.padding!);\n setUniform(material, \"uMap\", params.map!);\n setUniform(material, \"mapIntensity\", params.mapIntensity!);\n setUniform(material, \"edgeIntensity\", params.edgeIntensity!);\n setUniform(material, \"epicenter\", params.epicenter!);\n setUniform(material, \"dirX\", params.dir!.x);\n setUniform(material, \"dirY\", params.dir!.y);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec3 color = texture2D(u_texture, uv).rgb;\n\tfloat brightness = dot(color,u_brightness);\n\tfloat alpha = clamp(smoothstep(u_min, u_max, brightness),0.0,1.0);\n\tgl_FragColor = vec4(color, alpha);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class BrightnessPickerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_brightness: { value: new THREE.Vector3() },\n u_min: { value: 0.0 },\n u_max: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as BrightnessPickerMaterial;\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type BrightnessPickerParams = {\n /** pick brightness from this texture , default:THREE.Texture */\n texture?: THREE.Texture;\n /** default:(0.5,0.5,0.5) */\n brightness?: THREE.Vector3;\n /** default:0.0 */\n min?: number;\n /** default:1.0 */\n max?: number;\n};\n\nexport type BrightnessPickerObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRIGHTNESSPICKER_PARAMS: BrightnessPickerParams = {\n texture: new THREE.Texture(),\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrightnessPicker = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrightnessPickerParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D u_map;\nuniform float u_mapIntensity;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 mapColor = texture2D(u_map, uv).rg;\n\tvec2 normalizedMap = mapColor * 2.0 - 1.0;\n\t\n\tuv = uv * 2.0 - 1.0;\n\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), u_mapIntensity);\n\tuv = (uv + 1.0) / 2.0;\n\n\tgl_FragColor = texture2D(u_texture, uv);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class FxBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_map: { value: THREE.Texture };\n u_mapIntensity: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_map: { value: new THREE.Texture() },\n u_mapIntensity: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as FxBlendingMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type FxBlendingParams = {\n /** Make this texture Blending , default:THREE.Texture */\n texture?: THREE.Texture;\n /** map texture, default:THREE.Texture */\n map?: THREE.Texture;\n /** map strength , r,g value are affecting , default:0.3 */\n mapIntensity?: number;\n};\n\nexport type FxBlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const FXBLENDING_PARAMS: FxBlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n mapIntensity: 0.3,\n};\n\n/**\n * Blend map to texture. You can change the intensity of fx applied by the rg value of map. Unlike \"useBlending\", the map color is not reflected.\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxBlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n const bufferTexture = updateRenderTarget(gl);\n return bufferTexture;\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nuniform sampler2D uTexture;\nuniform sampler2D uMap;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 tex = texture2D(uTexture, uv);\n\tvec4 map = texture2D(uMap, uv);\n\tgl_FragColor = mix(tex,map,map.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class AlphaBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uMap: { value: THREE.Texture };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uMap: { value: new THREE.Texture() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as AlphaBlendingMaterial;\n\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\n\nexport type AlphaBlendingParams = {\n /** default:THREE.Texture()*/\n texture?: THREE.Texture;\n /** alpha map , default:THREE.Texture() */\n map?: THREE.Texture;\n};\n\nexport type AlphaBlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const ALPHABLENDING_PARAMS: AlphaBlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useAlphaBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] =\n useParams(ALPHABLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: AlphaBlendingParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uMap\", params.map!);\n\n return updateRenderTarget(gl);\n },\n [material, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform float u_brightness;\nuniform float u_saturation;\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class HSVMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: number };\n u_saturation: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_brightness: { value: 1 },\n u_saturation: { value: 1 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as HSVMaterial;\n\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\n\nexport type HSVParams = {\n /** default:THREE.Texture() */\n texture?: THREE.Texture;\n /** default:1 */\n brightness?: number;\n /** default:1 */\n saturation?: number;\n};\n\nexport type HSVObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const HSV_PARAMS: HSVParams = {\n texture: new THREE.Texture(),\n brightness: 1,\n saturation: 1,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useHSV = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(HSV_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: HSVParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_saturation\", params.saturation!);\n\n return updateRenderTarget(gl);\n },\n [material, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture;\n\nvoid main() {\n\tfloat screenAspect = uResolution.x / uResolution.y;\n\tfloat textureAspect = uTextureResolution.x / uTextureResolution.y;\n\tvec2 aspectRatio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\tvec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;\n\t\n\tgl_FragColor = texture2D(uTexture, uv);\n\n}","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class FxTextureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uTextureResolution: { value: THREE.Vector2 };\n uTexture: { value: THREE.Texture };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture: { value: new THREE.Texture() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type CoverTextureParams = {\n /** Textures that you want to display exactly on the screen , default:THREE.Texture() */\n texture?: THREE.Texture;\n};\n\nexport type CoverTextureObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COVERTEXTURE_PARAMS: CoverTextureParams = {\n texture: new THREE.Texture(),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCoverTexture = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: CoverTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uTextureResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","precision mediump float;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision mediump float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec2 uResolution;\nuniform float uBlurSize;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec2 perDivSize = uBlurSize / uResolution;\n\n\t// calc average color value from adjacent point\n\tvec4 outColor = vec4(\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, -1.0)) +\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 1.0))\n\t\t) / 9.0;\n\t\n\tgl_FragColor = outColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\n\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class SampleMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uResolution: { value: THREE.Vector2 };\n uBlurSize: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uBlurSize: { value: 1 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as SampleMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../../types\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** blurSize, default:3 */\n blurSize?: number;\n /** blurPower, affects performance default:5 */\n blurPower?: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const SIMPLEBLUR_PARAMS: SimpleBlurParams = {\n texture: new THREE.Texture(),\n blurSize: 3,\n blurPower: 5,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useSimpleBlur = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr,\n samples,\n }),\n [scene, camera, size, dpr, samples]\n );\n const [renderTarget, updateRenderTarget] = useSingleFBO(fboProps);\n const [_, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: SimpleBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n setUniform(material, \"uBlurSize\", params.blurSize!);\n\n let _tempTexture: THREE.Texture = updateTempTexture(gl);\n\n const iterations = params.blurPower!;\n for (let i = 0; i < iterations; i++) {\n setUniform(material, \"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateTempTexture, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform float uProgress;\nuniform float uStrength;\nuniform float uWidth;\nuniform vec2 uEpicenter;\nuniform int uMode;\n\nfloat PI = 3.141592653589;\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tfloat progress = min(uProgress, 1.0);\n\tfloat progressFactor = sin(progress * PI);\n\n\tfloat border = progress - progress * progressFactor * uWidth;\n\tfloat blur = uStrength * progressFactor;\n\t\n\t// 0 ~ 1\n\tvec2 normalizeCenter = (uEpicenter + 1.0) / 2.0;\n\n\t// 0:center 1:horizontal 2:vertical\n\tfloat dist = uMode == 0 ? length(uv - normalizeCenter) : uMode == 1 ? length(uv.x - normalizeCenter.x) : length(uv.y - normalizeCenter.y);\n\n\t// Calculate the maximum distance to the four corners of the screen\n\tfloat maxDistance = max(\n\t\tlength(vec2(0.0, 0.0) - normalizeCenter),\n\t\tmax(\n\t\t\t\tlength(vec2(1.0, 0.0) - normalizeCenter),\n\t\t\t\tmax(\n\t\t\t\t\tlength(vec2(0.0, 1.0) - normalizeCenter),\n\t\t\t\t\tlength(vec2(1.0, 1.0) - normalizeCenter)\n\t\t\t\t)\n\t\t)\n\t);\n\n\t// Scale distance so that waves extend to the edge of the screen\n\tdist = maxDistance > 0.0 ? dist / maxDistance : dist;\n\n\tvec3 color = vec3(smoothstep(border - blur, border, dist) -\n smoothstep(progress, progress + blur, dist));\n\t\n\t// Ensure color is 0 when progress is 0,1\n\tcolor *= progressFactor;\n\n\tgl_FragColor = vec4(color, 1.0);\n}\n\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class WaveMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uEpicenter: { value: THREE.Vector2 };\n uProgress: { value: number };\n uStrength: { value: number };\n uWidth: { value: number };\n uMode: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uEpicenter: { value: new THREE.Vector2(0.0, 0.0) },\n uProgress: { value: 0.0 },\n uStrength: { value: 0.0 },\n uWidth: { value: 0.0 },\n uMode: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n useAddMesh(scene, geometry, material);\n\n return material as WaveMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\n\nexport type WaveParams = {\n /** -1.0 ~ 1.0 , default:vec2(0.0,0.0) */\n epicenter?: THREE.Vector2;\n /** 0.0 ~ 1.0 , default:0.0 */\n progress?: number;\n /** default:0.0 */\n width?: number;\n /** default:0.0 */\n strength?: number;\n /** default:center */\n mode?: \"center\" | \"horizontal\" | \"vertical\";\n};\n\nexport type WaveObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WAVE_PARAMS: WaveParams = {\n epicenter: new THREE.Vector2(0.0, 0.0),\n progress: 0.0,\n width: 0.0,\n strength: 0.0,\n mode: \"center\",\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useWave = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: WaveParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uEpicenter\", params.epicenter!);\n setUniform(material, \"uProgress\", params.progress!);\n setUniform(material, \"uWidth\", params.width!);\n setUniform(material, \"uStrength\", params.strength!);\n setUniform(\n material,\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D u_texture;\nuniform vec2 u_resolution;\nuniform vec3 u_keyColor;\nuniform float u_similarity;\nuniform float u_smoothness;\nuniform float u_spill;\n\nuniform vec4 u_color;\nuniform float u_contrast;\nuniform float u_brightness;\nuniform float u_gamma;\n\n// From https://github.com/libretro/glsl-shaders/blob/master/nnedi3/shaders/rgb-to-yuv.glsl\nvec2 RGBtoUV(vec3 rgb) {\n return vec2(\n rgb.r * -0.169 + rgb.g * -0.331 + rgb.b * 0.5 + 0.5,\n rgb.r * 0.5 + rgb.g * -0.419 + rgb.b * -0.081 + 0.5\n );\n}\nfloat getChromeDist(vec3 texColor){\n\tfloat chromaDist = distance(RGBtoUV(texColor), RGBtoUV(u_keyColor));\n\treturn chromaDist;\n}\n\nfloat getBoxFilteredChromaDist(vec3 rgb, vec2 uv)\n{\n\tvec2 pixel_size = vec2(1.) / u_resolution;\n\tvec2 h_pixel_size = pixel_size / 2.0;\n\tvec2 point_0 = vec2(pixel_size.x, h_pixel_size.y);\n\tvec2 point_1 = vec2(h_pixel_size.x, -pixel_size.y);\n\tfloat distVal = getChromeDist(texture2D(u_texture,uv-point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv-point_1).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_1).rgb);\n\tdistVal *= 2.0;\n\tdistVal += getChromeDist(rgb);\n\treturn distVal / 9.0;\n}\n\nvec4 CalcColor(vec4 rgba)\n{\n\treturn vec4(pow(rgba.rgb, vec3(u_gamma, u_gamma, u_gamma)) * u_contrast + u_brightness, rgba.a);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tvec4 texColor = texture2D(u_texture, uv);\n\ttexColor.rgb *= (texColor.a > 0.) ? (1. / texColor.a) : 0.;\n\n\tfloat chromaDist = getBoxFilteredChromaDist(texColor.rgb,uv);\n\t\n\tfloat baseMask = chromaDist - u_similarity;\n\tfloat fullMask = pow(clamp(baseMask / u_smoothness, 0., 1.), 1.5);\n\t\n\ttexColor.rgba *= u_color;\n\ttexColor.a = fullMask;\n\n\tfloat spillVal = pow(clamp(baseMask / u_spill, 0., 1.), 1.5);\n\tfloat desat = clamp(texColor.r * 0.2126 + texColor.g * 0.7152 + texColor.b * 0.0722, 0., 1.);\n\ttexColor.rgb = mix(vec3(desat, desat, desat), texColor.rgb, spillVal);\n\n\tvec4 finColor = CalcColor(texColor);\n\n\tgl_FragColor = finColor;\n}","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useResolution } from \"../../../utils/useResolution\";\n\nexport class ChromaKeyMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_resolution: { value: THREE.Vector2 };\n u_keyColor: { value: THREE.Color };\n u_similarity: { value: number };\n u_smoothness: { value: number };\n u_spill: { value: number };\n u_color: { value: THREE.Vector4 };\n u_contrast: { value: number };\n u_brightness: { value: number };\n u_gamma: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_resolution: { value: new THREE.Vector2() },\n u_keyColor: { value: new THREE.Color() },\n u_similarity: { value: 0 },\n u_smoothness: { value: 0 },\n u_spill: { value: 0 },\n u_color: { value: new THREE.Vector4() },\n u_contrast: { value: 0 },\n u_brightness: { value: 0 },\n u_gamma: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as ChromaKeyMaterial;\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"u_resolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type ChromaKeyParams = {\n /** Process this texture with chroma key , default:THREE.Texture */\n texture?: THREE.Texture;\n /** key color for chromakey processing , default: THREE.Color(0x00ff00) */\n keyColor?: THREE.Color;\n /** If the similarity with the key color exceeds this value, it becomes transparent. , default: 0.2 */\n similarity?: number;\n /** smoothness , default : 0.1 */\n smoothness?: number;\n /** spill , default : 0.2 */\n spill?: number;\n /** tone correction , default : THREE.Vector4(1.0, 1.0, 1.0, 1.0) */\n color?: THREE.Vector4;\n /** contrast , default : 1.0 */\n contrast?: number;\n /** brightness , default : 0.0 */\n brightness?: number;\n /** gamma correction , default : 1.0 */\n gamma?: number;\n};\n\nexport type ChromaKeyObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const CHROMAKEY_PARAMS: ChromaKeyParams = {\n texture: new THREE.Texture(),\n keyColor: new THREE.Color(0x00ff00),\n similarity: 0.2,\n smoothness: 0.1,\n spill: 0.2,\n color: new THREE.Vector4(1.0, 1.0, 1.0, 1.0),\n contrast: 1.0,\n brightness: 0.0,\n gamma: 1.0,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useChromaKey = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ChromaKeyParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_keyColor\", params.keyColor!);\n setUniform(material, \"u_similarity\", params.similarity!);\n setUniform(material, \"u_smoothness\", params.smoothness!);\n setUniform(material, \"u_spill\", params.spill!);\n setUniform(material, \"u_color\", params.color!);\n setUniform(material, \"u_contrast\", params.contrast!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_gamma\", params.gamma!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { UseFboProps, renderFBO, FBO_OPTION } from \"./useSingleFBO\";\n\ntype UpdateCopyFunction = (\n gl: THREE.WebGLRenderer,\n index: number,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseCopyTextureReturn = [THREE.WebGLRenderTarget[], UpdateCopyFunction];\n\n/**\n * Generate an FBO array to copy the texture.\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @param length The number of FBOs to create\n * @returns [THREE.WebGLRenderTarget[] , updateCopyTexture] -Receives the RenderTarget array as the first argument and the update function as the second argument. updateCopyTexture() receives gl as the first argument and the index of the texture you want to copy as the second argument.\n */\nexport const useCopyTexture = (\n {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n }: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const renderTargetArr = useRef([]);\n const resolution = useResolution(size, dpr);\n\n renderTargetArr.current = useMemo(() => {\n return Array.from({ length }, () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n","export type EasingTypes =\n | \"easeInSine\"\n | \"easeOutSine\"\n | \"easeInOutSine\"\n | \"easeInQuad\"\n | \"easeOutQuad\"\n | \"easeInOutQuad\"\n | \"easeInCubic\"\n | \"easeOutCubic\"\n | \"easeInOutCubic\"\n | \"easeInQuart\"\n | \"easeOutQuart\"\n | \"easeInOutQuart\"\n | \"easeInQuint\"\n | \"easeOutQuint\"\n | \"easeInOutQuint\"\n | \"easeInExpo\"\n | \"easeOutExpo\"\n | \"easeInOutExpo\"\n | \"easeInCirc\"\n | \"easeOutCirc\"\n | \"easeInOutCirc\"\n | \"easeInBack\"\n | \"easeOutBack\"\n | \"easeInOutBack\"\n | \"easeInElastic\"\n | \"easeOutElastic\"\n | \"easeInOutElastic\"\n | \"easeInBounce\"\n | \"easeOutBounce\"\n | \"easeInOutBounce\";\n\ntype EasingFunctions = {\n [K in EasingTypes]: (x: number) => number;\n};\n\n/**\n * from https://github.com/ai/easings.net\n */\nexport const Easing: EasingFunctions = Object.freeze({\n easeInSine(x: number): number {\n return 1 - Math.cos((x * Math.PI) / 2);\n },\n easeOutSine(x: number): number {\n return Math.sin((x * Math.PI) / 2);\n },\n easeInOutSine(x: number): number {\n return -(Math.cos(Math.PI * x) - 1) / 2;\n },\n easeInQuad(x: number): number {\n return x * x;\n },\n easeOutQuad(x: number): number {\n return 1 - (1 - x) * (1 - x);\n },\n easeInOutQuad(x: number): number {\n return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2;\n },\n easeInCubic(x: number): number {\n return x * x * x;\n },\n easeOutCubic(x: number): number {\n return 1 - Math.pow(1 - x, 3);\n },\n easeInOutCubic(x: number): number {\n return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2;\n },\n easeInQuart(x: number): number {\n return x * x * x * x;\n },\n easeOutQuart(x: number): number {\n return 1 - Math.pow(1 - x, 4);\n },\n easeInOutQuart(x: number): number {\n return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2;\n },\n easeInQuint(x: number): number {\n return x * x * x * x * x;\n },\n easeOutQuint(x: number): number {\n return 1 - Math.pow(1 - x, 5);\n },\n easeInOutQuint(x: number): number {\n return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2;\n },\n easeInExpo(x: number): number {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n },\n easeOutExpo(x: number): number {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n },\n easeInOutExpo(x: number): number {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n },\n easeInCirc(x: number): number {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n },\n easeOutCirc(x: number): number {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n },\n easeInOutCirc(x: number): number {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n },\n easeInBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return c3 * x * x * x - c1 * x * x;\n },\n easeOutBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2);\n },\n easeInOutBack(x: number): number {\n const c1 = 1.70158;\n const c2 = c1 * 1.525;\n\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n },\n easeInElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n },\n easeOutElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;\n },\n easeInOutElastic(x: number): number {\n const c5 = (2 * Math.PI) / 4.5;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2\n : (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 +\n 1;\n },\n easeInBounce(x: number): number {\n return 1 - Easing.easeOutBounce(1 - x);\n },\n easeOutBounce(x: number): number {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n },\n easeInOutBounce(x: number): number {\n return x < 0.5\n ? (1 - Easing.easeOutBounce(1 - 2 * x)) / 2\n : (1 + Easing.easeOutBounce(2 * x - 1)) / 2;\n },\n});\n","import * as THREE from \"three\";\nimport { Easing, EasingTypes } from \"../libs/easing\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : 60\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\n\nexport class DomSyncerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_textureResolution: { value: THREE.Vector2 };\n u_resolution: { value: THREE.Vector2 };\n u_borderRadius: { value: number };\n };\n}\n\nexport const createMesh = ({\n params,\n size,\n scene,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n}) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mesh = new THREE.Mesh(\n new THREE.PlaneGeometry(1, 1),\n new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n transparent: true,\n uniforms: {\n u_texture: { value: texture },\n u_textureResolution: {\n value: new THREE.Vector2(0, 0),\n },\n u_resolution: { value: new THREE.Vector2(0, 0) },\n u_borderRadius: {\n value: params.boderRadius![i] ? params.boderRadius![i] : 0.0,\n },\n },\n })\n );\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { DomSyncerMaterial } from \"./createMesh\";\nimport { useCallback, useRef } from \"react\";\n\ntype UpdateDomRect = ({\n params,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n}: {\n params: DomSyncerParams;\n size: Size;\n resolutionRef: React.MutableRefObject;\n scene: THREE.Scene;\n isIntersectingRef: React.MutableRefObject;\n}) => void;\n\ntype UseUpdateDomRectReturn = [DOMRect[], UpdateDomRect];\n\nexport const useUpdateDomRect = (): UseUpdateDomRectReturn => {\n const domRects = useRef([]);\n\n const updateDomRects: UpdateDomRect = useCallback(\n ({ params, size, resolutionRef, scene, isIntersectingRef }) => {\n // Initialize domRects if the number of children in the scene is different from the number of DOMRect\n if (scene.children.length !== domRects.current!.length) {\n domRects.current = new Array(scene.children.length);\n }\n\n scene.children.forEach((mesh, i) => {\n const domElement = params.dom![i];\n if (!domElement) {\n return;\n }\n\n // DOMRect is updated even outside the intersection\n const rect = domElement.getBoundingClientRect();\n domRects.current[i] = rect;\n\n // Intersection cannot be determined accurately depending on the mobile navigation bar, so it seems better to update it constantly\n mesh.scale.set(rect.width, rect.height, 1.0);\n mesh.position.set(\n rect.left + rect.width * 0.5 - size.width * 0.5,\n -rect.top - rect.height * 0.5 + size.height * 0.5,\n 0.0\n );\n\n if (isIntersectingRef.current[i]) {\n if (params.rotation![i]) {\n mesh.rotation.copy(params.rotation![i]);\n }\n\n if (mesh instanceof THREE.Mesh) {\n const material: DomSyncerMaterial = mesh.material;\n setUniform(material, \"u_texture\", params.texture![i]);\n setUniform(material, \"u_textureResolution\", [\n params.texture![i]?.source?.data?.width || 0,\n params.texture![i]?.source?.data?.height || 0,\n ]);\n setUniform(\n material,\n \"u_resolution\",\n resolutionRef.current.set(rect.width, rect.height)\n );\n setUniform(\n material,\n \"u_borderRadius\",\n params.boderRadius![i] ? params.boderRadius![i] : 0.0\n );\n }\n }\n });\n },\n []\n );\n\n return [domRects.current, updateDomRects];\n};\n","import { useCallback, useRef } from \"react\";\n\nexport type IsIntersecting = (\n index: number,\n once?: boolean\n) => boolean[] | boolean;\n\nexport const useIsIntersecting = () => {\n const isIntersectingRef = useRef([]);\n const isIntersectingOnceRef = useRef([]);\n\n const isIntersecting: IsIntersecting = useCallback((index, once = false) => {\n isIntersectingRef.current.forEach((value, i) => {\n if (value) {\n isIntersectingOnceRef.current[i] = true;\n }\n });\n const temp = once\n ? [...isIntersectingOnceRef.current]\n : [...isIntersectingRef.current];\n return index < 0 ? temp : temp[index];\n }, []);\n\n return {\n isIntersectingRef,\n isIntersectingOnceRef,\n isIntersecting,\n };\n};\n","import { useEffect, useRef } from \"react\";\n\nexport type UseDomViewProps = {\n onView?: () => void;\n onHidden?: () => void;\n};\n\nexport type UseDomView = (props: UseDomViewProps) => void;\n\nexport const createUseDomView = (\n isIntersectingRef: React.MutableRefObject\n): UseDomView => {\n const useDomView = ({ onView, onHidden }: UseDomViewProps) => {\n const isView = useRef(false);\n useEffect(() => {\n let id: number;\n const filterIntersection = () => {\n if (isIntersectingRef.current.some((item) => item)) {\n if (!isView.current) {\n onView && onView();\n isView.current = true;\n }\n } else {\n if (isView.current) {\n onHidden && onHidden();\n isView.current = false;\n }\n }\n id = requestAnimationFrame(filterIntersection);\n };\n id = requestAnimationFrame(filterIntersection);\n return () => {\n cancelAnimationFrame(id);\n };\n }, [onView, onHidden]);\n };\n return useDomView;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef, useState, Key } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../../fxs/types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { errorHandler } from \"./utils/errorHandler\";\nimport { createMesh } from \"./utils/createMesh\";\nimport { useIntersectionHandler } from \"./utils/useIntersectionHandler\";\nimport { useUpdateDomRect } from \"./utils/useUpdateDomRect\";\nimport { useIsIntersecting, IsIntersecting } from \"./utils/useIsIntersecting\";\nimport { UseDomView, createUseDomView } from \"./utils/createUseDomView\";\n\nexport type DomSyncerParams = {\n /** DOM array you want to synchronize */\n dom?: (HTMLElement | Element | null)[];\n /** Texture array that you want to synchronize with the DOM rectangle */\n texture?: THREE.Texture[];\n /** default:0.0[] */\n boderRadius?: number[];\n /** the angle you want to rotate */\n rotation?: THREE.Euler[];\n /** Array of callback functions when crossed */\n onIntersect?: ((entry: IntersectionObserverEntry) => void)[];\n /** Because DOM rendering and React updates occur asynchronously, there may be a lag between updating dependent arrays and setting DOM arrays. That's what the Key is for. If the dependent array is updated but the Key is not, the loop will skip and return an empty texture. By updating the timing key when DOM acquisition is complete, you can perfectly synchronize DOM and Mesh updates.updateKey must be a unique value for each update, for example `performance.now()`.*/\n updateKey?: Key;\n};\n\nexport type DomSyncerObject = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n /**\n * A function that returns a determination whether the DOM intersects or not.\n * The boolean will be updated after executing the onIntersect function.\n * @param index - Index of the dom for which you want to return an intersection decision. -1 will return the entire array.\n * @param once - If set to true, it will continue to return true once crossed.\n */\n isIntersecting: IsIntersecting;\n /** target's DOMRect[] */\n DOMRects: DOMRect[];\n /** target's intersetions boolean[] */\n intersections: boolean[];\n /** You can set callbacks for when at least one DOM is visible and when it is completely hidden. */\n useDomView: UseDomView;\n};\n\nexport const DOMSYNCER_PARAMS: DomSyncerParams = {\n texture: [],\n dom: [],\n boderRadius: [],\n rotation: [],\n onIntersect: [],\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usedomsyncer\n * @param dependencies - When this dependency array is changed, the mesh and intersection judgment will be updated according to the passed DOM array.\n */\nexport const useDomSyncer = (\n { size, dpr, samples = 0 }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\n });\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useEffect(() => {\n setRefreshTrigger(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => new THREE.Texture(), []);\n\n // set intersection\n const intersectionHandler = useIntersectionHandler();\n const { isIntersectingOnceRef, isIntersectingRef, isIntersecting } =\n useIsIntersecting();\n\n // create useDomView\n const useDomView = createUseDomView(isIntersectingRef);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DomSyncerParams) => {\n const { gl, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (errorHandler(params)) {\n return emptyTexture;\n }\n\n if (refreshTrigger) {\n if (updateKey.current === params.updateKey) {\n return emptyTexture;\n } else {\n updateKey.current = params.updateKey!;\n }\n }\n\n if (refreshTrigger) {\n createMesh({\n params,\n size,\n scene,\n });\n\n intersectionHandler({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n });\n\n setRefreshTrigger(false);\n }\n\n updateDomRects({\n params,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n });\n\n return updateRenderTarget(gl);\n },\n [\n updateRenderTarget,\n setParams,\n intersectionHandler,\n updateDomRects,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n emptyTexture,\n ]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene,\n camera,\n renderTarget,\n output: renderTarget.texture,\n isIntersecting,\n DOMRects,\n intersections: isIntersectingRef.current,\n useDomView,\n },\n ];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","useAddMesh","scene","geometry","material","mesh","useEffect","setUniform","key","value","useMesh","vertexShader","fragmentShader","resolution","getCameraProps","width","height","frustumSize","aspect","w","h","useCamera","near","far","usePointer","lerp","prevPointer","useRef","diffPointer","lerpPointer","lastUpdateTime","velocity","isMoved","useCallback","currentPointer","now","current","deltaTime","isUpdate","prevTemp","useParams","params","paramsRef","obj","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","useLayoutEffect","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","BRUSH_PARAMS","useBrush","updatePointer","pressureEnd","props","pointer","pointerValues","color","init_default","useInitialMaterial","advection_default","useAdvectionMaterial","divergence_default","useDivergenceMaterial","pressure_default","usePressureMaterial","curl_default","useCurlMaterial","vorticity_default","useVorticityMaterial","clear_default","useClearMaterial","gradientSubtract_default","useGradientSubtractMaterial","splat_default","useSplateMaterial","initialMaterial","updateMaterial","curlMaterial","vorticityMaterial","advectionMaterial","divergenceMaterial","pressureMaterial","clearMaterial","gradientSubtractMaterial","splatMaterial","materials","setMeshMaterial","FLUID_PARAMS","useFluid","fboProps","velocityFBO","updateVelocityFBO","densityFBO","updateDensityFBO","curlFBO","updateCurlFBO","divergenceFBO","updateDivergenceFBO","pressureFBO","updatePressureFBO","lastTime","scaledDiffVec","spaltVec","clock","dt","velocityTex","densityTex","scaledDiff","curlTex","divergenceTex","pressureTexTemp","i","scale","max","texture","meshArr","RIPPLE_PARAMS","useRipple","currentWave","NOISE_PARAMS","useNoise","COLORSTRATA_PARAMS","useColorStrata","MARBLE_PARAMS","useMarble","COSPALETTE_PARAMS","useCosPalette","DUOTONE_PARAMS","useDuoTone","BLENDING_PARAMS","useBlending","FXTEXTURE_PARAMS","useFxTexture","tex0Res","_d","_c","tex1Res","_f","_e","_h","_g","interpolatedResolution","index","BRIGHTNESSPICKER_PARAMS","useBrightnessPicker","FXBLENDING_PARAMS","useFxBlending","ALPHABLENDING_PARAMS","useAlphaBlending","HSV_PARAMS","useHSV","COVERTEXTURE_PARAMS","useCoverTexture","SIMPLEBLUR_PARAMS","useSimpleBlur","_","updateTempTexture","_tempTexture","iterations","WAVE_PARAMS","useWave","CHROMAKEY_PARAMS","useChromaKey","useCopyTexture","length","renderTargetArr","updateCopyTexture","Easing","x","c2","c4","c5","getHash","input","n","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","hash","useFPSLimiter","fps","interval","prevTime","tick","errorHandler","domLength","textureLength","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","DOMRects","refreshTrigger","setRefreshTrigger","useState","updateKey","emptyTexture","intersectionHandler","useDomView"],"mappings":"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"} \ No newline at end of file diff --git a/packages/use-shader-fx/build/use-shader-fx.umd.cjs.map b/packages/use-shader-fx/build/use-shader-fx.umd.cjs.map index 934b0973..4be78c89 100644 --- a/packages/use-shader-fx/build/use-shader-fx.umd.cjs.map +++ b/packages/use-shader-fx/build/use-shader-fx.umd.cjs.map @@ -1 +1 @@ -{"version":3,"file":"use-shader-fx.umd.cjs","sources":["../src/fxs/interactions/useBrush/shader/main.vert","../src/fxs/interactions/useBrush/shader/main.frag","../src/utils/useResolution.ts","../src/utils/useAddMesh.ts","../src/utils/setUniforms.ts","../src/fxs/interactions/useBrush/useMesh.ts","../src/utils/useCamera.ts","../src/misc/usePointer.ts","../src/utils/useParams.ts","../src/utils/useSingleFBO.ts","../src/utils/useDoubleFBO.ts","../src/fxs/interactions/useBrush/index.ts","../src/fxs/interactions/useFluid/shaders/main.vert","../src/fxs/interactions/useFluid/shaders/init.frag","../src/fxs/interactions/useFluid/materials/useInitialMaterial.ts","../src/fxs/interactions/useFluid/shaders/advection.frag","../src/fxs/interactions/useFluid/materials/useAdvectionMaterial.ts","../src/fxs/interactions/useFluid/shaders/divergence.frag","../src/fxs/interactions/useFluid/materials/useDivergenceMaterial.ts","../src/fxs/interactions/useFluid/shaders/pressure.frag","../src/fxs/interactions/useFluid/materials/usePressureMaterial.ts","../src/fxs/interactions/useFluid/shaders/curl.frag","../src/fxs/interactions/useFluid/materials/useCurlMaterial.ts","../src/fxs/interactions/useFluid/shaders/vorticity.frag","../src/fxs/interactions/useFluid/materials/useVorticityMaterial.ts","../src/fxs/interactions/useFluid/shaders/clear.frag","../src/fxs/interactions/useFluid/materials/useClearMaterial.ts","../src/fxs/interactions/useFluid/shaders/gradientSubtract.frag","../src/fxs/interactions/useFluid/materials/useGradientSubtractMaterial.ts","../src/fxs/interactions/useFluid/shaders/splat.frag","../src/fxs/interactions/useFluid/materials/useSplatMaterial.ts","../src/fxs/interactions/useFluid/useMesh.ts","../src/fxs/interactions/useFluid/index.ts","../src/fxs/interactions/useRipple/useMesh.ts","../src/fxs/interactions/useRipple/index.ts","../src/fxs/noises/useNoise/shader/main.vert","../src/fxs/noises/useNoise/shader/main.frag","../src/fxs/noises/useNoise/useMesh.ts","../src/fxs/noises/useNoise/index.ts","../src/fxs/noises/useColorStrata/shader/main.vert","../src/fxs/noises/useColorStrata/shader/main.frag","../src/fxs/noises/useColorStrata/useMesh.ts","../src/fxs/noises/useColorStrata/index.ts","../src/fxs/noises/useMarble/shader/main.vert","../src/fxs/noises/useMarble/shader/main.frag","../src/fxs/noises/useMarble/useMesh.ts","../src/fxs/noises/useMarble/index.ts","../src/fxs/noises/useCosPalette/shader/main.vert","../src/fxs/noises/useCosPalette/shader/main.frag","../src/fxs/noises/useCosPalette/useMesh.ts","../src/fxs/noises/useCosPalette/index.ts","../src/fxs/utils/useDuoTone/shader/main.vert","../src/fxs/utils/useDuoTone/shader/main.frag","../src/fxs/utils/useDuoTone/useMesh.ts","../src/fxs/utils/useDuoTone/index.ts","../src/fxs/utils/useBlending/shader/main.vert","../src/fxs/utils/useBlending/shader/main.frag","../src/fxs/utils/useBlending/useMesh.ts","../src/fxs/utils/useBlending/index.ts","../src/fxs/utils/useFxTexture/shader/main.vert","../src/fxs/utils/useFxTexture/shader/main.frag","../src/fxs/utils/useFxTexture/useMesh.ts","../src/fxs/utils/useFxTexture/index.ts","../src/fxs/utils/useBrightnessPicker/shader/main.vert","../src/fxs/utils/useBrightnessPicker/shader/main.frag","../src/fxs/utils/useBrightnessPicker/useMesh.ts","../src/fxs/utils/useBrightnessPicker/index.ts","../src/fxs/utils/useFxBlending/shader/main.vert","../src/fxs/utils/useFxBlending/shader/main.frag","../src/fxs/utils/useFxBlending/useMesh.ts","../src/fxs/utils/useFxBlending/index.ts","../src/fxs/utils/useAlphaBlending/shader/main.vert","../src/fxs/utils/useAlphaBlending/shader/main.frag","../src/fxs/utils/useAlphaBlending/useMesh.ts","../src/fxs/utils/useAlphaBlending/index.ts","../src/fxs/utils/useHSV/shader/main.vert","../src/fxs/utils/useHSV/shader/main.frag","../src/fxs/utils/useHSV/useMesh.ts","../src/fxs/utils/useHSV/index.ts","../src/fxs/utils/useCoverTexture/shader/main.vert","../src/fxs/utils/useCoverTexture/shader/main.frag","../src/fxs/utils/useCoverTexture/useMesh.ts","../src/fxs/utils/useCoverTexture/index.ts","../src/fxs/effects/useSimpleBlur/shader/main.vert","../src/fxs/effects/useSimpleBlur/shader/main.frag","../src/fxs/effects/useSimpleBlur/useMesh.ts","../src/fxs/effects/useSimpleBlur/index.ts","../src/fxs/effects/useWave/shader/main.vert","../src/fxs/effects/useWave/shader/main.frag","../src/fxs/effects/useWave/useMesh.ts","../src/fxs/effects/useWave/index.ts","../src/fxs/misc/useChromaKey/shader/main.vert","../src/fxs/misc/useChromaKey/shader/main.frag","../src/fxs/misc/useChromaKey/useMesh.ts","../src/fxs/misc/useChromaKey/index.ts","../src/utils/useCopyTexture.ts","../src/libs/easing.ts","../src/misc/useBeat.ts","../src/misc/useFPSLimiter.ts","../src/misc/useDomSyncer/utils/errorHandler.ts","../src/misc/useDomSyncer/shader/main.vert","../src/misc/useDomSyncer/shader/main.frag","../src/misc/useDomSyncer/utils/createMesh.ts","../src/misc/useDomSyncer/utils/useIntersectionHandler.ts","../src/misc/useDomSyncer/utils/useUpdateDomRect.ts","../src/misc/useDomSyncer/utils/useIsIntersecting.ts","../src/misc/useDomSyncer/utils/createUseDomView.ts","../src/misc/useDomSyncer/index.ts"],"sourcesContent":["varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nuniform sampler2D uBuffer;\nuniform sampler2D uTexture;\nuniform bool uIsTexture;\nuniform sampler2D uMap;\nuniform bool uIsMap;\nuniform float uMapIntensity;\nuniform float uRadius;\nuniform float uDissipation;\nuniform vec2 uResolution;\nuniform float uSmudge;\nuniform vec2 uMouse;\nuniform vec2 uPrevMouse;\nuniform vec2 uVelocity;\nuniform vec3 uColor;\nuniform float uMotionBlur;\nuniform int uMotionSample;\nuniform bool uIsCursor;\nuniform float uPressureStart;\nuniform float uPressureEnd;\n\nvarying vec2 vUv;\n\nfloat isOnLine(vec2 point, vec2 start, vec2 end, float radius, float pressureStart, float pressureEnd) {\n\t\n\tfloat aspect = uResolution.x / uResolution.y;\n\n\tpoint.x *= aspect;\n\tstart.x *= aspect;\n\tend.x *= aspect;\n\n\tvec2 dir = normalize(end - start);\n\tvec2 n = vec2(dir.y, -dir.x);\n\tvec2 p0 = point - start;\n\t\n\tfloat distToLine = abs(dot(p0, n));\n\tfloat distAlongLine = dot(p0, dir);\n\tfloat totalLength = length(end - start);\n\n\tfloat progress = clamp(distAlongLine / totalLength, 0.0, 1.0);\n\tfloat pressure = mix(pressureStart, pressureEnd, progress);\n\tradius = min(radius,radius * pressure);\n\n\tfloat distFromStart = length(point - start);\n\tfloat distFromEnd = length(point - end);\n\t\n\tbool withinLine = (distToLine < radius && distAlongLine > 0.0 && distAlongLine < totalLength) || distFromStart < radius || distFromEnd < radius;\n\n\treturn float(withinLine);\n}\n\nvec4 createSmudge(vec2 uv){\n\tvec2 offsets[9];\n\toffsets[0] = vec2(-1, -1); offsets[1] = vec2( 0, -1); offsets[2] = vec2( 1, -1);\n\toffsets[3] = vec2(-1, 0); offsets[4] = vec2( 0, 0); offsets[5] = vec2( 1, 0);\n\toffsets[6] = vec2(-1, 1); offsets[7] = vec2( 0, 1); offsets[8] = vec2( 1, 1);\n\n\tfor(int i = 0; i < 9; i++) {\n\t\toffsets[i] = (offsets[i] * uSmudge) / uResolution;\n\t}\t\n\tvec4 smudgedColor = vec4(0.);\n\tfor(int i = 0; i < 9; i++) {\n\t\tsmudgedColor += texture2D(uBuffer, uv + offsets[i]);\n\t}\n\treturn smudgedColor / 9.0;\n}\n\nvec4 createMotionBlur(vec2 uv , vec4 baseColor, vec2 velocity) {\n\tvec2 scaledV = velocity * uMotionBlur;\n\tfor(int i = 1; i < uMotionSample; i++) {\n\t\tfloat t = float(i) / float(uMotionSample - 1);\n\t\tvec2 offset = t * scaledV / uResolution;\n\t\tbaseColor += texture2D(uBuffer, uv + offset);\n\t}\n\treturn baseColor / float(uMotionSample);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\tif(uIsMap){\n\t\tvec2 mapColor = texture2D(uMap, uv).rg;\n\t\tvec2 normalizedMap = mapColor * 2.0 - 1.0;\n\t\tuv = uv * 2.0 - 1.0;\n\t\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), uMapIntensity);\n\t\tuv = (uv + 1.0) / 2.0;\n\t}\n\tvec2 suv = uv*2.-1.;\n\n\tvec2 velocity = uVelocity * uResolution;\n\n\tfloat radius = max(0.0,uRadius);\n\t\n\tvec4 smudgedColor = uSmudge > 0. ? createSmudge(uv) : texture2D(uBuffer, uv);\n\n\tvec4 motionBlurredColor = uMotionBlur > 0. ? createMotionBlur(uv,smudgedColor, velocity) : smudgedColor;\n\n\tvec4 bufferColor = motionBlurredColor;\n\tbufferColor.a = bufferColor.a < 1e-10 ? 0.0 : bufferColor.a * uDissipation;\n\t\n\tvec4 brushColor = uIsTexture ? texture2D(uTexture, uv) : vec4(uColor,1.);\n\t\n\tfloat onLine = isOnLine(suv, uPrevMouse, uMouse, radius, uPressureStart,uPressureEnd);\n\tfloat isOnLine = length(velocity) > 0. ? onLine : uIsCursor ? onLine : 0.;\n\n\tvec4 finalColor = mix(bufferColor, brushColor, isOnLine);\n\n\tgl_FragColor = finalColor;\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\n/**\n * @params dpr if dpr is set, it returns the resolution which is size multiplied by dpr.\n */\nexport const useResolution = (size: Size, dpr: number | false = false) => {\n const _width = dpr ? size.width * dpr : size.width;\n const _height = dpr ? size.height * dpr : size.height;\n const resolution = useMemo(\n () => new THREE.Vector2(_width, _height),\n [_width, _height]\n );\n return resolution;\n};\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\n/** Generate mesh from geometry and material and add to scene */\nexport const useAddMesh = (\n scene: THREE.Scene,\n geometry: THREE.BufferGeometry,\n material: THREE.Material\n) => {\n const mesh = useMemo(\n () => new THREE.Mesh(geometry, material),\n [geometry, material]\n );\n\n useEffect(() => {\n scene.add(mesh);\n }, [scene, mesh]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","type UniformValue =\n | THREE.CubeTexture\n | THREE.Texture\n | Int32Array\n | Float32Array\n | THREE.Matrix4\n | THREE.Matrix3\n | THREE.Quaternion\n | THREE.Vector4\n | THREE.Vector3\n | THREE.Vector2\n | THREE.Color\n | number\n | boolean\n | Array\n | null;\ntype UniformObject = { [key: string]: { value: UniformValue } };\n\nexport const setUniform = (\n material: { uniforms: T },\n key: keyof T,\n value: UniformValue\n) => {\n if (\n material.uniforms &&\n material.uniforms[key] &&\n value !== undefined &&\n value !== null\n ) {\n material.uniforms[key].value = value;\n } else {\n console.error(\n `Uniform key \"${String(\n key\n )}\" does not exist in the material. or \"${String(\n key\n )}\" is null | undefined`\n );\n }\n};\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useEffect, useMemo } from \"react\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class BrushMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uBuffer: { value: THREE.Texture };\n uTexture: { value: THREE.Texture };\n uIsTexture: { value: boolean };\n uMap: { value: THREE.Texture };\n uIsMap: { value: boolean };\n uMapIntensity: { value: number };\n uResolution: { value: THREE.Texture };\n uRadius: { value: number };\n uSmudge: { value: number };\n uDissipation: { value: number };\n uMotionBlur: { value: number };\n uMotionSample: { value: number };\n uMouse: { value: number };\n uPrevMouse: { value: number };\n uVelocity: { value: number };\n uColor: { value: THREE.Vector3 };\n uIsCursor: { value: boolean };\n uPressureStart: { value: number };\n uPressureEnd: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uBuffer: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uTexture: { value: new THREE.Texture() },\n uIsTexture: { value: false },\n uMap: { value: new THREE.Texture() },\n uIsMap: { value: false },\n uMapIntensity: { value: 0.0 },\n uRadius: { value: 0.0 },\n uSmudge: { value: 0.0 },\n uDissipation: { value: 0.0 },\n uMotionBlur: { value: 0.0 },\n uMotionSample: { value: 0 },\n uMouse: { value: new THREE.Vector2(-10, -10) },\n uPrevMouse: { value: new THREE.Vector2(-10, -10) },\n uVelocity: { value: new THREE.Vector2(0, 0) },\n uColor: { value: new THREE.Vector3(1, 0, 0) },\n uIsCursor: { value: false },\n uPressureStart: { value: 1.0 },\n uPressureEnd: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as BrushMaterial;\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material;\n};\n","import * as THREE from \"three\";\nimport { useResolution } from \"./useResolution\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\nconst getCameraProps = (width: number, height: number) => {\n const frustumSize = height;\n const aspect = width / height;\n const [w, h] = [(frustumSize * aspect) / 2, frustumSize / 2];\n return { width: w, height: h, near: -1000, far: 1000 };\n};\n\nexport const useCamera = (size: Size) => {\n const resolution = useResolution(size);\n const { width, height, near, far } = getCameraProps(\n resolution.x,\n resolution.y\n );\n const camera = useMemo(\n () =>\n new THREE.OrthographicCamera(\n -width,\n width,\n height,\n -height,\n near,\n far\n ),\n [width, height, near, far]\n );\n return camera;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useRef } from \"react\";\n\nexport type PointerValues = {\n currentPointer: THREE.Vector2;\n prevPointer: THREE.Vector2;\n diffPointer: THREE.Vector2;\n velocity: THREE.Vector2;\n isVelocityUpdate: boolean;\n};\n\ntype UpdatePointer = (currentPointer: THREE.Vector2) => PointerValues;\n\n/**\n * @description When given the pointer vector2 from r3f's RootState, it generates an update function that returns {`currentPointer`, `prevPointer`, `diffPointer`, `isVelocityUpdate`, `velocity`}.\n * @description When calling custom in a `useFrame` loop, you can avoid duplication of execution by passing `pointerValues` to the update function of a Pointer-activated fxHook, such as `useBrush`.\n * @param lerp 0~1, lerp intensity (0 to less than 1) , default: 0\n */\nexport const usePointer = (lerp: number = 0): UpdatePointer => {\n const prevPointer = useRef(new THREE.Vector2(0, 0));\n const diffPointer = useRef(new THREE.Vector2(0, 0));\n const lerpPointer = useRef(new THREE.Vector2(0, 0));\n const lastUpdateTime = useRef(0);\n const velocity = useRef(new THREE.Vector2(0, 0));\n const isMoved = useRef(false);\n\n const updatePointer = useCallback(\n (currentPointer: THREE.Vector2) => {\n const now = performance.now();\n\n // lerp\n let current: THREE.Vector2;\n if (isMoved.current && lerp) {\n lerpPointer.current = lerpPointer.current.lerp(\n currentPointer,\n 1 - lerp\n );\n current = lerpPointer.current.clone();\n } else {\n current = currentPointer.clone();\n lerpPointer.current = current;\n }\n\n // first frame\n if (lastUpdateTime.current === 0) {\n lastUpdateTime.current = now;\n prevPointer.current = current;\n }\n const deltaTime = Math.max(1, now - lastUpdateTime.current);\n lastUpdateTime.current = now;\n\n // get velocity\n velocity.current\n .copy(current)\n .sub(prevPointer.current)\n .divideScalar(deltaTime);\n const isUpdate = velocity.current.length() > 0;\n\n //set prev temp pos\n const prevTemp = isMoved.current\n ? prevPointer.current.clone()\n : current;\n if (!isMoved.current && isUpdate) {\n isMoved.current = true;\n }\n prevPointer.current = current;\n\n return {\n currentPointer: current,\n prevPointer: prevTemp,\n diffPointer: diffPointer.current.subVectors(current, prevTemp),\n velocity: velocity.current,\n isVelocityUpdate: isUpdate,\n };\n },\n [lerp]\n );\n\n return updatePointer;\n};\n","import { useCallback, useRef } from \"react\";\n\ntype UseParamsReturn = [T, (params: Partial) => void];\n\n/**\n * @param params Receives an initial value object. With structuredClone, deep copy and set, but if the object contains a function, just set it.\n */\nexport const useParams = (params: T): UseParamsReturn => {\n const isContainsFunctions = (obj: object): boolean =>\n Object.values(obj).some((value) => typeof value === \"function\");\n const paramsRef = useRef(\n isContainsFunctions(params) ? params : structuredClone(params)\n );\n\n const setParams = useCallback((updateParams: Partial) => {\n for (const key in updateParams) {\n const paramKey = key as keyof T;\n if (\n paramKey in paramsRef.current &&\n updateParams[paramKey] !== undefined &&\n updateParams[paramKey] !== null\n ) {\n paramsRef.current[paramKey] = updateParams[paramKey]!;\n } else {\n console.error(\n `\"${String(\n paramKey\n )}\" does not exist in the params. or \"${String(\n paramKey\n )}\" is null | undefined`\n );\n }\n }\n }, []);\n return [paramsRef.current, setParams];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default:false */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. Default is 0. */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, Default is false. */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. Default is false. */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\n\nexport type BrushParams = {\n /** Texture applied to the brush, If texture is true, it will take precedence over color , default:false */\n texture?: THREE.Texture | false;\n /** You can attach an fx map , default:false */\n map?: THREE.Texture | false;\n /** map intensity , default:0.1 */\n mapIntensity?: number;\n /** size of the stamp, percentage of the size ,default:0.05 */\n radius?: number;\n /** Strength of smudge effect , default:0.0*/\n smudge?: number;\n /** dissipation rate. If set to 1, it will remain. ,default:1.0 */\n dissipation?: number;\n /** Strength of motion blur , default:0.0 */\n motionBlur?: number;\n /** Number of motion blur samples. Affects performance default: 5 */\n motionSample?: number;\n /** brush color , it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default:THREE.Vector3(1.0, 1.0, 1.0) */\n color?: ((velocity: THREE.Vector2) => THREE.Vector3) | THREE.Vector3;\n /** Follows the cursor even if it loses speed , default:false */\n isCursor?: boolean;\n /** brush pressure (0 to 1) , default : 1.0 */\n pressure?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default:false */\n pointerValues?: PointerValues | false;\n};\n\nexport type BrushObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRUSH_PARAMS: BrushParams = {\n texture: false,\n map: false,\n mapIntensity: 0.1,\n radius: 0.05,\n smudge: 0.0,\n dissipation: 1.0,\n motionBlur: 0.0,\n motionSample: 5,\n color: new THREE.Vector3(1.0, 0.0, 0.0),\n isCursor: false,\n pressure: 1.0,\n pointerValues: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrush = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrushParams) => {\n const { gl, pointer } = props;\n\n updateParams && setParams(updateParams);\n\n if (params.texture!) {\n setUniform(material, \"uIsTexture\", true);\n setUniform(material, \"uTexture\", params.texture!);\n } else {\n setUniform(material, \"uIsTexture\", false);\n }\n\n if (params.map!) {\n setUniform(material, \"uIsMap\", true);\n setUniform(material, \"uMap\", params.map!);\n setUniform(material, \"uMapIntensity\", params.mapIntensity!);\n } else {\n setUniform(material, \"uIsMap\", false);\n }\n\n setUniform(material, \"uRadius\", params.radius!);\n setUniform(material, \"uSmudge\", params.smudge!);\n setUniform(material, \"uDissipation\", params.dissipation!);\n setUniform(material, \"uMotionBlur\", params.motionBlur!);\n setUniform(material, \"uMotionSample\", params.motionSample!);\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n setUniform(material, \"uMouse\", pointerValues.currentPointer);\n setUniform(material, \"uPrevMouse\", pointerValues.prevPointer);\n }\n setUniform(material, \"uVelocity\", pointerValues.velocity);\n\n const color: THREE.Vector3 =\n typeof params.color === \"function\"\n ? params.color(pointerValues.velocity)\n : params.color!;\n setUniform(material, \"uColor\", color);\n\n setUniform(material, \"uIsCursor\", params.isCursor!);\n\n // pressure\n setUniform(material, \"uPressureEnd\", params.pressure!);\n if (pressureEnd.current === null) {\n pressureEnd.current = params.pressure!;\n }\n setUniform(material, \"uPressureStart\", pressureEnd.current);\n pressureEnd.current = params.pressure!;\n\n return updateRenderTarget(gl, ({ read }) => {\n setUniform(material, \"uBuffer\", read);\n });\n },\n [material, updatePointer, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","varying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform vec2 texelSize;\n\nvoid main () {\n\tvUv = uv;\n\tvL = vUv - vec2(texelSize.x, 0.0);\n\tvR = vUv + vec2(texelSize.x, 0.0);\n\tvT = vUv + vec2(0.0, texelSize.y);\n\tvB = vUv - vec2(0.0, texelSize.y);\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvoid main(){\n\tgl_FragColor = vec4(0.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/init.frag\";\n\nexport const useInitialMaterial = () => {\n const initialMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n depthTest: false,\n depthWrite: false,\n }),\n []\n );\n\n return initialMaterial as THREE.ShaderMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uVelocity;\nuniform sampler2D uSource;\nuniform vec2 texelSize;\nuniform float dt;\nuniform float dissipation;\n\nvoid main () {\n\tvec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize;\n\tgl_FragColor = dissipation * texture2D(uSource, coord);\n\tgl_FragColor.a = 1.0;\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/advection.frag\";\n\nexport class AdvectionMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uSource: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n dt: { value: number };\n dissipation: { value: number };\n };\n}\n\nexport const useAdvectionMaterial = () => {\n const advectionMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: new THREE.Texture() },\n uSource: { value: new THREE.Texture() },\n texelSize: { value: new THREE.Vector2() },\n dt: { value: 0.0 },\n dissipation: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return advectionMaterial as AdvectionMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvec2 sampleVelocity (in vec2 uv) {\n\tvec2 multiplier = vec2(1.0, 1.0);\n\tif (uv.x < 0.0) { uv.x = 0.0; multiplier.x = -1.0; }\n\tif (uv.x > 1.0) { uv.x = 1.0; multiplier.x = -1.0; }\n\tif (uv.y < 0.0) { uv.y = 0.0; multiplier.y = -1.0; }\n\tif (uv.y > 1.0) { uv.y = 1.0; multiplier.y = -1.0; }\n\treturn multiplier * texture2D(uVelocity, uv).xy;\n}\n\nvoid main () {\n\tfloat L = sampleVelocity(vL).x;\n\tfloat R = sampleVelocity(vR).x;\n\tfloat T = sampleVelocity(vT).y;\n\tfloat B = sampleVelocity(vB).y;\n\tfloat div = 0.5 * (R - L + T - B);\n\tgl_FragColor = vec4(div, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/divergence.frag\";\n\nexport class DivergenceMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useDivergenceMaterial = () => {\n const divergenceMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return divergenceMaterial as DivergenceMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uPressure;\nuniform sampler2D uDivergence;\n\nvec2 boundary (in vec2 uv) {\n\tuv = min(max(uv, 0.0), 1.0);\n\treturn uv;\n}\n\nvoid main () {\n\tfloat L = texture2D(uPressure, boundary(vL)).x;\n\tfloat R = texture2D(uPressure, boundary(vR)).x;\n\tfloat T = texture2D(uPressure, boundary(vT)).x;\n\tfloat B = texture2D(uPressure, boundary(vB)).x;\n\tfloat C = texture2D(uPressure, vUv).x;\n\tfloat divergence = texture2D(uDivergence, vUv).x;\n\tfloat pressure = (L + R + B + T - divergence) * 0.25;\n\tgl_FragColor = vec4(pressure, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/pressure.frag\";\n\nexport class PressureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uDivergence: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const usePressureMaterial = () => {\n const pressureMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: null },\n uDivergence: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return pressureMaterial as PressureMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvoid main () {\n\tfloat L = texture2D(uVelocity, vL).y;\n\tfloat R = texture2D(uVelocity, vR).y;\n\tfloat T = texture2D(uVelocity, vT).x;\n\tfloat B = texture2D(uVelocity, vB).x;\n\tfloat vorticity = R - L - T + B;\n\tgl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/curl.frag\";\n\nexport class CurlMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useCurlMaterial = () => {\n const curlMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return curlMaterial as CurlMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\nuniform sampler2D uCurl;\nuniform float curl;\nuniform float dt;\n\nvoid main () {\n\tfloat T = texture2D(uCurl, vT).x;\n\tfloat B = texture2D(uCurl, vB).x;\n\tfloat C = texture2D(uCurl, vUv).x;\n\tvec2 force = vec2(abs(T) - abs(B), 0.0);\n\tforce *= 1.0 / length(force + 0.00001) * curl * C;\n\tvec2 vel = texture2D(uVelocity, vUv).xy;\n\tgl_FragColor = vec4(vel + force * dt, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/vorticity.frag\";\n\nexport class VorticityMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uCurl: { value: THREE.Texture };\n curl: { value: number };\n dt: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useVorticityMaterial = () => {\n const vorticityMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: 0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return vorticityMaterial as VorticityMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float value;\n\nvoid main () {\n\tgl_FragColor = value * texture2D(uTexture, vUv);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/clear.frag\";\n\nexport class ClearMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n value: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useClearMaterial = () => {\n const advectionMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return advectionMaterial as ClearMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uPressure;\nuniform sampler2D uVelocity;\n\nvec2 boundary (in vec2 uv) {\n\tuv = min(max(uv, 0.0), 1.0);\n\treturn uv;\n}\n\nvoid main () {\n\tfloat L = texture2D(uPressure, boundary(vL)).x;\n\tfloat R = texture2D(uPressure, boundary(vR)).x;\n\tfloat T = texture2D(uPressure, boundary(vT)).x;\n\tfloat B = texture2D(uPressure, boundary(vB)).x;\n\tvec2 velocity = texture2D(uVelocity, vUv).xy;\n\tvelocity.xy -= vec2(R - L, T - B);\n\tgl_FragColor = vec4(velocity, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/gradientSubtract.frag\";\n\nexport class GradientSubtractMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useGradientSubtractMaterial = () => {\n const gradientSubtractMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: new THREE.Texture() },\n uVelocity: { value: new THREE.Texture() },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return gradientSubtractMaterial as GradientSubtractMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTarget;\nuniform float aspectRatio;\nuniform vec3 color;\nuniform vec2 point;\nuniform float radius;\n\nvoid main () {\n\tvec2 nPoint = (point + vec2(1.0)) * 0.5;\n\tvec2 p = vUv - nPoint.xy;\n\tp.x *= aspectRatio;\n\tvec3 splat = exp(-dot(p, p) / radius) * color;\n\tvec3 base = texture2D(uTarget, vUv).xyz;\n\tgl_FragColor = vec4(base + splat, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/splat.frag\";\n\nexport class SplatMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTarget: { value: THREE.Texture };\n aspectRatio: { value: number };\n color: { value: THREE.Vector3 };\n point: { value: THREE.Vector2 };\n radius: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useSplateMaterial = () => {\n const splatMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTarget: { value: new THREE.Texture() },\n aspectRatio: { value: 0 },\n color: { value: new THREE.Vector3() },\n point: { value: new THREE.Vector2() },\n radius: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return splatMaterial as SplatMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { useInitialMaterial } from \"./materials/useInitialMaterial\";\nimport {\n AdvectionMaterial,\n useAdvectionMaterial,\n} from \"./materials/useAdvectionMaterial\";\nimport {\n DivergenceMaterial,\n useDivergenceMaterial,\n} from \"./materials/useDivergenceMaterial\";\nimport {\n PressureMaterial,\n usePressureMaterial,\n} from \"./materials/usePressureMaterial\";\nimport { CurlMaterial, useCurlMaterial } from \"./materials/useCurlMaterial\";\nimport {\n VorticityMaterial,\n useVorticityMaterial,\n} from \"./materials/useVorticityMaterial\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { ClearMaterial, useClearMaterial } from \"./materials/useClearMaterial\";\nimport {\n GradientSubtractMaterial,\n useGradientSubtractMaterial,\n} from \"./materials/useGradientSubtractMaterial\";\nimport { SplatMaterial, useSplateMaterial } from \"./materials/useSplatMaterial\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\ntype TMaterials =\n | AdvectionMaterial\n | DivergenceMaterial\n | CurlMaterial\n | PressureMaterial\n | ClearMaterial\n | GradientSubtractMaterial\n | SplatMaterial;\n\nexport type FluidMaterials = {\n vorticityMaterial: VorticityMaterial;\n curlMaterial: CurlMaterial;\n advectionMaterial: AdvectionMaterial;\n divergenceMaterial: DivergenceMaterial;\n pressureMaterial: PressureMaterial;\n clearMaterial: ClearMaterial;\n gradientSubtractMaterial: GradientSubtractMaterial;\n splatMaterial: SplatMaterial;\n};\ntype TUseMeshReturnType = [FluidMaterials, (material: TMaterials) => void];\n\n/**\n * Returns the material update function in the second argument\n */\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}): TUseMeshReturnType => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const initialMaterial = useInitialMaterial();\n const updateMaterial = initialMaterial.clone();\n const curlMaterial = useCurlMaterial();\n const vorticityMaterial = useVorticityMaterial();\n const advectionMaterial = useAdvectionMaterial();\n const divergenceMaterial = useDivergenceMaterial();\n const pressureMaterial = usePressureMaterial();\n const clearMaterial = useClearMaterial();\n const gradientSubtractMaterial = useGradientSubtractMaterial();\n const splatMaterial = useSplateMaterial();\n const materials = useMemo(\n () => ({\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n }),\n [\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n ]\n );\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(\n materials.splatMaterial,\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(\n material,\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddMesh(scene, geometry, initialMaterial);\n useEffect(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return [materials, setMeshMaterial];\n};\n","import * as THREE from \"three\";\nimport { FluidMaterials, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { UseFboProps } from \"../../../utils/useSingleFBO\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\n\nexport type FluidParams = {\n /** density disspation , default:0.98 */\n density_dissipation?: number;\n /** velocity dissipation , default:0.99 */\n velocity_dissipation?: number;\n /** velocity acceleration , default:10.0 */\n velocity_acceleration?: number;\n /** pressure dissipation , default:0.9 */\n pressure_dissipation?: number;\n /** pressure iterations. affects performance , default:20 */\n pressure_iterations?: number;\n /** curl_strength , default:35 */\n curl_strength?: number;\n /** splat radius , default:0.002 */\n splat_radius?: number;\n /** Fluid Color.THREE.Vector3 Alternatively, it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default:THREE.Vector3(1.0, 1.0, 1.0) */\n fluid_color?: ((velocity: THREE.Vector2) => THREE.Vector3) | THREE.Vector3;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default:false */\n pointerValues?: PointerValues | false;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n materials: FluidMaterials;\n camera: THREE.Camera;\n renderTarget: {\n velocity: DoubleRenderTarget;\n density: DoubleRenderTarget;\n curl: THREE.WebGLRenderTarget;\n divergence: THREE.WebGLRenderTarget;\n pressure: DoubleRenderTarget;\n };\n output: THREE.Texture;\n};\n\nexport const FLUID_PARAMS: FluidParams = {\n density_dissipation: 0.98,\n velocity_dissipation: 0.99,\n velocity_acceleration: 10.0,\n pressure_dissipation: 0.9,\n pressure_iterations: 20,\n curl_strength: 35,\n splat_radius: 0.002,\n fluid_color: new THREE.Vector3(1.0, 1.0, 1.0),\n pointerValues: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const [materials, setMeshMaterial] = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n samples,\n }),\n [scene, camera, size, samples]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const lastTime = useRef(0);\n const scaledDiffVec = useRef(new THREE.Vector2(0, 0));\n const spaltVec = useRef(new THREE.Vector3(0, 0, 0));\n\n const [params, setParams] = useParams(FLUID_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FluidParams) => {\n const { gl, pointer, clock, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (lastTime.current === 0) {\n lastTime.current = clock.getElapsedTime();\n }\n const dt = Math.min(\n (clock.getElapsedTime() - lastTime.current) / 3,\n 0.02\n );\n lastTime.current = clock.getElapsedTime();\n\n // update velocity\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", read);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(materials.advectionMaterial, \"dt\", dt);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.velocity_dissipation!\n );\n });\n\n // update density\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", velocityTex);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.density_dissipation!\n );\n });\n\n // update splatting\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n setUniform(materials.splatMaterial, \"uTarget\", read);\n setUniform(\n materials.splatMaterial,\n \"point\",\n pointerValues.currentPointer\n );\n const scaledDiff = pointerValues.diffPointer.multiply(\n scaledDiffVec.current\n .set(size.width, size.height)\n .multiplyScalar(params.velocity_acceleration!)\n );\n setUniform(\n materials.splatMaterial,\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n setUniform(\n materials.splatMaterial,\n \"radius\",\n params.splat_radius!\n );\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n setUniform(materials.splatMaterial, \"uTarget\", read);\n const color: THREE.Vector3 =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(pointerValues.velocity)\n : params.fluid_color!;\n setUniform(materials.splatMaterial, \"color\", color);\n });\n }\n\n // update curl\n const curlTex = updateCurlFBO(gl, () => {\n setMeshMaterial(materials.curlMaterial);\n setUniform(materials.curlMaterial, \"uVelocity\", velocityTex);\n });\n\n // update vorticity\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.vorticityMaterial);\n setUniform(materials.vorticityMaterial, \"uVelocity\", read);\n setUniform(materials.vorticityMaterial, \"uCurl\", curlTex);\n setUniform(\n materials.vorticityMaterial,\n \"curl\",\n params.curl_strength!\n );\n setUniform(materials.vorticityMaterial, \"dt\", dt);\n });\n\n // update divergence\n const divergenceTex = updateDivergenceFBO(gl, () => {\n setMeshMaterial(materials.divergenceMaterial);\n setUniform(materials.divergenceMaterial, \"uVelocity\", velocityTex);\n });\n\n // update pressure\n updatePressureFBO(gl, ({ read }) => {\n setMeshMaterial(materials.clearMaterial);\n setUniform(materials.clearMaterial, \"uTexture\", read);\n setUniform(\n materials.clearMaterial,\n \"value\",\n params.pressure_dissipation!\n );\n });\n\n // solve pressure iterative (Gauss-Seidel)\n setMeshMaterial(materials.pressureMaterial);\n setUniform(materials.pressureMaterial, \"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressure_iterations!; i++) {\n pressureTexTemp = updatePressureFBO(gl, ({ read }) => {\n setUniform(materials.pressureMaterial, \"uPressure\", read);\n });\n }\n\n // update gradienSubtract\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.gradientSubtractMaterial);\n setUniform(\n materials.gradientSubtractMaterial,\n \"uPressure\",\n pressureTexTemp\n );\n setUniform(materials.gradientSubtractMaterial, \"uVelocity\", read);\n });\n\n return densityTex;\n },\n [\n materials,\n setMeshMaterial,\n updateCurlFBO,\n updateDensityFBO,\n updateDivergenceFBO,\n updatePointer,\n updatePressureFBO,\n updateVelocityFBO,\n setParams,\n params,\n ]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n materials: materials,\n camera: camera,\n renderTarget: {\n velocity: velocityFBO,\n density: densityFBO,\n curl: curlFBO,\n divergence: divergenceFBO,\n pressure: pressureFBO,\n },\n output: densityFBO.read.texture,\n },\n ];\n};\n","import { useEffect, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\n\ntype UseMeshProps = {\n scale: number;\n max: number;\n texture?: THREE.Texture;\n scene: THREE.Scene;\n};\n\nexport const useMesh = ({ scale, max, texture, scene }: UseMeshProps) => {\n const meshArr = useRef([]);\n const geometry = useMemo(\n () => new THREE.PlaneGeometry(scale, scale),\n [scale]\n );\n const material = useMemo(\n () =>\n new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthTest: false,\n depthWrite: false,\n }),\n [texture]\n );\n\n useEffect(() => {\n for (let i = 0; i < max; i++) {\n const mesh = new THREE.Mesh(geometry.clone(), material.clone());\n mesh.rotateZ(2 * Math.PI * Math.random());\n mesh.visible = false;\n scene.add(mesh);\n meshArr.current.push(mesh);\n }\n }, [geometry, material, scene, max]);\n\n useEffect(() => {\n return () => {\n meshArr.current.forEach((mesh) => {\n mesh.geometry.dispose();\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((material) => material.dispose());\n } else {\n mesh.material.dispose();\n }\n scene.remove(mesh);\n });\n meshArr.current = [];\n };\n }, [scene]);\n\n return meshArr.current;\n};\n","import { useCallback, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { usePointer, PointerValues } from \"../../../misc/usePointer\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type RippleParams = {\n /** How often ripples appear,default:0.01 */\n frequency?: number;\n /** rotation rate,default:0.05 */\n rotation?: number;\n /** fadeout speed,default:0.9 */\n fadeout_speed?: number;\n /** scale rate,default:0.3 */\n scale?: number;\n /** alpha,default:0.6 */\n alpha?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default:false */\n pointerValues?: PointerValues | false;\n};\n\nexport type RippleObject = {\n scene: THREE.Scene;\n meshArr: THREE.Mesh[];\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const RIPPLE_PARAMS: RippleParams = {\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n pointerValues: false,\n};\n\ninterface UseRippleProps extends HooksProps {\n /** texture applied to ripple */\n texture?: THREE.Texture;\n /** ripple size, default:64 */\n scale?: number;\n /** ripple max length, default:100 */\n max?: number;\n}\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useRipple = ({\n texture = new THREE.Texture(),\n scale = 64,\n max = 100,\n size,\n dpr,\n samples = 0,\n}: UseRippleProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: RippleParams) => {\n const { gl, pointer, size } = props;\n\n updateParams && setParams(updateParams);\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (params.frequency! < pointerValues.diffPointer.length()) {\n const mesh = meshArr[currentWave.current];\n mesh.visible = true;\n mesh.position.set(\n pointerValues.currentPointer.x * (size.width / 2),\n pointerValues.currentPointer.y * (size.height / 2),\n 0\n );\n mesh.scale.x = mesh.scale.y = 0.0;\n (mesh.material as THREE.MeshBasicMaterial).opacity = params.alpha!;\n currentWave.current = (currentWave.current + 1) % max;\n }\n meshArr.forEach((mesh) => {\n if (mesh.visible) {\n const material = mesh.material as THREE.MeshBasicMaterial;\n mesh.rotation.z += params.rotation!;\n material.opacity *= params.fadeout_speed!;\n mesh.scale.x =\n params.fadeout_speed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n if (material.opacity < 0.002) mesh.visible = false;\n }\n });\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, meshArr, updatePointer, max, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n camera: camera,\n meshArr: meshArr,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform float uTime;\nuniform float timeStrength;\nuniform int noiseOctaves;\nuniform int fbmOctaves;\nuniform int warpOctaves;\nuniform vec2 warpDirection;\nuniform float warpStrength;\nuniform float scale;\n\nconst float per = 0.5;\nconst float PI = 3.14159265359;\n\nfloat rnd(vec2 n) {\n\tfloat a = 0.129898;\n\tfloat b = 0.78233;\n\tfloat c = 437.585453;\n\tfloat dt= dot(n ,vec2(a, b));\n\tfloat sn= mod(dt, PI);\n\treturn fract(sin(sn) * c);\n}\n\nfloat interpolate(float a, float b, float x){\n float f = (1.0 - cos(x * PI)) * 0.5;\n return a * (1.0 - f) + b * f;\n}\n\nfloat irnd(vec2 p){\n\tvec2 i = floor(p);\n\tvec2 f = fract(p);\n\tvec4 v = vec4(rnd(vec2(i.x,i.y)),rnd(vec2(i.x + 1.0,i.y)),rnd(vec2(i.x,i.y + 1.0)),rnd(vec2(i.x + 1.0, i.y + 1.0)));\n\treturn interpolate(interpolate(v.x, v.y, f.x), interpolate(v.z, v.w, f.x), f.y);\n}\n\n// Based on The Book of Shaders\n// https://thebookofshaders.com/13/\nfloat noise(vec2 p, float time){\n\tfloat t = 0.0;\n\tfor(int i = 0; i < noiseOctaves; i++){\n\t\tfloat freq = pow(2.0, float(i));\n\t\tfloat amp = pow(per, float(noiseOctaves - i));\n\t\tt += irnd(vec2(p.y / freq + time, p.x / freq + time)) * amp;\n\t}\n\treturn t;\n}\n\nfloat fbm(vec2 x, float time) {\n\tfloat v = 0.0;\n\tfloat a = 0.5;\n\tvec2 shift = vec2(100);\n\tmat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5));\n\tfloat sign = 1.0;\n\tfor (int i = 0; i < fbmOctaves; ++i) {\n\t\tv += a * noise(x, time * sign);\n\t\tx = rot * x * 2.0 + shift;\n\t\ta *= 0.5;\n\t\tsign *= -1.0;\n\t}\n\treturn v;\n}\n\nfloat warp(vec2 x, float g,float time){\n\tfloat val = 0.0;\n\tfor (int i = 0; i < warpOctaves; i++){\n\t\tval = fbm(x + g * vec2(cos(warpDirection.x * val), sin(warpDirection.y * val)), time);\n\t}\n\treturn val;\n}\n\nvoid main() {\n\tfloat noise = warp(gl_FragCoord.xy * scale ,warpStrength,uTime * timeStrength);\n\tgl_FragColor = vec4(vec3(noise),1.0);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class NoiseMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTime: { value: number };\n scale: { value: number };\n timeStrength: { value: number };\n noiseOctaves: { value: number };\n fbmOctaves: { value: number };\n warpOctaves: { value: number };\n warpDirection: { value: THREE.Vector2 };\n warpStrength: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: 0.0 },\n timeStrength: { value: 0.0 },\n noiseOctaves: { value: 0 },\n fbmOctaves: { value: 0 },\n warpOctaves: { value: 0 },\n warpDirection: { value: new THREE.Vector2() },\n warpStrength: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as NoiseMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\n\nexport type NoiseParams = {\n /** noise scale , default:0.004 */\n scale?: number;\n /** time factor default:0.3 */\n timeStrength?: number;\n /** noiseOctaves, affects performance default:2 */\n noiseOctaves?: number;\n /** fbmOctaves, affects performance default:2 */\n fbmOctaves?: number;\n /** domain warping octaves , affects performance default:2 */\n warpOctaves?: number;\n /** direction of domain warping , default:(2.0,2,0) */\n warpDirection?: THREE.Vector2;\n /** strength of domain warping , default:8.0 */\n warpStrength?: number;\n /** you can get into the rhythm ♪ , default:false */\n beat?: number | false;\n};\n\nexport type NoiseObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const NOISE_PARAMS: NoiseParams = {\n scale: 0.004,\n timeStrength: 0.3,\n noiseOctaves: 2,\n fbmOctaves: 2,\n warpOctaves: 2,\n warpDirection: new THREE.Vector2(2.0, 2.0),\n warpStrength: 8.0,\n beat: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n *\n * It is a basic value noise with `fbm` and `domain warping`\n */\nexport const useNoise = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: NoiseParams) => {\n const { gl, clock } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"scale\", params.scale!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n setUniform(material, \"noiseOctaves\", params.noiseOctaves!);\n setUniform(material, \"fbmOctaves\", params.fbmOctaves!);\n setUniform(material, \"warpOctaves\", params.warpOctaves!);\n setUniform(material, \"warpDirection\", params.warpDirection!);\n setUniform(material, \"warpStrength\", params.warpStrength!);\n\n setUniform(material, \"uTime\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D uTexture;\nuniform bool isTexture;\nuniform sampler2D noise;\nuniform bool isNoise;\nuniform vec2 noiseStrength;\nuniform float laminateLayer;\nuniform vec2 laminateInterval;\nuniform vec2 laminateDetail;\nuniform vec2 distortion;\nuniform vec3 colorFactor;\nuniform float uTime;\nuniform vec2 timeStrength;\nuniform float scale;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 pos = isTexture ? texture2D(uTexture, uv).rg : uv * scale;\n\tvec2 noise = isNoise ? texture2D(noise, uv).rg : vec2(0.0);\n\tfloat alpha = isTexture ? texture2D(uTexture, uv).a : 1.0;\n\t\n\t// Avoid floating point bugs caused by GPU drivers.\n\talpha = (alpha < 1e-10) ? 0.0 : alpha;\n\n\tvec3 col;\n\tfor(float j = 0.0; j < 3.0; j++){\n\t\tfor(float i = 1.0; i < laminateLayer; i++){\n\t\t\tfloat timeNoiseSin = sin(uTime / (i + j)) * timeStrength.x + noise.r * noiseStrength.x;\n\t\t\tfloat timeNoiseCos = cos(uTime / (i + j)) * timeStrength.y + noise.g * noiseStrength.y;\n\t\t\tpos.x += laminateInterval.x / (i + j) * cos(i * distortion.x * pos.y + timeNoiseSin + sin(i + j));\n\t\t\tpos.y += laminateInterval.y / (i + j) * cos(i * distortion.y * pos.x + timeNoiseCos + sin(i + j));\n\t\t}\n\t\tcol[int(j)] = sin(pow(pos.x, 2.) * pow(laminateDetail.x, 2.)) + sin(pow(pos.y, 2.) * pow(laminateDetail.y, 2.));\n\t}\n\n\tcol *= colorFactor * alpha;\n\tcol = clamp(col, 0.0, 1.0);\n\t\n\tgl_FragColor = vec4(col, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class ColorStrataMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n isTexture: { value: boolean };\n scale: { value: number };\n noise: { value: THREE.Texture };\n noiseStrength: { value: THREE.Vector2 };\n isNoise: { value: boolean };\n laminateLayer: { value: number };\n laminateInterval: { value: THREE.Vector2 };\n laminateDetail: { value: THREE.Vector2 };\n distortion: { value: THREE.Vector2 };\n colorFactor: { value: THREE.Vector3 };\n uTime: { value: number };\n timeStrength: { value: THREE.Vector2 };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n isTexture: { value: false },\n scale: { value: 1.0 },\n noise: { value: new THREE.Texture() },\n noiseStrength: { value: new THREE.Vector2(0, 0) },\n isNoise: { value: false },\n laminateLayer: { value: 1.0 },\n laminateInterval: { value: new THREE.Vector2(0.1, 0.1) },\n laminateDetail: { value: new THREE.Vector2(1, 1) },\n distortion: { value: new THREE.Vector2(0, 0) },\n colorFactor: { value: new THREE.Vector3(1, 1, 1) },\n uTime: { value: 0 },\n timeStrength: { value: new THREE.Vector2(0, 0) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as ColorStrataMaterial;\n\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type ColorStrataParams = {\n /** default: null */\n texture?: THREE.Texture | false;\n /** Valid when texture is false. default : 1 */\n scale?: number;\n /** default: 1.0 */\n laminateLayer?: number;\n /** default: (0.1, 0.1) */\n laminateInterval?: THREE.Vector2;\n /** default: (1.0, 1.0) */\n laminateDetail?: THREE.Vector2;\n /** default: (0.0, 0.0) */\n distortion?: THREE.Vector2;\n /** default: (1.0, 1.0,1.0) */\n colorFactor?: THREE.Vector3;\n /** default: (0.0, 0.0) */\n timeStrength?: THREE.Vector2;\n /** default:false */\n noise?: THREE.Texture | false;\n /** default : (0.0,0.0) */\n noiseStrength?: THREE.Vector2;\n /** you can get into the rhythm ♪ , default:false */\n beat?: number | false;\n};\n\nexport type ColorStrataObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COLORSTRATA_PARAMS: ColorStrataParams = {\n texture: false,\n scale: 1.0,\n laminateLayer: 1.0,\n laminateInterval: new THREE.Vector2(0.1, 0.1),\n laminateDetail: new THREE.Vector2(1, 1),\n distortion: new THREE.Vector2(0, 0),\n colorFactor: new THREE.Vector3(1, 1, 1),\n timeStrength: new THREE.Vector2(0, 0),\n noise: false,\n noiseStrength: new THREE.Vector2(0, 0),\n beat: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useColorStrata = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ColorStrataParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n if (params.texture) {\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"isTexture\", true);\n } else {\n setUniform(material, \"isTexture\", false);\n setUniform(material, \"scale\", params.scale!);\n }\n\n if (params.noise) {\n setUniform(material, \"noise\", params.noise);\n setUniform(material, \"isNoise\", true);\n setUniform(material, \"noiseStrength\", params.noiseStrength!);\n } else {\n setUniform(material, \"isNoise\", false);\n }\n\n setUniform(material, \"uTime\", params.beat || clock.getElapsedTime());\n\n setUniform(material, \"laminateLayer\", params.laminateLayer!);\n setUniform(material, \"laminateInterval\", params.laminateInterval!);\n setUniform(material, \"laminateDetail\", params.laminateDetail!);\n setUniform(material, \"distortion\", params.distortion!);\n setUniform(material, \"colorFactor\", params.colorFactor!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform float u_time;\nuniform float u_pattern;\nuniform float u_complexity;\nuniform float u_complexityAttenuation;\nuniform float u_iterations;\nuniform float u_timeStrength;\nuniform float u_scale;\n\nvec3 marble(vec3 p){\n\tvec4 n;\n\tfor(float i;i {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_time: { value: 0 },\n u_pattern: { value: 0 },\n u_complexity: { value: 0 },\n u_complexityAttenuation: { value: 0 },\n u_iterations: { value: 0 },\n u_timeStrength: { value: 0 },\n u_scale: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as MarbleMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type MarbleParams = {\n /** You can add random patterns to noise by passing random numbers ,default:0 */\n pattern?: number;\n /** default:2 */\n complexity?: number;\n /** default:0.2 */\n complexityAttenuation?: number;\n /** default:8 */\n iterations?: number;\n /** default:0.2 */\n timeStrength?: number;\n /** default:0.002 */\n scale?: number;\n /** you can get into the rhythm ♪ , default:false */\n beat?: number | false;\n};\n\nexport type MarbleObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MARBLE_PARAMS: MarbleParams = {\n pattern: 0,\n complexity: 2,\n complexityAttenuation: 0.2,\n iterations: 8,\n timeStrength: 0.2,\n scale: 0.002,\n beat: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMarble = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: MarbleParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n setUniform(material, \"u_pattern\", params.pattern!);\n setUniform(material, \"u_complexity\", params.complexity!);\n setUniform(\n material,\n \"u_complexityAttenuation\",\n params.complexityAttenuation!\n );\n setUniform(material, \"u_iterations\", params.iterations!);\n setUniform(material, \"u_timeStrength\", params.timeStrength!);\n setUniform(material, \"u_scale\", params.scale!);\n\n setUniform(material, \"u_time\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\nuniform vec3 uColor4;\nuniform vec3 uRgbWeight;\n\n\n// Based on glsl-cos-palette by Erkaman\n// https://github.com/Erkaman/glsl-cos-palette\nvec3 cosPalette( float t, vec3 color1, vec3 color2, vec3 color3, vec3 color4 ){\n return color1 + color2 * cos( 6.28318 * ( color3 * t + color4) );\n}\n\nvoid main() {\n\n\tvec4 tex = texture2D(uTexture, vUv);\n\tfloat gray = dot(tex.rgb, uRgbWeight);\t\t\n\n\tvec3 outColor = cosPalette(\n\t\tgray,\n\t\tuColor1,\n\t\tuColor2,\n\t\tuColor3,\n\t\tuColor4\n\t);\n\n\tgl_FragColor = vec4(outColor, tex.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class CosPaletteMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uRgbWeight: { value: THREE.Vector3 };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColor4: { value: THREE.Color };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uRgbWeight: { value: new THREE.Vector3(0.299, 0.587, 0.114) },\n uColor1: { value: new THREE.Color().set(0.5, 0.5, 0.5) },\n uColor2: { value: new THREE.Color().set(0.5, 0.5, 0.5) },\n uColor3: { value: new THREE.Color().set(1, 1, 1) },\n uColor4: { value: new THREE.Color().set(0, 0.1, 0.2) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as CosPaletteMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\n\nexport type CosPaletteParams = {\n /** color1, default:rgb(50%, 50%, 50%) */\n color1?: THREE.Color;\n /** color2, default:rgb(50%, 50%, 50%) */\n color2?: THREE.Color;\n /** color3, default:rgb(100%, 100%, 100%) */\n color3?: THREE.Color;\n /** color4, default:rgb(0%, 10%, 20%) */\n color4?: THREE.Color;\n /** texture to be used as a palette */\n texture?: THREE.Texture;\n /** weight of the rgb, default:THREE.Vector3(1.0,0.0,0.0) */\n rgbWeight?: THREE.Vector3;\n};\n\nexport type ColorPaletteObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COSPALETTE_PARAMS: CosPaletteParams = {\n texture: new THREE.Texture(),\n color1: new THREE.Color().set(0.5, 0.5, 0.5),\n color2: new THREE.Color().set(0.5, 0.5, 0.5),\n color3: new THREE.Color().set(1, 1, 1),\n color4: new THREE.Color().set(0, 0.1, 0.2),\n rgbWeight: new THREE.Vector3(0.299, 0.587, 0.114),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCosPalette = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: CosPaletteParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor1\", params.color1!);\n setUniform(material, \"uColor2\", params.color2!);\n setUniform(material, \"uColor3\", params.color3!);\n setUniform(material, \"uColor4\", params.color4!);\n setUniform(material, \"uRgbWeight\", params.rgbWeight!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 texColor = texture2D(uTexture, uv);\n\tfloat grayscale = dot(texColor.rgb, vec3(0.299, 0.587, 0.114));\n\tvec3 duotone = mix(uColor0, uColor1, grayscale);\n\tgl_FragColor = vec4(duotone, texColor.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class DuoToneMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uColor0: { value: new THREE.Color(0xffffff) },\n uColor1: { value: new THREE.Color(0x000000) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as DuoToneMaterial;\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { DuoToneMaterial, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** 1st color , Default:new THREE.Color(0xffffff) */\n color0?: THREE.Color;\n /** 2nd color , Default: new THREE.Color(0x000000) */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n material: DuoToneMaterial;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const DUOTONE_PARAMS: DuoToneParams = {\n texture: new THREE.Texture(),\n color0: new THREE.Color(0xffffff),\n color1: new THREE.Color(0x000000),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useDuoTone = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DuoToneParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor0\", params.color0!);\n setUniform(material, \"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D u_map;\nuniform bool u_isAlphaMap;\nuniform sampler2D u_alphaMap;\nuniform float u_mapIntensity;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\nuniform vec3 u_dodgeColor;\nuniform bool u_isDodgeColor;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\t// fx blending\n\tvec3 mapColor = texture2D(u_map, uv).rgb;\n\tvec3 normalizedMap = mapColor * 2.0 - 1.0;\n\n\tuv = uv * 2.0 - 1.0;\n\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), u_mapIntensity);\n\tuv = (uv + 1.0) / 2.0;\n\n\t// colro blending\n\tfloat brightness = dot(mapColor,u_brightness);\n\tvec4 textureMap = texture2D(u_texture, uv);\n\tfloat blendValue = smoothstep(u_min, u_max, brightness);\n\n\t// set dodge color\n\tvec3 dodgeColor = u_isDodgeColor ? u_dodgeColor : mapColor;\n\tvec3 outputColor = blendValue * dodgeColor + (1.0 - blendValue) * textureMap.rgb;\n\t\n\t// alpha blending\n\tfloat alpha = u_isAlphaMap ? texture2D(u_alphaMap, uv).a : textureMap.a;\n\tfloat mixValue = u_isAlphaMap ? alpha : 0.0;\n\tvec3 alphColor = mix(outputColor,mapColor,mixValue);\n\n\tgl_FragColor = vec4(alphColor, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class BlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_map: { value: THREE.Texture };\n u_alphaMap: { value: THREE.Texture };\n u_isAlphaMap: { value: boolean };\n u_mapIntensity: { value: number };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n u_dodgeColor: { value: THREE.Color };\n u_isDodgeColor: { value: boolean };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_map: { value: new THREE.Texture() },\n u_alphaMap: { value: new THREE.Texture() },\n u_isAlphaMap: { value: false },\n u_mapIntensity: { value: 0.0 },\n u_brightness: { value: new THREE.Vector3() },\n u_min: { value: 0.0 },\n u_max: { value: 0.9 },\n u_dodgeColor: { value: new THREE.Color(0xffffff) },\n u_isDodgeColor: { value: false },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as BlendingMaterial;\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type BlendingParams = {\n /** Make this texture Blending , default:THREE.Texture */\n texture?: THREE.Texture;\n /** map texture, default:THREE.Texture */\n map?: THREE.Texture;\n /** map strength , r,g value are affecting , default:0.3 */\n mapIntensity?: number;\n /** Alpha blending is performed using the alpha of the set texture. , default:false */\n alphaMap?: THREE.Texture | false;\n /** default:(0.5,0.5,0.5) */\n brightness?: THREE.Vector3;\n /** default:0.0 */\n min?: number;\n /** default:1.0 */\n max?: number;\n /** If set, this value will apply color dodge , default: false */\n dodgeColor?: THREE.Color | false;\n};\n\nexport type BlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BLENDING_PARAMS: BlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n alphaMap: false,\n mapIntensity: 0.3,\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n dodgeColor: false,\n};\n\n/**\n * Blend map to texture. You can set the threshold for blending with brightness. You can set the dodge color by setting color. \nIf you don't want to reflect the map's color, you can use useFxBlending instead.\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n\n if (params.alphaMap) {\n setUniform(material, \"u_alphaMap\", params.alphaMap!);\n setUniform(material, \"u_isAlphaMap\", true);\n } else {\n setUniform(material, \"u_isAlphaMap\", false);\n }\n\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n if (params.dodgeColor) {\n setUniform(material, \"u_dodgeColor\", params.dodgeColor);\n setUniform(material, \"u_isDodgeColor\", true);\n } else {\n setUniform(material, \"u_isDodgeColor\", false);\n }\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture0;\nuniform sampler2D uTexture1;\nuniform sampler2D uMap;\nuniform float mapIntensity;\nuniform float edgeIntensity;\nuniform float progress;\nuniform float dirX;\nuniform float dirY;\nuniform vec2 epicenter;\nuniform float padding;\n\nbool isInPaddingArea(vec2 uv) {\n return uv.x < padding || uv.x > 1.0 - padding || uv.y < padding || uv.y > 1.0 - padding;\n}\n\nvoid main() {\n\tfloat screenAspect = uResolution.x / uResolution.y;\n\tfloat textureAspect = uTextureResolution.x / uTextureResolution.y;\n\tvec2 aspectRatio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\tvec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;\n\n\t// fx map\n\tvec2 map = texture2D(uMap, uv).rg;\n\tvec2 normalizedMap = map * 2.0 - 1.0;\n\n\t// multiply edge fx\n\tuv = uv * 2.0 - 1.0;\n\tuv *= map * distance(epicenter, uv) * edgeIntensity + 1.0;\n\tuv = (uv + 1.0) / 2.0;\n\n\t// padding\n\tif (isInPaddingArea(uv)) {\n\t\tgl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n\t\treturn;\n\t}\n\tvec2 paddedUV = uv * (1.0 - 2.0 * padding * -1.) + padding * -1.;\n\n\t// centered uv\n\tvec2 centeredUV = paddedUV - vec2(0.5);\n\n\t// multiply map fx\n\tcenteredUV *= normalizedMap * map * mapIntensity + 1.0;\n\n\t// texture 0\n\tfloat xOffsetTexture0 = 0.5 - dirX * progress;\n\tfloat yOffsetTexture0 = 0.5 - dirY * progress;\n\tvec2 samplePosTexture0 = vec2(xOffsetTexture0, yOffsetTexture0) + centeredUV;\n\n\t//texture 1\n\tfloat xOffsetTexture1 = 0.5 + dirX * (1.0 - progress);\n\tfloat yOffsetTexture1 = 0.5 + dirY * (1.0 - progress);\n\tvec2 samplePosTexture1 = vec2(xOffsetTexture1, yOffsetTexture1) + centeredUV;\n\n\tvec4 color0 = texture2D(uTexture0, samplePosTexture0);\n\tvec4 color1 = texture2D(uTexture1, samplePosTexture1);\n\n\tgl_FragColor = mix(color0, color1, progress);\n\n}","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class FxTextureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uTextureResolution: { value: THREE.Vector2 };\n uTexture0: { value: THREE.Texture };\n uTexture1: { value: THREE.Texture };\n padding: { value: number };\n uMap: { value: THREE.Texture };\n edgeIntensity: { value: number };\n mapIntensity: { value: number };\n epicenter: { value: THREE.Vector2 };\n progress: { value: number };\n dirX: { value: number };\n dirY: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: new THREE.Texture() },\n uTexture1: { value: new THREE.Texture() },\n padding: { value: 0.0 },\n uMap: { value: new THREE.Texture() },\n edgeIntensity: { value: 0.0 },\n mapIntensity: { value: 0.0 },\n epicenter: { value: new THREE.Vector2(0.0, 0.0) },\n progress: { value: 0.0 },\n dirX: { value: 0.0 },\n dirY: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type FxTextureParams = {\n /** 1st texture , default:THREE.Texture() */\n texture0?: THREE.Texture;\n /** 2nd texture , default:THREE.Texture() */\n texture1?: THREE.Texture;\n /** add transparent padding, 0.0 ~ 1.0 , default:0.0 */\n padding?: number;\n /** The color map. The uv value is affected according to this rbg , default:THREE.Texture() */\n map?: THREE.Texture;\n /** intensity of map , r,g value are affecting , default:0.0 */\n mapIntensity?: number;\n /** Intensity of effect on edges , default:0.0 */\n edgeIntensity?: number;\n /** epicenter of fx, -1 ~ 1 , default:vec2(0.0,0.0)*/\n epicenter?: THREE.Vector2;\n /** Switch value to switch between texture0 and texture1 , 0 ~ 1 , default : 0 */\n progress?: number;\n /** direction of transition , default: THREE.Vector2(0, 0) */\n dir?: THREE.Vector2;\n};\n\nexport type FxTextureObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const FXTEXTURE_PARAMS: FxTextureParams = {\n texture0: new THREE.Texture(),\n texture1: new THREE.Texture(),\n padding: 0.0,\n map: new THREE.Texture(),\n mapIntensity: 0.0,\n edgeIntensity: 0.0,\n epicenter: new THREE.Vector2(0, 0),\n progress: 0.0,\n dir: new THREE.Vector2(0, 0),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxTexture = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture0\", params.texture0!);\n setUniform(material, \"uTexture1\", params.texture1!);\n\n setUniform(material, \"progress\", params.progress!);\n\n // calculate resolution by linear interpolation.\n const tex0Res = [\n params.texture0!?.image?.width || 0,\n params.texture0!?.image?.height || 0,\n ];\n const tex1Res = [\n params.texture1!?.image?.width || 0,\n params.texture1!?.image?.height || 0,\n ];\n const interpolatedResolution = tex0Res.map((value, index) => {\n return value + (tex1Res[index] - value) * params.progress!;\n });\n setUniform(material, \"uTextureResolution\", interpolatedResolution);\n\n setUniform(material, \"padding\", params.padding!);\n setUniform(material, \"uMap\", params.map!);\n setUniform(material, \"mapIntensity\", params.mapIntensity!);\n setUniform(material, \"edgeIntensity\", params.edgeIntensity!);\n setUniform(material, \"epicenter\", params.epicenter!);\n setUniform(material, \"dirX\", params.dir!.x);\n setUniform(material, \"dirY\", params.dir!.y);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec3 color = texture2D(u_texture, uv).rgb;\n\tfloat brightness = dot(color,u_brightness);\n\tfloat alpha = clamp(smoothstep(u_min, u_max, brightness),0.0,1.0);\n\tgl_FragColor = vec4(color, alpha);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class BrightnessPickerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_brightness: { value: new THREE.Vector3() },\n u_min: { value: 0.0 },\n u_max: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as BrightnessPickerMaterial;\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type BrightnessPickerParams = {\n /** pick brightness from this texture , default:THREE.Texture */\n texture?: THREE.Texture;\n /** default:(0.5,0.5,0.5) */\n brightness?: THREE.Vector3;\n /** default:0.0 */\n min?: number;\n /** default:1.0 */\n max?: number;\n};\n\nexport type BrightnessPickerObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRIGHTNESSPICKER_PARAMS: BrightnessPickerParams = {\n texture: new THREE.Texture(),\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrightnessPicker = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrightnessPickerParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D u_map;\nuniform float u_mapIntensity;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 mapColor = texture2D(u_map, uv).rg;\n\tvec2 normalizedMap = mapColor * 2.0 - 1.0;\n\t\n\tuv = uv * 2.0 - 1.0;\n\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), u_mapIntensity);\n\tuv = (uv + 1.0) / 2.0;\n\n\tgl_FragColor = texture2D(u_texture, uv);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class FxBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_map: { value: THREE.Texture };\n u_mapIntensity: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_map: { value: new THREE.Texture() },\n u_mapIntensity: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as FxBlendingMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type FxBlendingParams = {\n /** Make this texture Blending , default:THREE.Texture */\n texture?: THREE.Texture;\n /** map texture, default:THREE.Texture */\n map?: THREE.Texture;\n /** map strength , r,g value are affecting , default:0.3 */\n mapIntensity?: number;\n};\n\nexport type FxBlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const FXBLENDING_PARAMS: FxBlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n mapIntensity: 0.3,\n};\n\n/**\n * Blend map to texture. You can change the intensity of fx applied by the rg value of map. Unlike \"useBlending\", the map color is not reflected.\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxBlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n const bufferTexture = updateRenderTarget(gl);\n return bufferTexture;\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nuniform sampler2D uTexture;\nuniform sampler2D uMap;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 tex = texture2D(uTexture, uv);\n\tvec4 map = texture2D(uMap, uv);\n\tgl_FragColor = mix(tex,map,map.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class AlphaBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uMap: { value: THREE.Texture };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uMap: { value: new THREE.Texture() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as AlphaBlendingMaterial;\n\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\n\nexport type AlphaBlendingParams = {\n /** default:THREE.Texture()*/\n texture?: THREE.Texture;\n /** alpha map , default:THREE.Texture() */\n map?: THREE.Texture;\n};\n\nexport type AlphaBlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const ALPHABLENDING_PARAMS: AlphaBlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useAlphaBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] =\n useParams(ALPHABLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: AlphaBlendingParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uMap\", params.map!);\n\n return updateRenderTarget(gl);\n },\n [material, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform float u_brightness;\nuniform float u_saturation;\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class HSVMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: number };\n u_saturation: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_brightness: { value: 1 },\n u_saturation: { value: 1 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as HSVMaterial;\n\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\n\nexport type HSVParams = {\n /** default:THREE.Texture() */\n texture?: THREE.Texture;\n /** default:1 */\n brightness?: number;\n /** default:1 */\n saturation?: number;\n};\n\nexport type HSVObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const HSV_PARAMS: HSVParams = {\n texture: new THREE.Texture(),\n brightness: 1,\n saturation: 1,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useHSV = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(HSV_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: HSVParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_saturation\", params.saturation!);\n\n return updateRenderTarget(gl);\n },\n [material, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture;\n\nvoid main() {\n\tfloat screenAspect = uResolution.x / uResolution.y;\n\tfloat textureAspect = uTextureResolution.x / uTextureResolution.y;\n\tvec2 aspectRatio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\tvec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;\n\t\n\tgl_FragColor = texture2D(uTexture, uv);\n\n}","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class FxTextureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uTextureResolution: { value: THREE.Vector2 };\n uTexture: { value: THREE.Texture };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture: { value: new THREE.Texture() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type CoverTextureParams = {\n /** Textures that you want to display exactly on the screen , default:THREE.Texture() */\n texture?: THREE.Texture;\n};\n\nexport type CoverTextureObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COVERTEXTURE_PARAMS: CoverTextureParams = {\n texture: new THREE.Texture(),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCoverTexture = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: CoverTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uTextureResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","precision mediump float;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision mediump float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec2 uResolution;\nuniform float uBlurSize;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec2 perDivSize = uBlurSize / uResolution;\n\n\t// calc average color value from adjacent point\n\tvec4 outColor = vec4(\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, -1.0)) +\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 1.0))\n\t\t) / 9.0;\n\t\n\tgl_FragColor = outColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\n\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class SampleMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uResolution: { value: THREE.Vector2 };\n uBlurSize: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uBlurSize: { value: 1 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as SampleMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../../types\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** blurSize, default:3 */\n blurSize?: number;\n /** blurPower, affects performance default:5 */\n blurPower?: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const SIMPLEBLUR_PARAMS: SimpleBlurParams = {\n texture: new THREE.Texture(),\n blurSize: 3,\n blurPower: 5,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useSimpleBlur = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr,\n samples,\n }),\n [scene, camera, size, dpr, samples]\n );\n const [renderTarget, updateRenderTarget] = useSingleFBO(fboProps);\n const [_, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: SimpleBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n setUniform(material, \"uBlurSize\", params.blurSize!);\n\n let _tempTexture: THREE.Texture = updateTempTexture(gl);\n\n const iterations = params.blurPower!;\n for (let i = 0; i < iterations; i++) {\n setUniform(material, \"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateTempTexture, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform float uProgress;\nuniform float uStrength;\nuniform float uWidth;\nuniform vec2 uEpicenter;\nuniform int uMode;\n\nfloat PI = 3.141592653589;\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tfloat progress = min(uProgress, 1.0);\n\tfloat progressFactor = sin(progress * PI);\n\n\tfloat border = progress - progress * progressFactor * uWidth;\n\tfloat blur = uStrength * progressFactor;\n\t\n\t// 0 ~ 1\n\tvec2 normalizeCenter = (uEpicenter + 1.0) / 2.0;\n\n\t// 0:center 1:horizontal 2:vertical\n\tfloat dist = uMode == 0 ? length(uv - normalizeCenter) : uMode == 1 ? length(uv.x - normalizeCenter.x) : length(uv.y - normalizeCenter.y);\n\n\t// Calculate the maximum distance to the four corners of the screen\n\tfloat maxDistance = max(\n\t\tlength(vec2(0.0, 0.0) - normalizeCenter),\n\t\tmax(\n\t\t\t\tlength(vec2(1.0, 0.0) - normalizeCenter),\n\t\t\t\tmax(\n\t\t\t\t\tlength(vec2(0.0, 1.0) - normalizeCenter),\n\t\t\t\t\tlength(vec2(1.0, 1.0) - normalizeCenter)\n\t\t\t\t)\n\t\t)\n\t);\n\n\t// Scale distance so that waves extend to the edge of the screen\n\tdist = maxDistance > 0.0 ? dist / maxDistance : dist;\n\n\tvec3 color = vec3(smoothstep(border - blur, border, dist) -\n smoothstep(progress, progress + blur, dist));\n\t\n\t// Ensure color is 0 when progress is 0,1\n\tcolor *= progressFactor;\n\n\tgl_FragColor = vec4(color, 1.0);\n}\n\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class WaveMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uEpicenter: { value: THREE.Vector2 };\n uProgress: { value: number };\n uStrength: { value: number };\n uWidth: { value: number };\n uMode: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uEpicenter: { value: new THREE.Vector2(0.0, 0.0) },\n uProgress: { value: 0.0 },\n uStrength: { value: 0.0 },\n uWidth: { value: 0.0 },\n uMode: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n useAddMesh(scene, geometry, material);\n\n return material as WaveMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\n\nexport type WaveParams = {\n /** -1.0 ~ 1.0 , default:vec2(0.0,0.0) */\n epicenter?: THREE.Vector2;\n /** 0.0 ~ 1.0 , default:0.0 */\n progress?: number;\n /** default:0.0 */\n width?: number;\n /** default:0.0 */\n strength?: number;\n /** default:center */\n mode?: \"center\" | \"horizontal\" | \"vertical\";\n};\n\nexport type WaveObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WAVE_PARAMS: WaveParams = {\n epicenter: new THREE.Vector2(0.0, 0.0),\n progress: 0.0,\n width: 0.0,\n strength: 0.0,\n mode: \"center\",\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useWave = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: WaveParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uEpicenter\", params.epicenter!);\n setUniform(material, \"uProgress\", params.progress!);\n setUniform(material, \"uWidth\", params.width!);\n setUniform(material, \"uStrength\", params.strength!);\n setUniform(\n material,\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D u_texture;\nuniform vec2 u_resolution;\nuniform vec3 u_keyColor;\nuniform float u_similarity;\nuniform float u_smoothness;\nuniform float u_spill;\n\nuniform vec4 u_color;\nuniform float u_contrast;\nuniform float u_brightness;\nuniform float u_gamma;\n\n// From https://github.com/libretro/glsl-shaders/blob/master/nnedi3/shaders/rgb-to-yuv.glsl\nvec2 RGBtoUV(vec3 rgb) {\n return vec2(\n rgb.r * -0.169 + rgb.g * -0.331 + rgb.b * 0.5 + 0.5,\n rgb.r * 0.5 + rgb.g * -0.419 + rgb.b * -0.081 + 0.5\n );\n}\nfloat getChromeDist(vec3 texColor){\n\tfloat chromaDist = distance(RGBtoUV(texColor), RGBtoUV(u_keyColor));\n\treturn chromaDist;\n}\n\nfloat getBoxFilteredChromaDist(vec3 rgb, vec2 uv)\n{\n\tvec2 pixel_size = vec2(1.) / u_resolution;\n\tvec2 h_pixel_size = pixel_size / 2.0;\n\tvec2 point_0 = vec2(pixel_size.x, h_pixel_size.y);\n\tvec2 point_1 = vec2(h_pixel_size.x, -pixel_size.y);\n\tfloat distVal = getChromeDist(texture2D(u_texture,uv-point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv-point_1).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_1).rgb);\n\tdistVal *= 2.0;\n\tdistVal += getChromeDist(rgb);\n\treturn distVal / 9.0;\n}\n\nvec4 CalcColor(vec4 rgba)\n{\n\treturn vec4(pow(rgba.rgb, vec3(u_gamma, u_gamma, u_gamma)) * u_contrast + u_brightness, rgba.a);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tvec4 texColor = texture2D(u_texture, uv);\n\ttexColor.rgb *= (texColor.a > 0.) ? (1. / texColor.a) : 0.;\n\n\tfloat chromaDist = getBoxFilteredChromaDist(texColor.rgb,uv);\n\t\n\tfloat baseMask = chromaDist - u_similarity;\n\tfloat fullMask = pow(clamp(baseMask / u_smoothness, 0., 1.), 1.5);\n\t\n\ttexColor.rgba *= u_color;\n\ttexColor.a = fullMask;\n\n\tfloat spillVal = pow(clamp(baseMask / u_spill, 0., 1.), 1.5);\n\tfloat desat = clamp(texColor.r * 0.2126 + texColor.g * 0.7152 + texColor.b * 0.0722, 0., 1.);\n\ttexColor.rgb = mix(vec3(desat, desat, desat), texColor.rgb, spillVal);\n\n\tvec4 finColor = CalcColor(texColor);\n\n\tgl_FragColor = finColor;\n}","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useResolution } from \"../../../utils/useResolution\";\n\nexport class ChromaKeyMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_resolution: { value: THREE.Vector2 };\n u_keyColor: { value: THREE.Color };\n u_similarity: { value: number };\n u_smoothness: { value: number };\n u_spill: { value: number };\n u_color: { value: THREE.Vector4 };\n u_contrast: { value: number };\n u_brightness: { value: number };\n u_gamma: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_resolution: { value: new THREE.Vector2() },\n u_keyColor: { value: new THREE.Color() },\n u_similarity: { value: 0 },\n u_smoothness: { value: 0 },\n u_spill: { value: 0 },\n u_color: { value: new THREE.Vector4() },\n u_contrast: { value: 0 },\n u_brightness: { value: 0 },\n u_gamma: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as ChromaKeyMaterial;\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"u_resolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type ChromaKeyParams = {\n /** Process this texture with chroma key , default:THREE.Texture */\n texture?: THREE.Texture;\n /** key color for chromakey processing , default: THREE.Color(0x00ff00) */\n keyColor?: THREE.Color;\n /** If the similarity with the key color exceeds this value, it becomes transparent. , default: 0.2 */\n similarity?: number;\n /** smoothness , default : 0.1 */\n smoothness?: number;\n /** spill , default : 0.2 */\n spill?: number;\n /** tone correction , default : THREE.Vector4(1.0, 1.0, 1.0, 1.0) */\n color?: THREE.Vector4;\n /** contrast , default : 1.0 */\n contrast?: number;\n /** brightness , default : 0.0 */\n brightness?: number;\n /** gamma correction , default : 1.0 */\n gamma?: number;\n};\n\nexport type ChromaKeyObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const CHROMAKEY_PARAMS: ChromaKeyParams = {\n texture: new THREE.Texture(),\n keyColor: new THREE.Color(0x00ff00),\n similarity: 0.2,\n smoothness: 0.1,\n spill: 0.2,\n color: new THREE.Vector4(1.0, 1.0, 1.0, 1.0),\n contrast: 1.0,\n brightness: 0.0,\n gamma: 1.0,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useChromaKey = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ChromaKeyParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_keyColor\", params.keyColor!);\n setUniform(material, \"u_similarity\", params.similarity!);\n setUniform(material, \"u_smoothness\", params.smoothness!);\n setUniform(material, \"u_spill\", params.spill!);\n setUniform(material, \"u_color\", params.color!);\n setUniform(material, \"u_contrast\", params.contrast!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_gamma\", params.gamma!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { UseFboProps, renderFBO, FBO_OPTION } from \"./useSingleFBO\";\n\ntype UpdateCopyFunction = (\n gl: THREE.WebGLRenderer,\n index: number,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseCopyTextureReturn = [THREE.WebGLRenderTarget[], UpdateCopyFunction];\n\n/**\n * Generate an FBO array to copy the texture.\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @param length The number of FBOs to create\n * @returns [THREE.WebGLRenderTarget[] , updateCopyTexture] -Receives the RenderTarget array as the first argument and the update function as the second argument. updateCopyTexture() receives gl as the first argument and the index of the texture you want to copy as the second argument.\n */\nexport const useCopyTexture = (\n {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n }: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const renderTargetArr = useRef([]);\n const resolution = useResolution(size, dpr);\n\n renderTargetArr.current = useMemo(() => {\n return Array.from({ length }, () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n","export type EasingTypes =\n | \"easeInSine\"\n | \"easeOutSine\"\n | \"easeInOutSine\"\n | \"easeInQuad\"\n | \"easeOutQuad\"\n | \"easeInOutQuad\"\n | \"easeInCubic\"\n | \"easeOutCubic\"\n | \"easeInOutCubic\"\n | \"easeInQuart\"\n | \"easeOutQuart\"\n | \"easeInOutQuart\"\n | \"easeInQuint\"\n | \"easeOutQuint\"\n | \"easeInOutQuint\"\n | \"easeInExpo\"\n | \"easeOutExpo\"\n | \"easeInOutExpo\"\n | \"easeInCirc\"\n | \"easeOutCirc\"\n | \"easeInOutCirc\"\n | \"easeInBack\"\n | \"easeOutBack\"\n | \"easeInOutBack\"\n | \"easeInElastic\"\n | \"easeOutElastic\"\n | \"easeInOutElastic\"\n | \"easeInBounce\"\n | \"easeOutBounce\"\n | \"easeInOutBounce\";\n\ntype EasingFunctions = {\n [K in EasingTypes]: (x: number) => number;\n};\n\n/**\n * from https://github.com/ai/easings.net\n */\nexport const Easing: EasingFunctions = Object.freeze({\n easeInSine(x: number): number {\n return 1 - Math.cos((x * Math.PI) / 2);\n },\n easeOutSine(x: number): number {\n return Math.sin((x * Math.PI) / 2);\n },\n easeInOutSine(x: number): number {\n return -(Math.cos(Math.PI * x) - 1) / 2;\n },\n easeInQuad(x: number): number {\n return x * x;\n },\n easeOutQuad(x: number): number {\n return 1 - (1 - x) * (1 - x);\n },\n easeInOutQuad(x: number): number {\n return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2;\n },\n easeInCubic(x: number): number {\n return x * x * x;\n },\n easeOutCubic(x: number): number {\n return 1 - Math.pow(1 - x, 3);\n },\n easeInOutCubic(x: number): number {\n return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2;\n },\n easeInQuart(x: number): number {\n return x * x * x * x;\n },\n easeOutQuart(x: number): number {\n return 1 - Math.pow(1 - x, 4);\n },\n easeInOutQuart(x: number): number {\n return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2;\n },\n easeInQuint(x: number): number {\n return x * x * x * x * x;\n },\n easeOutQuint(x: number): number {\n return 1 - Math.pow(1 - x, 5);\n },\n easeInOutQuint(x: number): number {\n return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2;\n },\n easeInExpo(x: number): number {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n },\n easeOutExpo(x: number): number {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n },\n easeInOutExpo(x: number): number {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n },\n easeInCirc(x: number): number {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n },\n easeOutCirc(x: number): number {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n },\n easeInOutCirc(x: number): number {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n },\n easeInBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return c3 * x * x * x - c1 * x * x;\n },\n easeOutBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2);\n },\n easeInOutBack(x: number): number {\n const c1 = 1.70158;\n const c2 = c1 * 1.525;\n\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n },\n easeInElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n },\n easeOutElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;\n },\n easeInOutElastic(x: number): number {\n const c5 = (2 * Math.PI) / 4.5;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2\n : (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 +\n 1;\n },\n easeInBounce(x: number): number {\n return 1 - Easing.easeOutBounce(1 - x);\n },\n easeOutBounce(x: number): number {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n },\n easeInOutBounce(x: number): number {\n return x < 0.5\n ? (1 - Easing.easeOutBounce(1 - 2 * x)) / 2\n : (1 + Easing.easeOutBounce(2 * x - 1)) / 2;\n },\n});\n","import * as THREE from \"three\";\nimport { Easing, EasingTypes } from \"../libs/easing\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : 60\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\n\nexport class DomSyncerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_textureResolution: { value: THREE.Vector2 };\n u_resolution: { value: THREE.Vector2 };\n u_borderRadius: { value: number };\n };\n}\n\nexport const createMesh = ({\n params,\n size,\n scene,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n}) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mesh = new THREE.Mesh(\n new THREE.PlaneGeometry(1, 1),\n new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n transparent: true,\n uniforms: {\n u_texture: { value: texture },\n u_textureResolution: {\n value: new THREE.Vector2(0, 0),\n },\n u_resolution: { value: new THREE.Vector2(0, 0) },\n u_borderRadius: {\n value: params.boderRadius![i] ? params.boderRadius![i] : 0.0,\n },\n },\n })\n );\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { DomSyncerMaterial } from \"./createMesh\";\nimport { useCallback, useRef } from \"react\";\n\ntype UpdateDomRect = ({\n params,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n}: {\n params: DomSyncerParams;\n size: Size;\n resolutionRef: React.MutableRefObject;\n scene: THREE.Scene;\n isIntersectingRef: React.MutableRefObject;\n}) => void;\n\ntype UseUpdateDomRectReturn = [DOMRect[], UpdateDomRect];\n\nexport const useUpdateDomRect = (): UseUpdateDomRectReturn => {\n const domRects = useRef([]);\n\n const updateDomRects: UpdateDomRect = useCallback(\n ({ params, size, resolutionRef, scene, isIntersectingRef }) => {\n // Initialize domRects if the number of children in the scene is different from the number of DOMRect\n if (scene.children.length !== domRects.current!.length) {\n domRects.current = new Array(scene.children.length);\n }\n\n scene.children.forEach((mesh, i) => {\n const domElement = params.dom![i];\n if (!domElement) {\n return;\n }\n\n // DOMRect is updated even outside the intersection\n const rect = domElement.getBoundingClientRect();\n domRects.current[i] = rect;\n\n // Intersection cannot be determined accurately depending on the mobile navigation bar, so it seems better to update it constantly\n mesh.scale.set(rect.width, rect.height, 1.0);\n mesh.position.set(\n rect.left + rect.width * 0.5 - size.width * 0.5,\n -rect.top - rect.height * 0.5 + size.height * 0.5,\n 0.0\n );\n\n if (isIntersectingRef.current[i]) {\n if (params.rotation![i]) {\n mesh.rotation.copy(params.rotation![i]);\n }\n\n if (mesh instanceof THREE.Mesh) {\n const material: DomSyncerMaterial = mesh.material;\n setUniform(material, \"u_texture\", params.texture![i]);\n setUniform(material, \"u_textureResolution\", [\n params.texture![i]?.source?.data?.width || 0,\n params.texture![i]?.source?.data?.height || 0,\n ]);\n setUniform(\n material,\n \"u_resolution\",\n resolutionRef.current.set(rect.width, rect.height)\n );\n setUniform(\n material,\n \"u_borderRadius\",\n params.boderRadius![i] ? params.boderRadius![i] : 0.0\n );\n }\n }\n });\n },\n []\n );\n\n return [domRects.current, updateDomRects];\n};\n","import { useCallback, useRef } from \"react\";\n\nexport type IsIntersecting = (\n index: number,\n once?: boolean\n) => boolean[] | boolean;\n\nexport const useIsIntersecting = () => {\n const isIntersectingRef = useRef([]);\n const isIntersectingOnceRef = useRef([]);\n\n const isIntersecting: IsIntersecting = useCallback((index, once = false) => {\n isIntersectingRef.current.forEach((value, i) => {\n if (value) {\n isIntersectingOnceRef.current[i] = true;\n }\n });\n const temp = once\n ? [...isIntersectingOnceRef.current]\n : [...isIntersectingRef.current];\n return index < 0 ? temp : temp[index];\n }, []);\n\n return {\n isIntersectingRef,\n isIntersectingOnceRef,\n isIntersecting,\n };\n};\n","import { useEffect, useRef } from \"react\";\n\nexport type UseDomViewProps = {\n onView?: () => void;\n onHidden?: () => void;\n};\n\nexport type UseDomView = (props: UseDomViewProps) => void;\n\nexport const createUseDomView = (\n isIntersectingRef: React.MutableRefObject\n): UseDomView => {\n const useDomView = ({ onView, onHidden }: UseDomViewProps) => {\n const isView = useRef(false);\n useEffect(() => {\n let id: number;\n const filterIntersection = () => {\n if (isIntersectingRef.current.some((item) => item)) {\n if (!isView.current) {\n onView && onView();\n isView.current = true;\n }\n } else {\n if (isView.current) {\n onHidden && onHidden();\n isView.current = false;\n }\n }\n id = requestAnimationFrame(filterIntersection);\n };\n id = requestAnimationFrame(filterIntersection);\n return () => {\n cancelAnimationFrame(id);\n };\n }, [onView, onHidden]);\n };\n return useDomView;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef, useState, Key } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../../fxs/types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { errorHandler } from \"./utils/errorHandler\";\nimport { createMesh } from \"./utils/createMesh\";\nimport { useIntersectionHandler } from \"./utils/useIntersectionHandler\";\nimport { useUpdateDomRect } from \"./utils/useUpdateDomRect\";\nimport { useIsIntersecting, IsIntersecting } from \"./utils/useIsIntersecting\";\nimport { UseDomView, createUseDomView } from \"./utils/createUseDomView\";\n\nexport type DomSyncerParams = {\n /** DOM array you want to synchronize */\n dom?: (HTMLElement | Element | null)[];\n /** Texture array that you want to synchronize with the DOM rectangle */\n texture?: THREE.Texture[];\n /** default:0.0[] */\n boderRadius?: number[];\n /** the angle you want to rotate */\n rotation?: THREE.Euler[];\n /** Array of callback functions when crossed */\n onIntersect?: ((entry: IntersectionObserverEntry) => void)[];\n /** Because DOM rendering and React updates occur asynchronously, there may be a lag between updating dependent arrays and setting DOM arrays. That's what the Key is for. If the dependent array is updated but the Key is not, the loop will skip and return an empty texture. By updating the timing key when DOM acquisition is complete, you can perfectly synchronize DOM and Mesh updates.updateKey must be a unique value for each update, for example `performance.now()`.*/\n updateKey?: Key;\n};\n\nexport type DomSyncerObject = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n /**\n * A function that returns a determination whether the DOM intersects or not.\n * The boolean will be updated after executing the onIntersect function.\n * @param index - Index of the dom for which you want to return an intersection decision. -1 will return the entire array.\n * @param once - If set to true, it will continue to return true once crossed.\n */\n isIntersecting: IsIntersecting;\n /** target's DOMRect[] */\n DOMRects: DOMRect[];\n /** target's intersetions boolean[] */\n intersections: boolean[];\n /** You can set callbacks for when at least one DOM is visible and when it is completely hidden. */\n useDomView: UseDomView;\n};\n\nexport const DOMSYNCER_PARAMS: DomSyncerParams = {\n texture: [],\n dom: [],\n boderRadius: [],\n rotation: [],\n onIntersect: [],\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usedomsyncer\n * @param dependencies - When this dependency array is changed, the mesh and intersection judgment will be updated according to the passed DOM array.\n */\nexport const useDomSyncer = (\n { size, dpr, samples = 0 }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\n });\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useEffect(() => {\n setRefreshTrigger(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => new THREE.Texture(), []);\n\n // set intersection\n const intersectionHandler = useIntersectionHandler();\n const { isIntersectingOnceRef, isIntersectingRef, isIntersecting } =\n useIsIntersecting();\n\n // create useDomView\n const useDomView = createUseDomView(isIntersectingRef);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DomSyncerParams) => {\n const { gl, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (errorHandler(params)) {\n return emptyTexture;\n }\n\n if (refreshTrigger) {\n if (updateKey.current === params.updateKey) {\n return emptyTexture;\n } else {\n updateKey.current = params.updateKey!;\n }\n }\n\n if (refreshTrigger) {\n createMesh({\n params,\n size,\n scene,\n });\n\n intersectionHandler({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n });\n\n setRefreshTrigger(false);\n }\n\n updateDomRects({\n params,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n });\n\n return updateRenderTarget(gl);\n },\n [\n updateRenderTarget,\n setParams,\n intersectionHandler,\n updateDomRects,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n emptyTexture,\n ]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene,\n camera,\n renderTarget,\n output: renderTarget.texture,\n isIntersecting,\n DOMRects,\n intersections: isIntersectingRef.current,\n useDomView,\n },\n ];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","useAddMesh","scene","geometry","material","mesh","useEffect","setUniform","key","value","useMesh","vertexShader","fragmentShader","resolution","getCameraProps","width","height","frustumSize","aspect","w","h","useCamera","near","far","usePointer","lerp","prevPointer","useRef","diffPointer","lerpPointer","lastUpdateTime","velocity","isMoved","useCallback","currentPointer","now","current","deltaTime","isUpdate","prevTemp","useParams","params","isContainsFunctions","obj","paramsRef","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","useLayoutEffect","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","BRUSH_PARAMS","useBrush","updatePointer","pressureEnd","props","pointer","pointerValues","color","init_default","useInitialMaterial","advection_default","useAdvectionMaterial","divergence_default","useDivergenceMaterial","pressure_default","usePressureMaterial","curl_default","useCurlMaterial","vorticity_default","useVorticityMaterial","clear_default","useClearMaterial","gradientSubtract_default","useGradientSubtractMaterial","splat_default","useSplateMaterial","initialMaterial","updateMaterial","curlMaterial","vorticityMaterial","advectionMaterial","divergenceMaterial","pressureMaterial","clearMaterial","gradientSubtractMaterial","splatMaterial","materials","setMeshMaterial","FLUID_PARAMS","useFluid","fboProps","velocityFBO","updateVelocityFBO","densityFBO","updateDensityFBO","curlFBO","updateCurlFBO","divergenceFBO","updateDivergenceFBO","pressureFBO","updatePressureFBO","lastTime","scaledDiffVec","spaltVec","clock","dt","velocityTex","densityTex","scaledDiff","curlTex","divergenceTex","pressureTexTemp","i","scale","max","texture","meshArr","RIPPLE_PARAMS","useRipple","currentWave","NOISE_PARAMS","useNoise","COLORSTRATA_PARAMS","useColorStrata","MARBLE_PARAMS","useMarble","COSPALETTE_PARAMS","useCosPalette","DUOTONE_PARAMS","useDuoTone","BLENDING_PARAMS","useBlending","FXTEXTURE_PARAMS","useFxTexture","tex0Res","_d","_c","tex1Res","_f","_e","_h","_g","interpolatedResolution","index","BRIGHTNESSPICKER_PARAMS","useBrightnessPicker","FXBLENDING_PARAMS","useFxBlending","ALPHABLENDING_PARAMS","useAlphaBlending","HSV_PARAMS","useHSV","COVERTEXTURE_PARAMS","useCoverTexture","SIMPLEBLUR_PARAMS","useSimpleBlur","_","updateTempTexture","_tempTexture","iterations","WAVE_PARAMS","useWave","CHROMAKEY_PARAMS","useChromaKey","useCopyTexture","length","renderTargetArr","updateCopyTexture","Easing","x","c2","c4","c5","getHash","input","n","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","hash","useFPSLimiter","fps","interval","prevTime","tick","errorHandler","domLength","textureLength","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","DOMRects","refreshTrigger","setRefreshTrigger","useState","updateKey","emptyTexture","intersectionHandler","useDomView"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"use-shader-fx.umd.cjs","sources":["../src/fxs/interactions/useBrush/shader/main.vert","../src/fxs/interactions/useBrush/shader/main.frag","../src/utils/useResolution.ts","../src/utils/useAddMesh.ts","../src/utils/setUniforms.ts","../src/fxs/interactions/useBrush/useMesh.ts","../src/utils/useCamera.ts","../src/misc/usePointer.ts","../src/utils/useParams.ts","../src/utils/useSingleFBO.ts","../src/utils/useDoubleFBO.ts","../src/fxs/interactions/useBrush/index.ts","../src/fxs/interactions/useFluid/shaders/main.vert","../src/fxs/interactions/useFluid/shaders/init.frag","../src/fxs/interactions/useFluid/materials/useInitialMaterial.ts","../src/fxs/interactions/useFluid/shaders/advection.frag","../src/fxs/interactions/useFluid/materials/useAdvectionMaterial.ts","../src/fxs/interactions/useFluid/shaders/divergence.frag","../src/fxs/interactions/useFluid/materials/useDivergenceMaterial.ts","../src/fxs/interactions/useFluid/shaders/pressure.frag","../src/fxs/interactions/useFluid/materials/usePressureMaterial.ts","../src/fxs/interactions/useFluid/shaders/curl.frag","../src/fxs/interactions/useFluid/materials/useCurlMaterial.ts","../src/fxs/interactions/useFluid/shaders/vorticity.frag","../src/fxs/interactions/useFluid/materials/useVorticityMaterial.ts","../src/fxs/interactions/useFluid/shaders/clear.frag","../src/fxs/interactions/useFluid/materials/useClearMaterial.ts","../src/fxs/interactions/useFluid/shaders/gradientSubtract.frag","../src/fxs/interactions/useFluid/materials/useGradientSubtractMaterial.ts","../src/fxs/interactions/useFluid/shaders/splat.frag","../src/fxs/interactions/useFluid/materials/useSplatMaterial.ts","../src/fxs/interactions/useFluid/useMesh.ts","../src/fxs/interactions/useFluid/index.ts","../src/fxs/interactions/useRipple/useMesh.ts","../src/fxs/interactions/useRipple/index.ts","../src/fxs/noises/useNoise/shader/main.vert","../src/fxs/noises/useNoise/shader/main.frag","../src/fxs/noises/useNoise/useMesh.ts","../src/fxs/noises/useNoise/index.ts","../src/fxs/noises/useColorStrata/shader/main.vert","../src/fxs/noises/useColorStrata/shader/main.frag","../src/fxs/noises/useColorStrata/useMesh.ts","../src/fxs/noises/useColorStrata/index.ts","../src/fxs/noises/useMarble/shader/main.vert","../src/fxs/noises/useMarble/shader/main.frag","../src/fxs/noises/useMarble/useMesh.ts","../src/fxs/noises/useMarble/index.ts","../src/fxs/noises/useCosPalette/shader/main.vert","../src/fxs/noises/useCosPalette/shader/main.frag","../src/fxs/noises/useCosPalette/useMesh.ts","../src/fxs/noises/useCosPalette/index.ts","../src/fxs/utils/useDuoTone/shader/main.vert","../src/fxs/utils/useDuoTone/shader/main.frag","../src/fxs/utils/useDuoTone/useMesh.ts","../src/fxs/utils/useDuoTone/index.ts","../src/fxs/utils/useBlending/shader/main.vert","../src/fxs/utils/useBlending/shader/main.frag","../src/fxs/utils/useBlending/useMesh.ts","../src/fxs/utils/useBlending/index.ts","../src/fxs/utils/useFxTexture/shader/main.vert","../src/fxs/utils/useFxTexture/shader/main.frag","../src/fxs/utils/useFxTexture/useMesh.ts","../src/fxs/utils/useFxTexture/index.ts","../src/fxs/utils/useBrightnessPicker/shader/main.vert","../src/fxs/utils/useBrightnessPicker/shader/main.frag","../src/fxs/utils/useBrightnessPicker/useMesh.ts","../src/fxs/utils/useBrightnessPicker/index.ts","../src/fxs/utils/useFxBlending/shader/main.vert","../src/fxs/utils/useFxBlending/shader/main.frag","../src/fxs/utils/useFxBlending/useMesh.ts","../src/fxs/utils/useFxBlending/index.ts","../src/fxs/utils/useAlphaBlending/shader/main.vert","../src/fxs/utils/useAlphaBlending/shader/main.frag","../src/fxs/utils/useAlphaBlending/useMesh.ts","../src/fxs/utils/useAlphaBlending/index.ts","../src/fxs/utils/useHSV/shader/main.vert","../src/fxs/utils/useHSV/shader/main.frag","../src/fxs/utils/useHSV/useMesh.ts","../src/fxs/utils/useHSV/index.ts","../src/fxs/utils/useCoverTexture/shader/main.vert","../src/fxs/utils/useCoverTexture/shader/main.frag","../src/fxs/utils/useCoverTexture/useMesh.ts","../src/fxs/utils/useCoverTexture/index.ts","../src/fxs/effects/useSimpleBlur/shader/main.vert","../src/fxs/effects/useSimpleBlur/shader/main.frag","../src/fxs/effects/useSimpleBlur/useMesh.ts","../src/fxs/effects/useSimpleBlur/index.ts","../src/fxs/effects/useWave/shader/main.vert","../src/fxs/effects/useWave/shader/main.frag","../src/fxs/effects/useWave/useMesh.ts","../src/fxs/effects/useWave/index.ts","../src/fxs/misc/useChromaKey/shader/main.vert","../src/fxs/misc/useChromaKey/shader/main.frag","../src/fxs/misc/useChromaKey/useMesh.ts","../src/fxs/misc/useChromaKey/index.ts","../src/utils/useCopyTexture.ts","../src/libs/easing.ts","../src/misc/useBeat.ts","../src/misc/useFPSLimiter.ts","../src/misc/useDomSyncer/utils/errorHandler.ts","../src/misc/useDomSyncer/shader/main.vert","../src/misc/useDomSyncer/shader/main.frag","../src/misc/useDomSyncer/utils/createMesh.ts","../src/misc/useDomSyncer/utils/useIntersectionHandler.ts","../src/misc/useDomSyncer/utils/useUpdateDomRect.ts","../src/misc/useDomSyncer/utils/useIsIntersecting.ts","../src/misc/useDomSyncer/utils/createUseDomView.ts","../src/misc/useDomSyncer/index.ts"],"sourcesContent":["varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nuniform sampler2D uBuffer;\nuniform sampler2D uTexture;\nuniform bool uIsTexture;\nuniform sampler2D uMap;\nuniform bool uIsMap;\nuniform float uMapIntensity;\nuniform float uRadius;\nuniform float uDissipation;\nuniform vec2 uResolution;\nuniform float uSmudge;\nuniform vec2 uMouse;\nuniform vec2 uPrevMouse;\nuniform vec2 uVelocity;\nuniform vec3 uColor;\nuniform float uMotionBlur;\nuniform int uMotionSample;\nuniform bool uIsCursor;\nuniform float uPressureStart;\nuniform float uPressureEnd;\n\nvarying vec2 vUv;\n\nfloat isOnLine(vec2 point, vec2 start, vec2 end, float radius, float pressureStart, float pressureEnd) {\n\t\n\tfloat aspect = uResolution.x / uResolution.y;\n\n\tpoint.x *= aspect;\n\tstart.x *= aspect;\n\tend.x *= aspect;\n\n\tvec2 dir = normalize(end - start);\n\tvec2 n = vec2(dir.y, -dir.x);\n\tvec2 p0 = point - start;\n\t\n\tfloat distToLine = abs(dot(p0, n));\n\tfloat distAlongLine = dot(p0, dir);\n\tfloat totalLength = length(end - start);\n\n\tfloat progress = clamp(distAlongLine / totalLength, 0.0, 1.0);\n\tfloat pressure = mix(pressureStart, pressureEnd, progress);\n\tradius = min(radius,radius * pressure);\n\n\tfloat distFromStart = length(point - start);\n\tfloat distFromEnd = length(point - end);\n\t\n\tbool withinLine = (distToLine < radius && distAlongLine > 0.0 && distAlongLine < totalLength) || distFromStart < radius || distFromEnd < radius;\n\n\treturn float(withinLine);\n}\n\nvec4 createSmudge(vec2 uv){\n\tvec2 offsets[9];\n\toffsets[0] = vec2(-1, -1); offsets[1] = vec2( 0, -1); offsets[2] = vec2( 1, -1);\n\toffsets[3] = vec2(-1, 0); offsets[4] = vec2( 0, 0); offsets[5] = vec2( 1, 0);\n\toffsets[6] = vec2(-1, 1); offsets[7] = vec2( 0, 1); offsets[8] = vec2( 1, 1);\n\n\tfor(int i = 0; i < 9; i++) {\n\t\toffsets[i] = (offsets[i] * uSmudge) / uResolution;\n\t}\t\n\tvec4 smudgedColor = vec4(0.);\n\tfor(int i = 0; i < 9; i++) {\n\t\tsmudgedColor += texture2D(uBuffer, uv + offsets[i]);\n\t}\n\treturn smudgedColor / 9.0;\n}\n\nvec4 createMotionBlur(vec2 uv , vec4 baseColor, vec2 velocity) {\n\tvec2 scaledV = velocity * uMotionBlur;\n\tfor(int i = 1; i < uMotionSample; i++) {\n\t\tfloat t = float(i) / float(uMotionSample - 1);\n\t\tvec2 offset = t * scaledV / uResolution;\n\t\tbaseColor += texture2D(uBuffer, uv + offset);\n\t}\n\treturn baseColor / float(uMotionSample);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\tif(uIsMap){\n\t\tvec2 mapColor = texture2D(uMap, uv).rg;\n\t\tvec2 normalizedMap = mapColor * 2.0 - 1.0;\n\t\tuv = uv * 2.0 - 1.0;\n\t\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), uMapIntensity);\n\t\tuv = (uv + 1.0) / 2.0;\n\t}\n\tvec2 suv = uv*2.-1.;\n\n\tvec2 velocity = uVelocity * uResolution;\n\n\tfloat radius = max(0.0,uRadius);\n\t\n\tvec4 smudgedColor = uSmudge > 0. ? createSmudge(uv) : texture2D(uBuffer, uv);\n\n\tvec4 motionBlurredColor = uMotionBlur > 0. ? createMotionBlur(uv,smudgedColor, velocity) : smudgedColor;\n\n\tvec4 bufferColor = motionBlurredColor;\n\tbufferColor.a = bufferColor.a < 1e-10 ? 0.0 : bufferColor.a * uDissipation;\n\t\n\tvec4 brushColor = uIsTexture ? texture2D(uTexture, uv) : vec4(uColor,1.);\n\t\n\tfloat onLine = isOnLine(suv, uPrevMouse, uMouse, radius, uPressureStart,uPressureEnd);\n\tfloat isOnLine = length(velocity) > 0. ? onLine : uIsCursor ? onLine : 0.;\n\n\tvec4 finalColor = mix(bufferColor, brushColor, isOnLine);\n\n\tgl_FragColor = finalColor;\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\n/**\n * @params dpr if dpr is set, it returns the resolution which is size multiplied by dpr.\n */\nexport const useResolution = (size: Size, dpr: number | false = false) => {\n const _width = dpr ? size.width * dpr : size.width;\n const _height = dpr ? size.height * dpr : size.height;\n const resolution = useMemo(\n () => new THREE.Vector2(_width, _height),\n [_width, _height]\n );\n return resolution;\n};\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\n/** Generate mesh from geometry and material and add to scene */\nexport const useAddMesh = (\n scene: THREE.Scene,\n geometry: THREE.BufferGeometry,\n material: THREE.Material\n) => {\n const mesh = useMemo(\n () => new THREE.Mesh(geometry, material),\n [geometry, material]\n );\n\n useEffect(() => {\n scene.add(mesh);\n }, [scene, mesh]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","type UniformValue =\n | THREE.CubeTexture\n | THREE.Texture\n | Int32Array\n | Float32Array\n | THREE.Matrix4\n | THREE.Matrix3\n | THREE.Quaternion\n | THREE.Vector4\n | THREE.Vector3\n | THREE.Vector2\n | THREE.Color\n | number\n | boolean\n | Array\n | null;\ntype UniformObject = { [key: string]: { value: UniformValue } };\n\nexport const setUniform = (\n material: { uniforms: T },\n key: keyof T,\n value: UniformValue\n) => {\n if (\n material.uniforms &&\n material.uniforms[key] &&\n value !== undefined &&\n value !== null\n ) {\n material.uniforms[key].value = value;\n } else {\n console.error(\n `Uniform key \"${String(\n key\n )}\" does not exist in the material. or \"${String(\n key\n )}\" is null | undefined`\n );\n }\n};\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useEffect, useMemo } from \"react\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class BrushMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uBuffer: { value: THREE.Texture };\n uTexture: { value: THREE.Texture };\n uIsTexture: { value: boolean };\n uMap: { value: THREE.Texture };\n uIsMap: { value: boolean };\n uMapIntensity: { value: number };\n uResolution: { value: THREE.Texture };\n uRadius: { value: number };\n uSmudge: { value: number };\n uDissipation: { value: number };\n uMotionBlur: { value: number };\n uMotionSample: { value: number };\n uMouse: { value: number };\n uPrevMouse: { value: number };\n uVelocity: { value: number };\n uColor: { value: THREE.Vector3 | THREE.Color };\n uIsCursor: { value: boolean };\n uPressureStart: { value: number };\n uPressureEnd: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uBuffer: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uTexture: { value: new THREE.Texture() },\n uIsTexture: { value: false },\n uMap: { value: new THREE.Texture() },\n uIsMap: { value: false },\n uMapIntensity: { value: 0.0 },\n uRadius: { value: 0.0 },\n uSmudge: { value: 0.0 },\n uDissipation: { value: 0.0 },\n uMotionBlur: { value: 0.0 },\n uMotionSample: { value: 0 },\n uMouse: { value: new THREE.Vector2(-10, -10) },\n uPrevMouse: { value: new THREE.Vector2(-10, -10) },\n uVelocity: { value: new THREE.Vector2(0, 0) },\n uColor: { value: new THREE.Vector3(1, 0, 0) },\n uIsCursor: { value: false },\n uPressureStart: { value: 1.0 },\n uPressureEnd: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as BrushMaterial;\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material;\n};\n","import * as THREE from \"three\";\nimport { useResolution } from \"./useResolution\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\nconst getCameraProps = (width: number, height: number) => {\n const frustumSize = height;\n const aspect = width / height;\n const [w, h] = [(frustumSize * aspect) / 2, frustumSize / 2];\n return { width: w, height: h, near: -1000, far: 1000 };\n};\n\nexport const useCamera = (size: Size) => {\n const resolution = useResolution(size);\n const { width, height, near, far } = getCameraProps(\n resolution.x,\n resolution.y\n );\n const camera = useMemo(\n () =>\n new THREE.OrthographicCamera(\n -width,\n width,\n height,\n -height,\n near,\n far\n ),\n [width, height, near, far]\n );\n return camera;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useRef } from \"react\";\n\nexport type PointerValues = {\n currentPointer: THREE.Vector2;\n prevPointer: THREE.Vector2;\n diffPointer: THREE.Vector2;\n velocity: THREE.Vector2;\n isVelocityUpdate: boolean;\n};\n\ntype UpdatePointer = (currentPointer: THREE.Vector2) => PointerValues;\n\n/**\n * @description When given the pointer vector2 from r3f's RootState, it generates an update function that returns {`currentPointer`, `prevPointer`, `diffPointer`, `isVelocityUpdate`, `velocity`}.\n * @description When calling custom in a `useFrame` loop, you can avoid duplication of execution by passing `pointerValues` to the update function of a Pointer-activated fxHook, such as `useBrush`.\n * @param lerp 0~1, lerp intensity (0 to less than 1) , default: 0\n */\nexport const usePointer = (lerp: number = 0): UpdatePointer => {\n const prevPointer = useRef(new THREE.Vector2(0, 0));\n const diffPointer = useRef(new THREE.Vector2(0, 0));\n const lerpPointer = useRef(new THREE.Vector2(0, 0));\n const lastUpdateTime = useRef(0);\n const velocity = useRef(new THREE.Vector2(0, 0));\n const isMoved = useRef(false);\n\n const updatePointer = useCallback(\n (currentPointer: THREE.Vector2) => {\n const now = performance.now();\n\n // lerp\n let current: THREE.Vector2;\n if (isMoved.current && lerp) {\n lerpPointer.current = lerpPointer.current.lerp(\n currentPointer,\n 1 - lerp\n );\n current = lerpPointer.current.clone();\n } else {\n current = currentPointer.clone();\n lerpPointer.current = current;\n }\n\n // first frame\n if (lastUpdateTime.current === 0) {\n lastUpdateTime.current = now;\n prevPointer.current = current;\n }\n const deltaTime = Math.max(1, now - lastUpdateTime.current);\n lastUpdateTime.current = now;\n\n // get velocity\n velocity.current\n .copy(current)\n .sub(prevPointer.current)\n .divideScalar(deltaTime);\n const isUpdate = velocity.current.length() > 0;\n\n //set prev temp pos\n const prevTemp = isMoved.current\n ? prevPointer.current.clone()\n : current;\n if (!isMoved.current && isUpdate) {\n isMoved.current = true;\n }\n prevPointer.current = current;\n\n return {\n currentPointer: current,\n prevPointer: prevTemp,\n diffPointer: diffPointer.current.subVectors(current, prevTemp),\n velocity: velocity.current,\n isVelocityUpdate: isUpdate,\n };\n },\n [lerp]\n );\n\n return updatePointer;\n};\n","import { useCallback, useRef } from \"react\";\n\ntype UseParamsReturn = [T, (params: Partial) => void];\n\n/**\n * @param params Receives an initial value object. With structuredClone, deep copy and set, but if the object contains a function, just set it.\n */\nexport const useParams = (params: T): UseParamsReturn => {\n const isContainsFunctions = (obj: object): boolean =>\n Object.values(obj).some((value) => typeof value === \"function\");\n const paramsRef = useRef(\n isContainsFunctions(params) ? params : structuredClone(params)\n );\n\n const setParams = useCallback((updateParams: Partial) => {\n for (const key in updateParams) {\n const paramKey = key as keyof T;\n if (\n paramKey in paramsRef.current &&\n updateParams[paramKey] !== undefined &&\n updateParams[paramKey] !== null\n ) {\n paramsRef.current[paramKey] = updateParams[paramKey]!;\n } else {\n console.error(\n `\"${String(\n paramKey\n )}\" does not exist in the params. or \"${String(\n paramKey\n )}\" is null | undefined`\n );\n }\n }\n }, []);\n return [paramsRef.current, setParams];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default:false */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. Default is 0. */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, Default is false. */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. Default is false. */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\n\nexport type BrushParams = {\n /** Texture applied to the brush, If texture is true, it will take precedence over color , default:false */\n texture?: THREE.Texture | false;\n /** You can attach an fx map , default:false */\n map?: THREE.Texture | false;\n /** map intensity , default:0.1 */\n mapIntensity?: number;\n /** size of the stamp, percentage of the size ,default:0.05 */\n radius?: number;\n /** Strength of smudge effect , default:0.0*/\n smudge?: number;\n /** dissipation rate. If set to 1, it will remain. ,default:1.0 */\n dissipation?: number;\n /** Strength of motion blur , default:0.0 */\n motionBlur?: number;\n /** Number of motion blur samples. Affects performance default: 5 */\n motionSample?: number;\n /** brush color , it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default:THREE.Vector3(1.0, 1.0, 1.0) */\n color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** Follows the cursor even if it loses speed , default:false */\n isCursor?: boolean;\n /** brush pressure (0 to 1) , default : 1.0 */\n pressure?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default:false */\n pointerValues?: PointerValues | false;\n};\n\nexport type BrushObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRUSH_PARAMS: BrushParams = {\n texture: false,\n map: false,\n mapIntensity: 0.1,\n radius: 0.05,\n smudge: 0.0,\n dissipation: 1.0,\n motionBlur: 0.0,\n motionSample: 5,\n color: new THREE.Vector3(1.0, 0.0, 0.0),\n isCursor: false,\n pressure: 1.0,\n pointerValues: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrush = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrushParams) => {\n const { gl, pointer } = props;\n\n updateParams && setParams(updateParams);\n\n if (params.texture!) {\n setUniform(material, \"uIsTexture\", true);\n setUniform(material, \"uTexture\", params.texture!);\n } else {\n setUniform(material, \"uIsTexture\", false);\n }\n\n if (params.map!) {\n setUniform(material, \"uIsMap\", true);\n setUniform(material, \"uMap\", params.map!);\n setUniform(material, \"uMapIntensity\", params.mapIntensity!);\n } else {\n setUniform(material, \"uIsMap\", false);\n }\n\n setUniform(material, \"uRadius\", params.radius!);\n setUniform(material, \"uSmudge\", params.smudge!);\n setUniform(material, \"uDissipation\", params.dissipation!);\n setUniform(material, \"uMotionBlur\", params.motionBlur!);\n setUniform(material, \"uMotionSample\", params.motionSample!);\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n setUniform(material, \"uMouse\", pointerValues.currentPointer);\n setUniform(material, \"uPrevMouse\", pointerValues.prevPointer);\n }\n setUniform(material, \"uVelocity\", pointerValues.velocity);\n\n const color: THREE.Vector3 | THREE.Color =\n typeof params.color === \"function\"\n ? params.color(pointerValues.velocity)\n : params.color!;\n setUniform(material, \"uColor\", color);\n\n setUniform(material, \"uIsCursor\", params.isCursor!);\n\n // pressure\n setUniform(material, \"uPressureEnd\", params.pressure!);\n if (pressureEnd.current === null) {\n pressureEnd.current = params.pressure!;\n }\n setUniform(material, \"uPressureStart\", pressureEnd.current);\n pressureEnd.current = params.pressure!;\n\n return updateRenderTarget(gl, ({ read }) => {\n setUniform(material, \"uBuffer\", read);\n });\n },\n [material, updatePointer, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","varying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform vec2 texelSize;\n\nvoid main () {\n\tvUv = uv;\n\tvL = vUv - vec2(texelSize.x, 0.0);\n\tvR = vUv + vec2(texelSize.x, 0.0);\n\tvT = vUv + vec2(0.0, texelSize.y);\n\tvB = vUv - vec2(0.0, texelSize.y);\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvoid main(){\n\tgl_FragColor = vec4(0.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/init.frag\";\n\nexport const useInitialMaterial = () => {\n const initialMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n depthTest: false,\n depthWrite: false,\n }),\n []\n );\n\n return initialMaterial as THREE.ShaderMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uVelocity;\nuniform sampler2D uSource;\nuniform vec2 texelSize;\nuniform float dt;\nuniform float dissipation;\n\nvoid main () {\n\tvec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize;\n\tgl_FragColor = dissipation * texture2D(uSource, coord);\n\tgl_FragColor.a = 1.0;\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/advection.frag\";\n\nexport class AdvectionMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uSource: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n dt: { value: number };\n dissipation: { value: number };\n };\n}\n\nexport const useAdvectionMaterial = () => {\n const advectionMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: new THREE.Texture() },\n uSource: { value: new THREE.Texture() },\n texelSize: { value: new THREE.Vector2() },\n dt: { value: 0.0 },\n dissipation: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return advectionMaterial as AdvectionMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvec2 sampleVelocity (in vec2 uv) {\n\tvec2 multiplier = vec2(1.0, 1.0);\n\tif (uv.x < 0.0) { uv.x = 0.0; multiplier.x = -1.0; }\n\tif (uv.x > 1.0) { uv.x = 1.0; multiplier.x = -1.0; }\n\tif (uv.y < 0.0) { uv.y = 0.0; multiplier.y = -1.0; }\n\tif (uv.y > 1.0) { uv.y = 1.0; multiplier.y = -1.0; }\n\treturn multiplier * texture2D(uVelocity, uv).xy;\n}\n\nvoid main () {\n\tfloat L = sampleVelocity(vL).x;\n\tfloat R = sampleVelocity(vR).x;\n\tfloat T = sampleVelocity(vT).y;\n\tfloat B = sampleVelocity(vB).y;\n\tfloat div = 0.5 * (R - L + T - B);\n\tgl_FragColor = vec4(div, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/divergence.frag\";\n\nexport class DivergenceMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useDivergenceMaterial = () => {\n const divergenceMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return divergenceMaterial as DivergenceMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uPressure;\nuniform sampler2D uDivergence;\n\nvec2 boundary (in vec2 uv) {\n\tuv = min(max(uv, 0.0), 1.0);\n\treturn uv;\n}\n\nvoid main () {\n\tfloat L = texture2D(uPressure, boundary(vL)).x;\n\tfloat R = texture2D(uPressure, boundary(vR)).x;\n\tfloat T = texture2D(uPressure, boundary(vT)).x;\n\tfloat B = texture2D(uPressure, boundary(vB)).x;\n\tfloat C = texture2D(uPressure, vUv).x;\n\tfloat divergence = texture2D(uDivergence, vUv).x;\n\tfloat pressure = (L + R + B + T - divergence) * 0.25;\n\tgl_FragColor = vec4(pressure, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/pressure.frag\";\n\nexport class PressureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uDivergence: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const usePressureMaterial = () => {\n const pressureMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: null },\n uDivergence: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return pressureMaterial as PressureMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvoid main () {\n\tfloat L = texture2D(uVelocity, vL).y;\n\tfloat R = texture2D(uVelocity, vR).y;\n\tfloat T = texture2D(uVelocity, vT).x;\n\tfloat B = texture2D(uVelocity, vB).x;\n\tfloat vorticity = R - L - T + B;\n\tgl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/curl.frag\";\n\nexport class CurlMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useCurlMaterial = () => {\n const curlMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return curlMaterial as CurlMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\nuniform sampler2D uCurl;\nuniform float curl;\nuniform float dt;\n\nvoid main () {\n\tfloat T = texture2D(uCurl, vT).x;\n\tfloat B = texture2D(uCurl, vB).x;\n\tfloat C = texture2D(uCurl, vUv).x;\n\tvec2 force = vec2(abs(T) - abs(B), 0.0);\n\tforce *= 1.0 / length(force + 0.00001) * curl * C;\n\tvec2 vel = texture2D(uVelocity, vUv).xy;\n\tgl_FragColor = vec4(vel + force * dt, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/vorticity.frag\";\n\nexport class VorticityMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uCurl: { value: THREE.Texture };\n curl: { value: number };\n dt: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useVorticityMaterial = () => {\n const vorticityMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: 0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return vorticityMaterial as VorticityMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float value;\n\nvoid main () {\n\tgl_FragColor = value * texture2D(uTexture, vUv);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/clear.frag\";\n\nexport class ClearMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n value: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useClearMaterial = () => {\n const advectionMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return advectionMaterial as ClearMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uPressure;\nuniform sampler2D uVelocity;\n\nvec2 boundary (in vec2 uv) {\n\tuv = min(max(uv, 0.0), 1.0);\n\treturn uv;\n}\n\nvoid main () {\n\tfloat L = texture2D(uPressure, boundary(vL)).x;\n\tfloat R = texture2D(uPressure, boundary(vR)).x;\n\tfloat T = texture2D(uPressure, boundary(vT)).x;\n\tfloat B = texture2D(uPressure, boundary(vB)).x;\n\tvec2 velocity = texture2D(uVelocity, vUv).xy;\n\tvelocity.xy -= vec2(R - L, T - B);\n\tgl_FragColor = vec4(velocity, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/gradientSubtract.frag\";\n\nexport class GradientSubtractMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useGradientSubtractMaterial = () => {\n const gradientSubtractMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: new THREE.Texture() },\n uVelocity: { value: new THREE.Texture() },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return gradientSubtractMaterial as GradientSubtractMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTarget;\nuniform float aspectRatio;\nuniform vec3 color;\nuniform vec2 point;\nuniform float radius;\n\nvoid main () {\n\tvec2 nPoint = (point + vec2(1.0)) * 0.5;\n\tvec2 p = vUv - nPoint.xy;\n\tp.x *= aspectRatio;\n\tvec3 splat = exp(-dot(p, p) / radius) * color;\n\tvec3 base = texture2D(uTarget, vUv).xyz;\n\tgl_FragColor = vec4(base + splat, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/splat.frag\";\n\nexport class SplatMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTarget: { value: THREE.Texture };\n aspectRatio: { value: number };\n color: { value: THREE.Vector3 | THREE.Color };\n point: { value: THREE.Vector2 };\n radius: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useSplateMaterial = () => {\n const splatMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTarget: { value: new THREE.Texture() },\n aspectRatio: { value: 0 },\n color: { value: new THREE.Vector3() },\n point: { value: new THREE.Vector2() },\n radius: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return splatMaterial as SplatMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { useInitialMaterial } from \"./materials/useInitialMaterial\";\nimport {\n AdvectionMaterial,\n useAdvectionMaterial,\n} from \"./materials/useAdvectionMaterial\";\nimport {\n DivergenceMaterial,\n useDivergenceMaterial,\n} from \"./materials/useDivergenceMaterial\";\nimport {\n PressureMaterial,\n usePressureMaterial,\n} from \"./materials/usePressureMaterial\";\nimport { CurlMaterial, useCurlMaterial } from \"./materials/useCurlMaterial\";\nimport {\n VorticityMaterial,\n useVorticityMaterial,\n} from \"./materials/useVorticityMaterial\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { ClearMaterial, useClearMaterial } from \"./materials/useClearMaterial\";\nimport {\n GradientSubtractMaterial,\n useGradientSubtractMaterial,\n} from \"./materials/useGradientSubtractMaterial\";\nimport { SplatMaterial, useSplateMaterial } from \"./materials/useSplatMaterial\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\ntype TMaterials =\n | AdvectionMaterial\n | DivergenceMaterial\n | CurlMaterial\n | PressureMaterial\n | ClearMaterial\n | GradientSubtractMaterial\n | SplatMaterial;\n\nexport type FluidMaterials = {\n vorticityMaterial: VorticityMaterial;\n curlMaterial: CurlMaterial;\n advectionMaterial: AdvectionMaterial;\n divergenceMaterial: DivergenceMaterial;\n pressureMaterial: PressureMaterial;\n clearMaterial: ClearMaterial;\n gradientSubtractMaterial: GradientSubtractMaterial;\n splatMaterial: SplatMaterial;\n};\ntype TUseMeshReturnType = [FluidMaterials, (material: TMaterials) => void];\n\n/**\n * Returns the material update function in the second argument\n */\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}): TUseMeshReturnType => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const initialMaterial = useInitialMaterial();\n const updateMaterial = initialMaterial.clone();\n const curlMaterial = useCurlMaterial();\n const vorticityMaterial = useVorticityMaterial();\n const advectionMaterial = useAdvectionMaterial();\n const divergenceMaterial = useDivergenceMaterial();\n const pressureMaterial = usePressureMaterial();\n const clearMaterial = useClearMaterial();\n const gradientSubtractMaterial = useGradientSubtractMaterial();\n const splatMaterial = useSplateMaterial();\n const materials = useMemo(\n () => ({\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n }),\n [\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n ]\n );\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(\n materials.splatMaterial,\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(\n material,\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddMesh(scene, geometry, initialMaterial);\n useEffect(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return [materials, setMeshMaterial];\n};\n","import * as THREE from \"three\";\nimport { FluidMaterials, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { UseFboProps } from \"../../../utils/useSingleFBO\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\n\nexport type FluidParams = {\n /** density disspation , default:0.98 */\n density_dissipation?: number;\n /** velocity dissipation , default:0.99 */\n velocity_dissipation?: number;\n /** velocity acceleration , default:10.0 */\n velocity_acceleration?: number;\n /** pressure dissipation , default:0.9 */\n pressure_dissipation?: number;\n /** pressure iterations. affects performance , default:20 */\n pressure_iterations?: number;\n /** curl_strength , default:35 */\n curl_strength?: number;\n /** splat radius , default:0.002 */\n splat_radius?: number;\n /** Fluid Color.THREE.Vector3 Alternatively, it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default:THREE.Vector3(1.0, 1.0, 1.0) */\n fluid_color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default:false */\n pointerValues?: PointerValues | false;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n materials: FluidMaterials;\n camera: THREE.Camera;\n renderTarget: {\n velocity: DoubleRenderTarget;\n density: DoubleRenderTarget;\n curl: THREE.WebGLRenderTarget;\n divergence: THREE.WebGLRenderTarget;\n pressure: DoubleRenderTarget;\n };\n output: THREE.Texture;\n};\n\nexport const FLUID_PARAMS: FluidParams = {\n density_dissipation: 0.98,\n velocity_dissipation: 0.99,\n velocity_acceleration: 10.0,\n pressure_dissipation: 0.9,\n pressure_iterations: 20,\n curl_strength: 35,\n splat_radius: 0.002,\n fluid_color: new THREE.Vector3(1.0, 1.0, 1.0),\n pointerValues: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const [materials, setMeshMaterial] = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n samples,\n }),\n [scene, camera, size, samples]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const lastTime = useRef(0);\n const scaledDiffVec = useRef(new THREE.Vector2(0, 0));\n const spaltVec = useRef(new THREE.Vector3(0, 0, 0));\n\n const [params, setParams] = useParams(FLUID_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FluidParams) => {\n const { gl, pointer, clock, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (lastTime.current === 0) {\n lastTime.current = clock.getElapsedTime();\n }\n const dt = Math.min(\n (clock.getElapsedTime() - lastTime.current) / 3,\n 0.02\n );\n lastTime.current = clock.getElapsedTime();\n\n // update velocity\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", read);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(materials.advectionMaterial, \"dt\", dt);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.velocity_dissipation!\n );\n });\n\n // update density\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", velocityTex);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.density_dissipation!\n );\n });\n\n // update splatting\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n setUniform(materials.splatMaterial, \"uTarget\", read);\n setUniform(\n materials.splatMaterial,\n \"point\",\n pointerValues.currentPointer\n );\n const scaledDiff = pointerValues.diffPointer.multiply(\n scaledDiffVec.current\n .set(size.width, size.height)\n .multiplyScalar(params.velocity_acceleration!)\n );\n setUniform(\n materials.splatMaterial,\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n setUniform(\n materials.splatMaterial,\n \"radius\",\n params.splat_radius!\n );\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n setUniform(materials.splatMaterial, \"uTarget\", read);\n const color: THREE.Vector3 | THREE.Color =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(pointerValues.velocity)\n : params.fluid_color!;\n setUniform(materials.splatMaterial, \"color\", color);\n });\n }\n\n // update curl\n const curlTex = updateCurlFBO(gl, () => {\n setMeshMaterial(materials.curlMaterial);\n setUniform(materials.curlMaterial, \"uVelocity\", velocityTex);\n });\n\n // update vorticity\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.vorticityMaterial);\n setUniform(materials.vorticityMaterial, \"uVelocity\", read);\n setUniform(materials.vorticityMaterial, \"uCurl\", curlTex);\n setUniform(\n materials.vorticityMaterial,\n \"curl\",\n params.curl_strength!\n );\n setUniform(materials.vorticityMaterial, \"dt\", dt);\n });\n\n // update divergence\n const divergenceTex = updateDivergenceFBO(gl, () => {\n setMeshMaterial(materials.divergenceMaterial);\n setUniform(materials.divergenceMaterial, \"uVelocity\", velocityTex);\n });\n\n // update pressure\n updatePressureFBO(gl, ({ read }) => {\n setMeshMaterial(materials.clearMaterial);\n setUniform(materials.clearMaterial, \"uTexture\", read);\n setUniform(\n materials.clearMaterial,\n \"value\",\n params.pressure_dissipation!\n );\n });\n\n // solve pressure iterative (Gauss-Seidel)\n setMeshMaterial(materials.pressureMaterial);\n setUniform(materials.pressureMaterial, \"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressure_iterations!; i++) {\n pressureTexTemp = updatePressureFBO(gl, ({ read }) => {\n setUniform(materials.pressureMaterial, \"uPressure\", read);\n });\n }\n\n // update gradienSubtract\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.gradientSubtractMaterial);\n setUniform(\n materials.gradientSubtractMaterial,\n \"uPressure\",\n pressureTexTemp\n );\n setUniform(materials.gradientSubtractMaterial, \"uVelocity\", read);\n });\n\n return densityTex;\n },\n [\n materials,\n setMeshMaterial,\n updateCurlFBO,\n updateDensityFBO,\n updateDivergenceFBO,\n updatePointer,\n updatePressureFBO,\n updateVelocityFBO,\n setParams,\n params,\n ]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n materials: materials,\n camera: camera,\n renderTarget: {\n velocity: velocityFBO,\n density: densityFBO,\n curl: curlFBO,\n divergence: divergenceFBO,\n pressure: pressureFBO,\n },\n output: densityFBO.read.texture,\n },\n ];\n};\n","import { useEffect, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\n\ntype UseMeshProps = {\n scale: number;\n max: number;\n texture?: THREE.Texture;\n scene: THREE.Scene;\n};\n\nexport const useMesh = ({ scale, max, texture, scene }: UseMeshProps) => {\n const meshArr = useRef([]);\n const geometry = useMemo(\n () => new THREE.PlaneGeometry(scale, scale),\n [scale]\n );\n const material = useMemo(\n () =>\n new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthTest: false,\n depthWrite: false,\n }),\n [texture]\n );\n\n useEffect(() => {\n for (let i = 0; i < max; i++) {\n const mesh = new THREE.Mesh(geometry.clone(), material.clone());\n mesh.rotateZ(2 * Math.PI * Math.random());\n mesh.visible = false;\n scene.add(mesh);\n meshArr.current.push(mesh);\n }\n }, [geometry, material, scene, max]);\n\n useEffect(() => {\n return () => {\n meshArr.current.forEach((mesh) => {\n mesh.geometry.dispose();\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((material) => material.dispose());\n } else {\n mesh.material.dispose();\n }\n scene.remove(mesh);\n });\n meshArr.current = [];\n };\n }, [scene]);\n\n return meshArr.current;\n};\n","import { useCallback, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { usePointer, PointerValues } from \"../../../misc/usePointer\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type RippleParams = {\n /** How often ripples appear,default:0.01 */\n frequency?: number;\n /** rotation rate,default:0.05 */\n rotation?: number;\n /** fadeout speed,default:0.9 */\n fadeout_speed?: number;\n /** scale rate,default:0.3 */\n scale?: number;\n /** alpha,default:0.6 */\n alpha?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default:false */\n pointerValues?: PointerValues | false;\n};\n\nexport type RippleObject = {\n scene: THREE.Scene;\n meshArr: THREE.Mesh[];\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const RIPPLE_PARAMS: RippleParams = {\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n pointerValues: false,\n};\n\ninterface UseRippleProps extends HooksProps {\n /** texture applied to ripple */\n texture?: THREE.Texture;\n /** ripple size, default:64 */\n scale?: number;\n /** ripple max length, default:100 */\n max?: number;\n}\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useRipple = ({\n texture = new THREE.Texture(),\n scale = 64,\n max = 100,\n size,\n dpr,\n samples = 0,\n}: UseRippleProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: RippleParams) => {\n const { gl, pointer, size } = props;\n\n updateParams && setParams(updateParams);\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (params.frequency! < pointerValues.diffPointer.length()) {\n const mesh = meshArr[currentWave.current];\n mesh.visible = true;\n mesh.position.set(\n pointerValues.currentPointer.x * (size.width / 2),\n pointerValues.currentPointer.y * (size.height / 2),\n 0\n );\n mesh.scale.x = mesh.scale.y = 0.0;\n (mesh.material as THREE.MeshBasicMaterial).opacity = params.alpha!;\n currentWave.current = (currentWave.current + 1) % max;\n }\n meshArr.forEach((mesh) => {\n if (mesh.visible) {\n const material = mesh.material as THREE.MeshBasicMaterial;\n mesh.rotation.z += params.rotation!;\n material.opacity *= params.fadeout_speed!;\n mesh.scale.x =\n params.fadeout_speed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n if (material.opacity < 0.002) mesh.visible = false;\n }\n });\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, meshArr, updatePointer, max, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n camera: camera,\n meshArr: meshArr,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform float uTime;\nuniform float timeStrength;\nuniform int noiseOctaves;\nuniform int fbmOctaves;\nuniform int warpOctaves;\nuniform vec2 warpDirection;\nuniform float warpStrength;\nuniform float scale;\n\nconst float per = 0.5;\nconst float PI = 3.14159265359;\n\nfloat rnd(vec2 n) {\n\tfloat a = 0.129898;\n\tfloat b = 0.78233;\n\tfloat c = 437.585453;\n\tfloat dt= dot(n ,vec2(a, b));\n\tfloat sn= mod(dt, PI);\n\treturn fract(sin(sn) * c);\n}\n\nfloat interpolate(float a, float b, float x){\n float f = (1.0 - cos(x * PI)) * 0.5;\n return a * (1.0 - f) + b * f;\n}\n\nfloat irnd(vec2 p){\n\tvec2 i = floor(p);\n\tvec2 f = fract(p);\n\tvec4 v = vec4(rnd(vec2(i.x,i.y)),rnd(vec2(i.x + 1.0,i.y)),rnd(vec2(i.x,i.y + 1.0)),rnd(vec2(i.x + 1.0, i.y + 1.0)));\n\treturn interpolate(interpolate(v.x, v.y, f.x), interpolate(v.z, v.w, f.x), f.y);\n}\n\n// Based on The Book of Shaders\n// https://thebookofshaders.com/13/\nfloat noise(vec2 p, float time){\n\tfloat t = 0.0;\n\tfor(int i = 0; i < noiseOctaves; i++){\n\t\tfloat freq = pow(2.0, float(i));\n\t\tfloat amp = pow(per, float(noiseOctaves - i));\n\t\tt += irnd(vec2(p.y / freq + time, p.x / freq + time)) * amp;\n\t}\n\treturn t;\n}\n\nfloat fbm(vec2 x, float time) {\n\tfloat v = 0.0;\n\tfloat a = 0.5;\n\tvec2 shift = vec2(100);\n\tmat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5));\n\tfloat sign = 1.0;\n\tfor (int i = 0; i < fbmOctaves; ++i) {\n\t\tv += a * noise(x, time * sign);\n\t\tx = rot * x * 2.0 + shift;\n\t\ta *= 0.5;\n\t\tsign *= -1.0;\n\t}\n\treturn v;\n}\n\nfloat warp(vec2 x, float g,float time){\n\tfloat val = 0.0;\n\tfor (int i = 0; i < warpOctaves; i++){\n\t\tval = fbm(x + g * vec2(cos(warpDirection.x * val), sin(warpDirection.y * val)), time);\n\t}\n\treturn val;\n}\n\nvoid main() {\n\tfloat noise = warp(gl_FragCoord.xy * scale ,warpStrength,uTime * timeStrength);\n\tgl_FragColor = vec4(vec3(noise),1.0);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class NoiseMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTime: { value: number };\n scale: { value: number };\n timeStrength: { value: number };\n noiseOctaves: { value: number };\n fbmOctaves: { value: number };\n warpOctaves: { value: number };\n warpDirection: { value: THREE.Vector2 };\n warpStrength: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: 0.0 },\n timeStrength: { value: 0.0 },\n noiseOctaves: { value: 0 },\n fbmOctaves: { value: 0 },\n warpOctaves: { value: 0 },\n warpDirection: { value: new THREE.Vector2() },\n warpStrength: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as NoiseMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\n\nexport type NoiseParams = {\n /** noise scale , default:0.004 */\n scale?: number;\n /** time factor default:0.3 */\n timeStrength?: number;\n /** noiseOctaves, affects performance default:2 */\n noiseOctaves?: number;\n /** fbmOctaves, affects performance default:2 */\n fbmOctaves?: number;\n /** domain warping octaves , affects performance default:2 */\n warpOctaves?: number;\n /** direction of domain warping , default:(2.0,2,0) */\n warpDirection?: THREE.Vector2;\n /** strength of domain warping , default:8.0 */\n warpStrength?: number;\n /** you can get into the rhythm ♪ , default:false */\n beat?: number | false;\n};\n\nexport type NoiseObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const NOISE_PARAMS: NoiseParams = {\n scale: 0.004,\n timeStrength: 0.3,\n noiseOctaves: 2,\n fbmOctaves: 2,\n warpOctaves: 2,\n warpDirection: new THREE.Vector2(2.0, 2.0),\n warpStrength: 8.0,\n beat: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n *\n * It is a basic value noise with `fbm` and `domain warping`\n */\nexport const useNoise = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: NoiseParams) => {\n const { gl, clock } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"scale\", params.scale!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n setUniform(material, \"noiseOctaves\", params.noiseOctaves!);\n setUniform(material, \"fbmOctaves\", params.fbmOctaves!);\n setUniform(material, \"warpOctaves\", params.warpOctaves!);\n setUniform(material, \"warpDirection\", params.warpDirection!);\n setUniform(material, \"warpStrength\", params.warpStrength!);\n\n setUniform(material, \"uTime\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D uTexture;\nuniform bool isTexture;\nuniform sampler2D noise;\nuniform bool isNoise;\nuniform vec2 noiseStrength;\nuniform float laminateLayer;\nuniform vec2 laminateInterval;\nuniform vec2 laminateDetail;\nuniform vec2 distortion;\nuniform vec3 colorFactor;\nuniform float uTime;\nuniform vec2 timeStrength;\nuniform float scale;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 pos = isTexture ? texture2D(uTexture, uv).rg : uv * scale;\n\tvec2 noise = isNoise ? texture2D(noise, uv).rg : vec2(0.0);\n\tfloat alpha = isTexture ? texture2D(uTexture, uv).a : 1.0;\n\t\n\t// Avoid floating point bugs caused by GPU drivers.\n\talpha = (alpha < 1e-10) ? 0.0 : alpha;\n\n\tvec3 col;\n\tfor(float j = 0.0; j < 3.0; j++){\n\t\tfor(float i = 1.0; i < laminateLayer; i++){\n\t\t\tfloat timeNoiseSin = sin(uTime / (i + j)) * timeStrength.x + noise.r * noiseStrength.x;\n\t\t\tfloat timeNoiseCos = cos(uTime / (i + j)) * timeStrength.y + noise.g * noiseStrength.y;\n\t\t\tpos.x += laminateInterval.x / (i + j) * cos(i * distortion.x * pos.y + timeNoiseSin + sin(i + j));\n\t\t\tpos.y += laminateInterval.y / (i + j) * cos(i * distortion.y * pos.x + timeNoiseCos + sin(i + j));\n\t\t}\n\t\tcol[int(j)] = sin(pow(pos.x, 2.) * pow(laminateDetail.x, 2.)) + sin(pow(pos.y, 2.) * pow(laminateDetail.y, 2.));\n\t}\n\n\tcol *= colorFactor * alpha;\n\tcol = clamp(col, 0.0, 1.0);\n\t\n\tgl_FragColor = vec4(col, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class ColorStrataMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n isTexture: { value: boolean };\n scale: { value: number };\n noise: { value: THREE.Texture };\n noiseStrength: { value: THREE.Vector2 };\n isNoise: { value: boolean };\n laminateLayer: { value: number };\n laminateInterval: { value: THREE.Vector2 };\n laminateDetail: { value: THREE.Vector2 };\n distortion: { value: THREE.Vector2 };\n colorFactor: { value: THREE.Vector3 };\n uTime: { value: number };\n timeStrength: { value: THREE.Vector2 };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n isTexture: { value: false },\n scale: { value: 1.0 },\n noise: { value: new THREE.Texture() },\n noiseStrength: { value: new THREE.Vector2(0, 0) },\n isNoise: { value: false },\n laminateLayer: { value: 1.0 },\n laminateInterval: { value: new THREE.Vector2(0.1, 0.1) },\n laminateDetail: { value: new THREE.Vector2(1, 1) },\n distortion: { value: new THREE.Vector2(0, 0) },\n colorFactor: { value: new THREE.Vector3(1, 1, 1) },\n uTime: { value: 0 },\n timeStrength: { value: new THREE.Vector2(0, 0) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as ColorStrataMaterial;\n\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type ColorStrataParams = {\n /** default: null */\n texture?: THREE.Texture | false;\n /** Valid when texture is false. default : 1 */\n scale?: number;\n /** default: 1.0 */\n laminateLayer?: number;\n /** default: (0.1, 0.1) */\n laminateInterval?: THREE.Vector2;\n /** default: (1.0, 1.0) */\n laminateDetail?: THREE.Vector2;\n /** default: (0.0, 0.0) */\n distortion?: THREE.Vector2;\n /** default: (1.0, 1.0,1.0) */\n colorFactor?: THREE.Vector3;\n /** default: (0.0, 0.0) */\n timeStrength?: THREE.Vector2;\n /** default:false */\n noise?: THREE.Texture | false;\n /** default : (0.0,0.0) */\n noiseStrength?: THREE.Vector2;\n /** you can get into the rhythm ♪ , default:false */\n beat?: number | false;\n};\n\nexport type ColorStrataObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COLORSTRATA_PARAMS: ColorStrataParams = {\n texture: false,\n scale: 1.0,\n laminateLayer: 1.0,\n laminateInterval: new THREE.Vector2(0.1, 0.1),\n laminateDetail: new THREE.Vector2(1, 1),\n distortion: new THREE.Vector2(0, 0),\n colorFactor: new THREE.Vector3(1, 1, 1),\n timeStrength: new THREE.Vector2(0, 0),\n noise: false,\n noiseStrength: new THREE.Vector2(0, 0),\n beat: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useColorStrata = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ColorStrataParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n if (params.texture) {\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"isTexture\", true);\n } else {\n setUniform(material, \"isTexture\", false);\n setUniform(material, \"scale\", params.scale!);\n }\n\n if (params.noise) {\n setUniform(material, \"noise\", params.noise);\n setUniform(material, \"isNoise\", true);\n setUniform(material, \"noiseStrength\", params.noiseStrength!);\n } else {\n setUniform(material, \"isNoise\", false);\n }\n\n setUniform(material, \"uTime\", params.beat || clock.getElapsedTime());\n\n setUniform(material, \"laminateLayer\", params.laminateLayer!);\n setUniform(material, \"laminateInterval\", params.laminateInterval!);\n setUniform(material, \"laminateDetail\", params.laminateDetail!);\n setUniform(material, \"distortion\", params.distortion!);\n setUniform(material, \"colorFactor\", params.colorFactor!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform float u_time;\nuniform float u_pattern;\nuniform float u_complexity;\nuniform float u_complexityAttenuation;\nuniform float u_iterations;\nuniform float u_timeStrength;\nuniform float u_scale;\n\nvec3 marble(vec3 p){\n\tvec4 n;\n\tfor(float i;i {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_time: { value: 0 },\n u_pattern: { value: 0 },\n u_complexity: { value: 0 },\n u_complexityAttenuation: { value: 0 },\n u_iterations: { value: 0 },\n u_timeStrength: { value: 0 },\n u_scale: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as MarbleMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type MarbleParams = {\n /** You can add random patterns to noise by passing random numbers ,default:0 */\n pattern?: number;\n /** default:2 */\n complexity?: number;\n /** default:0.2 */\n complexityAttenuation?: number;\n /** default:8 */\n iterations?: number;\n /** default:0.2 */\n timeStrength?: number;\n /** default:0.002 */\n scale?: number;\n /** you can get into the rhythm ♪ , default:false */\n beat?: number | false;\n};\n\nexport type MarbleObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MARBLE_PARAMS: MarbleParams = {\n pattern: 0,\n complexity: 2,\n complexityAttenuation: 0.2,\n iterations: 8,\n timeStrength: 0.2,\n scale: 0.002,\n beat: false,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMarble = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: MarbleParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n setUniform(material, \"u_pattern\", params.pattern!);\n setUniform(material, \"u_complexity\", params.complexity!);\n setUniform(\n material,\n \"u_complexityAttenuation\",\n params.complexityAttenuation!\n );\n setUniform(material, \"u_iterations\", params.iterations!);\n setUniform(material, \"u_timeStrength\", params.timeStrength!);\n setUniform(material, \"u_scale\", params.scale!);\n\n setUniform(material, \"u_time\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\nuniform vec3 uColor4;\nuniform vec3 uRgbWeight;\n\n\n// Based on glsl-cos-palette by Erkaman\n// https://github.com/Erkaman/glsl-cos-palette\nvec3 cosPalette( float t, vec3 color1, vec3 color2, vec3 color3, vec3 color4 ){\n return color1 + color2 * cos( 6.28318 * ( color3 * t + color4) );\n}\n\nvoid main() {\n\n\tvec4 tex = texture2D(uTexture, vUv);\n\tfloat gray = dot(tex.rgb, uRgbWeight);\t\t\n\n\tvec3 outColor = cosPalette(\n\t\tgray,\n\t\tuColor1,\n\t\tuColor2,\n\t\tuColor3,\n\t\tuColor4\n\t);\n\n\tgl_FragColor = vec4(outColor, tex.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class CosPaletteMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uRgbWeight: { value: THREE.Vector3 };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColor4: { value: THREE.Color };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uRgbWeight: { value: new THREE.Vector3(0.299, 0.587, 0.114) },\n uColor1: { value: new THREE.Color().set(0.5, 0.5, 0.5) },\n uColor2: { value: new THREE.Color().set(0.5, 0.5, 0.5) },\n uColor3: { value: new THREE.Color().set(1, 1, 1) },\n uColor4: { value: new THREE.Color().set(0, 0.1, 0.2) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as CosPaletteMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\n\nexport type CosPaletteParams = {\n /** color1, default:rgb(50%, 50%, 50%) */\n color1?: THREE.Color;\n /** color2, default:rgb(50%, 50%, 50%) */\n color2?: THREE.Color;\n /** color3, default:rgb(100%, 100%, 100%) */\n color3?: THREE.Color;\n /** color4, default:rgb(0%, 10%, 20%) */\n color4?: THREE.Color;\n /** texture to be used as a palette */\n texture?: THREE.Texture;\n /** weight of the rgb, default:THREE.Vector3(1.0,0.0,0.0) */\n rgbWeight?: THREE.Vector3;\n};\n\nexport type ColorPaletteObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COSPALETTE_PARAMS: CosPaletteParams = {\n texture: new THREE.Texture(),\n color1: new THREE.Color().set(0.5, 0.5, 0.5),\n color2: new THREE.Color().set(0.5, 0.5, 0.5),\n color3: new THREE.Color().set(1, 1, 1),\n color4: new THREE.Color().set(0, 0.1, 0.2),\n rgbWeight: new THREE.Vector3(0.299, 0.587, 0.114),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCosPalette = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: CosPaletteParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor1\", params.color1!);\n setUniform(material, \"uColor2\", params.color2!);\n setUniform(material, \"uColor3\", params.color3!);\n setUniform(material, \"uColor4\", params.color4!);\n setUniform(material, \"uRgbWeight\", params.rgbWeight!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 texColor = texture2D(uTexture, uv);\n\tfloat grayscale = dot(texColor.rgb, vec3(0.299, 0.587, 0.114));\n\tvec3 duotone = mix(uColor0, uColor1, grayscale);\n\tgl_FragColor = vec4(duotone, texColor.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class DuoToneMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uColor0: { value: new THREE.Color(0xffffff) },\n uColor1: { value: new THREE.Color(0x000000) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as DuoToneMaterial;\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { DuoToneMaterial, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** 1st color , Default:new THREE.Color(0xffffff) */\n color0?: THREE.Color;\n /** 2nd color , Default: new THREE.Color(0x000000) */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n material: DuoToneMaterial;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const DUOTONE_PARAMS: DuoToneParams = {\n texture: new THREE.Texture(),\n color0: new THREE.Color(0xffffff),\n color1: new THREE.Color(0x000000),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useDuoTone = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DuoToneParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor0\", params.color0!);\n setUniform(material, \"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D u_map;\nuniform bool u_isAlphaMap;\nuniform sampler2D u_alphaMap;\nuniform float u_mapIntensity;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\nuniform vec3 u_dodgeColor;\nuniform bool u_isDodgeColor;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\t// fx blending\n\tvec3 mapColor = texture2D(u_map, uv).rgb;\n\tvec3 normalizedMap = mapColor * 2.0 - 1.0;\n\n\tuv = uv * 2.0 - 1.0;\n\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), u_mapIntensity);\n\tuv = (uv + 1.0) / 2.0;\n\n\t// colro blending\n\tfloat brightness = dot(mapColor,u_brightness);\n\tvec4 textureMap = texture2D(u_texture, uv);\n\tfloat blendValue = smoothstep(u_min, u_max, brightness);\n\n\t// set dodge color\n\tvec3 dodgeColor = u_isDodgeColor ? u_dodgeColor : mapColor;\n\tvec3 outputColor = blendValue * dodgeColor + (1.0 - blendValue) * textureMap.rgb;\n\t\n\t// alpha blending\n\tfloat alpha = u_isAlphaMap ? texture2D(u_alphaMap, uv).a : textureMap.a;\n\tfloat mixValue = u_isAlphaMap ? alpha : 0.0;\n\tvec3 alphColor = mix(outputColor,mapColor,mixValue);\n\n\tgl_FragColor = vec4(alphColor, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class BlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_map: { value: THREE.Texture };\n u_alphaMap: { value: THREE.Texture };\n u_isAlphaMap: { value: boolean };\n u_mapIntensity: { value: number };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n u_dodgeColor: { value: THREE.Color };\n u_isDodgeColor: { value: boolean };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_map: { value: new THREE.Texture() },\n u_alphaMap: { value: new THREE.Texture() },\n u_isAlphaMap: { value: false },\n u_mapIntensity: { value: 0.0 },\n u_brightness: { value: new THREE.Vector3() },\n u_min: { value: 0.0 },\n u_max: { value: 0.9 },\n u_dodgeColor: { value: new THREE.Color(0xffffff) },\n u_isDodgeColor: { value: false },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as BlendingMaterial;\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type BlendingParams = {\n /** Make this texture Blending , default:THREE.Texture */\n texture?: THREE.Texture;\n /** map texture, default:THREE.Texture */\n map?: THREE.Texture;\n /** map strength , r,g value are affecting , default:0.3 */\n mapIntensity?: number;\n /** Alpha blending is performed using the alpha of the set texture. , default:false */\n alphaMap?: THREE.Texture | false;\n /** default:(0.5,0.5,0.5) */\n brightness?: THREE.Vector3;\n /** default:0.0 */\n min?: number;\n /** default:1.0 */\n max?: number;\n /** If set, this value will apply color dodge , default: false */\n dodgeColor?: THREE.Color | false;\n};\n\nexport type BlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BLENDING_PARAMS: BlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n alphaMap: false,\n mapIntensity: 0.3,\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n dodgeColor: false,\n};\n\n/**\n * Blend map to texture. You can set the threshold for blending with brightness. You can set the dodge color by setting color. \nIf you don't want to reflect the map's color, you can use useFxBlending instead.\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n\n if (params.alphaMap) {\n setUniform(material, \"u_alphaMap\", params.alphaMap!);\n setUniform(material, \"u_isAlphaMap\", true);\n } else {\n setUniform(material, \"u_isAlphaMap\", false);\n }\n\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n if (params.dodgeColor) {\n setUniform(material, \"u_dodgeColor\", params.dodgeColor);\n setUniform(material, \"u_isDodgeColor\", true);\n } else {\n setUniform(material, \"u_isDodgeColor\", false);\n }\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture0;\nuniform sampler2D uTexture1;\nuniform sampler2D uMap;\nuniform float mapIntensity;\nuniform float edgeIntensity;\nuniform float progress;\nuniform float dirX;\nuniform float dirY;\nuniform vec2 epicenter;\nuniform float padding;\n\nbool isInPaddingArea(vec2 uv) {\n return uv.x < padding || uv.x > 1.0 - padding || uv.y < padding || uv.y > 1.0 - padding;\n}\n\nvoid main() {\n\tfloat screenAspect = uResolution.x / uResolution.y;\n\tfloat textureAspect = uTextureResolution.x / uTextureResolution.y;\n\tvec2 aspectRatio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\tvec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;\n\n\t// fx map\n\tvec2 map = texture2D(uMap, uv).rg;\n\tvec2 normalizedMap = map * 2.0 - 1.0;\n\n\t// multiply edge fx\n\tuv = uv * 2.0 - 1.0;\n\tuv *= map * distance(epicenter, uv) * edgeIntensity + 1.0;\n\tuv = (uv + 1.0) / 2.0;\n\n\t// padding\n\tif (isInPaddingArea(uv)) {\n\t\tgl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n\t\treturn;\n\t}\n\tvec2 paddedUV = uv * (1.0 - 2.0 * padding * -1.) + padding * -1.;\n\n\t// centered uv\n\tvec2 centeredUV = paddedUV - vec2(0.5);\n\n\t// multiply map fx\n\tcenteredUV *= normalizedMap * map * mapIntensity + 1.0;\n\n\t// texture 0\n\tfloat xOffsetTexture0 = 0.5 - dirX * progress;\n\tfloat yOffsetTexture0 = 0.5 - dirY * progress;\n\tvec2 samplePosTexture0 = vec2(xOffsetTexture0, yOffsetTexture0) + centeredUV;\n\n\t//texture 1\n\tfloat xOffsetTexture1 = 0.5 + dirX * (1.0 - progress);\n\tfloat yOffsetTexture1 = 0.5 + dirY * (1.0 - progress);\n\tvec2 samplePosTexture1 = vec2(xOffsetTexture1, yOffsetTexture1) + centeredUV;\n\n\tvec4 color0 = texture2D(uTexture0, samplePosTexture0);\n\tvec4 color1 = texture2D(uTexture1, samplePosTexture1);\n\n\tgl_FragColor = mix(color0, color1, progress);\n\n}","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class FxTextureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uTextureResolution: { value: THREE.Vector2 };\n uTexture0: { value: THREE.Texture };\n uTexture1: { value: THREE.Texture };\n padding: { value: number };\n uMap: { value: THREE.Texture };\n edgeIntensity: { value: number };\n mapIntensity: { value: number };\n epicenter: { value: THREE.Vector2 };\n progress: { value: number };\n dirX: { value: number };\n dirY: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: new THREE.Texture() },\n uTexture1: { value: new THREE.Texture() },\n padding: { value: 0.0 },\n uMap: { value: new THREE.Texture() },\n edgeIntensity: { value: 0.0 },\n mapIntensity: { value: 0.0 },\n epicenter: { value: new THREE.Vector2(0.0, 0.0) },\n progress: { value: 0.0 },\n dirX: { value: 0.0 },\n dirY: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type FxTextureParams = {\n /** 1st texture , default:THREE.Texture() */\n texture0?: THREE.Texture;\n /** 2nd texture , default:THREE.Texture() */\n texture1?: THREE.Texture;\n /** add transparent padding, 0.0 ~ 1.0 , default:0.0 */\n padding?: number;\n /** The color map. The uv value is affected according to this rbg , default:THREE.Texture() */\n map?: THREE.Texture;\n /** intensity of map , r,g value are affecting , default:0.0 */\n mapIntensity?: number;\n /** Intensity of effect on edges , default:0.0 */\n edgeIntensity?: number;\n /** epicenter of fx, -1 ~ 1 , default:vec2(0.0,0.0)*/\n epicenter?: THREE.Vector2;\n /** Switch value to switch between texture0 and texture1 , 0 ~ 1 , default : 0 */\n progress?: number;\n /** direction of transition , default: THREE.Vector2(0, 0) */\n dir?: THREE.Vector2;\n};\n\nexport type FxTextureObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const FXTEXTURE_PARAMS: FxTextureParams = {\n texture0: new THREE.Texture(),\n texture1: new THREE.Texture(),\n padding: 0.0,\n map: new THREE.Texture(),\n mapIntensity: 0.0,\n edgeIntensity: 0.0,\n epicenter: new THREE.Vector2(0, 0),\n progress: 0.0,\n dir: new THREE.Vector2(0, 0),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxTexture = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture0\", params.texture0!);\n setUniform(material, \"uTexture1\", params.texture1!);\n\n setUniform(material, \"progress\", params.progress!);\n\n // calculate resolution by linear interpolation.\n const tex0Res = [\n params.texture0!?.image?.width || 0,\n params.texture0!?.image?.height || 0,\n ];\n const tex1Res = [\n params.texture1!?.image?.width || 0,\n params.texture1!?.image?.height || 0,\n ];\n const interpolatedResolution = tex0Res.map((value, index) => {\n return value + (tex1Res[index] - value) * params.progress!;\n });\n setUniform(material, \"uTextureResolution\", interpolatedResolution);\n\n setUniform(material, \"padding\", params.padding!);\n setUniform(material, \"uMap\", params.map!);\n setUniform(material, \"mapIntensity\", params.mapIntensity!);\n setUniform(material, \"edgeIntensity\", params.edgeIntensity!);\n setUniform(material, \"epicenter\", params.epicenter!);\n setUniform(material, \"dirX\", params.dir!.x);\n setUniform(material, \"dirY\", params.dir!.y);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec3 color = texture2D(u_texture, uv).rgb;\n\tfloat brightness = dot(color,u_brightness);\n\tfloat alpha = clamp(smoothstep(u_min, u_max, brightness),0.0,1.0);\n\tgl_FragColor = vec4(color, alpha);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class BrightnessPickerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_brightness: { value: new THREE.Vector3() },\n u_min: { value: 0.0 },\n u_max: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as BrightnessPickerMaterial;\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type BrightnessPickerParams = {\n /** pick brightness from this texture , default:THREE.Texture */\n texture?: THREE.Texture;\n /** default:(0.5,0.5,0.5) */\n brightness?: THREE.Vector3;\n /** default:0.0 */\n min?: number;\n /** default:1.0 */\n max?: number;\n};\n\nexport type BrightnessPickerObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRIGHTNESSPICKER_PARAMS: BrightnessPickerParams = {\n texture: new THREE.Texture(),\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrightnessPicker = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrightnessPickerParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D u_map;\nuniform float u_mapIntensity;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 mapColor = texture2D(u_map, uv).rg;\n\tvec2 normalizedMap = mapColor * 2.0 - 1.0;\n\t\n\tuv = uv * 2.0 - 1.0;\n\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), u_mapIntensity);\n\tuv = (uv + 1.0) / 2.0;\n\n\tgl_FragColor = texture2D(u_texture, uv);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class FxBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_map: { value: THREE.Texture };\n u_mapIntensity: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_map: { value: new THREE.Texture() },\n u_mapIntensity: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as FxBlendingMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type FxBlendingParams = {\n /** Make this texture Blending , default:THREE.Texture */\n texture?: THREE.Texture;\n /** map texture, default:THREE.Texture */\n map?: THREE.Texture;\n /** map strength , r,g value are affecting , default:0.3 */\n mapIntensity?: number;\n};\n\nexport type FxBlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const FXBLENDING_PARAMS: FxBlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n mapIntensity: 0.3,\n};\n\n/**\n * Blend map to texture. You can change the intensity of fx applied by the rg value of map. Unlike \"useBlending\", the map color is not reflected.\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxBlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n const bufferTexture = updateRenderTarget(gl);\n return bufferTexture;\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nuniform sampler2D uTexture;\nuniform sampler2D uMap;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 tex = texture2D(uTexture, uv);\n\tvec4 map = texture2D(uMap, uv);\n\tgl_FragColor = mix(tex,map,map.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class AlphaBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uMap: { value: THREE.Texture };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uMap: { value: new THREE.Texture() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as AlphaBlendingMaterial;\n\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\n\nexport type AlphaBlendingParams = {\n /** default:THREE.Texture()*/\n texture?: THREE.Texture;\n /** alpha map , default:THREE.Texture() */\n map?: THREE.Texture;\n};\n\nexport type AlphaBlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const ALPHABLENDING_PARAMS: AlphaBlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useAlphaBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] =\n useParams(ALPHABLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: AlphaBlendingParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uMap\", params.map!);\n\n return updateRenderTarget(gl);\n },\n [material, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform float u_brightness;\nuniform float u_saturation;\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class HSVMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: number };\n u_saturation: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_brightness: { value: 1 },\n u_saturation: { value: 1 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as HSVMaterial;\n\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\n\nexport type HSVParams = {\n /** default:THREE.Texture() */\n texture?: THREE.Texture;\n /** default:1 */\n brightness?: number;\n /** default:1 */\n saturation?: number;\n};\n\nexport type HSVObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const HSV_PARAMS: HSVParams = {\n texture: new THREE.Texture(),\n brightness: 1,\n saturation: 1,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useHSV = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(HSV_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: HSVParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_saturation\", params.saturation!);\n\n return updateRenderTarget(gl);\n },\n [material, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture;\n\nvoid main() {\n\tfloat screenAspect = uResolution.x / uResolution.y;\n\tfloat textureAspect = uTextureResolution.x / uTextureResolution.y;\n\tvec2 aspectRatio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\tvec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;\n\t\n\tgl_FragColor = texture2D(uTexture, uv);\n\n}","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class FxTextureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uTextureResolution: { value: THREE.Vector2 };\n uTexture: { value: THREE.Texture };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture: { value: new THREE.Texture() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type CoverTextureParams = {\n /** Textures that you want to display exactly on the screen , default:THREE.Texture() */\n texture?: THREE.Texture;\n};\n\nexport type CoverTextureObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COVERTEXTURE_PARAMS: CoverTextureParams = {\n texture: new THREE.Texture(),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCoverTexture = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: CoverTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uTextureResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","precision mediump float;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision mediump float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec2 uResolution;\nuniform float uBlurSize;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec2 perDivSize = uBlurSize / uResolution;\n\n\t// calc average color value from adjacent point\n\tvec4 outColor = vec4(\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, -1.0)) +\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 1.0))\n\t\t) / 9.0;\n\t\n\tgl_FragColor = outColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\n\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class SampleMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uResolution: { value: THREE.Vector2 };\n uBlurSize: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uBlurSize: { value: 1 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as SampleMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../../types\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** blurSize, default:3 */\n blurSize?: number;\n /** blurPower, affects performance default:5 */\n blurPower?: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const SIMPLEBLUR_PARAMS: SimpleBlurParams = {\n texture: new THREE.Texture(),\n blurSize: 3,\n blurPower: 5,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useSimpleBlur = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr,\n samples,\n }),\n [scene, camera, size, dpr, samples]\n );\n const [renderTarget, updateRenderTarget] = useSingleFBO(fboProps);\n const [_, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: SimpleBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n setUniform(material, \"uBlurSize\", params.blurSize!);\n\n let _tempTexture: THREE.Texture = updateTempTexture(gl);\n\n const iterations = params.blurPower!;\n for (let i = 0; i < iterations; i++) {\n setUniform(material, \"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateTempTexture, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform float uProgress;\nuniform float uStrength;\nuniform float uWidth;\nuniform vec2 uEpicenter;\nuniform int uMode;\n\nfloat PI = 3.141592653589;\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tfloat progress = min(uProgress, 1.0);\n\tfloat progressFactor = sin(progress * PI);\n\n\tfloat border = progress - progress * progressFactor * uWidth;\n\tfloat blur = uStrength * progressFactor;\n\t\n\t// 0 ~ 1\n\tvec2 normalizeCenter = (uEpicenter + 1.0) / 2.0;\n\n\t// 0:center 1:horizontal 2:vertical\n\tfloat dist = uMode == 0 ? length(uv - normalizeCenter) : uMode == 1 ? length(uv.x - normalizeCenter.x) : length(uv.y - normalizeCenter.y);\n\n\t// Calculate the maximum distance to the four corners of the screen\n\tfloat maxDistance = max(\n\t\tlength(vec2(0.0, 0.0) - normalizeCenter),\n\t\tmax(\n\t\t\t\tlength(vec2(1.0, 0.0) - normalizeCenter),\n\t\t\t\tmax(\n\t\t\t\t\tlength(vec2(0.0, 1.0) - normalizeCenter),\n\t\t\t\t\tlength(vec2(1.0, 1.0) - normalizeCenter)\n\t\t\t\t)\n\t\t)\n\t);\n\n\t// Scale distance so that waves extend to the edge of the screen\n\tdist = maxDistance > 0.0 ? dist / maxDistance : dist;\n\n\tvec3 color = vec3(smoothstep(border - blur, border, dist) -\n smoothstep(progress, progress + blur, dist));\n\t\n\t// Ensure color is 0 when progress is 0,1\n\tcolor *= progressFactor;\n\n\tgl_FragColor = vec4(color, 1.0);\n}\n\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\n\nexport class WaveMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uEpicenter: { value: THREE.Vector2 };\n uProgress: { value: number };\n uStrength: { value: number };\n uWidth: { value: number };\n uMode: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uEpicenter: { value: new THREE.Vector2(0.0, 0.0) },\n uProgress: { value: 0.0 },\n uStrength: { value: 0.0 },\n uWidth: { value: 0.0 },\n uMode: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n useAddMesh(scene, geometry, material);\n\n return material as WaveMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\n\nexport type WaveParams = {\n /** -1.0 ~ 1.0 , default:vec2(0.0,0.0) */\n epicenter?: THREE.Vector2;\n /** 0.0 ~ 1.0 , default:0.0 */\n progress?: number;\n /** default:0.0 */\n width?: number;\n /** default:0.0 */\n strength?: number;\n /** default:center */\n mode?: \"center\" | \"horizontal\" | \"vertical\";\n};\n\nexport type WaveObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WAVE_PARAMS: WaveParams = {\n epicenter: new THREE.Vector2(0.0, 0.0),\n progress: 0.0,\n width: 0.0,\n strength: 0.0,\n mode: \"center\",\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useWave = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: WaveParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uEpicenter\", params.epicenter!);\n setUniform(material, \"uProgress\", params.progress!);\n setUniform(material, \"uWidth\", params.width!);\n setUniform(material, \"uStrength\", params.strength!);\n setUniform(\n material,\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D u_texture;\nuniform vec2 u_resolution;\nuniform vec3 u_keyColor;\nuniform float u_similarity;\nuniform float u_smoothness;\nuniform float u_spill;\n\nuniform vec4 u_color;\nuniform float u_contrast;\nuniform float u_brightness;\nuniform float u_gamma;\n\n// From https://github.com/libretro/glsl-shaders/blob/master/nnedi3/shaders/rgb-to-yuv.glsl\nvec2 RGBtoUV(vec3 rgb) {\n return vec2(\n rgb.r * -0.169 + rgb.g * -0.331 + rgb.b * 0.5 + 0.5,\n rgb.r * 0.5 + rgb.g * -0.419 + rgb.b * -0.081 + 0.5\n );\n}\nfloat getChromeDist(vec3 texColor){\n\tfloat chromaDist = distance(RGBtoUV(texColor), RGBtoUV(u_keyColor));\n\treturn chromaDist;\n}\n\nfloat getBoxFilteredChromaDist(vec3 rgb, vec2 uv)\n{\n\tvec2 pixel_size = vec2(1.) / u_resolution;\n\tvec2 h_pixel_size = pixel_size / 2.0;\n\tvec2 point_0 = vec2(pixel_size.x, h_pixel_size.y);\n\tvec2 point_1 = vec2(h_pixel_size.x, -pixel_size.y);\n\tfloat distVal = getChromeDist(texture2D(u_texture,uv-point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv-point_1).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_1).rgb);\n\tdistVal *= 2.0;\n\tdistVal += getChromeDist(rgb);\n\treturn distVal / 9.0;\n}\n\nvec4 CalcColor(vec4 rgba)\n{\n\treturn vec4(pow(rgba.rgb, vec3(u_gamma, u_gamma, u_gamma)) * u_contrast + u_brightness, rgba.a);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tvec4 texColor = texture2D(u_texture, uv);\n\ttexColor.rgb *= (texColor.a > 0.) ? (1. / texColor.a) : 0.;\n\n\tfloat chromaDist = getBoxFilteredChromaDist(texColor.rgb,uv);\n\t\n\tfloat baseMask = chromaDist - u_similarity;\n\tfloat fullMask = pow(clamp(baseMask / u_smoothness, 0., 1.), 1.5);\n\t\n\ttexColor.rgba *= u_color;\n\ttexColor.a = fullMask;\n\n\tfloat spillVal = pow(clamp(baseMask / u_spill, 0., 1.), 1.5);\n\tfloat desat = clamp(texColor.r * 0.2126 + texColor.g * 0.7152 + texColor.b * 0.0722, 0., 1.);\n\ttexColor.rgb = mix(vec3(desat, desat, desat), texColor.rgb, spillVal);\n\n\tvec4 finColor = CalcColor(texColor);\n\n\tgl_FragColor = finColor;\n}","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../../utils/useAddMesh\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useResolution } from \"../../../utils/useResolution\";\n\nexport class ChromaKeyMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_resolution: { value: THREE.Vector2 };\n u_keyColor: { value: THREE.Color };\n u_similarity: { value: number };\n u_smoothness: { value: number };\n u_spill: { value: number };\n u_color: { value: THREE.Vector4 };\n u_contrast: { value: number };\n u_brightness: { value: number };\n u_gamma: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_resolution: { value: new THREE.Vector2() },\n u_keyColor: { value: new THREE.Color() },\n u_similarity: { value: 0 },\n u_smoothness: { value: 0 },\n u_spill: { value: 0 },\n u_color: { value: new THREE.Vector4() },\n u_contrast: { value: 0 },\n u_brightness: { value: 0 },\n u_gamma: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as ChromaKeyMaterial;\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"u_resolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n return material;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\n\nexport type ChromaKeyParams = {\n /** Process this texture with chroma key , default:THREE.Texture */\n texture?: THREE.Texture;\n /** key color for chromakey processing , default: THREE.Color(0x00ff00) */\n keyColor?: THREE.Color;\n /** If the similarity with the key color exceeds this value, it becomes transparent. , default: 0.2 */\n similarity?: number;\n /** smoothness , default : 0.1 */\n smoothness?: number;\n /** spill , default : 0.2 */\n spill?: number;\n /** tone correction , default : THREE.Vector4(1.0, 1.0, 1.0, 1.0) */\n color?: THREE.Vector4;\n /** contrast , default : 1.0 */\n contrast?: number;\n /** brightness , default : 0.0 */\n brightness?: number;\n /** gamma correction , default : 1.0 */\n gamma?: number;\n};\n\nexport type ChromaKeyObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const CHROMAKEY_PARAMS: ChromaKeyParams = {\n texture: new THREE.Texture(),\n keyColor: new THREE.Color(0x00ff00),\n similarity: 0.2,\n smoothness: 0.1,\n spill: 0.2,\n color: new THREE.Vector4(1.0, 1.0, 1.0, 1.0),\n contrast: 1.0,\n brightness: 0.0,\n gamma: 1.0,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useChromaKey = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ChromaKeyParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_keyColor\", params.keyColor!);\n setUniform(material, \"u_similarity\", params.similarity!);\n setUniform(material, \"u_smoothness\", params.smoothness!);\n setUniform(material, \"u_spill\", params.spill!);\n setUniform(material, \"u_color\", params.color!);\n setUniform(material, \"u_contrast\", params.contrast!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_gamma\", params.gamma!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { UseFboProps, renderFBO, FBO_OPTION } from \"./useSingleFBO\";\n\ntype UpdateCopyFunction = (\n gl: THREE.WebGLRenderer,\n index: number,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseCopyTextureReturn = [THREE.WebGLRenderTarget[], UpdateCopyFunction];\n\n/**\n * Generate an FBO array to copy the texture.\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @param length The number of FBOs to create\n * @returns [THREE.WebGLRenderTarget[] , updateCopyTexture] -Receives the RenderTarget array as the first argument and the update function as the second argument. updateCopyTexture() receives gl as the first argument and the index of the texture you want to copy as the second argument.\n */\nexport const useCopyTexture = (\n {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n }: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const renderTargetArr = useRef([]);\n const resolution = useResolution(size, dpr);\n\n renderTargetArr.current = useMemo(() => {\n return Array.from({ length }, () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n","export type EasingTypes =\n | \"easeInSine\"\n | \"easeOutSine\"\n | \"easeInOutSine\"\n | \"easeInQuad\"\n | \"easeOutQuad\"\n | \"easeInOutQuad\"\n | \"easeInCubic\"\n | \"easeOutCubic\"\n | \"easeInOutCubic\"\n | \"easeInQuart\"\n | \"easeOutQuart\"\n | \"easeInOutQuart\"\n | \"easeInQuint\"\n | \"easeOutQuint\"\n | \"easeInOutQuint\"\n | \"easeInExpo\"\n | \"easeOutExpo\"\n | \"easeInOutExpo\"\n | \"easeInCirc\"\n | \"easeOutCirc\"\n | \"easeInOutCirc\"\n | \"easeInBack\"\n | \"easeOutBack\"\n | \"easeInOutBack\"\n | \"easeInElastic\"\n | \"easeOutElastic\"\n | \"easeInOutElastic\"\n | \"easeInBounce\"\n | \"easeOutBounce\"\n | \"easeInOutBounce\";\n\ntype EasingFunctions = {\n [K in EasingTypes]: (x: number) => number;\n};\n\n/**\n * from https://github.com/ai/easings.net\n */\nexport const Easing: EasingFunctions = Object.freeze({\n easeInSine(x: number): number {\n return 1 - Math.cos((x * Math.PI) / 2);\n },\n easeOutSine(x: number): number {\n return Math.sin((x * Math.PI) / 2);\n },\n easeInOutSine(x: number): number {\n return -(Math.cos(Math.PI * x) - 1) / 2;\n },\n easeInQuad(x: number): number {\n return x * x;\n },\n easeOutQuad(x: number): number {\n return 1 - (1 - x) * (1 - x);\n },\n easeInOutQuad(x: number): number {\n return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2;\n },\n easeInCubic(x: number): number {\n return x * x * x;\n },\n easeOutCubic(x: number): number {\n return 1 - Math.pow(1 - x, 3);\n },\n easeInOutCubic(x: number): number {\n return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2;\n },\n easeInQuart(x: number): number {\n return x * x * x * x;\n },\n easeOutQuart(x: number): number {\n return 1 - Math.pow(1 - x, 4);\n },\n easeInOutQuart(x: number): number {\n return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2;\n },\n easeInQuint(x: number): number {\n return x * x * x * x * x;\n },\n easeOutQuint(x: number): number {\n return 1 - Math.pow(1 - x, 5);\n },\n easeInOutQuint(x: number): number {\n return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2;\n },\n easeInExpo(x: number): number {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n },\n easeOutExpo(x: number): number {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n },\n easeInOutExpo(x: number): number {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n },\n easeInCirc(x: number): number {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n },\n easeOutCirc(x: number): number {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n },\n easeInOutCirc(x: number): number {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n },\n easeInBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return c3 * x * x * x - c1 * x * x;\n },\n easeOutBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2);\n },\n easeInOutBack(x: number): number {\n const c1 = 1.70158;\n const c2 = c1 * 1.525;\n\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n },\n easeInElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n },\n easeOutElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;\n },\n easeInOutElastic(x: number): number {\n const c5 = (2 * Math.PI) / 4.5;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2\n : (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 +\n 1;\n },\n easeInBounce(x: number): number {\n return 1 - Easing.easeOutBounce(1 - x);\n },\n easeOutBounce(x: number): number {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n },\n easeInOutBounce(x: number): number {\n return x < 0.5\n ? (1 - Easing.easeOutBounce(1 - 2 * x)) / 2\n : (1 + Easing.easeOutBounce(2 * x - 1)) / 2;\n },\n});\n","import * as THREE from \"three\";\nimport { Easing, EasingTypes } from \"../libs/easing\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : 60\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\n\nexport class DomSyncerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_textureResolution: { value: THREE.Vector2 };\n u_resolution: { value: THREE.Vector2 };\n u_borderRadius: { value: number };\n };\n}\n\nexport const createMesh = ({\n params,\n size,\n scene,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n}) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mesh = new THREE.Mesh(\n new THREE.PlaneGeometry(1, 1),\n new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n transparent: true,\n uniforms: {\n u_texture: { value: texture },\n u_textureResolution: {\n value: new THREE.Vector2(0, 0),\n },\n u_resolution: { value: new THREE.Vector2(0, 0) },\n u_borderRadius: {\n value: params.boderRadius![i] ? params.boderRadius![i] : 0.0,\n },\n },\n })\n );\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { DomSyncerMaterial } from \"./createMesh\";\nimport { useCallback, useRef } from \"react\";\n\ntype UpdateDomRect = ({\n params,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n}: {\n params: DomSyncerParams;\n size: Size;\n resolutionRef: React.MutableRefObject;\n scene: THREE.Scene;\n isIntersectingRef: React.MutableRefObject;\n}) => void;\n\ntype UseUpdateDomRectReturn = [DOMRect[], UpdateDomRect];\n\nexport const useUpdateDomRect = (): UseUpdateDomRectReturn => {\n const domRects = useRef([]);\n\n const updateDomRects: UpdateDomRect = useCallback(\n ({ params, size, resolutionRef, scene, isIntersectingRef }) => {\n // Initialize domRects if the number of children in the scene is different from the number of DOMRect\n if (scene.children.length !== domRects.current!.length) {\n domRects.current = new Array(scene.children.length);\n }\n\n scene.children.forEach((mesh, i) => {\n const domElement = params.dom![i];\n if (!domElement) {\n return;\n }\n\n // DOMRect is updated even outside the intersection\n const rect = domElement.getBoundingClientRect();\n domRects.current[i] = rect;\n\n // Intersection cannot be determined accurately depending on the mobile navigation bar, so it seems better to update it constantly\n mesh.scale.set(rect.width, rect.height, 1.0);\n mesh.position.set(\n rect.left + rect.width * 0.5 - size.width * 0.5,\n -rect.top - rect.height * 0.5 + size.height * 0.5,\n 0.0\n );\n\n if (isIntersectingRef.current[i]) {\n if (params.rotation![i]) {\n mesh.rotation.copy(params.rotation![i]);\n }\n\n if (mesh instanceof THREE.Mesh) {\n const material: DomSyncerMaterial = mesh.material;\n setUniform(material, \"u_texture\", params.texture![i]);\n setUniform(material, \"u_textureResolution\", [\n params.texture![i]?.source?.data?.width || 0,\n params.texture![i]?.source?.data?.height || 0,\n ]);\n setUniform(\n material,\n \"u_resolution\",\n resolutionRef.current.set(rect.width, rect.height)\n );\n setUniform(\n material,\n \"u_borderRadius\",\n params.boderRadius![i] ? params.boderRadius![i] : 0.0\n );\n }\n }\n });\n },\n []\n );\n\n return [domRects.current, updateDomRects];\n};\n","import { useCallback, useRef } from \"react\";\n\nexport type IsIntersecting = (\n index: number,\n once?: boolean\n) => boolean[] | boolean;\n\nexport const useIsIntersecting = () => {\n const isIntersectingRef = useRef([]);\n const isIntersectingOnceRef = useRef([]);\n\n const isIntersecting: IsIntersecting = useCallback((index, once = false) => {\n isIntersectingRef.current.forEach((value, i) => {\n if (value) {\n isIntersectingOnceRef.current[i] = true;\n }\n });\n const temp = once\n ? [...isIntersectingOnceRef.current]\n : [...isIntersectingRef.current];\n return index < 0 ? temp : temp[index];\n }, []);\n\n return {\n isIntersectingRef,\n isIntersectingOnceRef,\n isIntersecting,\n };\n};\n","import { useEffect, useRef } from \"react\";\n\nexport type UseDomViewProps = {\n onView?: () => void;\n onHidden?: () => void;\n};\n\nexport type UseDomView = (props: UseDomViewProps) => void;\n\nexport const createUseDomView = (\n isIntersectingRef: React.MutableRefObject\n): UseDomView => {\n const useDomView = ({ onView, onHidden }: UseDomViewProps) => {\n const isView = useRef(false);\n useEffect(() => {\n let id: number;\n const filterIntersection = () => {\n if (isIntersectingRef.current.some((item) => item)) {\n if (!isView.current) {\n onView && onView();\n isView.current = true;\n }\n } else {\n if (isView.current) {\n onHidden && onHidden();\n isView.current = false;\n }\n }\n id = requestAnimationFrame(filterIntersection);\n };\n id = requestAnimationFrame(filterIntersection);\n return () => {\n cancelAnimationFrame(id);\n };\n }, [onView, onHidden]);\n };\n return useDomView;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef, useState, Key } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../../fxs/types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { errorHandler } from \"./utils/errorHandler\";\nimport { createMesh } from \"./utils/createMesh\";\nimport { useIntersectionHandler } from \"./utils/useIntersectionHandler\";\nimport { useUpdateDomRect } from \"./utils/useUpdateDomRect\";\nimport { useIsIntersecting, IsIntersecting } from \"./utils/useIsIntersecting\";\nimport { UseDomView, createUseDomView } from \"./utils/createUseDomView\";\n\nexport type DomSyncerParams = {\n /** DOM array you want to synchronize */\n dom?: (HTMLElement | Element | null)[];\n /** Texture array that you want to synchronize with the DOM rectangle */\n texture?: THREE.Texture[];\n /** default:0.0[] */\n boderRadius?: number[];\n /** the angle you want to rotate */\n rotation?: THREE.Euler[];\n /** Array of callback functions when crossed */\n onIntersect?: ((entry: IntersectionObserverEntry) => void)[];\n /** Because DOM rendering and React updates occur asynchronously, there may be a lag between updating dependent arrays and setting DOM arrays. That's what the Key is for. If the dependent array is updated but the Key is not, the loop will skip and return an empty texture. By updating the timing key when DOM acquisition is complete, you can perfectly synchronize DOM and Mesh updates.updateKey must be a unique value for each update, for example `performance.now()`.*/\n updateKey?: Key;\n};\n\nexport type DomSyncerObject = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n /**\n * A function that returns a determination whether the DOM intersects or not.\n * The boolean will be updated after executing the onIntersect function.\n * @param index - Index of the dom for which you want to return an intersection decision. -1 will return the entire array.\n * @param once - If set to true, it will continue to return true once crossed.\n */\n isIntersecting: IsIntersecting;\n /** target's DOMRect[] */\n DOMRects: DOMRect[];\n /** target's intersetions boolean[] */\n intersections: boolean[];\n /** You can set callbacks for when at least one DOM is visible and when it is completely hidden. */\n useDomView: UseDomView;\n};\n\nexport const DOMSYNCER_PARAMS: DomSyncerParams = {\n texture: [],\n dom: [],\n boderRadius: [],\n rotation: [],\n onIntersect: [],\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usedomsyncer\n * @param dependencies - When this dependency array is changed, the mesh and intersection judgment will be updated according to the passed DOM array.\n */\nexport const useDomSyncer = (\n { size, dpr, samples = 0 }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\n });\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useEffect(() => {\n setRefreshTrigger(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => new THREE.Texture(), []);\n\n // set intersection\n const intersectionHandler = useIntersectionHandler();\n const { isIntersectingOnceRef, isIntersectingRef, isIntersecting } =\n useIsIntersecting();\n\n // create useDomView\n const useDomView = createUseDomView(isIntersectingRef);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DomSyncerParams) => {\n const { gl, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (errorHandler(params)) {\n return emptyTexture;\n }\n\n if (refreshTrigger) {\n if (updateKey.current === params.updateKey) {\n return emptyTexture;\n } else {\n updateKey.current = params.updateKey!;\n }\n }\n\n if (refreshTrigger) {\n createMesh({\n params,\n size,\n scene,\n });\n\n intersectionHandler({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n });\n\n setRefreshTrigger(false);\n }\n\n updateDomRects({\n params,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n });\n\n return updateRenderTarget(gl);\n },\n [\n updateRenderTarget,\n setParams,\n intersectionHandler,\n updateDomRects,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n emptyTexture,\n ]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene,\n camera,\n renderTarget,\n output: renderTarget.texture,\n isIntersecting,\n DOMRects,\n intersections: isIntersectingRef.current,\n useDomView,\n },\n ];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","useAddMesh","scene","geometry","material","mesh","useEffect","setUniform","key","value","useMesh","vertexShader","fragmentShader","resolution","getCameraProps","width","height","frustumSize","aspect","w","h","useCamera","near","far","usePointer","lerp","prevPointer","useRef","diffPointer","lerpPointer","lastUpdateTime","velocity","isMoved","useCallback","currentPointer","now","current","deltaTime","isUpdate","prevTemp","useParams","params","isContainsFunctions","obj","paramsRef","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","useLayoutEffect","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","BRUSH_PARAMS","useBrush","updatePointer","pressureEnd","props","pointer","pointerValues","color","init_default","useInitialMaterial","advection_default","useAdvectionMaterial","divergence_default","useDivergenceMaterial","pressure_default","usePressureMaterial","curl_default","useCurlMaterial","vorticity_default","useVorticityMaterial","clear_default","useClearMaterial","gradientSubtract_default","useGradientSubtractMaterial","splat_default","useSplateMaterial","initialMaterial","updateMaterial","curlMaterial","vorticityMaterial","advectionMaterial","divergenceMaterial","pressureMaterial","clearMaterial","gradientSubtractMaterial","splatMaterial","materials","setMeshMaterial","FLUID_PARAMS","useFluid","fboProps","velocityFBO","updateVelocityFBO","densityFBO","updateDensityFBO","curlFBO","updateCurlFBO","divergenceFBO","updateDivergenceFBO","pressureFBO","updatePressureFBO","lastTime","scaledDiffVec","spaltVec","clock","dt","velocityTex","densityTex","scaledDiff","curlTex","divergenceTex","pressureTexTemp","i","scale","max","texture","meshArr","RIPPLE_PARAMS","useRipple","currentWave","NOISE_PARAMS","useNoise","COLORSTRATA_PARAMS","useColorStrata","MARBLE_PARAMS","useMarble","COSPALETTE_PARAMS","useCosPalette","DUOTONE_PARAMS","useDuoTone","BLENDING_PARAMS","useBlending","FXTEXTURE_PARAMS","useFxTexture","tex0Res","_d","_c","tex1Res","_f","_e","_h","_g","interpolatedResolution","index","BRIGHTNESSPICKER_PARAMS","useBrightnessPicker","FXBLENDING_PARAMS","useFxBlending","ALPHABLENDING_PARAMS","useAlphaBlending","HSV_PARAMS","useHSV","COVERTEXTURE_PARAMS","useCoverTexture","SIMPLEBLUR_PARAMS","useSimpleBlur","_","updateTempTexture","_tempTexture","iterations","WAVE_PARAMS","useWave","CHROMAKEY_PARAMS","useChromaKey","useCopyTexture","length","renderTargetArr","updateCopyTexture","Easing","x","c2","c4","c5","getHash","input","n","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","hash","useFPSLimiter","fps","interval","prevTime","tick","errorHandler","domLength","textureLength","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","DOMRects","refreshTrigger","setRefreshTrigger","useState","updateKey","emptyTexture","intersectionHandler","useDomView"],"mappings":"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"} \ No newline at end of file diff --git a/packages/use-shader-fx/package-lock.json b/packages/use-shader-fx/package-lock.json index 91c35627..345aa908 100644 --- a/packages/use-shader-fx/package-lock.json +++ b/packages/use-shader-fx/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hmng8/use-shader-fx", - "version": "1.1.2", + "version": "1.1.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hmng8/use-shader-fx", - "version": "1.1.2", + "version": "1.1.3", "license": "MIT", "devDependencies": { "@types/node": "20.5.6", diff --git a/packages/use-shader-fx/package.json b/packages/use-shader-fx/package.json index 2a0fa1c6..7fe56ebd 100644 --- a/packages/use-shader-fx/package.json +++ b/packages/use-shader-fx/package.json @@ -1,6 +1,6 @@ { "name": "@funtech-inc/use-shader-fx", - "version": "1.1.2", + "version": "1.1.3", "description": "⚡️ More FXs, Less GLSL", "main": "./build/use-shader-fx.umd.cjs", "module": "./build/use-shader-fx.js", diff --git a/packages/use-shader-fx/src/fxs/interactions/useBrush/index.ts b/packages/use-shader-fx/src/fxs/interactions/useBrush/index.ts index 2b06a649..f30277d1 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useBrush/index.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useBrush/index.ts @@ -27,7 +27,10 @@ export type BrushParams = { /** Number of motion blur samples. Affects performance default: 5 */ motionSample?: number; /** brush color , it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default:THREE.Vector3(1.0, 1.0, 1.0) */ - color?: ((velocity: THREE.Vector2) => THREE.Vector3) | THREE.Vector3; + color?: + | ((velocity: THREE.Vector2) => THREE.Vector3) + | THREE.Vector3 + | THREE.Color; /** Follows the cursor even if it loses speed , default:false */ isCursor?: boolean; /** brush pressure (0 to 1) , default : 1.0 */ @@ -118,7 +121,7 @@ export const useBrush = ({ } setUniform(material, "uVelocity", pointerValues.velocity); - const color: THREE.Vector3 = + const color: THREE.Vector3 | THREE.Color = typeof params.color === "function" ? params.color(pointerValues.velocity) : params.color!; diff --git a/packages/use-shader-fx/src/fxs/interactions/useBrush/useMesh.ts b/packages/use-shader-fx/src/fxs/interactions/useBrush/useMesh.ts index 7545c729..2fcd3134 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useBrush/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useBrush/useMesh.ts @@ -24,7 +24,7 @@ export class BrushMaterial extends THREE.ShaderMaterial { uMouse: { value: number }; uPrevMouse: { value: number }; uVelocity: { value: number }; - uColor: { value: THREE.Vector3 }; + uColor: { value: THREE.Vector3 | THREE.Color }; uIsCursor: { value: boolean }; uPressureStart: { value: number }; uPressureEnd: { value: number }; diff --git a/packages/use-shader-fx/src/fxs/interactions/useFluid/index.ts b/packages/use-shader-fx/src/fxs/interactions/useFluid/index.ts index f6ca3b55..027d804e 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useFluid/index.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useFluid/index.ts @@ -27,7 +27,10 @@ export type FluidParams = { /** splat radius , default:0.002 */ splat_radius?: number; /** Fluid Color.THREE.Vector3 Alternatively, it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default:THREE.Vector3(1.0, 1.0, 1.0) */ - fluid_color?: ((velocity: THREE.Vector2) => THREE.Vector3) | THREE.Vector3; + fluid_color?: + | ((velocity: THREE.Vector2) => THREE.Vector3) + | THREE.Vector3 + | THREE.Color; /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default:false */ pointerValues?: PointerValues | false; }; @@ -163,7 +166,7 @@ export const useFluid = ({ updateDensityFBO(gl, ({ read }) => { setMeshMaterial(materials.splatMaterial); setUniform(materials.splatMaterial, "uTarget", read); - const color: THREE.Vector3 = + const color: THREE.Vector3 | THREE.Color = typeof params.fluid_color === "function" ? params.fluid_color(pointerValues.velocity) : params.fluid_color!; diff --git a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useSplatMaterial.ts b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useSplatMaterial.ts index 1e2a5ed1..beb8cfd9 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useSplatMaterial.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useSplatMaterial.ts @@ -7,7 +7,7 @@ export class SplatMaterial extends THREE.ShaderMaterial { uniforms!: { uTarget: { value: THREE.Texture }; aspectRatio: { value: number }; - color: { value: THREE.Vector3 }; + color: { value: THREE.Vector3 | THREE.Color }; point: { value: THREE.Vector2 }; radius: { value: number }; texelSize: { value: THREE.Vector2 }; diff --git a/packages/use-shader-fx/types/fxs/interactions/useBrush/index.d.ts b/packages/use-shader-fx/types/fxs/interactions/useBrush/index.d.ts index 79b99a98..03316926 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useBrush/index.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useBrush/index.d.ts @@ -20,7 +20,7 @@ export type BrushParams = { /** Number of motion blur samples. Affects performance default: 5 */ motionSample?: number; /** brush color , it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default:THREE.Vector3(1.0, 1.0, 1.0) */ - color?: ((velocity: THREE.Vector2) => THREE.Vector3) | THREE.Vector3; + color?: ((velocity: THREE.Vector2) => THREE.Vector3) | THREE.Vector3 | THREE.Color; /** Follows the cursor even if it loses speed , default:false */ isCursor?: boolean; /** brush pressure (0 to 1) , default : 1.0 */ diff --git a/packages/use-shader-fx/types/fxs/interactions/useBrush/useMesh.d.ts b/packages/use-shader-fx/types/fxs/interactions/useBrush/useMesh.d.ts index 29d8c326..e1ff8964 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useBrush/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useBrush/useMesh.d.ts @@ -48,7 +48,7 @@ export declare class BrushMaterial extends THREE.ShaderMaterial { value: number; }; uColor: { - value: THREE.Vector3; + value: THREE.Vector3 | THREE.Color; }; uIsCursor: { value: boolean; diff --git a/packages/use-shader-fx/types/fxs/interactions/useFluid/index.d.ts b/packages/use-shader-fx/types/fxs/interactions/useFluid/index.d.ts index 6548b107..10afaed4 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useFluid/index.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useFluid/index.d.ts @@ -19,7 +19,7 @@ export type FluidParams = { /** splat radius , default:0.002 */ splat_radius?: number; /** Fluid Color.THREE.Vector3 Alternatively, it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default:THREE.Vector3(1.0, 1.0, 1.0) */ - fluid_color?: ((velocity: THREE.Vector2) => THREE.Vector3) | THREE.Vector3; + fluid_color?: ((velocity: THREE.Vector2) => THREE.Vector3) | THREE.Vector3 | THREE.Color; /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default:false */ pointerValues?: PointerValues | false; }; diff --git a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useSplatMaterial.d.ts b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useSplatMaterial.d.ts index 820cca7c..62734002 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useSplatMaterial.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useSplatMaterial.d.ts @@ -8,7 +8,7 @@ export declare class SplatMaterial extends THREE.ShaderMaterial { value: number; }; color: { - value: THREE.Vector3; + value: THREE.Vector3 | THREE.Color; }; point: { value: THREE.Vector2;