#!/usr/bin/nawk -f $0
#Eric Scroger's dodecahedron
BEGIN {
  if(ARGC < 3) {
    frame_delay = 0.02;
    num_frames = 100
    num_decahed = 1
    period = 2
  }
  else {
    num_frames  = ARGV[1];
    num_decahed   = ARGV[2];
    frame_delay = ARGV[3];
  }
  pi2= 2*atan2(0,-1);

  verts = 40;
  num_verts = num_decahed * verts

  g[0] = 0 ; g[1] = 1 ; g[2] = 2 ; g[3] = 3 ; g[4] = 4 ; g[5] = 0;
  g[6] = 5 ; g[7] = 10; g[8] = 6 ; g[9] = 1 ; g[10] = 6 ; g[11] = 11;
  g[12] = 7; g[13] = 2; g[14] = 7 ; g[15] = 12; g[16] = 8 ; g[17] = 3;
  g[18] = 8; g[19] = 13; g[20] = 9 ; g[21] = 4; g[22] = 9 ; g[23] = 14;
  g[24] = 5; g[25] = 10; g[26] = 15; g[27] = 16; g[28] = 11; g[29] = 16;
  g[30] = 17; g[31] = 12; g[32] = 17; g[33] = 18; g[34] = 13; g[35] = 18;
  g[36] = 19; g[37] = 14; g[38] = 19; g[39] = 15;

  v[0,0] = cos(0); v[0,1] = sin(0); v[0,2] = -1.5;
  v[1,0] = cos(pi2/5); v[1,1] = sin(pi2/5); v[1,2] = -1.5;
  v[2,0] = cos(2*pi2/5); v[2,1] = sin(2*pi2/5); v[2,2] = -1.5;
  v[3,0] = cos(3*pi2/5); v[3,1] = sin(3*pi2/5); v[3,2] = -1.5;
  v[4,0] = cos(4*pi2/5); v[4,1] = sin(4*pi2/5); v[4,2] = -1.5;
  v[5,0] = 1.7*cos(0); v[5,1] = 1.7*sin(0); v[5,2] = -0.4
  v[6,0] = 1.7*cos(pi2/5); v[6,1] = 1.7*sin(pi2/5); v[6,2] = -0.4;
  v[7,0] = 1.7*cos(2*pi2/5); v[7,1] = 1.7*sin(2*pi2/5); v[7,2] = -0.4;
  v[8,0] = 1.7*cos(3*pi2/5); v[8,1] = 1.7*sin(3*pi2/5); v[8,2] = -0.4;
  v[9,0] = 1.7*cos(4*pi2/5); v[9,1] = 1.7*sin(4*pi2/5); v[9,2] = -0.4;
  v[10,0] = 1.7*cos(0+pi2/10); v[10,1] = 1.7*sin(0+pi2/10); v[10.4] = 0.4;
  v[11,0] = 1.7*cos(pi2/5+pi2/10); v[11,1] = 1.7*sin(pi2/5+pi2/10); v[11,2] = 0.4;
  v[12,0] = 1.7*cos(2*pi2/5+pi2/10); v[12,1] = 1.7*sin(2*pi2/5+pi2/10); v[12,2] = 0.4;
  v[13,0] = 1.7*cos(3*pi2/5+pi2/10); v[13,1] = 1.7*sin(3*pi2/5+pi2/10); v[13,2] = 0.4;
  v[14,0] = 1.7*cos(4*pi2/5+pi2/10); v[14,1] = 1.7*sin(4*pi2/5+pi2/10); v[14,2] = 0.4;
  v[15,0] = cos(0+pi2/10); v[15,1] = sin(0+pi2/10); v[15,2] = 1.5;
  v[16,0] = cos(pi2/5+pi2/10); v[16,1] = sin(pi2/5+pi2/10); v[16,2] = 1.5;
  v[17,0] = cos(2*pi2/5+pi2/10); v[17,1] = sin(2*pi2/5+pi2/10); v[17,2] = 1.5;
  v[18,0] = cos(3*pi2/5+pi2/10); v[18,1] = sin(3*pi2/5+pi2/10); v[18,2] = 1.5;
  v[19,0] = cos(4*pi2/5+pi2/10); v[19,1] = sin(4*pi2/5+pi2/10); v[19,2] = 1.5;

  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;

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

      x = v[g[(j%verts)],0] ;
      y = v[g[(j%verts)],1] ;
      z = v[g[(j%verts)],2] ;

      angle = atan2(y,x);

      x  = x * (sin(angle/2+t3+14)+1.0)/2
      y  = y * (sin(angle/2+t3+9)+1.0)/2
      z  = z * (sin(angle/2+t3)+1.0)/2

      scale((int(j/verts)+1)*(verts/num_verts));
      scale(0.5);
      rotz(t3+pi2/0.3)
      rotx(1.06)
      roty(t3)
      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;
}
