/**
    License: Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License

    Inércia Shader Royale
    30 min - then elimination begins, lasted 3 rounds..#12

    11/4/22 | byt3_m3chanic

*/

#define R iResolution
#define T iTime

mat2 rot(float a){return mat2(cos(a),sin(a),-sin(a),cos(a));}
float hash21(vec2 a){return fract(sin(dot(a,vec2(32.232,21.232)))*2323.23);}
float smp(float a){return texture(iChannel0,vec2(a,.1)).x;}
vec3 gid,sid;
float glow =0.;
vec2 map(vec3 p, float a) {
    vec2 res=vec2(1e5,0.);
    vec3 o=p,i=p;
    float k=5./dot(o,o);
    o*=k;

    float tt = .5+.5*sin(T*.2);
    p=mix(p,o,tt);

    p.z-=T*1.5;

    vec3 id = floor((p+1.)/2.);
    float hs=hash21(id.xy+id.z);gid=id;
    float ss = (smp(mod(id.z*.05,1.))*.25)+.001;
    p=mod(p+1.,2.)-1.;

    vec2 q=vec2(length(p.xy)-.5,p.z);
    float d = length(q)-ss;

    vec3 w=p;

    float dt = length(abs(w.xy)-.5)-.075;
    dt=min(length(abs(w.xz)-.5)-.075,dt);
    dt=min(length(abs(w.yz)-.5)-.075,dt);

    float tm = .75+.25*cos(T*.2);
    dt=mix(1.,dt,tm);
    if(dt<res.x) res=vec2(dt,1.);
    if(d<res.x) res=vec2(d,1.);

    bool check=id.x==0.&&id.y==0.;
    float l = length(p)-.05;
    if(l<res.x&&hs>.6&&!check) res=vec2(l,1.);
    if(a==1.&&hs>.6&&!check) glow += .002/(.0165+l*l);

    float sx = .75+.5*sin(T*.33);
    float sp =length(i)-(.5+sx);
    if(sp<res.x) res=vec2(sp,1.);

    float ml= 1./k;
    res.x=mix(res.x,res.x*(ml/1.),tt);
    return res;
}

vec3 normal(vec3 p, float t){
    vec2 e=vec2(t*1e-3,0.);
    float d = map(p,0.).x;
    vec3 n=d-vec3(
    map(p-e.xyy,0.).x,
    map(p-e.yxy,0.).x,
    map(p-e.yyx,0.).x
    );
    return normalize(n);
}

vec3 hue(float a){return .45+.45*sin(6.*a+vec3(1,.5,.2)*vec3(2.75,1.2,.4));}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{

    vec2 uv = (2.*fragCoord-R.xy)/max(R.x,R.y);
    uv*=rot(T*.4);
    vec3 C = vec3(0),ro=vec3(0,0,5.),rd=normalize(vec3(uv,-1.));

    float tt = floor(T*.4);
    float xt= 1.015*sin(uv.x*45.+T*22.);float yt= .015*sin(uv.y*45.+T*22.);

    float hs=hash21(vec2(tt,25.));
    if(uv.x>yt&&hs>.7&&tt>12.){
        ro.xz*=rot(30.+T*.2);
        rd.xz*=rot(30.+T*.2);
    }

    hs=hash21(vec2(15,tt));
    if(uv.y>xt&&hs>.5&&tt>18.){
        ro.yz*=rot(50.+T*.1);
        rd.yz*=rot(50.+T*.1);
    }

    vec3 p = ro;
    float d=0.,m=0.;

    for(int i=0;i<132;i++){
        p=ro+d*rd;
        vec2 ray=map(p,1.);
        m=ray.y;
        ray.x=max(abs(ray.x),1e-4);
        d+=abs(ray.x*.45);
    }
    sid=gid;
    if(d<25.){
        vec3 n=normal(p,d);
        vec3 l=normalize(vec3(1,5,-5));
        float diff=clamp(dot(n,l),0.,1.);
        vec3 h = hue(n.x+n.y+n.z);

        C+=diff*h;

    }
    float ff = .5+.5*sin(T*.5);
    vec3 clr=mix(vec3(.1),hue(2.445+(uv.y+T)*.2),ff);
    C=mix(C,clr,1.-exp(-.0095*d*d*d));
    C = mix(C,vec3(glow),clamp(glow,0.,1.));

    C = pow(C,vec3(.4545));
    fragColor = vec4(C,1.0);
}
