From dcec3fd792cf422aef7a7217ec7f0311fbd12390 Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Tue, 8 Nov 2022 04:50:26 +0100
Subject: Fix `compatibility::quad` pipeline in `iced_glow`

---
 glow/src/shader/compatibility/quad.frag | 24 ++++++++++++++++++++----
 glow/src/shader/compatibility/quad.vert | 12 +++++++-----
 2 files changed, 27 insertions(+), 9 deletions(-)

(limited to 'glow/src/shader/compatibility')

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);
 }
diff --git a/glow/src/shader/compatibility/quad.vert b/glow/src/shader/compatibility/quad.vert
index abe70c0e..89931f06 100644
--- a/glow/src/shader/compatibility/quad.vert
+++ b/glow/src/shader/compatibility/quad.vert
@@ -5,7 +5,7 @@ attribute vec2 i_Pos;
 attribute vec2 i_Scale;
 attribute vec4 i_Color;
 attribute vec4 i_BorderColor;
-attribute float i_BorderRadius;
+attribute vec4 i_BorderRadius;
 attribute float i_BorderWidth;
 attribute vec2 q_Pos;
 
@@ -13,7 +13,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;
 
 
@@ -21,9 +21,11 @@ void main() {
     vec2 p_Pos = i_Pos * u_Scale;
     vec2 p_Scale = i_Scale  * u_Scale;
 
-    float i_BorderRadius = min(
-        i_BorderRadius,
-        min(i_Scale.x, i_Scale.y) / 2.0
+    vec4 i_BorderRadius = vec4(
+        min(i_BorderRadius.x, min(i_Scale.x, i_Scale.y) / 2.0),
+        min(i_BorderRadius.y, min(i_Scale.x, i_Scale.y) / 2.0),
+        min(i_BorderRadius.z, min(i_Scale.x, i_Scale.y) / 2.0),
+        min(i_BorderRadius.w, min(i_Scale.x, i_Scale.y) / 2.0)
     );
 
     mat4 i_Transform = mat4(
-- 
cgit