#include #include #include #include #include #include class Drawable { public: virtual void draw() = 0; }; class Engine { std::vector drawables; public: Engine(){ SDL_Init(SDL_INIT_VIDEO); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_SetVideoMode(640, 480, 16, SDL_OPENGL|SDL_GL_DOUBLEBUFFER); glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); glViewport( 0, 0, 640, 480 ); glMatrixMode( GL_PROJECTION ); glLoadIdentity( ); //glFrustum(1.0, 1.0, 1.0, 1.0, 0.0, 20.0); //glOrtho(1.0, 1.0, 1.0, 1.0, 4.0, 4.0); //glRotatef(0.1, 0.0, 1.0, 0.0); //glTranslatef(0.0f, 0.0f, 2.0f); glMatrixMode( GL_MODELVIEW ); glLoadIdentity( ); } ~Engine(){ SDL_Quit(); } void mainLoop(); void registerDrawable(Drawable* d); }; void Engine::mainLoop(){ bool requestExit = false; SDL_Event event; while(!requestExit){ if(SDL_PollEvent(&event)){ switch(event.type){ case SDL_QUIT: requestExit=true; break; } } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef( 0.0f, 0.0f, -6.0f ); for_each(drawables.begin(), drawables.end(), std::mem_fun(&Drawable::draw)); SDL_GL_SwapBuffers(); } } void Engine::registerDrawable(Drawable* d){ drawables.push_back(d); } class Window : public Drawable { public: void draw(); }; void Window::draw(){ glColor3f(1.0f, 1.0f, 1.0f); glBegin(GL_TRIANGLES); glColor3f(1.0f, 0.0f, 0.0f); glVertex3f( 0.0f, 1.0f, 0.0f ); /* Top */ glColor3f(0.0f, 1.0f, 0.0f); glVertex3f( -1.0f, -1.0f, 0.0f ); /* Bottom Left */ glColor3f(0.0f, 0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, 0.0f ); glEnd(); } int main(){ Engine engine; engine.registerDrawable(new Window); engine.mainLoop(); return 0; }