// FMS_Cat - Shell // GLSL Graphics for Tokyo Demo Fest 2015 // 2015/02/22 // // Greeting: // doxas // gyabo // Jugem-T // RTX1911 #ifdef GL_ES precision mediump float; #endif uniform float time; uniform vec2 resolution; #define C vec3(.5,.1,.2)*2. #define ITER 72 #define SITER 32 #define tMax 40. #define t mod(time,tMax) #define r resolution.xy #define v vec2(0.,1.) #define cl(i) clamp(i,0.,1.) #define PI 3.1415926 float hash(vec2 _v) { return fract(sin(dot(_v,vec2(89.44,19.36)))*229.22); } float iHash(vec2 _v,vec2 _r) { float h00 = hash(vec2(floor(_v*_r+v.xx)/_r)); float h10 = hash(vec2(floor(_v*_r+v.yx)/_r)); float h01 = hash(vec2(floor(_v*_r+v.xy)/_r)); float h11 = hash(vec2(floor(_v*_r+v.yy)/_r)); vec2 ip = vec2(smoothstep(v.xx,v.yy,mod(_v*_r,1.))); return (h00*(1.-ip.x)+h10*ip.x)*(1.-ip.y)+(h01*(1.-ip.x)+h11*ip.x)*ip.y; } float noise(vec2 _v) { float sum = 0.; for(int i=1; i<6; i++) { sum += iHash(_v+vec2(i),vec2(2.*pow(2.,float(i))))/pow(2.,float(i)); } return sum; } float noiseT(vec2 _v) { float sum = 0.; for(int i=1; i<6; i++) { sum += iHash(_v+vec2(i)*t,vec2(2.*pow(2.,float(i))))/pow(2.,float(i)); } return sum; } vec2 rotate(vec2 i,float th) { return mat2(cos(th),-sin(th),sin(th),cos(th))*i; } float box(vec3 p,vec3 b) { vec3 d=abs(p)-b; return min(max(d.x,max(d.y,d.z)),0.)+length(max(d,0.)); } float box(vec3 p,float b){return box(p,vec3(b));} float bar(vec2 p,vec2 b) { vec2 d=abs(p)-b; return min(max(d.x,d.y),0.)+length(max(d,0.)); } float crossBar(vec3 p,float b) { float da=bar(p.xy,vec2(b)), db=bar(p.yz,vec2(b)), dc=bar(p.zx,vec2(b)); return min(da,min(db,dc)); } float spongePre(vec3 p) { p.xy=rotate(p.xy,t*.23); p.yz=rotate(p.yz,t*.13); p.zx=rotate(p.zx,t*.43); return box(p,.4); } vec2 sponge(vec3 p) { p.xy=rotate(p.xy,t*.23); p.yz=rotate(p.yz,t*.13); p.zx=rotate(p.zx,t*.43); float ret=box(p,.4); vec3 pt=p; for(float c=0.;c<4.;c+=1.) { p=pt; float h0=pow(1.17+hash(floor(t/5.+361.)*v.yy),c*.5); float h1=pow(1.17+hash(ceil(t/5.+361.)*v.yy),c*.5); float pw=h1+exp(-mod(t,5.)*12.)*(h0-h1); ret=max(ret,-crossBar(mod(p+.15/pw,.6/pw)-.15/pw,.1/pw)); } return vec2(ret,0.); } vec2 oil(vec3 p) { return vec2(p.y+.9,1.); } vec2 flo(vec3 p) { return vec2(max(p.y+.7,.8-length(p.xz)),2.); } vec2 pole(vec3 p) { return vec2(length(mod(p.xz,4.)-2.)-.3,2.); } #define check if(disC.x