diff options
Diffstat (limited to 'include/sway/desktop/shaders.h')
-rw-r--r-- | include/sway/desktop/shaders.h | 64 |
1 files changed, 61 insertions, 3 deletions
diff --git a/include/sway/desktop/shaders.h b/include/sway/desktop/shaders.h index 53b7f464..a5ff3d5f 100644 --- a/include/sway/desktop/shaders.h +++ b/include/sway/desktop/shaders.h @@ -1,6 +1,8 @@ #ifndef _SWAY_SHADERS_H #define _SWAY_SHADERS_H +#include <GLES2/gl2.h> + // Colored quads const GLchar quad_vertex_src[] = "uniform mat3 proj;\n" @@ -53,7 +55,7 @@ const GLchar tex_fragment_src_rgba[] = " vec2 corner_distance = min(gl_FragCoord.xy - position, position + vec2(width, height) - gl_FragCoord.xy);\n" " if (max(corner_distance.x, corner_distance.y) < radius) {\n" " float d = radius - distance(corner_distance, vec2(radius, radius));\n" -" float smooth = smoothstep(-1.0f, 1.0f, d);\n" +" float smooth = smoothstep(-1.0f, 0.5f, d);\n" " gl_FragColor = mix(vec4(0), gl_FragColor, smooth);\n" " }\n" "}\n"; @@ -74,7 +76,7 @@ const GLchar tex_fragment_src_rgbx[] = " vec2 corner_distance = min(gl_FragCoord.xy - position, position + vec2(width, height) - gl_FragCoord.xy);\n" " if (max(corner_distance.x, corner_distance.y) < radius) {\n" " float d = radius - distance(corner_distance, vec2(radius, radius));\n" -" float smooth = smoothstep(-1.0f, 1.0f, d);\n" +" float smooth = smoothstep(-1.0f, 0.5f, d);\n" " gl_FragColor = mix(vec4(0), gl_FragColor, smooth);\n" " }\n" "}\n"; @@ -96,9 +98,65 @@ const GLchar tex_fragment_src_external[] = " vec2 corner_distance = min(gl_FragCoord.xy - position, position + vec2(width, height) - gl_FragCoord.xy);\n" " if (max(corner_distance.x, corner_distance.y) < radius) {\n" " float d = radius - distance(corner_distance, vec2(radius, radius));\n" -" float smooth = smoothstep(-1.0f, 1.0f, d);\n" +" float smooth = smoothstep(-1.0f, 0.5f, d);\n" " gl_FragColor = mix(vec4(0), gl_FragColor, smooth);\n" " }\n" "}\n"; +const GLchar corner_fragment_src[] = +"precision mediump float;\n" +"varying vec4 v_color;\n" +"varying vec2 v_texcoord;\n" +"\n" +"uniform bool is_top_left;\n" +"uniform bool is_top_right;\n" +"uniform bool is_bottom_left;\n" +"uniform bool is_bottom_right;\n" +"\n" +"uniform float width;\n" +"uniform float height;\n" +"uniform vec2 position;\n" +"uniform float radius;\n" +"uniform float thickness;\n" +"\n" +"float roundedBoxSDF(vec2 center, vec2 size, float radius) {\n" +" return length(max(abs(center) - size + radius, 0.0)) - radius;\n" +"}\n" +"\n" +"void main() {\n" +" gl_FragColor = v_color;\n" +" vec2 size = vec2(width, height);\n" +" vec2 pos = vec2(position.x - (width + thickness) * 0.5, position.y -\n" +" (width + thickness) * 0.5);\n" +" vec2 rel_pos = gl_FragCoord.xy - pos - size - thickness * 0.5;\n" +"\n" +" float distance = roundedBoxSDF(\n" +" rel_pos,\n" // Center +" (size - thickness) * 0.5,\n" // Size +" radius + thickness * 0.5\n" // Radius +" );\n" +"\n" +" float smoothedAlphaOuter = 1.0 - smoothstep(-1.0, 1.0, distance - thickness * 0.5);\n" + // Creates a inner circle that isn't as anti-aliased as the outer ring +" float smoothedAlphaInner = 1.0 - smoothstep(-1.0, 0.5, distance + thickness * 0.5);\n" +" gl_FragColor = mix(vec4(0), gl_FragColor, smoothedAlphaOuter - smoothedAlphaInner);\n" +"\n" +// top left +" if (is_top_left && (rel_pos.y > 0.0 || rel_pos.x > 0.0)) {\n" +" discard;\n" +" }\n" +// top right +" else if (is_top_right && (rel_pos.y > 0.0 || rel_pos.x < 0.0)) {\n" +" discard;\n" +" }\n" +// bottom left +" else if (is_bottom_left && (rel_pos.y < 0.0 || rel_pos.x > 0.0)) {\n" +" discard;\n" +" }\n" +// bottom right +" else if (is_bottom_right && (rel_pos.y < 0.0 || rel_pos.x < 0.0)) {\n" +" discard;\n" +" }\n" +"}\n"; + #endif |