forked from AuroraMiddleware/gtk
900a4e4d31
Move the resources of each renderer to its subdirectory. We've previously done that for the ngl renderer, but it is better to be consistent and do it for all the renderers.
75 lines
1.7 KiB
GLSL
75 lines
1.7 KiB
GLSL
// VERTEX_SHADER
|
|
uniform vec4 u_geometry;
|
|
|
|
_NOPERSPECTIVE_ _OUT_ vec2 coord;
|
|
|
|
void main() {
|
|
gl_Position = u_projection * (u_modelview * vec4(aPosition, 0.0, 1.0));
|
|
|
|
vec2 mv0 = u_modelview[0].xy;
|
|
vec2 mv1 = u_modelview[1].xy;
|
|
vec2 offset = aPosition - u_geometry.xy;
|
|
vec2 dir = vec2(dot(mv0, offset),
|
|
dot(mv1, offset));
|
|
|
|
coord = dir * u_geometry.zw;
|
|
}
|
|
|
|
// FRAGMENT_SHADER:
|
|
#ifdef GSK_LEGACY
|
|
uniform int u_num_color_stops;
|
|
#else
|
|
uniform highp int u_num_color_stops;
|
|
#endif
|
|
|
|
uniform bool u_repeat;
|
|
uniform vec2 u_range;
|
|
uniform float u_color_stops[6 * 5];
|
|
|
|
_NOPERSPECTIVE_ _IN_ vec2 coord;
|
|
|
|
float get_offset(int index) {
|
|
return u_color_stops[5 * index];
|
|
}
|
|
|
|
vec4 get_color(int index) {
|
|
int base = 5 * index + 1;
|
|
|
|
return vec4(u_color_stops[base],
|
|
u_color_stops[base + 1],
|
|
u_color_stops[base + 2],
|
|
u_color_stops[base + 3]);
|
|
}
|
|
|
|
void main() {
|
|
// Reverse scale
|
|
float offset = length(coord) * u_range.x + u_range.y;
|
|
|
|
if (u_repeat) {
|
|
offset = fract(offset);
|
|
}
|
|
|
|
if (offset < get_offset(0)) {
|
|
gskSetOutputColor(gsk_scaled_premultiply(get_color(0), u_alpha));
|
|
return;
|
|
}
|
|
|
|
int n = u_num_color_stops - 1;
|
|
for (int i = 0; i < n; i++) {
|
|
float curr_offset = get_offset(i);
|
|
float next_offset = get_offset(i + 1);
|
|
|
|
if (offset >= curr_offset && offset < next_offset) {
|
|
float f = (offset - curr_offset) / (next_offset - curr_offset);
|
|
vec4 curr_color = gsk_premultiply(get_color(i));
|
|
vec4 next_color = gsk_premultiply(get_color(i + 1));
|
|
vec4 color = mix(curr_color, next_color, f);
|
|
|
|
gskSetOutputColor(color * u_alpha);
|
|
return;
|
|
}
|
|
}
|
|
|
|
gskSetOutputColor(gsk_scaled_premultiply(get_color(n), u_alpha));
|
|
}
|