#!/usr/bin/nawk -f $0
BEGIN {
  if(ARGC < 3) {
    frame_delay = 0.02;
    num_frames = 100
    num_cubes = 1
    period = 2
  }
  else {
    num_frames  = ARGV[1];
    num_cubes   = ARGV[2];
    frame_delay = ARGV[3];
  }
  num_lines = 16
  temp = num_lines - 1
  pi2= 2*atan2(0,-1);

  num_verts = num_cubes * num_lines

  g[0] = 0 ; g[1] = 1 ; g[2] = 2 ; g[3] = 3 ; g[4] = 0 ; g[5] = 4
  g[6] = 5 ; g[7] = 1 ; g[8] = 5 ; g[9] = 6 ; g[10]= 2 ; g[11]= 6 
  g[12]= 7 ; g[13]= 3 ; g[14]= 7 ; g[15]= 4

  v[0,0] =-1 ; v[0,1] = 1 ; v[0,2] = 1
  v[1,0] = 1 ; v[1,1] = 1 ; v[1,2] = 1
  v[2,0] = 1 ; v[2,1] = 1 ; v[2,2] =-1
  v[3,0] =-1 ; v[3,1] = 1 ; v[3,2] =-1
  v[4,0] =-1 ; v[4,1] =-1 ; v[4,2] = 1
  v[5,0] = 1 ; v[5,1] =-1 ; v[5,2] = 1
  v[6,0] = 1 ; v[6,1] =-1 ; v[6,2] =-1
  v[7,0] =-1 ; v[7,1] =-1 ; v[7,2] =-1

  printf("%d %d %f\n",num_frames,num_verts,frame_delay); 

  for(k=0;k<num_frames;k++) {
    t1 = (k/num_frames)*pi2;
    t3 = (k/(num_frames-1))*pi2;

    inc = inc + 1
    if(inc > 15) flags = 0
    else flags = 1
    if(inc > 20) {
      inc = 0
    }

    for(j=0;j<num_verts;j++) {
      t2 = (j/num_verts)*pi2;
      t4 = (j/(num_verts-1))*pi2;

      temp = temp + 1
      if(temp>15) {
	temp = 0
      }
      x = v[g[temp],0];
      y = v[g[temp],1];
      z = v[g[temp],2];

      scale((int(j/16)+1)*(10/num_verts));
      rotz(pi2/0.3)
      rotx(1.06)
      roty(t1)
      red   = cos(t4) * 127 + 128
      green = sin(t4) * 127 + 128
      blue  = int((j/(num_verts-1)) * 255)

      printf("%d %f %f %f %02x%02x%02x\n",flags,x,y,z,blue,green,red);
    }
  }
  exit(0);
}

function rotx(angle) {
  y1 = y
  y =  cos(angle) * y1 + sin(angle) * z
  z = -sin(angle) * y1 + cos(angle) * z
}

function roty(angle) {
  z1 = z
  z =  cos(angle)*z1 + sin(angle) * x
  x = -sin(angle)* z1 + cos(angle) * x
}

function rotz(angle) {
  x1 = x
  x =  cos(angle) * x1 + sin(angle) * y
  y = -sin(angle) * x1 + cos(angle) * y
}

function scale(value) {
  x = x * value;
  y = y * value;
  z = z * value;
}
