| @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 |