blob: b52c05dc0e5d88dd61ee1bcc4106e7f026975dc9 [file] [log] [blame]
@ctype mat4 rive::Mat4
@ctype vec2 rive::Vec2D
@vs vs
uniform vs_params {
mat4 mvp;
};
in vec2 position;
in vec2 texcoord0;
out vec2 uv;
void main() {
gl_Position = mvp * vec4(position.x, position.y, 0.0, 1.0);
uv = texcoord0;
}
@end
@fs fs
uniform sampler2D tex;
in vec2 uv;
out vec4 frag_color;
void main() {
frag_color = texture(tex, uv);
}
@end
@program rive_tess vs fs
@vs vs_path
uniform vs_path_params {
mat4 mvp;
int fillType;
vec2 gradientStart;
vec2 gradientEnd;
};
in vec2 position;
out vec2 gradient_uv;
void main() {
gl_Position = mvp * vec4(position, 0.0, 1.0);
if(fillType == 1) {
// Linear gradient.
vec2 toEnd = gradientEnd - gradientStart;
float lengthSquared = toEnd.x * toEnd.x + toEnd.y * toEnd.y;
gradient_uv.x = dot(position - gradientStart, toEnd) / lengthSquared;
}
else if(fillType == 2) {
// fillType == 2 (Radial gradient)
gradient_uv = (position - gradientStart) / distance(gradientStart, gradientEnd);
}
}
@end
@fs fs_path
uniform fs_path_uniforms {
int fillType;
vec4 colors[16];
vec4 stops[4];
int stopCount;
};
in vec2 gradient_uv;
out vec4 frag_color;
void main() {
if (fillType == 0) {
// Solid color.
frag_color = colors[0];
}
else {
float f = fillType == 1 ? gradient_uv.x : length(gradient_uv);
vec4 color =
mix(colors[0], colors[1], smoothstep(stops[0][0], stops[0][1], f));
for (int i = 1; i < 15; ++i)
{
if (i >= stopCount - 1)
{
break;
}
color = mix(color,
colors[i + 1],
smoothstep(stops[i/4][i%4], stops[(i+1)/4][(i+1)%4], f));
}
frag_color = color;
}
}
@end
@program rive_tess_path vs_path fs_path