#define Pi 3.1415926535897932384626433832795028841971693993751
struct Gear{
    float t;		
    float gearR;		
    float teethH;	
    float teethR;		
    float teethCount;
    float diskR;	
    vec3 color;	  
    };
float GearFunction(vec2 uv, Gear g){
    float r = length(uv);
    float a = atan(uv.y, uv.x);
    float p = g.gearR-0.5*g.teethH + g.teethH/(1.0+exp(g.teethR*sin(g.t + g.teethCount*a)));
    float gear = r - p;
    float disk = r - g.diskR;
    return g.gearR > g.diskR ? max(-disk, gear) : max(disk, -gear);}
float GearDe(vec2 uv, Gear g){
    float f = GearFunction(uv, g);
    vec2 eps = vec2(0.0001, 0);
    vec2 grad = vec2(
        GearFunction(uv + eps.xy, g) - GearFunction(uv - eps.xy, g),
        GearFunction(uv + eps.yx, g) - GearFunction(uv - eps.yx, g)) / (2.0*eps.x);
        return (f)/length(grad);}
float GearShadow(vec2 uv, Gear g){
    float r = length(uv+vec2(0.1));
    float de = r - g.diskR + 0.0*(g.diskR - g.gearR);
    float eps = 0.4*g.diskR;
    return smoothstep(eps, 0., abs(de));}
void DrawGear(inout vec3 color, vec2 uv, Gear g,float eps){
	float d = smoothstep(eps, -eps, GearDe(uv, g));
    float s = 1.0 - 0.7*GearShadow(uv, g);
    color = mix(s*color, g.color, d);}
void mainImage( out vec4 fragColor, in vec2 fragCoord ){
    float t = 8.0*iTime;
    float tb = 12.0*iTime;
    float tc = 18.0*iTime;
    vec2 uv = 2.0*(fragCoord - 0.5*iResolution.xy)/iResolution.y;
    float eps = 2.0/iResolution.y;
	vec3 base = vec3(0.935, 0.967, 0.922);
	vec3 based = vec3(0.635, 0.667, 0.522);
	vec3 baseg = vec3(0.035, 0.967, 0.022);
	vec3 baser = vec3(0.935, 0.267, 0.122);
	vec3 baseb = vec3(0.035, 0.067, 0.992);
    const float count = 32.0;
    const float count2 = 22.0;
    const float count3 = 12.0;
    Gear outer =Gear(0.0, 0.981, 0.25, 40.0, 32.0, 0.92926, based);
    Gear tertiary = Gear(0.0, 0.71,   0.01, 40.0, 22.0, 0.74, base);
    Gear tertiaryb = Gear(0.0, 0.7,   0.01, 40.0, 22.0, 0.72, based);
    Gear center= Gear(0.0, 0.41,   0.01, 40.0, 12.0, 0.44, base);
    Gear centerb= Gear(0.0, 0.38,   0.01, 40.0, 12.0, 0.42, based);
    Gear stator= Gear(0.0, 0.1,   0.01, 40.0, 1.0,  0.2321, base);
    Gear statorb= Gear(0.0,0.14,  0.01, 40.0, 1.0,  0.2321, based);
    Gear inner =Gear(0.0, 0.035, 0.05, 40.0, 13.0, 0.05, baser);
    Gear secondary =Gear(0.0, 0.035, 0.05, 40.0, 13.0, 0.05, baseg);
    Gear middle=Gear(0.0, 0.035, 0.05, 40.0, 13.0, 0.05, baseb);
    vec3 color = vec3(1.0);
for(float i=0.0; i<count;i++){
        t += 2.0*Pi/count;
 	    inner.t = 0.9*t;
        inner.color = baseg*(0.85 + 0.56*i/(count-0.12));
        DrawGear(color, uv+0.85*vec2(cos(t),sin(t)), inner, eps);
        inner.color = based*(0.85 + 0.56*i/(count-0.12));
        DrawGear(color, uv+0.86*vec2(cos(t),sin(t)), inner, eps);}
for(float i=0.0; i<count2;i++)    {
        tb += 2.0*Pi/count2;
 	    secondary.t = 0.6*t;
        secondary.color = baseb*(0.85 + 0.5*i/(count2-0.16));
        DrawGear(color, uv+0.55*vec2(cos(tb),sin(tb)), secondary, eps);
        secondary.color = based*(0.85 + 0.5*i/(count2-0.16));
        DrawGear(color, uv+0.56*vec2(cos(tb),sin(tb)), secondary, eps);}
for(float i=0.0; i<count3;i++)    {
        tc += 2.0*Pi/count3;
 	    middle.t = 3.3*t;
        middle.color = baser*(0.85 + 0.6*i/(count3-0.18));
        DrawGear(color, uv+0.3*vec2(cos(tc),sin(tc)), middle, eps);
        middle.color = based*(0.85 + 0.6*i/(count3-0.18));
        DrawGear(color, uv+0.31*vec2(cos(tc),sin(tc)), middle, eps);}
    DrawGear(color, uv, outer, eps);
    DrawGear(color, uv, tertiary, eps);
    DrawGear(color, uv, tertiaryb, eps);
    DrawGear(color, uv, center, eps);
    DrawGear(color, uv, centerb, eps);
    DrawGear(color, uv, stator, eps);
    DrawGear(color, uv, statorb, eps);
    fragColor = vec4(color,1.0);}
