/*
Mouse X Left 左 : 低速 Slow
Mouse X Right 右 : 最高速度 Maximum Speed
*/
precision highp float;
uniform vec2 resolution;
uniform vec2 mouse;
uniform float time;
uniform sampler2D backbuffer;
out vec4 outColor;float crossDist( in vec3 p ) {
vec3 absp = abs(p);
float d =0.;
for(float i=0.,m;i++<3.;){
d+=step(m=max(absp.y,absp.z),absp.x)*m;
absp.xyz=absp.yzx;
}
float cr = 1.0-d;
float cu = max(max(absp.x,absp.z), absp.y) - 3.0;
return max(cr, cu);
}
// menger sponge fractal
float fractal( in vec3 p ) {
vec3 pp = p;
float scale = 1.0;
float dist = 0.0;
for (int i = 0 ; i < 4 ; i++) {
dist = max(dist, crossDist(p)*scale);
p = fract((p-1.0)*0.5) * 6.0 - 3.0;
scale /= 3.;
//p.yz*=rot(.785);
}
return dist;
}
mat2 rot(float a){float c=cos(a),s=sin(a);return mat2(c,-s,s,c);}
vec3 pal(float t){return .5+.5*cos(6.28*(1.*t+vec3(.0,.3,.7)));}
void main(){
vec2 r=resolution,uv=(gl_FragCoord.xy*2.-r)/min(r.x,r.y);
bool speedup = mouse.x*mouse.x >.5 ;
vec3 col = vec3(0.);
float rnd = fract(758.7*sin(dot(uv,vec2(486.426,751.953))));
vec3 p,d=normalize(vec3(uv,.8-.05*sqrt(max(.1,length(uv)-.3))*rnd));
float t = time*.2;
t*=2.;
t=floor(t)+pow(fract(t),.05);
t+=time*.2;
t=speedup?time:t;
for(float i,e,g;i++<50.;){
p = d*g;
vec3 op = p;
if(mod(t,(speedup ? 12.:6.))<2.){p.x +=20.+10.*((t*.5));p.yz*=rot(t);}
else if(mod(t,(speedup ? 12.:6.))<4.){ p.y +=20.+10.*((t*.5)); p.xz *=rot(t);}
else { p.xy *=rot(t+p.z*.1+rnd*.025*sqrt(length(uv))); p.z +=20.+10.*((t*.5)); p.x += sin(t);}
p.zxy = asin(sin(p.zxy/1.8))*1.8;
float h= max(abs(p.z)-3.,fractal(p));
g+=e=max(.0001,abs(h));
float tt=tanh(sin(length(p)+rnd*.01)*5.);
col +=mix(pal(.9+rnd*.1+tt+t*2.+length(p))*(.05),vec3(.0015)*fract(105.*dot(floor(p*5.)/10.,vec3(225.35,355.35,953.35))),clamp(tt,0.,1.))/exp((1.-fract(-op.z*.1+t*2.))*e*i*i);
}
outColor=vec4(sqrt(col),1);
}