precision highp float;
uniform float uTime;
uniform float uScrollHeight;
uniform vec2 uResolution;

const vec3 colourA = vec3(0.1059, 0.3765, 0.2784);
const vec3 colourB = vec3(1.0, 0.9922, 0.9294);
const vec3 colourC = vec3(0.9608, 0.5922, 0.3098);

float rand(vec2 co) // thanks stack overflow
{
    return fract(sin(dot(co, vec2(12.9898, 78.233))) * 43758.5453);
}

// fuck you I'm not adding comments skoog
// comments are for pussies

void main()
{
    vec2 uv = gl_FragCoord.xy / uResolution;
    vec3 colour = vec3(0.0);

    uv.y += sin(uv.x * 8.0 + (uTime / 3.0)) / 8.0;
    uv.y += sin(uv.x * 100.0 + (uTime / 3.0) - (uScrollHeight / 300.0)) / 80.0;
    uv.y += sin(uv.x * 1000.0 + (uTime / 3.0) + (uScrollHeight / 300.0)) / 350.0;
    uv.y *= (1.0-abs(uv.x - 0.5)) / ((uScrollHeight / 600.0) + 1.0);
    uv.y += uScrollHeight / 10000.0;

    if (uv.y < 0.3333)
        colour = mix(colourA, colourB, uv.y * 3.0);
    else
        colour = mix(colourB, colourC, (uv.y - 0.3333) * 2.0);

    colour.r += rand(gl_FragCoord.xy / 1000.0) / 15.0;
    colour.g += rand(gl_FragCoord.xy / 1267.0) / 15.0;
    colour.b += rand(gl_FragCoord.xy / 2022.0) / 15.0;

    colour = mix(colour, colour * colour, (uScrollHeight / 600.0));

    float bottom = (uResolution.y * 0.15) + uScrollHeight;
    float peak = 120.0 / ((uScrollHeight / 500.0) + 1.0);
    bottom += sin(gl_FragCoord.x / 120.0 - (uScrollHeight / 200.0) + (uTime / 3.0)) * (peak / 2.0);
    bottom += sin(gl_FragCoord.x / 400.0 + (uScrollHeight / 200.0) - (uTime / 2.0)) * (peak / 2.0);

    if (gl_FragCoord.y < bottom)
    {
        if (gl_FragCoord.y > bottom - 6.0)
            colour = vec3(0.04, 0.04, 0.067);
        else
            colour = vec3(0.06, 0.06, 0.08);

        colour += rand((gl_FragCoord.xy + uScrollHeight) / 1000.0) * 0.01;
    }

    gl_FragColor = vec4(colour, 1.0);
}