#define chanfro(a)  dot(cos(a + vec2(0, -11.)), q.xy)
#define wmod(p, w) mod(p, w) - w/2.
#define rot(a) mat2(cos(a + vec4(0, 11, 33, 0)))
#define cor    (cos(id * 6. + vec4(0, 23, 21, 0)) + (i/5.)) / 90.
#define t      iTime
#define PI     3.1415

float id;
float tambor(vec3 p, float a, float b){
    float s, r = 1.;
    vec3 k, q = p;

    id = wmod(atan(p.x, p.y) + a, PI / 3.);

    s = length(                 //domain
            q.xy = cos(
                       wmod(
                           atan(p.x, p.y) + a,
                           PI / 3.
                       ) + vec2(0, 11)
                   ) * length(p.xy)
                   - vec2(b, 0)) - r;   // cyl

    s = max(s, abs(q.z) - 1.); // size

    k = abs( // chanfro hexa
            vec3(
                dot(cos(a +    PI/3. + vec2(0, -11.)), q.xy),
                dot(cos(a + 2.*PI/3. + vec2(0, -11.)), q.xy),
                dot(cos(a +    PI    + vec2(0, -11.)), q.xy)
            ));

    return max(s,
               max(k.x, max(k.y, k.z))
                    + cos(7. * t) * .1 - .4);
}


float map(vec3 p) {
    float s = 1., d, l;

    // rot
    p.z -= 3.5;
    p.zy *= rot((t * 1.7) * .7);
    p.xz *= rot((t * 1.5) * .7);

    // map in 2 fases
    s = min(
            tambor(p, 0., 2.),
            tambor(p, PI/2., sqrt(3.))
        );

    // glass
    return abs(s) - .005;
}


void mainImage(out vec4 o, vec2 u) {
    float d = 1., s, i; o *= 0.;

    vec3 R = iResolution,
         rd = vec3((u.xy - R.xy * .5) / R.y, 1), p;

    while(i++ < 34.)
        s = map(p),
        d += max(s, 7e-3),
        p = d * rd,
        p.z += -2.5,
        s < .003 ? o += .003 / d * i + cor : o;
}
