#define PI 3.14159265

vec3 rot(vec3 p, vec3 ax, float a){ // rotation by blackle
    ax = normalize(ax);
    return mix(dot(ax,p)*ax, p, cos(a)) + cross(ax,p)*sin(a);
}

float smin(float a, float b, float k ){
	float h = clamp(.5 + .5*(b-a)/k, 0., 1.);
	return mix(b, a, h) - k*h*(1.0-h);
}

float box(vec3 p, vec3 b){
    vec3 q = abs(p)-b;
    return length(max(q,0.)) + min(0., max(q.x, max(q.y, q.z)));
}

float sdf(vec3 p){
    p.xz += .06*sin(10.*cos(p.y+iTime)); // wobble :>
    p = rot(p, vec3(1), iTime);
    float d = box(p, vec3(1))-.2;
    
    float s = 1.;
    vec3 q = rot(p, vec3(.3,.9,.55), .37);
    q = mod(q+0.5*s, s)-0.5*s;
    d = smin(d, -length(q)+0.33*s, -0.07); // 1st set of holes
    
    q = rot(p, vec3(-.73,.14,.58), .87);
    q = mod(q+0.5*s, s)-0.5*s;
    d = smin(d, -length(q)+0.2*s, -0.07); // 2nd set of holes
    
    return d;
}

vec3 nor(vec3 p){
    vec2 e = vec2(.001,0);
    return normalize(sdf(p)-vec3(sdf(p-e.xyy),sdf(p-e.yxy),sdf(p-e.yyx)));
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = (fragCoord.xy-.5*iResolution.xy)/iResolution.y;
    vec2 puv = vec2(atan(uv.y,uv.x), length(uv)); // polar for background
    uv.x += .01*sin(20.*sin(uv.x+iTime)); // wobbling uv.x

    
    // background color
    float k = 3.*(puv.x + puv.y + sin(3.*puv.x) + iTime);
    vec3 bg = abs(sin(vec3(k, k+(PI/3.), k+(2.*PI/3.)))); // color gradient

    // isometric perspective
    vec3 ro = vec3(5.*uv,-4), rd = vec3(0,0,1), p=ro;
    bool hit = false, outline = false;
    
    for(int i=0; i<80 && !hit; i++){
        float d = sdf(p);
        hit = d<0.001;
        outline = !outline && d<0.15 ? true : outline;
        p += rd*d;
        if(distance(p,ro)>7.)break;
    }
    
    vec3 col = outline ? vec3(.4,.1,.3) : bg;
    if(hit){
        vec3 n = nor(p), l = normalize(vec3(1,2,1));
        col = mix(vec3(.8,.45,.1), vec3(.9,.9,.7), pow(.5*dot(n,l)+.5,1.5));
        col += 10.*vec3(1,.8,.1)*pow(max(dot(n,l),0.),20.);
        col += 0.75*vec3(1,0,0)*max(sdf(p-.1*l),0.); // bad subsurface scattering :(
    }
    
    fragColor = vec4(col,1);
}
