/* xscreensaver, Copyright (c) 1998-2014 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation. No representations are made about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. */ #include "gllist.h" void renderList (const struct gllist *list, int wire_p) { while (list) { if (!wire_p || list->primitive == GL_LINES || list->primitive == GL_POINTS) { glInterleavedArrays (list->format, 0, list->data); glDrawArrays (list->primitive, 0, list->points); } else { /* For wireframe, do it the hard way: treat every tuple of points as its own line loop. */ const GLfloat *p = (GLfloat *) list->data; int i, j, tick, skip, stride; switch (list->primitive) { case GL_QUADS: tick = 4; break; case GL_TRIANGLES: tick = 3; break; default: abort(); break; /* write me */ } switch (list->format) { case GL_C3F_V3F: case GL_N3F_V3F: skip = 3; stride = 6; break; default: abort(); break; /* write me */ } glBegin (GL_LINE_LOOP); for (i = 0, j = skip; i < list->points; i++, j += stride) { if (i && !(i % tick)) { glEnd(); glBegin (GL_LINE_LOOP); } glVertex3f (p[j], p[j+1], p[j+2]); } glEnd(); } list = list->next; } } void renderListNormals (const struct gllist *list, GLfloat length, int faces_p) { while (list) { const GLfloat *p = (GLfloat *) list->data; int i, j, tick, skip, stride; GLfloat v[3], n[3]; if (list->primitive == GL_LINES) continue; if (! faces_p) tick = 1; else switch (list->primitive) { case GL_QUADS: tick = 4; break; case GL_TRIANGLES: tick = 3; break; default: abort(); break; /* write me */ } switch (list->format) { case GL_N3F_V3F: skip = 0; stride = 6; break; case GL_C3F_V3F: continue; break; default: abort(); break; /* write me */ } v[0] = v[1] = v[2] = 0; n[0] = n[1] = n[2] = 0; for (i = 0, j = skip; i <= list->points; i++, j += stride) { if (i && !(i % tick)) { n[0] /= tick; n[1] /= tick; n[2] /= tick; v[0] /= tick; v[1] /= tick; v[2] /= tick; glPushMatrix(); glTranslatef (v[0], v[1], v[2]); glScalef (length, length, length); glBegin (GL_LINES); glVertex3f (0, 0, 0); glVertex3f (n[0], n[1], n[2]); glEnd(); glPopMatrix(); v[0] = v[1] = v[2] = 0; n[0] = n[1] = n[2] = 0; } if (i == list->points) break; n[0] += p[j]; n[1] += p[j+1]; n[2] += p[j+2]; v[0] += p[j+3]; v[1] += p[j+4]; v[2] += p[j+5]; } list = list->next; } }