diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-05-01 19:06:08 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-05-02 14:27:53 +0400 |
| commit | 42cef79c699c0f03b4bb99c4278169c48d9a5bd0 (patch) | |
| tree | 630d18b49f3d93603a79bcfc5734dc773c6d0cb6 /src/render_helpers/shaders/resize_prelude.frag | |
| parent | d86df5025cfd26ef4a3c48acd8ee80555265ee53 (diff) | |
| download | niri-42cef79c699c0f03b4bb99c4278169c48d9a5bd0.tar.gz niri-42cef79c699c0f03b4bb99c4278169c48d9a5bd0.tar.bz2 niri-42cef79c699c0f03b4bb99c4278169c48d9a5bd0.zip | |
Implement rounded window corners
Diffstat (limited to 'src/render_helpers/shaders/resize_prelude.frag')
| -rw-r--r-- | src/render_helpers/shaders/resize_prelude.frag | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/render_helpers/shaders/resize_prelude.frag b/src/render_helpers/shaders/resize_prelude.frag new file mode 100644 index 00000000..5c052277 --- /dev/null +++ b/src/render_helpers/shaders/resize_prelude.frag @@ -0,0 +1,51 @@ +precision mediump float; + +#if defined(DEBUG_FLAGS) +uniform float niri_tint; +#endif + +varying vec2 niri_v_coords; +uniform vec2 niri_size; + +uniform mat3 niri_input_to_curr_geo; +uniform mat3 niri_curr_geo_to_prev_geo; +uniform mat3 niri_curr_geo_to_next_geo; +uniform vec2 niri_curr_geo_size; + +uniform sampler2D niri_tex_prev; +uniform mat3 niri_geo_to_tex_prev; + +uniform sampler2D niri_tex_next; +uniform mat3 niri_geo_to_tex_next; + +uniform float niri_progress; +uniform float niri_clamped_progress; + +uniform vec4 niri_corner_radius; +uniform float niri_clip_to_geometry; + +uniform float niri_alpha; + +float niri_rounding_alpha(vec2 coords, vec2 size) { + vec2 center; + float radius; + + if (coords.x < niri_corner_radius.x && coords.y < niri_corner_radius.x) { + radius = niri_corner_radius.x; + center = vec2(radius, radius); + } else if (size.x - niri_corner_radius.y < coords.x && coords.y < niri_corner_radius.y) { + radius = niri_corner_radius.y; + center = vec2(size.x - radius, radius); + } else if (size.x - niri_corner_radius.z < coords.x && size.y - niri_corner_radius.z < coords.y) { + radius = niri_corner_radius.z; + center = vec2(size.x - radius, size.y - radius); + } else if (coords.x < niri_corner_radius.w && size.y - niri_corner_radius.w < coords.y) { + radius = niri_corner_radius.w; + center = vec2(radius, size.y - radius); + } else { + return 1.0; + } + + float dist = distance(coords, center); + return 1.0 - smoothstep(radius - 0.5, radius + 0.5, dist); +} |
