#version 300 es
precision highp float;
uniform vec2 r;uniform float t;uniform int n;uniform vec2 p;out vec4 o;
#define S smoothstep
float T,F,G;mat2 R(float a){float c=cos(a),s=sin(a);return mat2(c,-s,s,c);}float H(vec2 p){return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453);}float B(vec3 p,vec3 b){vec3 q=abs(p)-b;return length(max(q,0.))+min(max(q.x,max(q.y,q.z)),0.);}
vec2 M(vec3 p){p.xy*=R(sin(p.z*.22+T*.35)*.18*F);p.x+=sin(p.z*.31+T*.2)*.25*F;vec3 q=p;q.z=mod(q.z+3.,6.)-3.;float fl=p.y+1.5,pi=B(vec3(abs(p.x)-4.,p.y+.75,q.z),vec3(.3,.75,.34));vec2 a=vec2(p.x,p.y);float ar=abs(length(a)-4.)-.16;ar=max(ar,-a.y);ar=max(ar,abs(q.z)-.22);float rb=B(vec3(abs(p.x)-2.25,p.y-3.25,q.z),vec3(1.55,.1,.14));float d=min(fl,min(pi,min(ar,rb))),m=d==fl?2.:1.;return vec2(d,m);}
vec3 N(vec3 p){vec2 e=vec2(.002,-.002);return normalize(e.xyy*M(p+e.xyy).x+e.yyx*M(p+e.yyx).x+e.yxy*M(p+e.yxy).x+e.xxx*M(p+e.xxx).x);}
void main(){float ph=mod(t,120.);T=ph*.5;F=S(30.,70.,ph);vec2 u=(gl_FragCoord.xy*2.-r)/r.y;u*=R(sin(ph*.04)*.025+F*sin(ph*.1)*.06);float eye=S(50.,82.,ph),grow=S(10.,82.,ph),close=S(104.,118.,ph);vec3 ro=vec3(sin(ph*.085)*.24,sin(ph*.07)*.1,ph*.36),ta=ro+vec3(sin(ph*.045)*.35,sin(ph*.065)*.08,4.);vec3 f=normalize(ta-ro),rr=normalize(cross(vec3(0,1,0),f)),up=cross(f,rr),rd=normalize(f+u.x*rr+u.y*up);float z=0.,mat=0.;G=0.;for(int i=0;i<40;i++){vec2 h=M(ro+rd*z);G+=.0015/(.02+abs(h.x));if(h.x<.001||z>55.){mat=h.y;break;}z+=h.x*.9;}vec3 col=vec3(.004,.008,.018)+max(0.,u.y+.5)*vec3(.012,.018,.035);float sd=length(u*vec2(1.,1.15)),sr=mix(.08,.38,grow),co=.012/max(.012,abs(sd-sr));col+=vec3(1.,.17,.025)*co;if(sd<sr)col*=.04;col+=vec3(step(.9985,H(floor((u+ph*.001)*r*.45)))*.35);if(z<55.){vec3 x=ro+rd*z,no=mat>1.5?vec3(0,1,0):N(x),ld=normalize(vec3(-.5,.8,-.6)),base=mix(vec3(.025,.04,.07),vec3(.04,.055,.075),sin(x.y*13.+x.z*2.)*.5+.5);float lit=.12+.88*max(0.,dot(no,ld));col=base*lit;col+=vec3(.7,.12,.025)*pow(max(0.,dot(reflect(-ld,no),-rd)),24.);if(mat>1.5)col+=vec3(.12,.025,.012)*(.3+.7*abs(sin(x.x*7.+x.z)));col=mix(col,vec3(.008,.012,.025),1.-exp(-z*z*.0012));col+=G*vec3(.018,.035,.06);}if(eye>.01){float a=atan(u.y,u.x),pr=.08+.16*S(94.,106.,ph),ir=S(sr,sr-.16,sd)*S(pr,pr+.06,sd),im=S(sr+.02,sr-.02,sd)*eye;vec3 ec=vec3(.008,.002,.001)+ir*(.3+.7*abs(sin(a*24.+ph*.5)))*vec3(1.,.18,.025);col=mix(col,ec,im);col+=eye*vec3(.22,.018,.003)*exp(-abs(u.x)*12.)*max(0.,-u.y);}float open=1.-close,ey=abs(u.y)-open*(.42-u.x*u.x*.13);col*=mix(1.,S(.015,-.015,ey),close);float fade=S(0.,4.,ph)*S(120.,114.,ph);col*=fade;col=pow(col,vec3(.72));o=vec4(col,1);}
