// loop trick from https://twitter.com/zozuar/status/1483236063342698503

#define R(p,a,t) mix(a*dot(p,a),p,cos(t))+sin(t)*cross(p,a)
#define H(h,s,v) mix(vec3(1),clamp((abs(fract((h)+vec3(3,2,1)/3.)*6.-3.)-1.),0.,1.),(s))*(v)

void mainImage( out vec4 O, in vec2 C )
{
    O=vec4(0);
    vec4 p;
    vec2 r=iResolution.xy;
    float e,s=1.,g,j=0.,t=iTime;
    for(int i=0;i<490;)
        p=i++%7<1?
            g+=e=length(p.xz)*length(p.wy)/s,
            O.rgb+=H(log(s)*.4,.5,.05/exp(j*j*e)),
            j++,
            s=2.,
            vec4(R(vec3((C-r*.5)/r.y*g,g-.8),vec3(.577),t*.5),.07)
        :
            (
            s*=e=max(1./dot(p,p),1.2),
            abs(p.x<p.y?p.wzxy:p.wzyx)*e-1.2
            )
        ;
        O*=O*O;
}
