diff options
author | 2022-12-02 21:10:44 +0100 | |
---|---|---|
committer | 2022-12-02 21:10:44 +0100 | |
commit | 91d5516474dcb9494987f264783ad1400781b025 (patch) | |
tree | 11376e29c3c1358f7576e502366a990db9fb1c08 /glow/src/shader/compatibility/quad.frag | |
parent | da244ff8048e0b339c1502372894a2460a637241 (diff) | |
parent | 60e41666d0e203d9777de981121c39f569bc3a7b (diff) | |
download | iced-91d5516474dcb9494987f264783ad1400781b025.tar.gz iced-91d5516474dcb9494987f264783ad1400781b025.tar.bz2 iced-91d5516474dcb9494987f264783ad1400781b025.zip |
Merge pull request #1506 from rksm/non-uniform-border-radius-for-quads
non uniform border radius for quads
Diffstat (limited to 'glow/src/shader/compatibility/quad.frag')
-rw-r--r-- | glow/src/shader/compatibility/quad.frag | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/glow/src/shader/compatibility/quad.frag b/glow/src/shader/compatibility/quad.frag index 8ea5693d..bb9d8122 100644 --- a/glow/src/shader/compatibility/quad.frag +++ b/glow/src/shader/compatibility/quad.frag @@ -12,7 +12,7 @@ varying vec4 v_Color; varying vec4 v_BorderColor; varying vec2 v_Pos; varying vec2 v_Scale; -varying float v_BorderRadius; +varying vec4 v_BorderRadius; varying float v_BorderWidth; float _distance(vec2 frag_coord, vec2 position, vec2 size, float radius) @@ -33,10 +33,26 @@ float _distance(vec2 frag_coord, vec2 position, vec2 size, float radius) return sqrt(distance.x * distance.x + distance.y * distance.y); } +float selectBorderRadius(vec4 radi, vec2 position, vec2 center) +{ + float rx = radi.x; + float ry = radi.y; + rx = position.x > center.x ? radi.y : radi.x; + ry = position.x > center.x ? radi.z : radi.w; + rx = position.y > center.y ? ry : rx; + return rx; +} + void main() { vec2 fragCoord = vec2(gl_FragCoord.x, u_ScreenHeight - gl_FragCoord.y); - float internal_border = max(v_BorderRadius - v_BorderWidth, 0.0); + float border_radius = selectBorderRadius( + v_BorderRadius, + fragCoord, + (v_Pos + v_Scale * 0.5).xy + ); + + float internal_border = max(border_radius - v_BorderWidth, 0.0); float internal_distance = _distance( fragCoord, @@ -57,11 +73,11 @@ void main() { fragCoord, v_Pos, v_Scale, - v_BorderRadius + border_radius ); float radius_alpha = - 1.0 - smoothstep(max(v_BorderRadius - 0.5, 0.0), v_BorderRadius + 0.5, d); + 1.0 - smoothstep(max(border_radius - 0.5, 0.0), border_radius + 0.5, d); gl_FragColor = vec4(mixed_color.xyz, mixed_color.w * radius_alpha); } |