vec2 e=vec2(0.01, .0);
vec3 co,fo, n,ld=normalize(vec3(1, 1.,-4.)),al=vec3(.85);
float t,d,dd;
#define rot(a) mat2(cos(a), sin(a), -sin(a), cos(a))
#define a(d) clamp(m(p+n*d)/d, 0., 1.)
#define s(d) smoothstep(0., 1., m(p+ld*d)/d)
#define COL_P vec3(0., 0.34, 1.)
#define pi acos(-1.)
float mov;
float h(float p){
  return fract(sin((p)*344.)*803.5);
}
float h2(vec2 p){
  return fract(sin(dot((p+t*10.)*345.,p.yx*456.))*567.);
}
float c(float t){
  t*=.05;
  return mix(h(floor(t)), h(floor(t+1.)), pow(smoothstep(0., 1., fract(t)), 20.));
}
float sb(vec3 p, vec3 s){
  p=abs(p)-s;
  return max(max(p.y,p.x), p.z);
}
float smin(float a, float b, float k){
  float h=max(k-abs(a-b), 0.);
  return min(a,b)-h*h*.25/k;
}
vec2 smin(vec2 a, vec2 b, vec2 k){
  vec2 h=max(k-abs(a-b), 0.);
  return min(a,b)-h*h*.25/k;
}
vec3 smin(vec3 a, vec3 b, vec3 k){
  vec3 h=max(k-abs(a-b), 0.);
  return min(a,b)-h*h*.25/k;
}
float tr(vec3 p, vec3 s){
  p.y=abs(p.y)-.1;
  p.zx=abs(p.zx)-s.xz;
  vec2 a=vec2(.34);
  return max(max(dot(p.xy,a),dot(p.xz,a)), dot(p.yz,a));
}
float id1;
float g1,g2,g3,g4;
float tt;
float dia(vec3 p){
  vec3 p1=p;

  p1.z+=mov;

  float re1=30.;


  p1.yx=abs(p1.yx)-9.-sin(tt*.41);
  p1.xy*=rot(pi/4.);
  id1=h2(floor(p1.xz/re1-.5));
  p1.xz=(fract(p1.xz/re1-.5)-.5)*re1;

  float cc=sb(p1,vec3(1., 15., 1.));
  g1+=.01/(.1+cc*cc);
  vec3 p2=p;
  float re2=20.;
  p2.xy+=sin(p2.z*.45+t*2.);
  for(float i=0.;i<3.;i++)
  p2=abs(p2)-3.-t,
  p2.zy*=rot(pi*2.+t*.141),
  p2.xy*=rot(pi*2.+t*.141),
  //p2.xy=abs(p2.xy)-15.,
  p2.xy=smin(p2.xy, 1.-p2.xy, vec2(1.));//exp

  p2-=1.;
  p2=(fract(p2/re2-.5)-.5)*re2;
  float cc1=sb(p2,vec3(1., 60.45, .23));
  //cc=mix(cc1,cc,1.05);
  g2+=.1/(.1+cc1*cc1);
  cc=smin(cc1,cc, 1.);

  vec3 p3=p;
  //p3.x=abs(p3.x)-3.;
  p3.xy*=rot(tt*8.);
  p3=abs(abs(p3)-1.)-13.;
  float cc3=tr(p3, vec3(3.));
  cc=min(cc3,cc);
  g3=1./(1.+cc3);
  return cc;
}

float g5;
float m(vec3 p){
  float d=dia(p);
  vec3 p1=p;
  p1.xy*=rot(tt);
  vec2 s=vec2(1., 10.);
  float ff=length(vec2(length(p1.xy)-s.y, p1.z))-s.x-sin(p.y*.451+tt)*sin(p.x*.5656+tt)*sin(p.z*.5656+tt)*.5-.5;
  p1.yx-=2.;
  p1.xy*=rot(tt);
  float ff2=length(vec2(length(p1.xy)-s.y, p1.z))-s.x-sin(p.y);
  ff=smin(ff2,ff, 1.);
  d=smin(d, ff, 5.);

  float ss=sin((t*.5))*200.+250.;
  float ccl=(length(p)-ss);
  g4+=1./(1.+ccl*ccl);
  ccl=smoothstep(0., 1., ccl);

  vec3 p4=p;

  p4=abs(p)-4.;
  float at=mov*1.5;
  p4.xy+=sin(at)*10.;

  p4.zx=abs(p4.zx)-.5;
  p4.yz*=rot(at+p4.y*.1);
  float momo=length(p4)-2.;
  momo=min(momo, length(p-vec3(0., 1., 0.))-2.-sin(p.y+tt)*sin(p.x+tt)*sin(p.z+tt)*.5-.5);
  d=smin(d, momo, 1.);
  g5+=2./(.1+momo*momo);
  return d;
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{

 t=mod(iTime*.5, 50.);
 tt=c(t*.25)*20.+t*.25;
 mov= t*30.;
	vec2 uv = fragCoord/iResolution.xy;
	uv -= 0.5;
	uv /= vec2(iResolution.y / iResolution.x, 1);
  float scene=mod(t*.25, 50.);
  //
  //if(mm < 0.1)
  //  scene=50.;


  float r1=scene*5.;
  uv=(fract(uv.yx/r1-.5)-.5)*r1;
  vec3 p=vec3(0.01, 0.01, -20.);
  p.x=abs(p.x)-100.;
  p.zx+=abs(sin(t*.45)*6.4)-2.;
  p.xz*=rot(sin(t*.15)*pi*2.);
  vec3 pp=vec3(0.01);
  pp.xz*=rot(sin(t*.05)*pi*.5);
  pp.xz*=rot(sin(t*.15)*pi*2.);
  vec3 cz=normalize(pp-p);
  vec3 cx=normalize(cross(cz, vec3(0.,-1., 0.)));
  vec3 cy=normalize(cross(cz,cx));
  vec3 r=mat3(cx,cy,cz)*normalize(vec3(-uv-h2(uv)*.001-h(uv.x)*.25*sin(t*.001)*.25, 1.-length(uv)*1.15+(sin(t*.5)*.33)));
  r.xy*=rot(sin(t)*.5-.5);
  co=fo=vec3(0.01);
  float i;
	for(i=0.;i < 50.;i++) if(d=m(p),dd+=d,p+=d*r,abs(d) < .001) {
    if(d > 100.){co=vec3(0.1);break;}
    n=normalize(
    e.xyy * (m(p+e.xyy)) +
    e.yyx * (m(p+e.yyx)) +
    e.yxy * (m(p+e.yxy)) +
    e.xxx * (m(p+e.xxx))
    );
    r=reflect(-r, n),p+=.001;

    float dif=max(dot(ld,n), 0.);
    float sp=pow(max(dot(reflect(-ld,n), -r),0.),30.);
    float fr=pow(1.+dif, 3.);
    co=mix(sp*al+(a(.7))*(dif+s(.24)),fo, min(fr, .06) );
  }
    co+=g3*vec3(.0, 0.1, .5)*50.;
    co+=g1*vec3(0.73-sin(t*.1)*.0001-.5, 0.,id1*id1)*.65;
    co+=g2*vec3(0., sin(t*.7)*.0001-.5,.01)*.5;
    co+=g4*vec3(1., 0.25*-sin(tt)*.5+.5, 0.)*.25;
    co+=g5*vec3(1.,0.,0.)*.95;



    co=smoothstep(-0.123, 10., co);
    co*=smoothstep(0., 1.,1.-length(uv)*1.05);
    co*= 1.-max(length(dd)/300.,0.);
	fragColor = sqrt(vec4(co, 1.));
}
