@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