float TAU = 6.283185307;

float sdEquilateralTriangle( in vec2 p, in float r )
{
    const float k = sqrt(3.0);
    p.x = abs(p.x) - r;
    p.y = p.y + r/k;
    if( p.x+k*p.y>0.0 ) p = vec2(p.x-k*p.y,-k*p.x-p.y)/2.0;
    p.x -= clamp( p.x, -2.0*r, 0.0 );
    return -length(p)*sign(p.y);
}

float mirror(in float val, in float period){

    return abs(mod(length(val), 2.0 * period) - period)/period;
}


vec3 shuffle( in vec3 uv, in float s){
    float rad1 = sin(iTime*4.0 * s);
    vec2 centre1 = (vec2(sin(iTime * s), cos(iTime * s)) * rad1);

    float rad2 = sin(s * iTime*4.0 + TAU/3.0);
    vec2 centre2 = (vec2(sin(s * iTime + TAU/3.0), cos(s * iTime + TAU/3.0)) * rad2);
    float rad3 = sin(s * iTime*4.0 - TAU/1.5);
    vec2 centre3 = (vec2(sin(s * iTime + TAU/1.5), cos(s * iTime + TAU/1.5)) * rad3);

    vec3 uv2 = vec3(0.0);
    uv2.x = mirror(length(uv.yz - centre1), 1.0);
    uv2.y = mirror(length(uv.xz - centre2), 1.0);
    uv2.z = mirror(length(uv.xy - centre3), 1.0);


    float circles_xy = mirror(sdEquilateralTriangle(uv2.xy, 0.5), 1.0);
    float circles_yz = mirror(sdEquilateralTriangle(uv2.yz, 0.5), 1.0);
    float circles_zx = mirror(sdEquilateralTriangle(uv2.zx, 0.5), 1.0);
    return vec3(circles_xy, circles_yz, circles_zx);
}




void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = fragCoord/iResolution.xy;
    uv = (uv - vec2(0.5)) * 2.0 * vec2(iResolution.x/iResolution.y, 1.0);


    float spd = 0.2;

    // Time varying pixel color
    //vec3 col = 0.5 + 0.5*cos(iTime+uv.xyx+vec3(0,2,4));
    float rad1 = sin(spd * iTime*4.0);
    vec2 centre1 = (vec2(sin(spd * iTime), cos(spd * iTime)) * rad1);

    float rad2 = sin(spd * iTime*4.0 + TAU/3.0);
    vec2 centre2 = (vec2(sin(spd * iTime + TAU/3.0), cos(spd * iTime + TAU/3.0)) * rad2);
    float rad3 = sin(spd * iTime*4.0 - TAU/1.5);
    vec2 centre3 = (vec2(sin(spd * iTime + TAU/1.5), cos(spd * iTime + TAU/1.5)) * rad3);

    vec3 uv2 = vec3(0.0);
    uv2.x = mirror(length(uv - centre1), 1.0);
    uv2.y = mirror(length(uv - centre2), 1.0);
    uv2.z = mirror(length(uv - centre3), 1.0);

    vec3 out1 = shuffle(uv2, 0.05);

    out1 = shuffle(out1.zyx, 0.30);
    out1 = shuffle(out1.xyz, 0.05);
    out1 = shuffle(out1.xzy, 0.15);

    // Output to screen
    fragColor = vec4(mix(out1, uv2, 0.0), 1.0);
    //fragColor = vec4(uv2, 1.0);
}

