#ifdef GL_ES precision mediump float; #endif // glslsandbox uniforms uniform float time; uniform vec2 resolution; uniform vec2 mouse; // shadertoy emulation #define iTime time #define iResolution resolution vec4 iMouse = vec4(0.); // raymarching based from https://www.shadertoy.com/view/wdGGz3 #define USE_MOUSE 0 #define MAX_STEPS 100 #define MAX_DIST 100. #define SURF_DIST .001 #define Rot(a) mat2(cos(a),-sin(a),sin(a),cos(a)) #define Slice(p,a) dot(p,vec2(cos(a),sin(a))) #define antialiasing(n) n/min(iResolution.y,iResolution.x) #define S(d,b) smoothstep(antialiasing(1.0),b,d) #define B(p,s) max(abs(p).x-s.x,abs(p).y-s.y) #define Tri(p,s,a) max(-dot(p,vec2(cos(-a),sin(-a))),max(dot(p,vec2(cos(a),sin(a))),max(abs(p).x-s.x,abs(p).y-s.y))) #define DF(a,b) length(a) * cos( mod( atan(a.y,a.x)+6.28/(b*8.0), 6.28/((b*8.0)*0.5))+(b-1.)*6.28/(b*8.0) + vec2(0,11) ) #define MATERIAL_UPPER 0 #define MATERIAL_OUTSOLE 1 #define MATERIAL_EFFECT 2 #define SCENE0 3.0 #define SCENE1 10.0 #define SCENE2 20.0 #define SCENE3 30.0 #define SCENE_LENGTH 38.0 float getSceneTime(){ return mod(iTime,SCENE_LENGTH); } float Hash21(vec2 p) { p = fract(p*vec2(234.56,789.34)); p+=dot(p,p+34.56); return fract(p.x+p.y); } // https://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm float dot2( in vec2 v ) { return dot(v,v); } float dot2( in vec3 v ) { return dot(v,v); } float opSmoothUnion( float d1, float d2, float k ) { float h = clamp( 0.5 + 0.5*(d2-d1)/k, 0.0, 1.0 ); return mix( d2, d1, h ) - k*h*(1.0-h); } // IQ's 3D noise function. It's faster than the FBM and enough for me to design. // The compile is also faster. float noise3d( vec3 p ) { const vec3 s = vec3(27, 111, 57); vec3 ip = floor(p); p -= ip; vec4 h = vec4(0., s.yz, s.y + s.z) + dot(ip, s); p = p*p*(3. - 2.*p); //p *= p*p*(p*(p*6. - 15.) + 10.); // option h = mix(fract(sin(h) * 43758.545), fract(sin(h + s.x) * 43758.545), p.x); h.xy = mix(h.xz, h.yw, p.y); return mix(h.x, h.y, p.z); } vec2 combine(vec2 val1, vec2 val2 ){ return (val1.x < val2.x)?val1:val2; } vec2 smoothCombine(vec2 val1, vec2 val2, float k ){ if(val1.x < val2.x){ val1.x = opSmoothUnion(val1.x,val2.x,k); return val1; } val2.x = opSmoothUnion(val1.x,val2.x,k); return val2; } // https://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm float sdTorus( vec3 p, vec2 t ) { vec2 q = vec2(length(p.xz)-t.x,p.y); return length(q)-t.y; } // https://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm float sdCappedCylinder( vec3 p, float h, float r ) { vec2 d = abs(vec2(length(p.yz),p.x)) - vec2(r,h); return min(max(d.x,d.y),0.0) + length(max(d,0.0)); } // https://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm float sdBox( vec3 p, vec3 b ) { vec3 q = abs(p) - b; return length(max(q,0.0)) + min(max(q.x,max(q.y,q.z)),0.0); } // https://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm float sdEllipsoid( vec3 p, vec3 r ) { float k0 = length(p/r); float k1 = length(p/(r*r)); return k0*(k0-1.0)/k1; } // https://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm float sdCappedCone( vec3 p, float h, float r1, float r2 ) { vec2 q = vec2( length(p.xz), p.y ); vec2 k1 = vec2(r2,h); vec2 k2 = vec2(r2-r1,2.0*h); vec2 ca = vec2(q.x-min(q.x,(q.y<0.0)?r1:r2), abs(q.y)-h); vec2 cb = q - k1 + k2*clamp( dot(k1-q,k2)/dot2(k2), 0.0, 1.0 ); float s = (cb.x<0.0 && ca.y<0.0) ? -1.0 : 1.0; return s*sqrt( min(dot2(ca),dot2(cb)) ); } float sdSimpleCylinder(vec3 p, float r, float h){ float d = length(p.xz)-r; d = max(abs(p.y)-h,d); return d; } // =========== 3D Model =========== float baseOutsole(vec3 p, float h){ vec3 prevP = p; p.xz*=Rot(radians(17.0)); p.z*=0.4; p.x*=0.57; p.x+=0.03; p.z-=0.07; float d =sdSimpleCylinder(p,0.1,h); p = prevP; p.xy*=Rot(radians(90.0)); p.y*=1.5; p.z*=1.2; float d2 = sdCappedCylinder(p-vec3(0.0,0.0,-0.25),h,0.2); d = opSmoothUnion(d, d2,0.13); p = prevP; d = max(abs(p.y)-h,d); return (d)*0.6; } float outsole(vec3 p){ p.z*=0.9; vec3 prevP = p; float d = baseOutsole(p-vec3(0.0,0.02,0.),0.06); // wave traction pattern float scene = getSceneTime(); if(scene=SCENE3){ p.xz*=Rot(radians(iTime*50.0)); d = sdTorus(p,vec2(0.45,0.005)); d = max(-(abs(p.x)-0.455),d); p = prevP; p.y+=0.125; p.xy*=Rot(radians((iTime*-50.0))); p.yz*=Rot(radians(90.0)); d2 = sdTorus(p,vec2(0.45,0.005)); d2 = max(-(abs(p.x)-0.455),d2); vec2 model3 = vec2(min(d,d2),MATERIAL_EFFECT); return combine(smoothCombine(model,model2,0.03),model3); } return smoothCombine(model,model2,0.03); } vec2 RayMarch(vec3 ro, vec3 rd, float side) { vec2 dO = vec2(0.0); for(int i=0; iMAX_DIST || abs(dS.x)0.0)?r.xy : r.zw; r.x = (p.y>0.0)?r.x : r.y; vec2 q = abs(p)-b+r.x; return min(max(q.x,q.y),0.0) + length(max(q,0.0)) - r.x; } // https://www.iquilezles.org/www/articles/distfunctions2d/distfunctions2d.htm float sdPie( in vec2 p, in vec2 c, in float r ) { p.x = abs(p.x); float l = length(p) - r; float m = length(p-c*clamp(dot(p,c),0.0,r)); // c=sin/cos of aperture return max(l,m*sign(c.y*p.x-c.x*p.y)); } float dTri(vec2 p, vec2 s){ p*=-1.0; return Tri(p,s,radians(30.0)); } float animationMask(vec2 p, float speed){ float t = mod(iTime*speed,360.0); float rad = radians(t); float d = sdPie(p,vec2(sin(rad),cos(rad)),0.15); return d; } float charT(vec2 p, int animate, float speed) { vec2 prevP = p; float w = 0.03; float size = 0.1; float d = sdBox(p,vec2(size)); float mask = sdBox(p-vec2(0.031,-0.031),vec2(0.071)); d = max(-mask,d); p*=Rot(radians(45.0)); p.x+=0.075; d = max(-p.x,d); p = prevP; p*=Rot(radians(45.0)); d = max(p.x,d); p = prevP; if(animate == 1){ mask = animationMask(p,speed); d = max(-mask,d); } return d; } float charD(vec2 p, int animate, float speed) { vec2 prevP = p; float w = 0.03; float size = 0.1; float d = sdRoundedBox(p,vec2(size),vec4(0.05,0.05,0,0)); float d2 = sdRoundedBox(p,vec2(0.04,0.04),vec4(0.025,0.025,0,0)); d = max(-d2,d); p*=Rot(radians(45.0)); p.x+=0.04; d = max(-p.x,d); p = prevP; if(animate == 1){ float mask = animationMask(p,speed); d = max(-mask,d); } return d; } float charF(vec2 p, int animate, float speed) { vec2 prevP = p; float size = 0.1; float d = sdBox(p,vec2(size)); p*=Rot(radians(45.0)); d = max(p.x,d); p = prevP; float mask = sdBox(p-vec2(0.06,0.025),vec2(0.1,0.015)); d = max(-mask,d); if(animate == 1){ mask = animationMask(p,speed); d = max(-mask,d); } return d; } float drawTDFLogo(vec2 p, int animate, float speed){ float d = charT(p-vec2(-0.13,0.0),animate,speed); float d2 = charD(p-vec2(-0.05,0.0),animate,speed); d = min(d,d2); d2 = charF(p-vec2(0.17,0.0),animate,speed); return min(d,d2); } float drawTDFLogoPararell(vec2 p, int animate, float speed){ float d = charT(p-vec2(-0.13,0.0),animate,speed); float d2 = charD(p-vec2(-0.05,0.0),animate,speed*0.5); d = min(d,d2); d2 = charF(p-vec2(0.17,0.0),animate,speed*0.75); return min(d,d2); } vec3 drawHUD(vec2 p, vec3 col){ vec2 prevP = p; p*=Rot(radians(-iTime*10.0)); p = DF(p,16.0); p = abs(p); p -= vec2(0.215); p*=Rot(radians(45.0)); float d = B(p,vec2(0.001,0.005)); col = mix(col,vec3(1.0),S(d,0.0)); p = prevP; p*=Rot(radians(-iTime*10.0)); p = DF(p,4.0); p = abs(p); p -= vec2(0.21); p*=Rot(radians(45.0)); d = B(p,vec2(0.001,0.015)); col = mix(col,vec3(1.0),S(d,0.0)); p = prevP; p*=Rot(radians(iTime*20.0)); d = abs(length(p)-0.32)-0.005; d = max(-B(p,vec2(1.0,0.2)),d); p = mod(p,0.005)-0.0025; d = max(-B(p,vec2(0.003)),d); col = mix(col,vec3(1.0),S(d,0.0)); p = prevP; p*=Rot(radians(sin(iTime*1.0)*45.0)); p = DF(p,1.0); p = abs(p); p -= vec2(0.24); p*=Rot(radians(45.0)); d = dTri(p,vec2(0.015)); col = mix(col,vec3(1.0),S(d,0.0)); return col; } vec3 drawUI(vec2 p, vec3 col){ vec2 prevP = p; p*=3.5; p = abs(p); p.x -=2.7; p.y -=1.3; p*=Rot(radians(-90.0)); float d = drawTDFLogo(p,1,0.0); col = mix(col,vec3(1.0),S(d,0.0)); p = prevP; p*=0.8; float scene = getSceneTime(); if((scene>=SCENE0 && scene=SCENE2 && scene=0.4 && n<0.7){ d = charD(gv,1,120.0*n); } else if(n>=0.7){ d = charF(gv,1,140.0*n); } col = mix(col,vec3(0.9,0.9,0.1),S(d,0.0)); return col; } vec3 postEffect(vec2 p, vec3 col){ p*=8.0; float y = fract(p.y)-0.5; vec2 gv = fract(p)-0.5; vec2 id = floor(p); float n = Hash21(id); p.y = y; float d = B(p,vec2(cos(iTime*n*20.0)*100.0*n*n,sin(iTime*n*20.0)*100.0*n*n)); col = mix(col,vec3(0.9,0.9,0.1)*0.75,S(d,0.0)); return col; } vec3 logoAnimationBg(vec2 p, vec3 col){ float brightness = 0.2; vec2 prevP = p; p.x+=iTime*0.1; p.x = mod(p.x,0.54)-0.27; p.y = mod(p.y,0.45)-0.225; float d = drawTDFLogoPararell(p,1,100.0); col = mix(col,vec3(0.9,0.9,0.1)*brightness,S(d,0.0)); p = prevP; p.x-=iTime*0.1; p.y+=0.225; p.x = mod(p.x,0.54)-0.27; p.y = mod(p.y,0.45)-0.225; d = drawTDFLogoPararell(p,1,120.0); col = mix(col,vec3(0.9,0.9,0.1)*brightness,S(d,0.0)); return col; } void mainImage( out vec4 fragColor, in vec2 fragCoord ) { vec2 uv = (fragCoord-.5*iResolution.xy)/iResolution.y; vec2 prevUV = uv; float scene = getSceneTime(); if(scene>=SCENE1 && scene=SCENE3){ uv.y+=scene*0.1; uv*=1.4; uv.y = fract(uv.y)-0.5; } vec2 m = iMouse.xy/iResolution.xy -.3; float cz = 0.85; if(scene>=SCENE0 && scene<=SCENE1){ cz = 1.; } else if(scene>=SCENE1 && scene<=SCENE2){ cz = 1.2; } else if(scene>=SCENE2){ cz = 1.0; } vec3 ro = vec3(0, 0, cz); #if USE_MOUSE == 1 ro.yz *= Rot(-m.y*3.14+1.); ro.xz *= Rot(-m.x*6.2831); #else if(scene=SCENE1 && scene=SCENE2 && scene=SCENE3){ ro.xz *= Rot(radians(-25.0+scene*20.0)); ro.yz *= Rot(radians(85.0)); } else { ro.xz *= Rot(radians(-5.0+scene*20.0)); } } #endif vec3 rd = R(uv, ro, vec3(0,0.0,0), 1.0); vec2 d = RayMarch(ro, rd, 1.); vec3 col = vec3(1.0); if(d.x=SCENE0 && scene=SCENE2 && scene=SCENE3){ col = logoAnimationBg(uv,col); } } // UI //float ld = drawTDFLogo(uv,1,60.0); if(scene=SCENE0-0.2 && scene=SCENE1-0.2 && scene=SCENE2-0.2 && scene=SCENE3-0.1 && sceneSCENE_LENGTH-0.2 || scene<0.1){ col = postEffect(uv,col); } fragColor = vec4(col,1.0); } void main(void) { iMouse = vec4(mouse * resolution, 01., 10.); mainImage(gl_FragColor, gl_FragCoord.xy); gl_FragColor.a = 1.2; }