#define GL_GLEXT_PROTOTYPES #include #include #include #include "checkGLError.h" #define WIDTH 500 #define HEIGHT 500 #define ADDR_DIFF(x, y) ((unsigned long) (y) - (unsigned long) (x)) void init(void) { GL_CHECK(glClearColor (0.0, 0.0, 0.0, 0.0)); GL_CHECK(glEnable(GL_DEPTH_TEST)); GL_CHECK(glEnableClientState(GL_VERTEX_ARRAY)); GL_CHECK(glEnableClientState(GL_COLOR_ARRAY)); GL_CHECK(glShadeModel(GL_SMOOTH)); GL_CHECK(glViewport(0, 0, WIDTH, HEIGHT)); GL_CHECK(glMatrixMode(GL_PROJECTION)); GL_CHECK(glLoadIdentity()); gluPerspective(60.0, (GLfloat)WIDTH/(GLfloat)WIDTH, 1.0, 30.0); GL_CHECK(glMatrixMode(GL_MODELVIEW)); GL_CHECK(glLoadIdentity()); GL_CHECK(glTranslatef(0.0, 0.0, -3.6)); } void display(void) { GL_CHECK(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); static const GLfloat data[][2][4] = { {{-0.8, -0.8, 0.0, 1.0}, {1.0, 0.0, 0.0, 1.0}}, {{0.8, -0.8, 0.0, 1.0}, {0.0, 1.0, 0.0, 1.0}}, {{0.8, 0.8, 0.0, 1.0}, {0.0, 0.0, 1.0, 1.0}}, {{-0.8, 0.8, 0.0, 1.0}, {0.0, 0.4, 1.0, 1.0}} }; static const GLushort indexes[] = {1, 0, 2, 3}; GLuint buffers[2]; GL_CHECK(glGenBuffers(sizeof(buffers)/sizeof(buffers[0]), buffers)); GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, buffers[0])); GL_CHECK(glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW)); GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1])); GL_CHECK(glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexes), indexes, GL_STATIC_DRAW)); GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, buffers[0])); GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1])); GL_CHECK(glVertexPointer(3, GL_FLOAT, ADDR_DIFF(&data[0], &data[1]), (void *) ADDR_DIFF(&data, &data[0][0][0]))); GL_CHECK(glColorPointer(4, GL_FLOAT, ADDR_DIFF(&data[0], &data[1]), (void *) ADDR_DIFF(&data, &data[0][1][0]))); GL_CHECK(glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, NULL)); SDL_GL_SwapBuffers(); } int main(int argc, char *argv[]) { if (SDL_Init(SDL_INIT_VIDEO)) { printf("Failed to initialize SDL!\n"); return 1; } atexit(SDL_Quit); SDL_Surface *screen; SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); if (!(screen = SDL_SetVideoMode(WIDTH, HEIGHT, 16, SDL_OPENGL))) { printf("Failed to set video mode!\n"); SDL_Quit(); return 2; } SDL_WM_SetCaption(argv[0], argv[0]); init(); display(); SDL_Event event; while (SDL_WaitEvent(&event)) { if (event.type == SDL_QUIT) break; else if (event.type == SDL_KEYDOWN) { if (event.key.keysym.sym == SDLK_ESCAPE) break; } } }