#define pi 3.14159
#define thc(a,b) tanh(a*cos(b))/tanh(a)

float seg( in vec2 p, in vec2 a, in vec2 b, float o )
{
    vec2 pa = p-a, ba = b-a;
    float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
    //h += 0.01 * cos(4. * iTime + 16. * h);
    return (4. + 3.4 * thc(4., pi * o + .75 * length(ba) * pi * h)) * length( pa - ba*h );
}

float bleh(vec2 uv) { 
    uv.x += 0.1 * iTime;

    float sc = 16.;
    uv *= sc;
    float ix = floor(uv.x);
    uv.x = fract(uv.x) - 0.5;
    
    float t = 1.5 * iTime + 0.25 * ix;
    float o = 0.125 * cos(0.125 * uv.y + 1.5 * t);
    uv.x += o;
    uv.y -= 0.1 * sc * sin(uv.x);
    
    vec2 p = vec2(0, 0.35 * sc * cos(pi * t * 0.125));
    vec2 q = vec2(0, 0.15 * sc * cos(pi * t * 0.3 - 0.25 * pi));
    float d = seg(uv, p, q, ix);
    // no smoothstep because modified seg() function isn't an SDF
    return step(d, (0.02 + 0.015 * cos(0.5 * t)) * sc);
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 res = iResolution.xy;
    vec2 uv = (fragCoord - 0.5 * res) / res.y;

    float s = 0., s2 = 0.;
    float n = 5.;
    float zm = mix(2., 1., tanh(0.4 * iTime));
    for(float i = 0.; i < n; i++) {
        s  += bleh(uv * (zm + 0.02 * i / n)) / n;
        s2 += bleh(uv * (zm + 0.02 * i / n) - vec2(.015,0)) / n;
    }
    vec3 col = (1.-s) * mix(vec3(210), vec3(240), 0.5 - uv.y) / 255.;
    vec3 col2 = (0.5 + 0.5 * cos(0.75 * iTime)) * vec3(1,.5,.15);
    col = mix(col, (uv.x + 0.5 * res.x/res.y) * col2, s2);

    fragColor = vec4(col,1.0);
}
