+# ifdef FREEGLUT_GLES1
+ /* Solid drawing is the same for OpenGL 1.x and OpenGL ES 1.x, just
+ * no edge flags for ES.
+ * WireFrame drawing will have to be done per face though, using
+ * GL_LINE_LOOP and issuing one draw call per face. For triangles,
+ * we use glDrawArrays directly on the vertex data for each face,
+ * while for shapes that are composed of quads or pentagons, we use
+ * glDrawElements with index vector {0,1,2,5} or {0,1,2,8,5},
+ * respectively.
+ * We use the first parameter in glDrawArrays or glDrawElements to
+ * go from face to face.
+ */
+ if (useWireMode)
+ {
+ /* setup reading the right elements from vertex array */
+ GLubyte vertIdx4[4] = {0,1,2,5};
+ GLubyte vertIdx5[5] = {0,1,2,8,5};
+ GLubyte *indices = NULL;
+ int vertStride, i, j;
+
+ switch (numEdgePerFace)
+ {
+ case 3:
+ vertStride = 3; /* there are 3 vertices for each face in the array */
+ break;
+ case 4:
+ indices = vertIdx4;
+ vertStride = 6; /* there are 6 vertices for each face in the array */
+ break;
+ case 5:
+ indices = vertIdx5;
+ vertStride = 9; /* there are 9 vertices for each face in the array */
+ break;
+ }
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_NORMAL_ARRAY);
+
+ glVertexPointer(3, GL_DOUBLE, 0, vertices);
+ glNormalPointer(GL_DOUBLE, 0, normals);
+
+ if (numEdgePerFace==3)
+ for (i=0; i<numFaces; i++)
+ glDrawArrays(GL_LINE_LOOP, i*vertStride, numEdgePerFace);
+ else
+ {
+ GLubyte *vertIndices = malloc(numEdgePerFace*sizeof(GLubyte));
+ for (i=0; i<numFaces; i++)
+ {
+ for (j=0; j< numEdgePerFace; j++)
+ vertIndices[j] = indices[j]+i*vertStride;
+
+ glDrawElements(GL_LINE_LOOP, numEdgePerFace, GL_UNSIGNED_BYTE, vertIndices);
+ }
+ free(vertIndices);
+ }
+
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_NORMAL_ARRAY);
+ return; /* done */
+ }
+# endif
+