diff options
Diffstat (limited to 'glow/src/shader/compatibility')
| -rw-r--r-- | glow/src/shader/compatibility/quad.frag | 24 | ||||
| -rw-r--r-- | glow/src/shader/compatibility/quad.vert | 12 | 
2 files changed, 27 insertions, 9 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);  } 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( | 
