rendered paste body#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <SDL/SDL.h>
#include <GL/gl.h>
class Drawable {
public:
virtual void draw() = 0;
};
class Engine {
std::vector<Drawable*> 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;
}