// inspired from "rainbow noise" by violetforest. https://shadertoy.com/view/4dyyDW

#define MOD int(mod(iTime/3.,4.))

#define hash(p) fract(sin(dot(p,vec3(127.1,311.7, 74.7)))*43758.5453123)

float noise (vec3 p) {
    vec3 i = floor(p);
    vec3 f = fract(p); f = f*f*(3.-2.*f); // smoothstep

    float v= mix( mix( mix(hash(i+vec3(0,0,0)),hash(i+vec3(1,0,0)),f.x),
                       mix(hash(i+vec3(0,1,0)),hash(i+vec3(1,1,0)),f.x), f.y), 
                  mix( mix(hash(i+vec3(0,0,1)),hash(i+vec3(1,0,1)),f.x),
                       mix(hash(i+vec3(0,1,1)),hash(i+vec3(1,1,1)),f.x), f.y), f.z);
	return   MOD==0 ? v
	       : MOD==1 ? 2.*v-1.
           : MOD==2 ? abs(2.*v-1.)
                    : 1.-abs(2.*v-1.);
}

#define rot(a) mat2(cos(a),-sin(a),sin(a),cos(a))

float fbm (vec3 p) {
    float v = 0.,  a = .5;
    mat2 R = rot(.37 + iTime/1e4);

    for (int i = 0; i < 9; i++, p*=2.,a/=2.) 
        p.xy *= R, p.yz *= R,
        v += a * noise(p);

    return v;
}

void mainImage( out vec4 O, vec2 U )
{
    U /= iResolution.y;
    O = .5+ .55* cos( 9.*fbm(vec3(U,iTime/3.))+ vec4(0,23,21,0)); // hue
  //O *= abs(fract(3.*fbm(vec3(U,iTime/3.)+.5))*2.-1.);           // intensity
  //O *= abs(fract(3.*fbm(vec3(U,iTime/3.)))*2.-1.);              // intensity
  //O *= .5+fbm(vec3(U,iTime/3.)+.5);                             // intensity
    if ( length(U*4.-vec2(.1,.2*float(MOD+1)))<.1 ) O--;          // MOD
}
