summaryrefslogtreecommitdiffstats
path: root/glow/src/shader
diff options
context:
space:
mode:
authorLibravatar shan <shankern@protonmail.com>2022-09-29 10:52:58 -0700
committerLibravatar shan <shankern@protonmail.com>2022-09-29 11:15:35 -0700
commit40f45d7b7e35dd4937abe6b5ce16b6256b4f1eeb (patch)
tree38ffc5dd6bae5da4da3b93664dfe27e024dfa261 /glow/src/shader
parent97f385e093711c269df315b28f76e66e0220e22a (diff)
downloadiced-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')
-rw-r--r--glow/src/shader/common/gradient.frag48
-rw-r--r--glow/src/shader/common/triangle.frag4
-rw-r--r--glow/src/shader/common/triangle.vert6
3 files changed, 52 insertions, 6 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
diff --git a/glow/src/shader/common/triangle.frag b/glow/src/shader/common/triangle.frag
index e8689f2e..0ee65239 100644
--- a/glow/src/shader/common/triangle.frag
+++ b/glow/src/shader/common/triangle.frag
@@ -11,8 +11,8 @@ out vec4 fragColor;
#define gl_FragColor fragColor
#endif
-in vec4 v_Color;
+uniform vec4 color;
void main() {
- gl_FragColor = v_Color;
+ fragColor = color;
} \ No newline at end of file
diff --git a/glow/src/shader/common/triangle.vert b/glow/src/shader/common/triangle.vert
index d0494a5f..09a4e324 100644
--- a/glow/src/shader/common/triangle.vert
+++ b/glow/src/shader/common/triangle.vert
@@ -1,11 +1,9 @@
uniform mat4 u_Transform;
in vec2 i_Position;
-in vec4 i_Color;
-
-out vec4 v_Color;
+out vec2 raw_position;
void main() {
gl_Position = u_Transform * vec4(i_Position, 0.0, 1.0);
- v_Color = i_Color;
+ raw_position = i_Position;
} \ No newline at end of file