From 8845996c8c8243f28d73e5c338100d92feb7bdb0 Mon Sep 17 00:00:00 2001 From: kossLAN Date: Tue, 10 Jun 2025 13:12:50 -0400 Subject: [PATCH] vibe out them edge reflections --- shaders/liquid-glass.frag | 64 +++++++++++++++++++++++++++-- shaders/liquid-glass.frag.qsb | Bin 3284 -> 5359 bytes shell.qml | 75 +++++++++++++++++++++++++++------- 3 files changed, 121 insertions(+), 18 deletions(-) diff --git a/shaders/liquid-glass.frag b/shaders/liquid-glass.frag index 3faaa4f..36d746f 100644 --- a/shaders/liquid-glass.frag +++ b/shaders/liquid-glass.frag @@ -10,6 +10,8 @@ layout(std140, binding = 0) uniform buf { float warpStrength; float flowSpeed; float scale; + float edgeReflectionStrength; + float edgeReflectionWidth; } ubuf; layout(binding = 1) uniform sampler2D source; @@ -49,16 +51,72 @@ void main() { // Combine flows for more organic movement vec2 finalFlow = (flowDir1 + flowDir2 * 0.5) * ubuf.warpStrength * 0.01; - // Apply subtle chromatic aberration like Apple's effect + // Apply subtle chromatic aberration float aberration = length(finalFlow) * 0.5; vec2 distortedUV = uv + finalFlow; - // Sample with slight chromatic separation + // Sample with slight chromatic separation for main glass effect float r = texture(source, distortedUV + vec2(aberration, 0.0)).r; float g = texture(source, distortedUV).g; float b = texture(source, distortedUV - vec2(aberration, 0.0)).b; - fragColor = vec4(r, g, b, 1.0) * ubuf.qt_Opacity; + vec4 glassColor = vec4(r, g, b, 1.0); + + // Simple edge reflection - back to what worked + float edgeWidth = ubuf.edgeReflectionWidth; + + // Calculate distance from edges + float distFromLeft = uv.x; + float distFromRight = 1.0 - uv.x; + float distFromTop = uv.y; + float distFromBottom = 1.0 - uv.y; + + // Find the minimum distance to any edge + float minDistToEdge = min(min(distFromLeft, distFromRight), min(distFromTop, distFromBottom)); + + // Create edge mask + float edgeMask = smoothstep(edgeWidth, 0.0, minDistToEdge); + + if (edgeMask > 0.0) { + vec2 reflectionUV = distortedUV; + + // Simple reflection logic + if (minDistToEdge == distFromLeft) { + // Left edge - flip horizontally + reflectionUV.x = 1.0 - distortedUV.x; + } else if (minDistToEdge == distFromRight) { + // Right edge - keep as is but sample from further right + reflectionUV.x = distortedUV.x + 0.1; + } else if (minDistToEdge == distFromTop) { + // Top edge - flip vertically + reflectionUV.y = 1.0 - distortedUV.y; + } else { + // Bottom edge - flip vertically + reflectionUV.y = 1.0 - distortedUV.y + 0.1; + } + + // Clamp to valid range + reflectionUV = clamp(reflectionUV, 0.0, 1.0); + + // Sample reflection with same chromatic aberration + float rRefl = texture(source, reflectionUV + vec2(aberration, 0.0)).r; + float gRefl = texture(source, reflectionUV).g; + float bRefl = texture(source, reflectionUV - vec2(aberration, 0.0)).b; + + vec4 reflectionColor = vec4(rRefl, gRefl, bRefl, 1.0); + + // Blend reflection with glass effect + glassColor = mix(glassColor, reflectionColor, edgeMask * ubuf.edgeReflectionStrength); + } + + // Simple glass overlay enhancement + vec2 centeredUV = (uv - 0.5) * 2.0; + float fresnel = pow(1.0 - abs(dot(normalize(vec3(centeredUV, 1.0)), vec3(0.0, 0.0, 1.0))), 1.5); + + // Add subtle white tint and fresnel + glassColor.rgb = mix(glassColor.rgb, vec3(1.0), 0.02 + fresnel * 0.03); + + fragColor = glassColor * ubuf.qt_Opacity; } diff --git a/shaders/liquid-glass.frag.qsb b/shaders/liquid-glass.frag.qsb index 805b78b7bb39179469d937f0ca00015cf8bef46c..8f49b0f6dd76eb79759698e893816b119d7e254d 100644 GIT binary patch literal 5359 zcmZQz$lF>m=WQ%^jf{Kc{IAA=Q;zsOI#OAdtA1{7O_<+uYulXDX50RFy}7Yb#ey|bE$|%Zsx)*nWtAzStg({B}ikbL-emlfnHpV z4hnPgpV@D}|L*NvmE&awJHO_ae*gQt`mFh8jLCB+;`y=_z3onF{Ep<5(IX;YAbvf7k_xX$da#$9?si<5%7xC`g~F}WXq zXveu=wk_?|O9aEU&U@Oo?qHCaE%{yO^HZaaH=?PUCTgxRhP;bs_m&@gZF6#pFsmf{ zS&JJTg*z?uwuUWvr}%V&a@VHs>nxZK&h2H<3=vuIIB0{;Q5nf}-A%hEddyzo_1`$? z%#N+=1+#r#&YocZ{j~LJmt!IGy)GRr2yd6xjJ_Lk)A6U}xhpbROOC}HxuUl_Xi{>_ z#I6;_f`Bdu*=uEmvGd+yJ5R!_vTl9 zd6kEBbA`vvP{b>2_N-Olm%&zmW^ z+Zp0lyl6F@l`@@WL+B5a8LTJWBHHg+WTMre)>uJXX5GKTqpNS)SV5!!L(IK z=h$ASOV1b2{g65-jwy22wT3vZSx@vE-zaU-4=O6zTR-_>Jl}uc-(1ViAMuEred6BN z4e5^mc`wx4{&@M>P0hbV{n!(uo2zHfxMz2E+szNTDOKzr=a#Hz-^(j;G*kT77Kfkv z9q#DZmpAV7(~~!uX5PH~qHkH5^0n;;_%2pANbb)Qt@X|(p%@A`5%;5Mfc|$ zmW1BBd-v{ao?54S^3_S@y>+dR?(e*MVSV5i<>=mj*ST%a`~H@GdiUGRQ0aA3Hb2b$ zpt@t0#IG#PpJhLPn*I2{`@sFae?oux%;HSs?G*O>{61ZxIrhxI$6deg`5xQf-*kM7 z{pw%ek2GYy-?pXSByaY|xxa)b-|x7W_R?}Y(=Oh9w=Zqk+568{?CXDDX`a2|m)8G# zu-$yZe*JA*-o?Ikm>WRiV;d_&OZ*_Cs*{|9OWwa206|P?#v~I4)?_u z$a7ujH<&f=syp-Be7-IFO&#`IJJ=t~klM}9ddpsDfxX-Ud&vd%vJ32`7ud@$*e~

4Q*789?G-9J>{xa-pIWx9oc)7y z*1L>1M?XB~`;yHPVgKdA$&X5Bd@o-=+_>+a9nA0yS zzB^y8Hr}y#oh`QG@GmPy`%OLi>R)D6wS3&mv&Ztt6Ac65$u>zvQ(kH+gjJq+!;qE~ z#&u+kjL_!Y4YOy2DwK;Kj(HHeEZaz>?|6gsyvK@#bC~iTS@7=EY`e?*hvoI_(~XyF z?Ke#R@b+oXd%1<*=Z9~&agY06wZQV<4Kr{2Q%S0p@4oxD@y6c}k2i7*d5^wao>1M8 zXwN+7_`7uHr0>NCc+a12Kk{zs0pB@wj795HZme$je8ZOGPpD4W`nG(2qkY%8_J;3o zJNi!i;P0p-?-Uc%%J`Mb_zi9Mx6H8PnWzLf4t_W!iUNaPYn}}U5n?e z6*K(O-fGt^@oRmnUH6;GVJDB>cX)O-qoNvC7V8Nh|roT%wb1Wyd_{hduAD5C4-n z{y%S!p8cO?_Wb6)^GwEn{_A{+JbNKt;MbaKdXK%oh#ThTF}xR-ct5?x?zrTyco2EB zK6O*P)9%dQ=GVTtewb80-+lJQpYNUK>+=4Ucbd<8`{~Nw7yn!4>3vwo!2j}>(XHM$ z^_;bRH9p7MJ{|qf=4Nz%;-7fYU%%!(S-x%kiP;8Lr|VrS&L6+tT4#6S*mVbK>Hp0C zdH(Vq`5wFB=l%yj*>dbo<^GO{1$9|cA!gtyJiy!v0e!Sn{$T`<($9m^>C$<*| z?^d05tn$q?wjANTDhbtv3e(QBJUccy=UzNhZJPX!DNnDn?e2Mc?Msi)wlhYh3TvC6 zbey-bKdqCmzw6Ma_pYZCFCTg2b$Y*eY-(oD`>o;8QGK`0#Fg|eEe)Q1vwPiE6FmX> zQ;O?T_x*7>ATGU6Vy?E%*<|Cn+Pb~7_fGqCVXDvbuZ(leS$=J|y0BkbxA)^-v!u+O z(vklcO}i$WxUVEa%Dh_l=>gd{k)4rN`DS0Dyq}+Kd$*xISbPv4&1eV|(O*7Sw;A;LG09{ZWr^Epnk_|tPS?_~4E{$C9H&%TY; zjSV+U-gW+x#MPT;tjcCDeO>TdXZ`=*y1lb^%YJLSAu;*w-3O+x?;HGyKJ}>D`pFq% zf1B;bGnpquo=f2~idJ#9VV`+M@kC9-$vcdapWg_cm(?lLZ|tdL<9jT5cf^Jb&$)u1(;`x%50Z$i4kS^<0N) zp0|caTC=WaCw`x6G5tv6#h7KAIW7iPmOGf8O1jl*H=}f^^k238LJNFj6*_-TNGSAm zbf5I{jpLj%#W%Qhjy}3@I_KNrWs$$HF&byzZ#~fS@9T$~KQ=JV=zQ*#AhO={#b+t8 z^^8Ye$7%Y1QA?1%S&_rlcb3#npM7s~ zq4v&|U%7&%IPOHB>v?)7vv1eVro%5E&-AK1vDV@!=XZ|dPtQMgPCYL9JfT!)@^??` z$HM38)Mu9;i+PzjL(cyA!8;bF^QYL()OogPsaNB!B>z+LJeOqGrExvo6YR-z>*}SH zRG(Y9*3(w{Jns_zW|*$y_*c4Y*|uq3Q$Oy=x%}+X(V%s&Ttu8LyCgzo$~OgVS-mr9 z$sNno@*A;pSFZST;eZLl%V`%U$?Cck9lf+9`?u)JYsoYJEJ^0S@$sC+d(EA*i`9>p z26Oo??a~e1S=M*q>!;-Axl`n`uepTozUDoB+mw|lT$48Mxp#Q#R#WD(BgPjJf35tn zIIw?rPC3sF&c_n5K3zXcC$YQD47h6_cB=QbNw)H`)2G&+OunREzvp#KpT{yj(@Ar) zX1TmI?NVH%Fsp3YPP46xY-(QqYq{by@%mh@SsvvRCkAf}dOXoTI{i-m7VUe-*Dl+= zBR0rz#_9=)s`{}#niH#@3!U0o_1-GwMD?$$SFek|f7}1P?C9i^|6Ic3*UxFn-g+`c-VM!1WswXW8s@uRBn%#JHE7j^}m+5R!+s%~gZ`k!yilj7OxdY|isM^9Y4 z&RA96U)@mRB6q?W^izzw_g<}MA=oJ7i7-<5>e!7!RDvet`vsebpkT6$_?)QON6$#w1u^H1NJIO~g>sY{}?-%_y*Q^lJO z)z%yvJzM9A#Q69f(`|;{8uVdF0Ti>Y&{{A$l9<$x6aNmJ9RyNR}FWmqPghDhKPV% zpX{}3wPX`tm*z_MerjG8m3?f^qSqlCzFu6IyjIeDuc-Q;=Pz@Pt`w8y3f@^FGg;R- zs<&tQ9go0eoHJ|QwOG9@cegpatG-IA#Qn;v6?GaWQimP)i|r`cZlzK=ciq;~;As0M zr<}RLm(>?+JMCkVx{zDFHAL&;{mHLhd6s=u4c_}Pukuo0I$w$NTrHsoZ~eZgPu{!t zEm$zijT9<8=ILmLwvM=Af(vl1wr@1|9ul;M< zd}6ZeOm>z@*EIuo>uFV<%vSoxcRel^NQixl0$V4cRiaYg^F8Fs)l&uCJ{w zdbz@6()C1ZTb3?j)fe^M+Yo#)#!!db_0)_hlg*7AIj^4bxq9`KPxQ=8ZR5WiPx<)! z$60M(vt{b!ZAC%5LFA=?$V~zGFDEt*9!&*;Byyt=rk!7%i^*uNPpPY>z>F{;nDtx7rFo4LG6 z(jx!!@`o!zc;4RL`rn}{duhnpW#yu$C+nSG@b}h|rw?=6x4pZ&yWU`(waB96_e-P$ z4xRDhb!NYGc;=~=$4;&5r5G0bzGl3+tI5G^kCH%0Sh(;BGfl1;+akkRd$wK<6+dC7 z$CHx2jwj&A<$a$R{$vLza8$fko%J&6liWwSSA7SXHOk}eU$ouhbRd@{n`N_^v(753 z3B0#*LKGSz!;~&~#7;c$Jbr`Egn6!q<}U5AzO;tfck|mdFXNT=)bp-lvD@BU+O+v) zS^19Jyr)?HC356UjrF!OTz4wGE-ug$W!}4_{8g!)P{hM# zRu&euf=g%Gt_q~BH(#>EfPMKjv%*(Ls`h>ReQtx)XHlt5zS_Krw_g{pHc9dKUa9zd zadh^HbK7oA$lcI7_iL5&HyM444Qp?`FP?k<;kENAM-?S*Zw@M2VQiIrR?&KL^zw+3 z1AR-vrEV>k5|v4d_|5dST{1l7{DC8PcuiJ%oH=?na?M3k=EP90%@O7+f>WeLwU($q zeKxf#Vd^5sU#{%kwsnGpS+@8~hqsIDyszv(u;#Qw z?#wNI7B6LL&0luw^UFSvnX7oSXZqg^g(F+81q8LEJ@Qb0FL`>_*G-Ej2hDGqyvM}( zKa1<`@L7?czJ{i*Tr^>!>M9Gx>Br8vYz$et$3}hsiJfWdW2!eySbb_uSyJxKpd#;g zB{x^D%gK(Os@?Zg^YiV1f;&ETv8Bg9@4VQ{v;G;^WAlss=ai*y-%|5zjXfhWXI0Oh zWbKt3_HT+^%`mrnz1jkEk+&AT4vVu6pEw~=>-Om4;dW=0;-hL?`zB62xhlBxiFdNA z-nvzqJCp3fOWu@NJwA1!*Ke1fm279qr{l(#uWrffar--!_q)f@lRdYSmnK~eQ45=Y zshWTJ118n@4e{weefDV-?($aZ)mHN5Rx*+2DhmAmtoxss;bsT6V7~2jVZy)zuEk5_@wEXh8GZ*GidXfAxG{TdBKz-uueh>L))}J)iUV=^XioS?9Q){uTVI&?;K8 zA?@XNk28jgZq8OYJMC~}Xz8NOD_*r^&X0CYPy3&?G4A@7`A(M4r^H(~-V3h$xTMf@ zx!D=x{WU?HdukUwKj)JwTOYdoVYNo_$`?QGyEcB(%U?84`TgQ4OjrA#yHFsYuDx&l{r6pNQKvatEfH?tg?5E^{yiivxzXDqDXOP~>+eSwKb6ciy?Gzy zW0W2xu|Dsx;k>a(p|v|GW~KeQjNLN?N`=H9iB!G%9?KTK+hl>w9Y434pm&qzJI!J1 z^JV)U`Rl1o#~XoAp;MDO^wSbbCV$hbnd{`UP9soGz8vS~1fI(q zQuGe~jC))0Y}SRyolA4)YDfIfoN|17<2+yO4&8ZfN`LO`$<2vg^z6CN-^{qUM?4$1 zJp4E_sgi{OI|bgheZ5As~5c=yAzX*dtUb!KZFq>x$?~N6Wx~$ud9+<{>J1yaKf1Pp11FcSk*|+G^jV(-~1ydO zHy1?ylR2?1c~9)Ak6&N8o!!s%@AXG-p4zu(=j5kUPd{`|=*54DFY#P;b#-?pq+2z{ z%y$or&3hpmk~7=nKAZD9t)xvAcpWh#d*llQ+_QBXr^Kj*3FW>7g-o1W(d&SG9v<#6wh%{zfta(dDYf{*M-ck)=W|TxsH40 zFW~vG>*3y(>(@#jJiHUj|A*t_hBLeqcHf(Dn{}t5^E~bcN}LPu_Gy zs5fNK%W+v_`M@fSy~tAenoYs+j;###pV;PWUop4I{BV~kPTcY)yU+6_9dq6of0;62 zwNi>1^JUA`Ek$9yCvMg~uu7ME@=baM|DLoLtK6S_WGFamEIRRc<^!vK;|a6PHbghd zn z(1Rge87s= zejn$~_FkD7R>YZ<{Nwr| z^rD7w#O`rJU8 z)w+MK?N8k)FRx(tPSdL8Rdv`QweP&one1dO5$|9NhUn$naeCK@i=wn-n_l|Kp>f@MqpAXjg zvs;<7=li>QA^yvSyLKx`n-|^cmiS_Rp?$~A^&%O2uYXInUDC5>*}}#5FYFYnwBnh^ zn2@Q=&)jxa@y3F3x@ShQ1e3ZJQa@zC7fNeOv$1=0Sz&_MmN5lTY@odY%&N>AS1- zz%GUaXP@tX6R;(t7am+xPGY*pW6Ac#MAs@V>&mLoS8>yhSn=Js*AuN5!9FLa>+bERKK&tDaeAJ~ryQ2W6lVMR7==9M zxLEvWSNOK9Jj*a&pXk`Id?nfC?M!J56QZNM>lTR=pPsrapH+0_Mdq@N?;;L|8BH`v zPA-q#KQGuhlPA=sJLKoI(=V*5)@=Xv^5R|D>5ski<4;X`dsFq%nswQaE=7IcAet@p z;!>g4zluF4W4G>VTRWw!N8kC>hu0HkN@O~<)h~GTOee0yPbiy+u4lWCK9w*m zJvr0oL}Xv|-ARgSigBh@J2o0UO8aHxta<6s%y7q6-;}DGCpsfCKU_FI$%C!;n;N_C z>X~tu^;S!i+M4M+J$Y14^U|vrFRSaXV#Sx%yq&OzjeRn+^U210DfRyYR+SetOnV@; zv|R7`(zb(3_Ec532c2AaT&m>s+MCVEdu!F*?{?L9#UGZ|7dZV= zQd7A)L!fJ;`ze+kcQ(cDnH7;*((CzVTM}<&S^wXL$Is-J)%dH0{%~ey&i>6F{L+z6 z(R9W;-}SyrndASqJg(e!{`Q*KDk)s$b34PNWM zc%QNF{N;`F?;)c!|jh1N*mh6`yLig z8nI98^!22lzy9mQyZ3(j8nU@&sr`o z>W6Kf9DG_V?4;j{KGU+t!a9k$7E_OwW?6avsXRV;>m#mPYq*~DJU*&6ske8p(NxWw z+b6h6I{q)&zhz?P6;mPQ=-*mDYtDX5zWE^P@|ptmBe(CL(!O5Rp>25iRJz`Bv472L z|Mb3J)>^r0YGmCaMYqU3E7;y$sy$IPwV!vzlC*C%eurjgZB5?y);i41Fg2jw_nDM& z@Mnk1b3^@FvNu|a>72;0JXV&sH?chJ$m%OuGuJ-Nx@(@D86X{buk@;~vUS-VgIOVr zt}ku`es}ib*}Nn%r#x-?TTvN#Ev8z=o^v-PpF~GB*OcT7gk8HN`{a2B|CbwkelzF3 zO)2I0c{94@&&O((a}{bAG!E>KjB1_m{p_U4nNvPSe3pLARV%(_E$g?fFX9ev5qu~1 zEVnH(W&Q;I+jG{2HbgFt4Dj&YE$~7AjzP+^z^czN)yc)I2I+UtzWxz(@#EP``Yd<& z%6Z-|yeo&f4V?^5;JpPwRPqS6cDqwC67}jvaq(`f734)SR0l(`_e5>+MR- z+HbVYztR6nt@`B7qi-Hfu?;@G;$Vf%jr~6+&r5#3CTD5P<-f;M)l1G5GU}`!^jqr|3LrNI%#1_V0&U#^W~c zqpp9Glm9lS;`B1RS2I2?{T{LL=a=k{mcO=YEdBiIYTxU#IlWPPZmtMDRO^$yS*+43 vCFii{)!PNdn`7P;Sm<%dO0KLAI2nG#{y2B3bMYsx3yG4If5lY}9S8&fxeBJ* diff --git a/shell.qml b/shell.qml index 6900819..90b06e5 100644 --- a/shell.qml +++ b/shell.qml @@ -24,7 +24,6 @@ ShellRoot { } ColumnLayout { - // anchors.fill: parent anchors { centerIn: parent } @@ -58,12 +57,13 @@ ShellRoot { live: true } - FastBlur { + GaussianBlur { id: backgroundBlur anchors.fill: parent source: blurredBackground - radius: 16 - transparentBorder: true + radius: 4 + samples: 4 + // transparentBorder: true } // Liquid glass shader warp @@ -75,38 +75,51 @@ ShellRoot { property real warpStrength: warpSlider.value property real flowSpeed: speedSlider.value property real scale: 3.0 + property real edgeReflectionStrength: edgeReflectionSlider.value + property real edgeReflectionWidth: edgeWidthSlider.value + property real cornerRadius: 0.1 property variant source: ShaderEffectSource { - sourceItem: backgroundBlur + sourceItem: backgroundBlur hideSource: false live: true } } - // Glass overlay + // Subtle glass overlay Rectangle { anchors.fill: parent - color: Qt.rgba(1,1,1, 0.05) - border.width: 1 - border.color: Qt.rgba(1, 1, 1, 0.3) + color: "transparent" radius: 20 + // Subtle inner glow Rectangle { anchors.fill: parent anchors.margins: 1 radius: parent.radius - 1 + color: "transparent" + border.width: 1 + border.color: Qt.rgba(1, 1, 1, 0.05) + } + + border.width: 1 + border.color: Qt.rgba(1, 1, 1, 0.15) + + Rectangle { + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.margins: 1 + height: parent.height * 0.3 + radius: parent.radius - 1 gradient: Gradient { GradientStop { position: 0.0 - color: Qt.rgba(1, 1, 1, 0.1) - } - GradientStop { - position: 0.3 - color: Qt.rgba(1, 1, 1, 0.05) + color: Qt.rgba(1, 1, 1, 0.08) } GradientStop { position: 1.0 - color: Qt.rgba(0, 0, 0, 0.05) + color: Qt.rgba(1, 1, 1, 0.0) } } } @@ -161,6 +174,38 @@ ShellRoot { Layout.preferredHeight: 30 } } + + RowLayout { + Text { + text: "Edge Reflection:" + } + + Slider { + id: edgeReflectionSlider + from: 0 + to: 1 + value: 0.3 + + Layout.fillWidth: true + Layout.preferredHeight: 30 + } + } + + RowLayout { + Text { + text: "Edge Width:" + } + + Slider { + id: edgeWidthSlider + from: 0.01 + to: 0.2 + value: 0.1 + + Layout.fillWidth: true + Layout.preferredHeight: 30 + } + } } } }