- /* PWO: Again, I dared to convert the code to use macros... */
- glBegin( GL_QUADS );
- N( 1.0, 0.0, 0.0); V(+,-,+); V(+,-,-); V(+,+,-); V(+,+,+);
- N( 0.0, 1.0, 0.0); V(+,+,+); V(+,+,-); V(-,+,-); V(-,+,+);
- N( 0.0, 0.0, 1.0); V(+,+,+); V(-,+,+); V(-,-,+); V(+,-,+);
- N(-1.0, 0.0, 0.0); V(-,-,+); V(-,+,+); V(-,+,-); V(-,-,-);
- N( 0.0,-1.0, 0.0); V(-,-,+); V(-,-,-); V(+,-,-); V(+,-,+);
- N( 0.0, 0.0,-1.0); V(-,-,-); V(-,+,-); V(+,+,-); V(+,-,-);
- glEnd();
+static void fghCubeGenerate()
+{
+ int i,j;
+ for (i=0; i<CUBE_NUM_FACES; i++)
+ {
+ for (j=0; j<CUBE_NUM_VERT_PER_FACE; j++)
+ {
+ int idx = i*CUBE_NUM_VERT_PER_FACE*3+j*3;
+ cube_verts[idx ] = cube_v[cube_vi[i][j]][0];
+ cube_verts[idx+1] = cube_v[cube_vi[i][j]][1];
+ cube_verts[idx+2] = cube_v[cube_vi[i][j]][2];
+
+ cube_norms[idx ] = cube_n[i][0];
+ cube_norms[idx+1] = cube_n[i][1];
+ cube_norms[idx+2] = cube_n[i][2];
+ }
+ }
+}
+
+/* -- Tetrahedron -- */
+/* Magic Numbers: r0 = ( 1, 0, 0 )
+ * r1 = ( -1/3, 2 sqrt(2) / 3, 0 )
+ * r2 = ( -1/3, - sqrt(2) / 3, sqrt(6) / 3 )
+ * r3 = ( -1/3, - sqrt(2) / 3, -sqrt(6) / 3 )
+ * |r0| = |r1| = |r2| = |r3| = 1
+ * Distance between any two points is 2 sqrt(6) / 3
+ *
+ * Normals: The unit normals are simply the negative of the coordinates of the point not on the surface.
+ */
+#define TETR_NUM_VERT 4
+#define TETR_NUM_FACES 4
+#define TETR_NUM_VERT_PER_FACE 3
+#define TETR_VERT_PER_TETR TETR_NUM_FACES*TETR_NUM_VERT_PER_FACE
+#define TETR_VERT_ELEM_PER_TETR TETR_VERT_PER_TETR*3
+
+/* Vertex Coordinates */
+static GLdouble tet_r[TETR_NUM_VERT][3] =
+{
+ { 1.0, 0.0, 0.0 },
+ { -0.333333333333, 0.942809041582, 0.0 },
+ { -0.333333333333, -0.471404520791, 0.816496580928 },
+ { -0.333333333333, -0.471404520791, -0.816496580928 }
+};
+/* Normal Vectors */
+static GLdouble tet_n[CUBE_NUM_FACES][3] =
+{
+ { - 1.0, 0.0, 0.0 },
+ { 0.333333333333, -0.942809041582, 0.0 },
+ { 0.333333333333, 0.471404520791, -0.816496580928 },
+ { 0.333333333333, 0.471404520791, 0.816496580928 }
+};
+
+/* Vertex indices */
+static GLubyte tet_i[TETR_NUM_FACES][TETR_NUM_VERT_PER_FACE] =
+{
+ { 1, 3, 2 }, { 0, 2, 3 }, { 0, 3, 1 }, { 0, 1, 2 }
+};
+
+/* Cache of input to glDrawArrays */
+static GLboolean tetrCached = FALSE;
+static double tetr_verts[TETR_VERT_ELEM_PER_TETR];
+static double tetr_norms[TETR_VERT_ELEM_PER_TETR];