#version 410 core

uniform float fGlobalTime; // in seconds
uniform vec2 v2Resolution; // viewport resolution (in pixels)
uniform float fFrameTime; // duration of the last frame, in seconds

uniform sampler1D texFFT; // towards 0.0 is bass / lower freq, towards 1.0 is higher / treble freq
uniform sampler1D texFFTSmoothed; // this one has longer falloff and less harsh transients
uniform sampler1D texFFTIntegrated; // this is continually increasing
uniform sampler2D texPreviousFrame; // screenshot of the previous frame
uniform sampler2D texChecker;
uniform sampler2D texNoise;
uniform sampler2D texTex1;
uniform sampler2D texTex2;
uniform sampler2D texTex3;
uniform sampler2D texTex4;

layout(location = 0) out vec4 out_color; // out_color must be written in order to see anything

float bbox(vec2 uv, vec2 a, vec2 b, float t){
   float l = length(b-a);
   vec2 d = (b-a)/l;
   vec2 q = uv - (a+b)*.5;

   q = mat2(d.x,-d.y,d.y,d.x)*q;
   float tt =texture(texFFT,abs(q.x+q.y*20.)*.01).r*.2;
   q = abs(q) - vec2(l+(t/tt)*.0001,t-tt*tt)*.5;
   return length(max(q,vec2(0.))) + min(max(q.x,q.y),0.);
 }


 float left_fu(vec2 uv){
  float h =  bbox(uv,vec2(-.1,-.2), vec2(-.1,.1),.01);

   float t = bbox(uv,vec2(-.2,.2), vec2(.0,.2),.01);
   h = min(t,h);

    t = bbox(uv,vec2(.0,.2), vec2(-.2,.1),.01);
   h = min(t,h);

    t = bbox(uv,vec2(-.05,.1), vec2(.01,.05),.01);
   h = min(t,h);

     t = bbox(uv,vec2(-.15,.30), vec2(-.10,.25),.01);
   h = min(t,h);
   return h;
   }

 float right_fu(vec2 uv){
    float h =  bbox(uv,vec2(.35,.25), vec2(.05,.25),.01);

     float t = abs(bbox(uv,vec2(.3,.13), vec2(.1,.13),.1))-.01;
     h = min(t,h);


    uv +=vec2(.05,.0);
     t = bbox(uv,vec2(.25,.00), vec2(.25,-.20),.01);
     h = min(t,h);
   uv *=.5;

   t = abs(bbox(uv,vec2(.2,-.05), vec2(.05,-.05),.1))-.001;
     h = min(t,h);

    t = bbox(uv,vec2(.2,-.05), vec2(.05,-.05),.001);
     h = min(t,h);
   return h;

 }
 float fu(vec2 uv){
   float h =  left_fu(uv);
   float r = right_fu(uv);
   h = min(h,r);


   return h ;

   }

vec3 pal(float t){

   return vec3(.5)+.5*cos(2.*3.141592*(1.*t+vec3(.0,.3,.7)));
 }


float mandel(vec2 uv){
    float tt = texture(texFFT,.3).r*5.;
     vec2 c = vec2(.41-tt,.42+tt);
     vec2 z = uv;
     float limit = 200.;
     float cpt =  0.;

  for(float i = 0.;i<=limit; i++){

       z = vec2(z.x*z.x-z.y*z.y,2.*z.x*z.y)+c;
       if(length(z) >2) break;
       cpt ++;

    }

    return cpt /limit;
  }
void main(void)
{
       vec2 uv = vec2(gl_FragCoord.x / v2Resolution.x, gl_FragCoord.y / v2Resolution.y);
       uv -= 0.5;
       uv /= vec2(v2Resolution.y / v2Resolution.x, 1);
float t1 = texture(texFFTSmoothed,.3).r*100.;

 float t2 = texture(texFFTSmoothed,.7).r*100.;
 uv *=(fract(-fGlobalTime*.5+length(uv)));
 uv *=2.;
 uv.x +=fract(fGlobalTime+t1*.1);
  uv.y += sin(fGlobalTime)+t2*10.;
 vec2 id = floor(uv);
 uv = fract(uv)-.5;
float d = fu(uv);
  float mandal = mandel(abs(uv)+.1);
 d = abs(.01/(d));
 if(mod(id.x,2.) ==0.){
    d = 1.-d;
 }
 vec3 col = vec3(d)*pal(mandal*10.+d*.001+fract(fGlobalTime)+uv.x);
       out_color = vec4(sqrt(col),1.0);
}