#define Rot(a) mat2(cos(a),-sin(a),sin(a),cos(a))
#define antialiasing(n) n/min(iResolution.y,iResolution.x)
#define S(d,b) smoothstep(antialiasing(1.0),b,d)
#define B(p,s) max(abs(p).x-s.x,abs(p).y-s.y)
#define Tri(p,s,a) max(-dot(p,vec2(cos(-a),sin(-a))),max(dot(p,vec2(cos(a),sin(a))),max(abs(p).x-s.x,abs(p).y-s.y)))
#define DF(a,b) length(a) * cos( mod( atan(a.y,a.x)+6.28/(b*8.0), 6.28/((b*8.0)*0.5))+(b-1.)*6.28/(b*8.0) + vec2(0,11) )
#define SkewX(a) mat2(1.0,tan(a),0.0,1.0)
#define SkewY(a) mat2(1.0,0.0,tan(a),1.0)

float SimpleVesicaDistanceY(vec2 p, float r, float d) {
    p.x = abs(p.x);
    p.x+=d;
    return length(p)-r;
}

float SimpleVesicaDistanceX(vec2 p, float r, float d) {
    p.y = abs(p.y);
    p.y+=d;
    return length(p)-r;
}

float eyeBall(vec2 p){
    vec2 prevP = p;
    p.x += sin(iTime)*0.05;
    float thickness = 0.002;
    float d = abs(length(p)-0.1)-thickness;
    float d2 = abs(length(p)-0.04)-thickness;
    d = min(d,d2);
    
    p = DF(p,6.0);
    p -= vec2(0.05);
    p*=Rot(radians(45.));
    d2 = B(p,vec2(0.001,0.015));
    d = min(d,d2);
    
    p = prevP;
    p.x += sin(iTime)*0.05;
    d2 = length(p-vec2(-0.03,0.03))-0.015;
    d = min(d,d2);
    return d;
}

float eye(vec2 p){
    p*=1.2;
    vec2 prevP = p;
    float thickness = 0.002;
    float d = eyeBall(p);
    float s = mod(iTime*0.5,2.3);
    if(s<1.){
        p.y*=1.+s;
    } else if(s>=1. && s<2.){
        p.y*=1.+2.-s;
    }
    float d2 = abs(SimpleVesicaDistanceX(p,0.21,0.1))-thickness;
    float d3 = SimpleVesicaDistanceX(p,0.21,0.1);
    d = max(d3,d);
    
    d = min(d,d2);
    return d;
}

float arrow(vec2 p){
    float d = Tri(p,vec2(0.22),radians(45.));
    float d2 =Tri(p-vec2(0.0,-0.11),vec2(0.22),radians(45.));
    d = max(-d2,d);
    return d;
}

float featherBG(vec2 p){
    p*=2.3;
    vec2 prevP = p;
    p.x*=mix(0.3,2.,smoothstep(-1.2,0.9,p.y));
    float d = SimpleVesicaDistanceY(p,0.41,0.2);
    return d;
}

float feather(vec2 p){
    p*=2.3;
    vec2 prevP = p;
    p.x*=mix(0.3,2.,smoothstep(-1.2,0.9,p.y));
    float d = abs(SimpleVesicaDistanceY(p,0.41,0.2))-0.003;
    
    p = prevP;
    float d2 = B(p-vec2(0.,-0.035),vec2(0.003,0.38));
    d = min(d,d2);
    
    p-=vec2(0.062,0.1);
    p*=Rot(radians(-30.));
    d2 = B(p,vec2(0.072,0.003));
    d = min(d,d2);
    
    p = prevP;
    p-=vec2(-0.048,0.18);
    p*=Rot(radians(30.));
    d2 = B(p,vec2(0.055,0.003));
    d = min(d,d2);    
        
    p = prevP;
    p-=vec2(0.079,-0.03);
    p*=Rot(radians(-30.));
    d2 = B(p,vec2(0.089,0.003));
    d = min(d,d2);  
    
    p = prevP;
    p-=vec2(-0.07,0.03);
    p*=Rot(radians(30.));
    d2 = B(p,vec2(0.083,0.003));
    d = min(d,d2);      
    
    p = prevP;
    d2 = abs(length(p-vec2(-0.08,-0.06))-0.06)-0.003;
    d = min(d,d2);      
    
    p = prevP;
    d2 = length(p-vec2(0.05,-0.11))-0.02;
    d = min(d,d2);  
    d2 = length(p-vec2(0.11,-0.075))-0.02;
    d = min(d,d2);  
    
    d2 = B(p-vec2(0.07,0.032),vec2(0.003,0.068));
    d = min(d,d2);    
    d2 = B(p-vec2(-0.06,0.105),vec2(0.003,0.081));
    d = min(d,d2);  
    
    d2 = abs(length(p-vec2(-0.035,0.25))-0.02)-0.003;
    d = min(d,d2); 
    
    d2 = abs(length(p-vec2(0.052,0.17))-0.03)-0.003;
    d = min(d,d2);     
    
    d2 = abs(length(p-vec2(0.035,0.24))-0.015)-0.003;
    d = min(d,d2);      
    
    p = prevP;
    
    p.x = abs(p.x);
    
    p-=vec2(0.08,-0.16);
    p*=Rot(radians(-30.));
    d2 = B(p,vec2(0.095,0.003));
    d = min(d,d2);   
    p*=Rot(radians(30.));
    p-=vec2(-0.03,-0.09);
    d2 = B(p,vec2(0.003,0.075));
    d = min(d,d2);  
    
    p-=vec2(0.05,0.035);
    d2 = B(p,vec2(0.003,0.066));
    d = min(d,d2);  
    
    return d;
}

float drawMainGraphic(vec2 p){
    vec2 prevP = p;

    float d = eye(p);

    p*=Rot(radians(10.*iTime));
    p = DF(p,3.0);
    p -= vec2(0.235);
    p*=Rot(radians(45.));
    float d2 = feather(p);
    d = min(d,d2);
    
    p = prevP;
    p*=Rot(radians(10.*iTime));
    p = DF(p,3.0);
    p -= vec2(0.108);
    d2 = abs(length(p)-0.02)-0.001;
    d = min(d,d2);
    
    p = prevP;
    d2 = abs(length(p)-0.155)-0.001;
    d = min(d,d2);
    
    return d;
}

float isoCube(vec2 p){
    vec2 prevP = p;
    p.y*=1.5;
    p*=Rot(radians(45.));
    
    float d = abs(B(p,vec2(0.1)))-0.002;
    p = prevP;
    p.x=abs(p.x);
    p-=vec2(0.072,-0.12);
    p.x*=1.41;
    p.y*=1.41;
    p*=SkewY(radians(-34.));
    float d2 = abs(B(p,vec2(0.1)))-0.002;
    d = min(d,d2);
    return d;
}

float background(vec2 p){
    p.y-=iTime*0.1;
    p*=2.;
    vec2 prevP = p;
    p.x = mod(p.x,0.288)-0.144;
    p.y = mod(p.y,0.48)-0.24;
    float d = isoCube(p);
    p = prevP;
    p.x+=0.144;
    p.x = mod(p.x,0.288)-0.144;
    p.y+=0.24;
    p.y = mod(p.y,0.48)-0.24;
    float d2 = isoCube(p);
    
    return min(d,d2);
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 p = (fragCoord-0.5*iResolution.xy)/iResolution.y;
    vec2 prevP = p;
    
    vec3 col = vec3(0.);
    float d = drawMainGraphic(p);
    
    float d6 = background(p);
    d6 = max(-(length(p)-0.25),d6);
    col = mix(col,vec3(0.5),S(d6,0.0));
    
    p = prevP;
    p*=Rot(radians(7.*iTime));
    p = DF(p,3.0);
    p -= vec2(0.45);
    p*=Rot(radians(45.));
    float d5 =arrow(p);
    col = mix(col,vec3(0.),S(d5,0.0));  
    col = mix(col,vec3(0.7),S(abs(d5)-0.001,0.0));  
    
    // feather bg
    p = prevP;
    p*=Rot(radians(-5.*iTime));
    p = DF(p,4.0);
    p -= vec2(0.3);
    p*=Rot(radians(45.));
    float d4 = featherBG(p);
    col = mix(col,vec3(0.),S(d4,0.0));    
    
    p = prevP;
    p*=Rot(radians(-5.*iTime));
    p = DF(p,4.0);
    p -= vec2(0.3);
    p*=Rot(radians(45.));
    float d3 = feather(p);
    col = mix(col,vec3(0.8),S(d3,0.0));
     
    p = prevP;
    
    // feather bg
    p*=Rot(radians(10.*iTime));
    p = DF(p,3.0);
    p -= vec2(0.235);
    p*=Rot(radians(45.));
    float d2 = featherBG(p);
    col = mix(col,vec3(0.),S(d2,0.0));
    col = mix(col,vec3(1.),S(d,0.0));
    
    fragColor = vec4(col,1.0);
}
