diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-02-21 21:27:44 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-02-21 22:15:21 +0400 |
| commit | 48f0f6fb3ceb68fdb559ab38c8dcbb7b9ba3a13e (patch) | |
| tree | d71dbc10132f38f59e4a72d1d8a509102f701f8c /src/render_helpers/shaders/gradient_border.frag | |
| parent | 340bac0690972ee6f6badc8d386162320d70b7bd (diff) | |
| download | niri-48f0f6fb3ceb68fdb559ab38c8dcbb7b9ba3a13e.tar.gz niri-48f0f6fb3ceb68fdb559ab38c8dcbb7b9ba3a13e.tar.bz2 niri-48f0f6fb3ceb68fdb559ab38c8dcbb7b9ba3a13e.zip | |
Implement gradient borders
Diffstat (limited to 'src/render_helpers/shaders/gradient_border.frag')
| -rw-r--r-- | src/render_helpers/shaders/gradient_border.frag | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/render_helpers/shaders/gradient_border.frag b/src/render_helpers/shaders/gradient_border.frag new file mode 100644 index 00000000..354968cf --- /dev/null +++ b/src/render_helpers/shaders/gradient_border.frag @@ -0,0 +1,46 @@ +precision mediump float; +uniform float alpha; +#if defined(DEBUG_FLAGS) +uniform float tint; +#endif +uniform vec2 size; +varying vec2 v_coords; + +uniform vec4 color_from; +uniform vec4 color_to; +uniform float angle; +uniform vec2 gradient_offset; +uniform float gradient_width; +uniform float gradient_total; + +#define FRAC_PI_2 1.57079632679 +#define PI 3.14159265359 +#define FRAC_3_PI_2 4.71238898038 +#define TAU 6.28318530718 + +void main() { + vec2 coords = v_coords * size + gradient_offset; + + if ((FRAC_PI_2 <= angle && angle < PI) || (FRAC_3_PI_2 <= angle && angle < TAU)) + coords.x -= gradient_width; + + float frag_angle = FRAC_PI_2; + if (coords.x != 0.0) + frag_angle = atan(coords.y, coords.x); + + float angle_frag_to_grad = frag_angle - angle; + + float frac = cos(angle_frag_to_grad) * length(coords) / gradient_total; + if (PI <= angle) + frac += 1.0; + frac = clamp(frac, 0.0, 1.0); + + vec4 out_color = mix(color_from, color_to, frac); + +#if defined(DEBUG_FLAGS) + if (tint == 1.0) + out_color = vec4(0.0, 0.3, 0.0, 0.2) + out_color * 0.8; +#endif + + gl_FragColor = out_color; +} |
