#define TAU 6.28318530718

float circle(vec2 uv) {
    return sqrt(dot(uv, uv));
}

float diamond(vec2 uv) {
    return abs(uv.x) + abs(uv.y);
}

float triangle(vec2 uv) {
    float radius = sqrt(dot(uv, uv));

    vec2 unitVector = vec2(0.0, 0.0);
    float angle = mod(atan(uv.y, uv.x) + TAU / 2.0, TAU);

    float ptRight = TAU - (TAU / 6.0);
    float ptTop = mod(TAU - (TAU / 6.0) + TAU / 3.0, TAU);
    float ptLeft = mod(TAU - (TAU / 6.0) + TAU * 2.0 / 3.0, TAU);

    if ((angle > ptRight && angle < TAU) || (angle > 0.0 && angle < ptTop)) {
        unitVector = vec2(cos(ptLeft), sin(ptLeft));
    } else if (angle > ptTop && angle < ptLeft) {
        unitVector = vec2(cos(ptRight), sin(ptRight));
    } else if (angle > ptLeft && angle < ptRight) {
        unitVector = vec2(cos(ptTop), sin(ptTop));
    }

    return dot(unitVector, uv);
}

float channel(float value, float power, float threshold) {
    return mod(pow(value, power), threshold) / threshold;
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    float threshold = iTime * 10.0;
    vec2 uv = fragCoord * 2.0 - iResolution.xy;

    float r = channel(circle(uv), 1.8, threshold);
    float g = channel(triangle(uv), 1.8, threshold);
    float b = channel(diamond(uv), 1.8, threshold);

    float enableR = 1.0;
    float enableG = 0.0;
    float enableB = 0.0;

    fragColor = vec4(r * enableR, g * enableG, b * enableB, 1.0);
}