#define ITER 28

mat2 rot(float a){ float s=sin(a), c=cos(a); return mat2(c,s,-s,c); }
float box(vec3 p, float r){ return length(max(abs(p)-r,0.)); }

float map(vec3 p)
{   
    float s = sin( iTime + .6*p.z )/4.;
    p.xy *= rot( s );
    p.xy += .5 + vec2( -s, s );
    
    vec3 q = abs( p-round(p) );
    float d = min(min(length(q.xy), length(q.xz)), length(q.yz)) - .01;
    d = min(d, box(q, .05));
    q = vec3(.0, ( p.xy - vec2(2.5, 0.5) ) * rot( p.z+iTime ) );
    d = min(d, box(q, .25));
    
    return d;
}

void mainImage( out vec4 O, vec2 U )
{
	vec3  R = iResolution.xyy,
         rd = normalize(vec3(U-.5*R.xy, R.y)),
	     ro = vec2(.0, iTime).xxy;
    
    //uint xor = ( (uint(U.x) ^ uint(U.y)) - uint(iFrame) ) % uint(R.x);
    //if(xor != 0u)discard;
    
    rd.xz *= rot(.6);
    
    float t=.0, m;
    for( int i=0; ++i < ITER; ) {
    	t += map(ro+rd*t)/2.;
    }
    
    O = vec4( cos(t*rd.z + iTime - .5),
              exp(-t/6.),
              1.-exp(-t/4.), 
              1 );
}
