
#define PI 3.141

mat2 rotate2D(float angle) {
	return mat2(cos(angle), -sin(angle), sin(angle), cos(angle));
}

float randomStars(in vec2 uv) {
    return fract(sin(dot(uv.xy, vec2(2.0, 30.0))) * 9999999999.0);
}

float random(in vec2 uv) {
    return fract(sin(dot(uv.xy, vec2(12.9898,78.233))) * 43758.5453123);
}

float noise(in vec2 st) {
    vec2 i = floor(st);
    vec2 f = fract(st);

    float a = random(i);
    float b = random(i + vec2(1.0, 0.0));
    float c = random(i + vec2(0.0, 1.0));
    float d = random(i + vec2(1.0, 1.0));

    vec2 u = f * f * (3.0 - 2.0 * f);
    return mix(a, b, u.x) + 
            (c - a) * u.y * (1.0 - u.x) + 
            (d - b) * u.x * u.y;
}

void mainImage(out vec4 fragColor, in vec2 fragCoord) {
	vec2 uv = fragCoord.xy / iResolution.xy;
    float ratio = iResolution.x / iResolution.y;
    
    uv *= rotate2D(60.0 * PI / 180.0);
        
    float zoom = 2.0;
    float offset = noise(uv * zoom - iTime);

    float stars = randomStars(uv * iTime);
    float outer = smoothstep(0.0 - offset, 0.3 - offset, uv.x) - smoothstep(0.5 - offset, 0.7 - offset, uv.x);
    float inner = smoothstep(0.3 - offset, 0.4 - offset, uv.x) - smoothstep(0.7 - offset, 1.0 - offset, uv.x);
    float overlap = smoothstep(0.45 - offset, 0.7 - offset, uv.x) - smoothstep(0.8 - offset, 0.9 - offset, uv.x); 

    vec3 blue = vec3(0.0, 0.0, 0.175);
    vec3 purple = vec3(0.7, 0.4, 0.6);
    vec3 green = vec3(0.4, 1.0, 0.7);
    vec3 white = vec3(0.9, 1.0, 0.9);

    vec3 starColor = mix(blue, white, stars);
    vec3 outerColor = mix(starColor, purple, outer);
    vec3 innerColor = mix(outerColor, green, inner);
    vec3 overlapColor = mix(innerColor, white, overlap);

    fragColor = vec4(overlapColor, 1.0);
}
