#define GLSLIFY 1
uniform float time;
uniform float seed;
uniform vec2 resolution;
float noise3D(vec3 p){
return fract(sin(dot(p,vec3(12.9898,78.233,128.852)))*43758.5453)*2.-1.;
}
float simplex3D(vec3 p){
float f3=1./3.;
float s=(p.x+p.y+p.z)*f3;
int i=int(floor(p.x+s));
int j=int(floor(p.y+s));
int k=int(floor(p.z+s));
float g3=1./6.;
float t=float((i+j+k))*g3;
float x0=float(i)-t;
float y0=float(j)-t;
float z0=float(k)-t;
x0=p.x-x0;
y0=p.y-y0;
z0=p.z-z0;
int i1,j1,k1;
int i2,j2,k2;
if(x0>=y0)
{
if(y0>=z0){i1=1;j1=0;k1=0;i2=1;j2=1;k2=0;}
else if(x0>=z0){i1=1;j1=0;k1=0;i2=1;j2=0;k2=1;}
else{i1=0;j1=0;k1=1;i2=1;j2=0;k2=1;}
}
else
{
if(y0<z0){i1=0;j1=0;k1=1;i2=0;j2=1;k2=1;}
else if(x0<z0){i1=0;j1=1;k1=0;i2=0;j2=1;k2=1;}
else{i1=0;j1=1;k1=0;i2=1;j2=1;k2=0;}
}
float x1=x0-float(i1)+g3;
float y1=y0-float(j1)+g3;
float z1=z0-float(k1)+g3;
float x2=x0-float(i2)+2.*g3;
float y2=y0-float(j2)+2.*g3;
float z2=z0-float(k2)+2.*g3;
float x3=x0-1.+3.*g3;
float y3=y0-1.+3.*g3;
float z3=z0-1.+3.*g3;
vec3 ijk0=vec3(i,j,k);
vec3 ijk1=vec3(i+i1,j+j1,k+k1);
vec3 ijk2=vec3(i+i2,j+j2,k+k2);
vec3 ijk3=vec3(i+1,j+1,k+1);
vec3 gr0=normalize(vec3(noise3D(ijk0),noise3D(ijk0*2.01),noise3D(ijk0*2.02)));
vec3 gr1=normalize(vec3(noise3D(ijk1),noise3D(ijk1*2.01),noise3D(ijk1*2.02)));
vec3 gr2=normalize(vec3(noise3D(ijk2),noise3D(ijk2*2.01),noise3D(ijk2*2.02)));
vec3 gr3=normalize(vec3(noise3D(ijk3),noise3D(ijk3*2.01),noise3D(ijk3*2.02)));
float n0=0.;
float n1=0.;
float n2=0.;
float n3=0.;
float t0=.5-x0*x0-y0*y0-z0*z0;
if(t0>=0.)
{
t0*=t0;
n0=t0*t0*dot(gr0,vec3(x0,y0,z0));
}
float t1=.5-x1*x1-y1*y1-z1*z1;
if(t1>=0.)
{
t1*=t1;
n1=t1*t1*dot(gr1,vec3(x1,y1,z1));
}
float t2=.5-x2*x2-y2*y2-z2*z2;
if(t2>=0.)
{
t2*=t2;
n2=t2*t2*dot(gr2,vec3(x2,y2,z2));
}
float t3=.5-x3*x3-y3*y3-z3*z3;
if(t3>=0.)
{
t3*=t3;
n3=t3*t3*dot(gr3,vec3(x3,y3,z3));
}
return 96.*(n0+n1+n2+n3);
}
vec3 palette(float t){
vec3 a=vec3(.5,.5,.5);
vec3 b=vec3(.5,.5,.5);
vec3 c=vec3(1.,1.,.5);
vec3 d=vec3(.80,.90,.30);
return a+b*cos(6.28318*(c*t+d));
}
const int iterations=20;
void main(){
vec2 uv=gl_FragCoord.xy/resolution.xy;
vec2 uv0=uv;
uv-=vec2(.5);
uv*=min(vec2(resolution.x/resolution.y,1.),vec2(1.,resolution.y/resolution.x));
float a=40.;
mat2 rot=mat2(cos(a),sin(a),-sin(a),cos(a));
float ot=1.;
float l=length(uv);
vec2 r=vec2(0.);
float st=120.+time*.1;
for(int i=0;i<iterations;++i){
uv=abs(uv*rot)*1.3-1.;
r=uv+vec2(sin(st),cos(st))*.5;
ot=min(ot,abs(dot(r,r)-l*.015-.5));
}
float c=pow(ot,.1)+l*3.;
vec3 col=palette(max(c,.75))*(2.-c);
gl_FragColor=vec4(col,1.);
}