float edge(vec2 a, vec2 b, vec2 p) {
return (b.x - a.x) * (p.y - a.y) - (b.y - a.y) * (p.x - a.x);
}
float segment(vec2 p, vec2 a, vec2 b) {
vec2 pa = p - a, ba = b - a;
float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);
return length(pa - ba * h);
}
void main() {
float cellSize = uResolution.x / 18.000;
vec2 p = gl_FragCoord.xy / cellSize;
vec2 center = floor(p) + 0.5;
vec2 size = uResolution / cellSize;
vec2 A = vec2(0.10, 0.12) * size;
vec2 B = vec2(0.90, 0.30) * size;
vec2 C = vec2(0.450, 0.90) * size;
float area = edge(A, B, C);
float w0 = edge(B, C, center) / area;
float w1 = edge(C, A, center) / area;
float w2 = edge(A, B, center) / area;
float covered = step(0.0, min(w0, min(w1, w2)));
vec3 mixed = w0 * vec3(1.0, 0.35, 0.3) + w1 * vec3(0.3, 0.85, 0.5) + w2 * vec3(0.3, 0.55, 1.0);
vec3 fill = mix(vec3(0.96, 0.43, 0.30), mixed, 0.000);
vec3 color = mix(vec3(0.06, 0.10, 0.14), fill, covered);
vec2 local = fract(p);
float gridLine = step(0.93, max(local.x, local.y));
color = mix(color, vec3(0.3, 0.38, 0.42), gridLine * 0.5);
color = mix(color, vec3(1.0), (1.0 - smoothstep(0.06, 0.1, length(local - 0.5))) * 0.6);
float outline = min(segment(p, A, B), min(segment(p, B, C), segment(p, C, A)));
color = mix(color, vec3(1.0, 0.85, 0.4), (1.0 - smoothstep(0.02, 0.07, outline)) * 1.000);
gl_FragColor = vec4(color, 1.0);
}