#define erot(p,ax,t) (mix(dot(ax,p)*ax,p,cos(t))+cross(ax,p)*sin(t))
#define pcg3d(p,o) do{uvec3 q=floatBitsToUint(p)*123456798u+12346578u; q.x+=q.y*q.z;q.y+=q.x*q.z;q.z+=q.y*q.x;q^=q>>16u;q.x+=q.y*q.z;q.y+=q.x*q.z;q.z+=q.y*q.x; o=vec3(q)/float(-1U);}while(false)
#define pal(t,a) (a+a*cos(6.28*(t+vec3(1.,1.,1.))))
#define pal2(t) (.5+.5*cos(6.28*(1.*t+vec3(.0,.3,.7))))
#define  diam2(p,s) (abs(p).x+abs(p).y-s)*inversesqrt(3.)
#define tru(p,out) do{ vec2 id = floor(p)+.5; vec2 gv = p-id; gv.x  *= fract(452.6*sin(dot(id,vec2(452.5,985.5)))) > .5 ? -1.:1. ; gv.xy-=.5 * (gv.x >-gv.y ? 1. :-1.); out= abs(diam2(gv.xy,.5));  } while(false)
#define cd(p,o) do{vec3 cdp=abs(p);float cdd=0.,m;for(int j=0;j++<3;){cdd+=step(m=max(cdp.y,cdp.z),cdp.x)*m;cdp = cdp.yzx;}o=max(max(cdp.x,max(cdp.y,cdp.z))-3.,1.-cdd);}while(false)
#define fractal(p,o) do{vec3 fp=p;float s= 1.;for (int ii=0;ii<6;ii++){float q;cd(fp,q);o = max(o, q*s);fp = fract((fp-1.)*.5)*6.-3.;s/= 3.0;} }while(false)
#define tri(p,trir,triout ) do{vec2 trip=p;const float k = sqrt(3.0);trip.x = abs(trip.x) - trir;trip.y = trip.y + trir/k;if( trip.x+k*trip.y>0.0 ){ trip = vec2(trip.x-k*trip.y,-k*trip.x-trip.y)/2.0;}trip.x -= clamp( trip.x, -2.0*trir, 0.0 ); triout = -length(trip)*sign(trip.y);}while(false)
vec2 p=(FC.xy*2.-r)/min(r.x,r.y);
vec2 op=p;
vec3 rnd;
pcg3d(vec3(vec3(t,floor(p.xy*50.))),rnd);
vec3 col=vec3(0.);

float bpm = t*140./60.*(.5+min(15.5,.1*exp(mod(t,35.)*.1)));
vec3 trnd; pcg3d(vec3(floor(bpm)),trnd);;
bpm= smoothstep(0.,1.,fract(bpm))+floor(bpm);
float sq =(mod(bpm,10.));
//sq =-1.5;

vec3 subscreenRnd;pcg3d(trnd,subscreenRnd);
float screenRatio = r.y/r.x;

vec2 subscreenSize = vec2(1.,screenRatio);

p -=(max(vec2(.1),subscreenRnd.xy)-.5)*1.5;
p /=max(.1,subscreenRnd.z);

if(sq<1.){
  for(float i=0.,im=25.;i<im;i++){
    vec2 pp= p;
    pp.x+=sin(t+i/im*6.28);
    pp.y+=cos(i+t*.1);
    float d = length(pp)-.1-abs(dot(sin(p*3.),cos(p.yx*2.))*.1);
    d=.001/(.001+abs(d));
    col +=vec3(d);
  }
} else if(sq<2.)  {
  for(float i=0.,im=8.;i<im;i++){
    vec2 pp= p;
 
    pp=erot(pp.xyy,vec3(0.,0.,1.),i*i).xy;
    
    pp.x += sin(i);
    float sc = i/im;
    float fsc = fract(sc-t*.1);
    float m =mix(.1,10.,fsc);
    pp*=m;
    pp=fract(pp)-.5;
    float d=  min(abs(pp.x),abs(pp.y));
    d=.001/(.001+abs(d))*mix(10.,.0,1.-exp(-7.*fsc));
    col +=vec3(d);
  }
} else if( sq<3.) {
   for(float i=0.,im=32.;i++<im;){
    vec3 rnd; pcg3d(vec3(i),rnd);
    float d=  length(p+(rnd.xz-.5)*.1)-.3;
    d= (.001+.001*exp(-.5*fract(i/im+t)))/(.001+abs(d));
    col += vec3(1.,.5,.2)*d*(1.5+1.5*sin(i/im*6.28+t+atan(p.x,p.y)));
    p*=(1.-rnd.z*.05);
    }
} else if(sq<4.) {
  vec3 a;
  vec2 pp=p;
    float b;
    pp.y -=t*.05;
    vec3 z; pcg3d(vec3(floor(pp*20.).y),z) ;
    pp.x -=(b=t*(.1+.3*z.z));

    pcg3d(vec3( floor(pp*25.),0.),a);
    col = pal(b*4.5+length(a),a)*smoothstep(a.x,a.y,a.z);
  
}else if(sq<5.)
{
 float d = 1.0;
        float ztime = t;
        for(int c =0;c<3;c++){        
        ztime = smoothstep(.0,1.,pow(fract(ztime),2.))+floor(ztime);
        for(float i=1.,im=16.;i<im;i++){   
    
            vec2 uuv = abs(p*rotate2D(i/im+ztime*i/im-t*.5)*pow(0.95,i))-.2/(sqrt(1.)/i*im);
    
            d = length(max(vec2(0.),uuv))+min(0.,max(uuv.x,uuv.y));
            d = max(0.,0.002/(.001+abs(d)));
            col[c] +=d*exp(-fract(ztime+.5+i/im));
        }
    }
    col = 1.-col;
   
}
else if(sq<6.){
  vec2 pp=p;
    pp*=8.;

  float bpm = floor(t)+smoothstep(.0,1.,fract(t));
  for(float i=0.,im=8.;i<im;i++){
       float q = fract(i/im);
      vec2  luv =pp+q;
      float tou;tru(luv*q+bpm,tou);
      col  += +exp(-5.*fract(bpm*2.+q))*sin(vec3(.3,.3,.7))*q*.1/tou;
      tru(p+q+bpm,tou);
     //col  += +exp(-5.*fract(bpm+q))*vec3(.1,.5,.1)*.256*.02/tou;
  }
  
}  else if(sq<7.){
  vec2 pp=p;
  vec3 ro=vec3(0.,0.,-10.);
  vec3 rd = normalize(vec3(pp,1.));
  for(float i=0.,e=0.,g=0.;i++<20.;){
     vec3 z = ro+rd*g;
     vec3 zz=z;
     zz.xz*=rotate2D(t);
      zz.xy*=rotate2D(t);
     //z.z += t;
  
     float h =0.; length(z)-.1;
     
     fractal(zz,h);
     g+=e=max(.001,(h));
     col+=(.5+.5*sin(t+g*1.0+vec3(1.,.5,.3)))/exp(10.*i*i*e);
  }
} else if(sq<8.) {

  float t = t*.5;
  for(int cc=0;cc<3;cc++){
  for(float i=0.,im=5.;i<im;i++){
     t = pow(fract(t),0.75)+floor(t);
float sc = 2.;
  vec2 zpp=  p*(sc=pow(sqrt(3.),i));
   zpp=erot(zpp.xyy,vec3(0.,0.,1.),3.14/6.*(1.+i)*t ).xy;
      float d ; tri(zpp,.4,d);abs(d/sc)-.002;
    d = min(-d,min(abs(zpp.x),abs(zpp.y))-.1);
  d= (.005-sin(atan(zpp.x,zpp.y)+t)*.004)/(.002+abs(d)-.001);
  col[cc] += (4.*(.5+.25*sin(t+i*vec3(.2,.5,.9)))*d/im)[cc];
  }
  
  
}col=1.-col;}else if(sq<9.){
  
     float d = float(1U);
    float im=16.;
    for(float i=0.;i++<im;){
     float d = min(d,abs(p.x+asin(sin(i/im*6.28+p.y*5.+3.14*exp(-3.*fract(t+(1.+i/im)))))*.4));
     col += pal2(i/im)*((.005+.005*exp(-3.*fract(t)))/(.001+d));
  }
    
   
}else if(sq<10.) {
   vec3 ro =vec3(0.,1.,-5.),rt=vec3(0.);
   
  ro.zx +=t; rt.zx +=t;

  vec3 z = normalize(rt-ro),x=vec3(z.z,0.,-z.x),y=cross(z,x);
  vec3 rd = mat3(x,y,z)*normalize(vec3(p,1.));
  float g=0.;
  for(float  i=0.,e=0.;i++<50.;){
    
      vec3 gp=ro+rd*g;
     vec3 cent=gp;
    cent.zx-=t;
    float d = 0.;
    vec4 pp=vec4(gp,1.);
     for(float j=0.;j++<2.;){
       
     d +=  .5*dot((sin(d+pp.xyz)),(cos(pp.yzx*2./pp.w)))/pp.w;
        pp.xyz = (abs(pp.xyz)-1.5);
        pp.xyz = erot(pp.xyz,normalize(vec3(.3,.5,.3)),j+.785);
        pp*=1.1;
     }
     
      float h = dot(gp,vec3(0.,1.,0.))+d*.2;
      g+=e=max(.01,h);
      col+=vec3(1.,.5,.1)*.0525/exp(i*i*e);  }
  col = mix(col,vec3(1.),1.-exp(-g*g*g*.001));
  
}
col += step(-abs(p.x),-.95)+step(-abs(p.y),-.42);
vec3 pcol = texelFetch(b,ivec2(FC.xy)+(mod(t,70.)>35. ? 1:0)*ivec2(int(sign(sin(p.xx*100.)))+int((rnd.x-.5)*10.)/1,0),0).rgb;
o.rgb = mix(pcol*vec3(.0,.993,.992)*(1.-.00*rnd.xyz)*step(-.5,sin(op.y*1000.)),col,step(abs(p.y),subscreenSize.y)*step(abs(p.x),subscreenSize.x));
o.rgb = max(vec3(0.),o.rgb);