scene.org File Archive

File download

<root>­/­parties­/­2021­/­tokyodemofest21­/­glsl/clock_glsl.zip

File size:
1 202 bytes (1.17K)
File date:
2021-12-12 11:40:28
Download count:
all-time: 18

Preview

  • Clock_GLSL/Clock_GLSL.txt 3.18K

file_id.diz

precision mediump float;

uniform float time;
uniform vec2 resolution;

const float pi = acos(-1.);
const float pi2 = pi*2.;

const float bpm = 120.;

mat2 rot(float r)
{
  return mat2(cos(r),sin(r),-sin(r),cos(r));
}

vec2 pmod(vec2 p, float r)
{
  float a = atan(p.x,p.y) + pi / r;
  float n = pi2 / r;
  a = floor(a/n)*n;

  return p*rot(-a);
}

float cube(vec3 p, vec3 s)
{
  p = abs(p) - s;
  return max(max(p.x,p.y),p.z);
}

float crosscube(vec3 p, vec3 s)
{
  vec3 v = vec3(1./3.,1./3.,4./3.);

  float d = cube(p,s*v.xyz);
  float d2 = cube(p,s*v.yzx);
  float d3 = cube(p,s*v.zxy);

  return min(min(d,d2),d3);
}

float background(vec3 p)
{
  float tbpm = time * bpm / 60.;
  float seq = floor(tbpm);
  float count = mod(seq,4.);

  vec3 q = p;
  p.z -= tbpm+exp(sin(tbpm*1.6));
  p.xy *= rot(0.1*p.z);
  p.xy *= rot((tbpm*0.1));
  p.z = mod(p.z,4.)-2.;
  p.xy = pmod(p.xy,6.);


  float d = 1e5;
  float v = 1.;
  float scale = 1.1;
  float sum = scale;
  for(int i = 0; i < 7; i++)
  {
    p.xy = abs(p.xy)-3.;
    p.xy *= rot(pi*0.25);
    float td = cube(p,vec3(0.5)*v)/sum;
    d = min(d,td);
    v *= 1.1;
    p *= scale;
    sum *= scale;
  }
  d = max(d,-cube(q,vec3(5.)));
  return d;
}

float menger(vec3 p,vec3 s)
{
  vec3 size = s;
  float d = cube(p,size);
  float cd = crosscube(p,size);
  d = max(d,-cd);
for(int i = 0; i < 4; i++)
{
  size *= 1./3.;
  float m = size.x*2.;
  p = mod(p-0.5*m,m)-0.5*m;
  cd = crosscube(p,size);
  d = max(d,-cd);
}
  return d;
}

float map(vec3 p)
{
  float tbpm = time * bpm / 60.;
  float seq = floor(tbpm);
  float count = mod(seq,4.);



  p.xz *= rot(sin(time)+exp(sin(time)));
  p.yz *= rot(cos(time)+exp(cos(time)));
  p.xy *= rot(pi*0.25*seq);
  if(count == 0.)
  {
    p.xy = pmod(p.xy,8.);
  }
  if(count == 1.)
  {
    p.xy = pmod(p.xy,8.);
  }
  if(count == 2.)
  {
    p.xy = pmod(p.xy,8.);
  }
  if(count == 3.)
  {
    p.xy = pmod(p.xy,8.);
  }

  vec3 q = p;

  float d = menger(q,vec3(1.));
  float scale = 1.5;
  float sum = scale;
  for(int i = 0; i < 5; i++)
  {
    q.x = abs(q.x) - 1.;
    q.y = abs(q.y) - 1.;
    q.xy *= rot(pi*0.25);
    float td = menger(q,vec3(0.5))/sum;
    d = min(d,td);

    q*=scale;
    sum*=scale;
  }


  return d;
}

void main()
{
  vec2 p = (gl_FragCoord.xy * 2. - resolution.xy) / min(resolution.x,resolution.y);

  vec3 cp = vec3(0.,0.,10.);
  cp.xz *= rot(sin(time*0.1)*0.6);
  cp.yz *= rot(cos(time*0.2)*0.3);
  vec3 ta = vec3(0.,0.,0.);
  vec3 cd = normalize(vec3(ta-cp));
  vec3 cu = vec3(0.,1.,0.);
  vec3 cs = cross(cd,cu);
  float td = 1.;

  vec3 ray = normalize(p.x*cs+p.y*cu+cd*td);
  vec3 col = vec3(0.);
  float me = 0.;
  float se = 0.;

  float d,rl = 0.;
  float d2 = 0.;
  vec3 rp = cp;
  for(int i = 0; i < 128; i++)
  {
    d = map(rp);
    d2 = background(rp);
    if(d < d2) me += exp(abs(d)*-0.2);
    if(d > d2) se += exp(abs(d)*-0.2);
    d = min(d,d2);
    rl += d;
    rp = cp + rl * ray;

    if(d < 0.001)
    {
      break;
    }
  }
  col = vec3(0.3,0.6,0.8)*me*0.02;
  col += vec3(1.,1.1,1.2)*se*0.02;
  gl_FragColor = vec4(col,1.);
}