#! /bin/sh

export LC_ALL="C"

exec date | \
gawk '
{
    unitcube = \
	"OFF\n" \
	"8 6 0\n" \
	"-1 -1 -1\n" \
	"1 -1 -1\n" \
	"1 1 -1\n" \
	"-1 1 -1\n" \
	"-1 -1 1\n" \
	"1 -1 1\n" \
	"1 1 1\n" \
	"-1 1 1\n" \
	"4 0 1 2 3\n" \
	"4 4 5 6 7\n" \
	"4 0 4 7 3\n" \
	"4 0 1 5 4\n" \
	"4 1 5 6 2\n" \
	"4 2 6 7 3\n";

  printf("(progn ")

  # Print out the clock face
  printf("(geometry face { LIST ");
  printf("{ INST unit { OFF 8 6 0 \n")
  printf("-.05 .9 -.3\n")
  printf(".05 .9 -.3\n")
  printf(".05 1.1 -.3\n")
  printf("-.05 1.1 -.3\n")
  printf("-.05 .9 -.1\n")
  printf(".05 .9 -.1\n")
  printf(".05 1.1 -.1\n")
  printf("-.05 1.1 -.1\n")
  printf("4 0 1 2 3\n")
  printf("4 4 5 6 7\n")
  printf("4 0 4 7 3\n")
  printf("4 0 1 5 4\n")
  printf("4 1 5 6 2\n")
  printf("4 2 6 7 3\n")
  printf("}\ntlist\n")

  # Not all versions of awk have sin/cos functions, so...
  split("0 .5 .866 1 .866 .5", table);
  for(i = 0; i < 6; i++) { sn[i] = table[i+1];  sn[i+6] = -sn[i]; }
  for(i = 0; i < 12; i++) cs[i] = sn[(i+3) % 12];

  for (i = 1; i < 12; ++i) {
    # ang = i * 3.14159 / 6.0;
    printf("%g %g 0 0\n", cs[i], -sn[i]);
    printf("%g %g 0 0\n", sn[i], cs[i]);
    printf("0 0 1 0\n");
    printf("0 0 0 1\n\n");
  }
  printf("}\n");
  printf("{appearance {material {diffuse 0 .75 .75}}");
  printf("INST\n");
  printf("unit OFF\n");
  printf("20 12 30\n");
  printf("	1.214124 0.000000 1.589309\n");
  printf("	0.375185 1.154701 1.589309\n");
  printf("	-0.982247 0.713644 1.589309\n");
  printf("	-0.982247 -0.713644 1.589309\n");
  printf("	0.375185 -1.154701 1.589309\n");
  printf("	1.964494 0.000000 0.375185\n");
  printf("	0.607062 1.868345 0.375185\n");
  printf("	-1.589309 1.154701 0.375185\n");
  printf("	-1.589309 -1.154701 0.375185\n");
  printf("	0.607062 -1.868345 0.375185\n");
  printf("	1.589309 1.154701 -0.375185\n");
  printf("	-0.607062 1.868345 -0.375185\n");
  printf("	-1.964494 0.000000 -0.375185\n");
  printf("	-0.607062 -1.868345 -0.375185\n");
  printf("	1.589309 -1.154701 -0.375185\n");
  printf("	0.982247 0.713644 -1.589309\n");
  printf("	-0.375185 1.154701 -1.589309\n");
  printf("	-1.214124 0.000000 -1.589309\n");
  printf("	-0.375185 -1.154701 -1.589309\n");
  printf("	0.982247 -0.713644 -1.589309\n");
  printf("	5 0 1 2 3 4\n");
  printf("	5 0 5 10 6 1\n");
  printf("	5 1 6 11 7 2\n");
  printf("	5 2 7 12 8 3\n");
  printf("	5 3 8 13 9 4\n");
  printf("	5 4 9 14 5 0\n");
  printf("	5 15 10 5 14 19\n");
  printf("	5 16 11 6 10 15\n");
  printf("	5 17 12 7 11 16\n");
  printf("	5 18 13 8 12 17\n");
  printf("	5 19 14 9 13 18\n");
  printf("	5 19 18 17 16 15\n");
  printf("transform\n");
  printf("0.07  0  0    0\n");
  printf("0   0.07  0   0\n");
  printf("0  0   0.07   0\n");
  printf("0 1 -.2 1\n");
  printf("}\n");

  printf("  })\n");


  # Hour hand
  printf("(geometry hour { INST unit {")
  print unitcube;
  printf("}\n")
  printf("tlist\n")
  printf(".12 0 0 0\n")
  printf("0 .28 0 0\n")
  printf("0 0 .05 0\n")
  printf("0 .22 0 1\n");
  printf("})")

  # Minute hand
  printf("(geometry minute { INST unit {")
  print unitcube;
  printf("}\n")
  printf("tlist\n")
  printf(".07 0 0 0\n")
  printf("0 .55 0 0\n")
  printf("0 0 .05 0\n")
  printf("0 .45 .1 1\n")
  printf("})\n");

  # Second hand
  printf("(geometry second { INST unit {")
  print unitcube;
  printf("}\n")
  printf("tlist\n")
  printf(".02 0 0 0\n")
  printf("0 .6 0 0\n")
  printf("0 0 .05 0\n")
  printf("0 .45 .2 1\n")
  printf("})\n");

  printf("(normalization face none)")
  printf("(normalization hour none)")
  printf("(normalization minute none)")
  printf("(normalization second none)")

  printf("(bbox-draw face no)")
  printf("(bbox-draw hour no)")
  printf("(bbox-draw minute no)")
  printf("(bbox-draw second no)")

  printf("(merge-ap face {appearance +edge material { diffuse 0 0 .7}})")
  printf("(merge-ap hour {appearance +edge material { diffuse .54 .15 1}})")
  printf("(merge-ap minute {appearance +edge material { diffuse .13 .82 .51}})")
  printf("(merge-ap second {appearance +edge material { diffuse .82 0 0 }})")

  time = substr($4, 7, 2) + 0.0;
  printf("(transform-set second world world rotate 0 0 %g)", \
    -(time / 60.0) * 3.14159 * 2.0);

  time = time + (substr($4, 4, 2) + 0.0)*60.0;
  printf("(transform-set minute world world rotate 0 0 %g)", \
    -(time / 3600.0) * 3.14159 * 2.0);

  time += (substr($4, 1, 2)%12) * 3600.0;
  printf("(transform-set hour world world rotate 0 0 %g)", \
    -(time / 43200.0) * 3.14159 * 2.0);

  printf("(transform-incr hour world world rotate 0 0 -3.14159 21600)")
  printf("(transform-incr minute world world rotate 0 0 -3.14159 1800)")
  printf("(transform-incr second world world rotate 0 0 -3.14159 30)")

  printf(")")
}
'
