1// Compatibility #ifdefs needed for parameters 2#ifdef GL_ES 3#define COMPAT_PRECISION mediump 4#else 5#define COMPAT_PRECISION 6#endif 7 8// Parameter lines go here: 9#pragma parameter RETRO_PIXEL_SIZE "Retro Pixel Size" 0.84 0.0 1.0 0.01 10#ifdef PARAMETER_UNIFORM 11// All parameter floats need to have COMPAT_PRECISION in front of them 12uniform COMPAT_PRECISION float RETRO_PIXEL_SIZE; 13#else 14#define RETRO_PIXEL_SIZE 0.84 15#endif 16 17#if defined(VERTEX) 18 19#if __VERSION__ >= 130 20#define COMPAT_VARYING out 21#define COMPAT_ATTRIBUTE in 22#define COMPAT_TEXTURE texture 23#else 24#define COMPAT_VARYING varying 25#define COMPAT_ATTRIBUTE attribute 26#define COMPAT_TEXTURE texture2D 27#endif 28 29#ifdef GL_ES 30#define COMPAT_PRECISION mediump 31#else 32#define COMPAT_PRECISION 33#endif 34 35COMPAT_ATTRIBUTE vec4 VertexCoord; 36COMPAT_ATTRIBUTE vec4 COLOR; 37COMPAT_ATTRIBUTE vec4 TexCoord; 38COMPAT_VARYING vec4 COL0; 39COMPAT_VARYING vec4 TEX0; 40// out variables go here as COMPAT_VARYING whatever 41 42vec4 _oPosition1; 43uniform mat4 MVPMatrix; 44uniform COMPAT_PRECISION int FrameDirection; 45uniform COMPAT_PRECISION int FrameCount; 46uniform COMPAT_PRECISION vec2 OutputSize; 47uniform COMPAT_PRECISION vec2 TextureSize; 48uniform COMPAT_PRECISION vec2 InputSize; 49 50// compatibility #defines 51#define vTexCoord TEX0.xy 52#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize 53#define OutSize vec4(OutputSize, 1.0 / OutputSize) 54 55void main() 56{ 57 gl_Position = MVPMatrix * VertexCoord; 58 TEX0.xy = VertexCoord.xy; 59// Paste vertex contents here: 60} 61 62#elif defined(FRAGMENT) 63 64#if __VERSION__ >= 130 65#define COMPAT_VARYING in 66#define COMPAT_TEXTURE texture 67out vec4 FragColor; 68#else 69#define COMPAT_VARYING varying 70#define FragColor gl_FragColor 71#define COMPAT_TEXTURE texture2D 72#endif 73 74#ifdef GL_ES 75#ifdef GL_FRAGMENT_PRECISION_HIGH 76precision highp float; 77#else 78precision mediump float; 79#endif 80#define COMPAT_PRECISION mediump 81#else 82#define COMPAT_PRECISION 83#endif 84 85uniform COMPAT_PRECISION int FrameDirection; 86uniform COMPAT_PRECISION int FrameCount; 87uniform COMPAT_PRECISION vec2 OutputSize; 88uniform COMPAT_PRECISION vec2 TextureSize; 89uniform COMPAT_PRECISION vec2 InputSize; 90uniform sampler2D Texture; 91COMPAT_VARYING vec4 TEX0; 92// in variables go here as COMPAT_VARYING whatever 93 94// compatibility #defines 95#define Source Texture 96#define vTexCoord TEX0.xy 97 98#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize 99#define OutSize vec4(OutputSize, 1.0 / OutputSize) 100 101// delete all 'params.' or 'registers.' or whatever in the fragment 102float iGlobalTime = float(FrameCount)*0.025; 103vec2 iResolution = OutputSize.xy; 104 105//I remade my other shader (https://www.shadertoy.com/view/ldjGWD) inspired by "The Popular Demo", to make it more accurate 106//I added a tiling effect to make the robot look faceted, but it seems to somehow over-complicate the shader so it doesn't compile. 107// fizzer - 2014-01-04 108 109#define USE_IQ_SMIN 0 110 111float time; 112 113vec2 leg0[3]; 114vec2 leg1[3]; 115 116vec2 arm0[3]; 117vec2 arm1[3]; 118 119float wlen=15.0; 120float bob; 121float wc_scale=0.5; 122float scroll; 123float scene_scale=15.0; 124 125// Finds the entry and exit points of a 2D ray with a circle of radius 1 126// centered at the origin. 127vec2 intersectCircle(vec2 ro, vec2 rd) 128{ 129 float a = dot(rd, rd); 130 float b = 2.0 * dot(rd, ro); 131 float ds = b * b - 4.0 * a * (dot(ro, ro) - 1.0); 132 133 if(ds < 0.0) 134 return vec2(1e3); 135 136 return ((-b - sqrt(ds) * vec2(-1.0, 1.0))) / (2.0 * a); 137} 138 139mat3 rotateXMat(float a) 140{ 141 return mat3(1.0, 0.0, 0.0, 0.0, cos(a), -sin(a), 0.0, sin(a), cos(a)); 142} 143 144mat3 rotateYMat(float a) 145{ 146 return mat3(cos(a), 0.0, -sin(a), 0.0, 1.0, 0.0, sin(a), 0.0, cos(a)); 147} 148 149// Adapted from https://www.shadertoy.com/view/ldlGR7 150vec2 solve( vec2 p, float l1, float l2, float side ) 151{ 152 vec2 q = p*( 0.5 + 0.5*(l1*l1-l2*l2)/dot(p,p) ); 153 154 float s = l1*l1/dot(q,q) - 1.0; 155 156 if( s<0.0 ) return vec2(-100.0); 157 158 return q + q.yx*vec2(-1.0,1.0)*side*sqrt( s ); 159} 160 161// Returns a pyramid-like periodic signal. 162float pyramid(float x) 163{ 164 x = fract(x); 165 return min(x * 2.0, (1.0 - x) * 2.0); 166} 167 168// Returns a semicircular periodic signal. 169float circ(float x) 170{ 171 x = fract(x) * 2.0 - 1.0; 172 return sqrt(1.0 - x * x); 173} 174 175#if USE_IQ_SMIN 176float smin(float a,float b,float k){ return -log(exp(-k*a)+exp(-k*b))/k;}//from iq 177#else 178// http://www.johndcook.com/blog/2010/01/20/how-to-compute-the-soft-maximum/ 179float smin(in float a, in float b, in float k) { return a - log(1.0+exp(k*(a-b))) / k; } 180#endif 181 182float mp(float x) 183{ 184 float y=0.3; 185 return clamp((pyramid(x)-0.5)*2.0-0.4,-y,y); 186} 187 188float mosaic(vec3 p) 189{ 190 // Disabled because it causes a compilation failure due to time-out or size limit. 191 return 0.0;//max(mp(p.y*10.0),mp(p.z*10.0))*0.01; 192} 193/* 194mat3 transpose(mat3 m) 195{ 196 return mat3(vec3(m[0].x,m[1].x,m[2].x), 197 vec3(m[0].y,m[1].y,m[2].y), 198 vec3(m[0].z,m[1].z,m[2].z)); 199}*/ 200 201float capsuleDist(vec3 p,vec3 o,vec3 d,float h0,float h1,float r0,float r1) 202{ 203 vec3 u=cross(d,vec3(1.0,0.0,0.0)); 204 vec3 v=cross(u,d); 205 u=cross(v,d); 206 mat3 m=transpose(mat3(normalize(u),normalize(v),normalize(d))); 207 d=normalize(d); 208 float t=clamp(dot(p-o,d),h0,h1); 209 vec3 np=o+t*d; 210 return distance(np,p)-mix(r0,r1,t)+mosaic(m*(p-o)); 211} 212 213float boxDist(vec3 p,vec3 s,float r) 214{ 215 return length(max(vec3(0.0),abs(p)-s))-r+mosaic(p); 216} 217 218float sphereDist(vec3 p,vec3 o,float r) 219{ 220 return distance(p,o)-r+mosaic(p-o); 221} 222 223float sceneDist(vec3 p) 224{ 225 float d=1e3; 226 227 p+=vec3(0.0,0.07,0.0)*scene_scale; 228 p=rotateYMat(3.1415926*0.5)*p; 229 230 p.z+=cos(p.y*2.0+time)*0.1; 231 float tm=fract(time*wc_scale*2.0-0.1); 232 p.x-=(smoothstep(0.0,0.3,tm)-smoothstep(0.4,1.0,tm))*smoothstep(0.5,2.0,p.y)*0.2+scroll; 233 234 // Leg 0 235 { 236 float g=0.08; 237 vec3 o=vec3(0.0,0.0,0.2); 238 float d0=capsuleDist(p+o,vec3(leg0[0],0.0),vec3(leg0[1]-leg0[0],0.0),0.0,1.0-g,0.1,0.1); 239 float d1=capsuleDist(p+o,vec3(leg0[1],0.0),vec3(leg0[2]-leg0[1],0.0),g,1.0,0.1,0.2); 240 d=min(d,smin(d0,d1,15.0)); 241 } 242 243 // Leg 1 244 { 245 float g=0.08; 246 vec3 o=vec3(0.0,0.0,-0.2); 247 float d0=capsuleDist(p+o,vec3(leg1[0],0.0),vec3(leg1[1]-leg1[0],0.0),0.0,1.0-g,0.1,0.1); 248 float d1=capsuleDist(p+o,vec3(leg1[1],0.0),vec3(leg1[2]-leg1[1],0.0),g,1.0,0.1,0.2); 249 d=min(d,smin(d0,d1,15.0)); 250 } 251 252 p.y-=bob; 253 254 // Arm 0 255 { 256 float g=0.08; 257 vec3 o=vec3(0.0,0.0,0.4); 258 mat3 m=rotateXMat(-0.3)*rotateYMat((cos((time*wc_scale+0.5)*3.1415926*2.0)-0.6)*0.5); 259 float d0=capsuleDist(p+o,vec3(arm0[0],0.0),m*vec3(arm0[1]-arm0[0],0.0),0.0,0.7-g,0.03,0.03); 260 float d1=capsuleDist(p+o,vec3(arm0[0],0.0)+m*vec3(arm0[1]-arm0[0],0.0),m*vec3(arm0[2]-arm0[1],0.0),g,0.7,0.03,0.06); 261 d=min(d,smin(d0,d1,15.0)); 262 } 263 264 // Arm 1 265 { 266 float g=0.08; 267 vec3 o=vec3(0.0,0.0,-0.4); 268 mat3 m=rotateXMat(0.3)*rotateYMat(-(cos(time*wc_scale*3.1415926*2.0)-0.6)*0.5); 269 float d0=capsuleDist(p+o,vec3(arm1[0],0.0),m*vec3(arm1[1]-arm1[0],0.0),0.0,0.7-g,0.03,0.03); 270 float d1=capsuleDist(p+o,vec3(arm1[0],0.0)+m*vec3(arm1[1]-arm1[0],0.0),m*vec3(arm1[2]-arm1[1],0.0),g,0.7,0.03,0.06); 271 d=min(d,smin(d0,d1,15.0)); 272 } 273 274 // Torso 275 d=smin(d,boxDist(p+vec3(0.0,-0.7,0.0),vec3(0.05,0.7,0.15),0.1),15.0); 276 d=smin(d,boxDist(p+vec3(-0.1,-1.1,0.0),vec3(0.05,0.2,0.15)*0.1,0.1),5.0); 277 278 // Head 279 d=smin(d,sphereDist(p,vec3(0.0,1.825,0.0),0.2),15.0); 280 281 282 return d; 283} 284 285vec3 sceneNorm(vec3 p) 286{ 287 p*=scene_scale; 288 float c=sceneDist(p); 289 float e=1e-3; 290 return normalize(vec3(sceneDist(p+vec3(e,0,0))-c, 291 sceneDist(p+vec3(0,e,0))-c, 292 sceneDist(p+vec3(0,0,e))-c)); 293} 294 295float robot(vec3 ro,vec3 rd) 296{ 297 float t=0.0; 298 float tm; 299 300 tm=time*wc_scale; 301 302 leg0[0]=vec2(0.0,bob); 303 leg0[2]=vec2(pyramid(tm)-0.3,-1.8+0.3*circ(tm*2.0)*step(fract(tm),0.5)); 304 leg0[1]=(leg0[0]+solve(leg0[2]-leg0[0],1.0,1.0,1.0)); 305 306 arm1[0]=vec2(0.0,1.4); 307 arm1[2]=vec2(pyramid(tm)-0.3,0.1+pow(pyramid(tm),2.0)*0.7); 308 arm1[1]=(arm1[0]+solve(arm1[2]-arm1[0],0.7,0.7,-1.0)); 309 310 tm+=0.5; 311 312 leg1[0]=vec2(0.0,bob); 313 leg1[2]=vec2(pyramid(tm)-0.3,-1.8+0.3*circ(tm*2.0)*step(fract(tm),0.5)); 314 leg1[1]=(leg1[0]+solve(leg1[2]-leg1[0],1.0,1.0,1.0)); 315 316 arm0[0]=vec2(0.0,1.4); 317 arm0[2]=vec2(pyramid(tm)-0.3,0.1+pow(pyramid(tm),2.0)*0.7); 318 arm0[1]=(arm0[0]+solve(arm0[2]-arm0[0],0.7,0.7,-1.0)); 319 320 float rt=1e4; 321 322 ro*=scene_scale; 323 rd*=scene_scale; 324 325 for(int i=0;i<15;i+=1) 326 { 327 vec3 rp=ro+rd*t; 328 329 float d=sceneDist(rp); 330 331 if(d<1e-2) 332 { 333 rt=t; 334 } 335 336 t+=d/scene_scale; 337 } 338 339 340 return rt; 341} 342 343 344vec2 unitSquareInterval(vec2 ro, vec2 rd) 345{ 346 vec2 slabs0 = (vec2(+1.0) - ro) / rd; 347 vec2 slabs1 = (vec2(-1.0) - ro) / rd; 348 349 vec2 mins = min(slabs0, slabs1); 350 vec2 maxs = max(slabs0, slabs1); 351 352 return vec2(max(mins.x, mins.y), 353 min(maxs.x, maxs.y)); 354} 355 356vec3 squaresColours(vec2 p) 357{ 358 p+=vec2(time*0.2); 359 360 vec3 orange=vec3(1.0,0.4,0.1)*2.0; 361 vec3 purple=vec3(1.0,0.2,0.5)*0.8; 362 363 float l=pow(0.5+0.5*cos(p.x*7.0+cos(p.y)*8.0)*sin(p.y*2.0),4.0)*2.0; 364 vec3 c=pow(l*(mix(orange,purple,0.5+0.5*cos(p.x*40.0+sin(p.y*10.0)*3.0))+ 365 mix(orange,purple,0.5+0.5*cos(p.x*20.0+sin(p.y*3.0)*3.0))),vec3(1.2))*0.7; 366 367 c+=vec3(1.0,0.8,0.4)*pow(0.5+0.5*cos(p.x*20.0)*sin(p.y*12.0),20.0)*2.0; 368 369 c+=vec3(0.1,0.5+0.5*cos(p*20.0))*vec3(0.05,0.1,0.4).bgr*0.7; 370 371 return c; 372} 373 374vec3 squaresTex(vec2 p,float border) 375{ 376 float sm=0.02; 377 vec2 res=vec2(8.0); 378 vec2 ip=floor(p*res)/res; 379 vec2 fp=fract(p*res); 380 float m=1.0-max(smoothstep(border-sm,border,abs(fp.x-0.5)),smoothstep(border-sm,border,abs(fp.y-0.5))); 381 m+=1.0-smoothstep(0.0,0.56,distance(fp,vec2(0.5))); 382 return m*squaresColours(ip); 383} 384 385vec3 room(vec3 ro,vec3 rd,out vec3 rp,out vec3 n) 386{ 387 vec2 box_size=vec2(1.0,5.0+3.0/8.0); 388 389 vec2 cp=vec2(0.0),ct=vec2(1e3); 390 391 for(int i=0;i<4;i+=1) 392 { 393 float cr=0.03; 394 vec2 tcp=vec2(2.5/8.0*float(-1),float(i)-2.0+0.5/8.0); 395 vec2 tct=intersectCircle((ro.xz-tcp)/cr,rd.xz/cr); 396 397 if(tct.y > 0.0 && tct.y<ct.y) 398 { 399 ct=tct; 400 cp=tcp; 401 } 402 } 403 404 for(int i=0;i<4;i+=1) 405 { 406 float cr=0.03; 407 vec2 tcp=vec2(2.5/8.0*float(+1),float(i)-2.0+0.5/8.0); 408 vec2 tct=intersectCircle((ro.xz-tcp)/cr,rd.xz/cr); 409 410 if(tct.y > 0.0 && tct.y<ct.y) 411 { 412 ct=tct; 413 cp=tcp; 414 } 415 } 416 417 ct.y=max(0.0,ct.y); 418 419 vec3 ci=ro+rd*ct.y; 420 vec2 cu=vec2(atan(ci.z-cp.y,ci.x-cp.x)/3.1415926*0.5,(ci.y+0.5/8.0)*4.0); 421 422 float wt=max(0.0,unitSquareInterval(ro.xy * box_size, rd.xy * box_size).y); 423 float t=min(ct.y,wt); 424 425 rp=ro+rd*(t-1e-4); 426 427 n.z=0.0; 428 if(abs(rp.x*box_size.x)>abs(rp.y*box_size.y)) 429 n.xy=vec2(rp.x/abs(rp.x),0.0); 430 else 431 n.xy=vec2(0.0,rp.y/abs(rp.y)); 432 433 if(ct.y<wt) 434 { 435 n.y=0.0; 436 n.xz=normalize(rp.xz-ci.xz); 437 } 438 439 float l=1.0-smoothstep(0.0,3.0,abs(rp.z-ro.z)); 440 441 vec3 wc=mix(squaresTex(rp.zy+vec2(0.0,0.5/8.0),0.5),squaresTex(rp.xz,0.44),step(0.999/box_size.y,abs(rp.y))); 442 vec3 cc=squaresTex(cu,0.45)+0.8*vec3(smoothstep(0.83/5.0,0.86/5.0,abs(rp.y))); 443 444 return l*mix(cc,wc,step(wt,t)); 445} 446 447vec3 scene(vec2 p) 448{ 449 mat3 cam = rotateXMat(cos(time * 0.2) * 0.1) * rotateYMat(time * 0.5); 450 float lt=mod(time*wc_scale,wlen)/wlen; 451 452 vec3 ro = cam*vec3(0.0,-0.15+lt*0.15, 0.15+lt*0.2)+vec3(0.0,0.0,scroll/scene_scale); 453 vec3 rd = cam*vec3(p, -1.0); 454 455 rd=normalize(rd); 456 457 float robot_t=robot(ro,rd); 458 459 vec3 n,rp; 460 461 vec3 c; 462 vec3 c0=room(ro,rd,rp,n); 463 464 if(robot_t < distance(ro,rp)) 465 { 466 rp=ro+rd*robot_t; 467 n=sceneNorm(rp); 468 vec3 r=reflect(rd,n); 469 c=vec3(0.5+0.5*n.y)*0.5*vec3(1.0,0.8,0.5); 470 vec3 c1=room(rp,r,rp,n); 471 c+=c1*0.5; 472 } 473 else 474 { 475 vec3 r=reflect(rd,n); 476 vec3 c1=room(rp,r,rp,n); 477 c=c0+c1*c0*0.4; 478 } 479 480 vec3 ll=vec3(1.0-(smoothstep(0.0,0.07,lt)-smoothstep(0.93,1.0,lt))); 481 482 return ll+c+ 483 0.6*((sin(p.y)*cos(p.x+time*2.0)*0.5+0.5)* 484 pow(mix(vec3(1.0,0.7,0.1),vec3(1.0,0.2,0.6),0.5+0.5*cos(p.x+sin(time*3.0+p.y*2.0))),vec3(2.0))); 485} 486 487void mainImage( out vec4 fragColor, in vec2 fragCoord ) 488{ 489 time=iGlobalTime+1.0; 490 bob=cos(time*12.0)*0.05; 491 scroll=-15.0+mod(time*wc_scale,wlen)*2.0; 492 vec2 uv = fragCoord.xy / iResolution.xy; 493 vec2 q=uv; 494 vec2 t=uv*2.0-vec2(1.0); 495 t.x*=iResolution.x/iResolution.y; 496 fragColor.a = 1.0f; 497 fragColor.rgb = scene(t.xy) * 1.3; 498 499 // vignet 500 fragColor.rgb *= 0.5 + 0.5*pow( 16.0*q.x*q.y*(1.0-q.x)*(1.0-q.y), 0.1 ); 501} 502 503 void main(void) 504{ 505 //just some shit to wrap shadertoy's stuff 506 vec2 FragCoord = vTexCoord.xy*OutputSize.xy; 507 mainImage(FragColor,FragCoord); 508} 509#endif 510