/* @maxwellcoffee - 2023

inspo from + @kishimisu - 2022)
*/

#define a(a,b,f,o) mix(a,b,sin(o+e*f)*.5+.5)
#define s(a) mat2(cos(a+vec4(0,33,11,0)))
#define PI 3.1415926535897932384626433832795

void mainImage(out vec4 fragColor, vec2 fragCoord) {
    float c,
          o,
          d = 1.,
          e = iTime * 0.1,
          w = 1.0 + sin(e * 0.01) * 1.5,
          s = 0.01;
    vec2 r = iResolution.xy;

    for (; o++ < 2e2 && d > .0001;) {
        vec3 p = abs(.7 * c * normalize(vec3((fragCoord + fragCoord - r) / r.y, 1)));
        p.xy *= s(e);
        p.zy += e + c * cos(2. * e);
        p = fract(p) - .5;
        p.xy *= s(c);
        p.xz *= s(e);
        p.y = max(abs(p.y) - a(0., .2, 1., e * 2.), 0.);
        c += d = (length(vec2(length(p.xy) - .2, p.z)) - a(.04, .1, .5, 4.) - c * .01) * .5;
    }

    vec3 baseColor = vec3(1.0, 0.0, 1.0);
    vec3 color1 = vec3(1.0, 0.0, 0.0);
    vec3 color2 = vec3(0.0, 1.0, 1.0);
    vec3 color3 = vec3(0.0, 1.0, 0.0);
    vec3 color4 = vec3(1.0, 1.0, 0.0);

    baseColor = mix(baseColor, color1, 0.5 + 0.5 * sin(e * s));
    baseColor = mix(baseColor, color2, 0.5 + 0.5 * sin((e + PI / 2.0) * s));
    baseColor = mix(baseColor, color3, 0.5 + 0.5 * sin((e + PI) * s));
    baseColor = mix(baseColor, color4, 0.5 + 0.5 * sin((e + 3.0 * PI / 2.0) * s));


    vec3 col = 1.2*(cos(c*110. + .99*vec3(0,1.+c*.2,2))+.2)/exp(c*0.00914);
    col = mix(col, vec3(0.5, 0.5, 0.5), pow(abs(fragCoord.x - r.x / 2.0) / (r.x / 2.0), 2.0));
    col = mix(col, vec3(0.5, 0.5, 0.5), pow(abs(fragCoord.y - r.y / 2.0) / (r.y / 2.0), 2.0));
    fragColor = vec4(col, 1.0);
}