#ifdef GL_ES
precision highp float;
#endif

varying highp vec2 vTextureCoord;

uniform vec4 uGlobalColor;
uniform float uTime;
uniform float uDeltaTime;
uniform vec2 uMouse;
uniform vec2 uResolution;


#define C_BG vec3(0.157)
#define C_FG vec3(0.922, 0.859, 0.698)

float circle(vec2 p, vec2 offset, float rad){
    p -= offset;
    return length(p) - rad;
}


//SRC: I-Quilez: https://www.shadertoy.com/view/stcfzn
float oriented_box( in vec2 p, in vec2 a, in vec2 b, float th )
{
    float l = length(b-a);
    vec2  d = (b-a)/l;
    vec2  q = p-(a+b)*0.5;
          q = mat2(d.x,-d.y,d.y,d.x)*q;
          q = abs(q)-vec2(l*0.5,th);
    return length(max(q,0.0)) + min(max(q.x,q.y),0.0);
}

//src: https://iquilezles.org/articles/distfunctions/
float smooth_union(float a, float b, float smoothness){
    float h = clamp( 0.5 + 0.5*(a-b)/smoothness, 0.0, 1.0 );
    return mix( a, b, h ) - smoothness*h*(1.0-h);
}

float modI(float a,float b) {
    float m=a-floor((a+0.5)/b)*b;
    return floor(m+0.5);
}

vec4 sdf(vec2 p, float t){

    vec2 offset0 = vec2(sin(t / 2.0) , cos((t + 0.1) / 3.0));
    vec2 offset1 = vec2(sin(t / 5.0) , cos((t - 2.5) / 2.0));
    vec2 offset2 = vec2(cos((t+3.141) / 2.0) , sin((t + 3.0) / 3.0));
    vec2 offset3 = vec2(sin((t) / 4.0), cos(t+3.141 / 2.0));

    vec2 a = vec2(sin(t / 3.0) * 1.5, sin((t + 0.5) / 4.0) * 2.0);
    vec2 b = vec2(cos(t / 3.0) * 1.5, cos((t + 0.5) / 4.0) * 2.0);
    float boxsdf = oriented_box(p, a, b, 2.0 + sin(t / 2.0));

    float sdf = smooth_union(
        smooth_union(
            smooth_union(circle(p, offset0, 0.3), circle(p, offset1, 0.45), 0.5),
            smooth_union(circle(p, offset2, 0.6), circle(p, offset3, 0.25), 0.3),
            0.4
        ),
        boxsdf,
        0.1
    );

    float alpha = modI(sdf * 5.0, 1.01);
    float grid = modI(p.x * 20.0, 1.05) + modI(p.y * 20.0, 1.05) / 2.0;
    vec3 color = mix(C_BG, C_FG, alpha * grid);
    return vec4(color, 1.0);

}

void main() {
    float aspect_ratio = uResolution.x / uResolution.y;
    vec2 uv = vTextureCoord;
    uv.x *= aspect_ratio;
    gl_FragColor = sdf(uv, uTime);
}
