#include #include #include #include typedef float vector3[3]; /* * Interleaved vertex and colour data. */ typedef struct { vector3 position; vector3 colour; } vertex; static vertex data0[] = { { { 0.0, 0.0, 0.0 }, { 1.0, 0.0, 0.0 } }, { { 100.0, 0.0, 0.0 }, { 0.0, 1.0, 0.0 } }, { { 100.0, 100.0, 0.0 }, { 0.0, 0.0, 1.0 } } }; /* * Vertex data followed by colour data. */ static vector3 data1[] = { { 0.0, 0.0, 0.0 }, { 100.0, 0.0, 0.0 }, { 100.0, 100.0, 0.0 }, { 1.0, 0.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 0.0, 0.0, 1.0 } }; static void reshape(int width, int height) { glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, width, 0, height, -1.0, 100.0); assert(glGetError() == GL_NO_ERROR); } static void display(void) { glClearColor(0.3f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPushMatrix(); glTranslated(20.0, 20.0, 0.0); { const unsigned char *data0_v = (unsigned char *) &data0; const unsigned char *data0_c = ((unsigned char *) &data0) + offsetof(vertex, colour); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glVertexPointer(3, GL_FLOAT, sizeof(vertex), data0_v); glColorPointer(3, GL_FLOAT, sizeof(vertex), data0_c); glDrawArrays(GL_TRIANGLES, 0, 3); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); } glTranslated(120.0, 120.0, 0.0); { const unsigned char *data1_v = (unsigned char *) &data1; const unsigned char *data1_c = ((unsigned char *) &data1) + (3 * sizeof(vector3)); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glVertexPointer(3, GL_FLOAT, sizeof(vector3), data1_v); glColorPointer(3, GL_FLOAT, sizeof(vector3), data1_c); glDrawArrays(GL_TRIANGLES, 0, 3); glDisableClientState(GL_VERTEX_ARRAY); } glPopMatrix(); assert(glGetError() == GL_NO_ERROR); glutSwapBuffers(); } int main(int argc, char **argv) { glutInit(&argc, argv); glutCreateWindow("Vertex array triangle"); glutReshapeFunc(reshape); glutDisplayFunc(display); glutIdleFunc(glutPostRedisplay); glutMainLoop(); return 0; }