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

void mainImage( out vec4 o, in vec2 FC )
{
    float i,j,d=.3,e; vec3 p;
    o=vec4(0.);
    for(i=0.;i++<64.&&d>1e-4;){
        p=vec3((FC.xy-.5*iResolution.xy)/iResolution.y,e);
        p.z-=4.;p*=rotate3D(iTime*.5,vec3(-1));
        for(j=0.;j++<6.;){
            p=abs(abs(p)-.04)-.1,
            d=max(max(p.x,p.y),p.z)-.1,
            d-=min(min(p.y,p.x),p.z-.05)/.6,
            d-=dot(p,p)/d*.01;
        }e+=d;
    }o+=vec4(exp(p*j),2)*4./i;
}
