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

mat3 rotate3D(float theta, vec3 axis){
    axis=normalize(axis);
    float c=cos(theta);
    vec3 s=axis*sin(theta),r=axis*(1.-c);
    return
        mat3(axis.x*r,axis.y*r,axis.z*r)+
        mat3(c,s.z,-s.y,-s.z,c,s.x,s.y,-s.x,c);
}


#define hsv(h,s,v) mix(vec3(1),clamp((abs(fract((h)+vec3(3,2,1)/3.)*6.-3.)-1.),0.,1.),(s))*(v)
#define r iResolution.xy
#define t iTime

void mainImage( out vec4 O, in vec2 C )
{
    O=vec4(0);
    // つぶやきGLSL -> https://twitter.com/gaziya5/status/1502426596124545028
    vec4 p=vec4(0);
    float e,s=1.,g,j=0.;
    for(int i=0;i<450;)
        p=i++%5<1?
            g+=e=length(p.wy)/s,
            O.rgb+=hsv(log(s)*.4,.4,.02/exp(.3*j*j*e)),
            j++,
            s=2.,
            vec4(vec3((C-r*.5)/r.y*g,g-.2)*rotate3D(t*.5,r.xxy),.1)
        :
            (
            p=.1-abs(p-.1),
            s*=e=max(1./dot(p,p),1.1),
            abs(p.x<p.y?p.wzxy:p.wzyx)*e-.7)
        ;
        O*=O*O;
}
