/////////////////////////////////////////////////////
#define time iTime*0.1
#define pi 3.14159265
#define deg pi/180.

mat2 r2d(float a) {
    return mat2(cos(a),sin(a),-sin(a),cos(a));
}

float sdBox(vec3 p, vec3 s) {
    return max(abs(p.z)-s.z,max(abs(p.x)-s.x,abs(p.y)-s.y));
}

vec4 map(vec3 p) {
    p.z -= 2.4;
    p.yz *= r2d(iMouse.y/iResolution.y+0.);
    p.xz *= r2d(iMouse.x/iResolution.x+0.);
    p.yz *= r2d(sin(time/2.)*0.5);
    p.xz *= r2d(time*0.5);
    p = abs(p)-0.6;
    p.yz *= r2d(time);
    p.xz *= r2d(time);
    p = abs(p)-0.01;
    float di = 0.1;
    float d2 = 0.01;
    for(int i=0;i<3;i++) {
        p = abs(p)-di;
        p.yz *= r2d(time);
        p.xz *= r2d(time);
        p = abs(p)-d2;
    }
    //p.yz *= r2d(-time);
    //p.xz *= r2d(-time);
    float d = sdBox(vec3(p),vec3(0.1));
    //p.xy *= r2d(90.*deg);
    p.yz *= r2d(45.*deg);
    
    p.yz = abs(p.yz);
    p.yz *= r2d(-45.*deg);
    p.xz *= r2d(-45.*deg);
    //p.yz *= r2d(45.*deg);
    p.xz = abs(p.xz);
    p.xz *= r2d(-45.*deg);
    //p.yz *= r2d(45.*deg);
    return vec4(p.xy,p.z,d);
}

vec2 RM(vec3 ro, vec3 rd) {
    float dO = 0.;
    float ii = 0.;
    for (int i=0;i<16;i++) {
        vec3 p = ro+rd*dO;
        float dS = map(p).w;
        dO += dS;
        ii += 0.01;
        if (dO > 100. || dS < 0.001) {
            break;
        }
    }
    return vec2(dO,ii);
}

void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
    vec2 uv = fragCoord.xy / iResolution.xy;
    vec2 R = iResolution.xy;
    float ar = R.x/R.y;
    vec2 tv = uv;
    uv -= 0.5;
    uv.x *= ar;
    vec3 col = vec3(0.);
    vec3 ro = vec3(0.);
    vec3 rd = normalize(vec3(uv,1.));
    vec2 d = RM(ro,rd);
    vec3 p = ro+rd*d.x;
    vec3 mp = map(p).xyz;
    uv = mix(uv,mp.xy,1.);
    float fs = 4.;
    vec2 ov = uv;
    uv *= r2d(deg*360./6.);
    //uv.y -= uv.x/2.;
    //uv.x -= uv.y;
    //uv.y *= 1.155;
    uv.y *= 1.155;
    uv.x -= uv.y/2.;
    vec2 t1v = uv;
    vec3 trv = vec3(floor(uv.xy),floor(ov.y*fs*1.155));
    uv.y += time*trv.x;
    uv.x += time*trv.y;
    uv.x = (fract(uv.x*fs)-0.5);
    uv.y = (fract(uv.y*fs)-0.5);
    col.rg = uv.xy;
    col.b += (fract((t1v.x+t1v.y)*fs));
    col.g += sin(trv.z*20.+time*2.);
    col += sin(col*20.+d.x*0.1)*0.4;
    col += sin(col*20.+p.x*210.+d.x)*0.4;
    col = clamp(col,0.,1.);
    col *= 1.-d.x*0.2;
    fragColor = vec4(col,1.0);
}
