49 lines
1.9 KiB
GLSL
49 lines
1.9 KiB
GLSL
|
|
precision highp float;
|
|
|
|
uniform float alpha;
|
|
uniform vec4 clip_rect;
|
|
uniform float radius;
|
|
uniform float border_width;
|
|
uniform vec4 border_color;
|
|
uniform vec4 border_color_to;
|
|
uniform vec4 gradient_line;
|
|
uniform vec4 focus_color;
|
|
uniform vec4 focus_color_to;
|
|
uniform vec4 focus_gradient_line;
|
|
uniform float focus_mix;
|
|
varying vec2 v_coords;
|
|
|
|
#if defined(DEBUG_FLAGS)
|
|
uniform float tint;
|
|
#endif
|
|
|
|
//_CORNERS_
|
|
|
|
void main() {
|
|
float signed_distance = rounded_rect_distance(gl_FragCoord.xy, clip_rect, radius);
|
|
float outer_coverage = edge_coverage(signed_distance);
|
|
|
|
vec2 inner_size = max(clip_rect.zw - vec2(2.0 * border_width), vec2(0.0));
|
|
vec4 inner_rect = vec4(clip_rect.xy + (clip_rect.zw - inner_size) * 0.5, inner_size);
|
|
float inner_radius = max(radius - border_width, 0.0);
|
|
float inner_coverage = edge_coverage(rounded_rect_distance(gl_FragCoord.xy, inner_rect, inner_radius));
|
|
float coverage = max(outer_coverage - inner_coverage, 0.0);
|
|
float progress = clamp(dot(gl_FragCoord.xy - gradient_line.xy, gradient_line.zw), 0.0, 1.0);
|
|
// Interpolate premultiplied endpoints: a transparent endpoint must not
|
|
// leak its RGB into the visible border or create a dark halo.
|
|
vec4 from = vec4(border_color.rgb * border_color.a, border_color.a);
|
|
vec4 to = vec4(border_color_to.rgb * border_color_to.a, border_color_to.a);
|
|
float focus_progress = clamp(dot(gl_FragCoord.xy - focus_gradient_line.xy, focus_gradient_line.zw), 0.0, 1.0);
|
|
vec4 focus_from = vec4(focus_color.rgb * focus_color.a, focus_color.a);
|
|
vec4 focus_to = vec4(focus_color_to.rgb * focus_color_to.a, focus_color_to.a);
|
|
vec4 color = mix(mix(from, to, progress), mix(focus_from, focus_to, focus_progress), focus_mix) * coverage * alpha;
|
|
|
|
#if defined(DEBUG_FLAGS)
|
|
if (tint == 1.0)
|
|
color = vec4(0.0, 0.2, 0.0, 0.2) + color * 0.8;
|
|
#endif
|
|
|
|
gl_FragColor = color;
|
|
}
|