diff options
author | 2022-09-29 10:52:58 -0700 | |
---|---|---|
committer | 2022-09-29 11:15:35 -0700 | |
commit | 40f45d7b7e35dd4937abe6b5ce16b6256b4f1eeb (patch) | |
tree | 38ffc5dd6bae5da4da3b93664dfe27e024dfa261 /glow/src/shader/common/gradient.frag | |
parent | 97f385e093711c269df315b28f76e66e0220e22a (diff) | |
download | iced-40f45d7b7e35dd4937abe6b5ce16b6256b4f1eeb.tar.gz iced-40f45d7b7e35dd4937abe6b5ce16b6256b4f1eeb.tar.bz2 iced-40f45d7b7e35dd4937abe6b5ce16b6256b4f1eeb.zip |
Adds linear gradient support to 2D meshes in the canvas widget.
Diffstat (limited to 'glow/src/shader/common/gradient.frag')
-rw-r--r-- | glow/src/shader/common/gradient.frag | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/glow/src/shader/common/gradient.frag b/glow/src/shader/common/gradient.frag new file mode 100644 index 00000000..588f63e0 --- /dev/null +++ b/glow/src/shader/common/gradient.frag @@ -0,0 +1,48 @@ +// GLSL does not support dynamically sized arrays without SSBOs +#define MAX_STOPS 64 + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#endif + +#ifdef HIGHER_THAN_300 +layout (location = 0) out vec4 fragColor; +#define gl_FragColor fragColor +#endif + +in vec2 raw_position; + +uniform vec2 gradient_start; +uniform vec2 gradient_end; + +uniform uint color_stops_size; +uniform float color_stop_offsets[MAX_STOPS]; +uniform vec4 color_stop_colors[MAX_STOPS]; + +void main() { + vec2 gradient_vec = vec2(gradient_end - gradient_start); + vec2 current_vec = vec2(raw_position.xy - gradient_start); + vec2 unit = normalize(gradient_vec); + float coord_offset = dot(unit, current_vec) / length(gradient_vec); + + for (uint i = 0; i < color_stops_size - 1; i++) { + float stop_offset = color_stop_offsets[i]; + float next_stop_offset = color_stop_offsets[i + 1]; + + if (stop_offset <= coord_offset && coord_offset <= next_stop_offset) { + fragColor = mix(color_stop_colors[i], color_stop_colors[i+1], smoothstep( + stop_offset, + next_stop_offset, + coord_offset + )); + } else if (coord_offset < color_stop_offsets[0]) { + fragColor = color_stop_colors[0]; + } else if (coord_offset > color_stop_offsets[color_stops_size - 1]) { + fragColor = color_stop_colors[color_stops_size - 1]; + } + } +}
\ No newline at end of file |