#include "engine.h" #include "config.h" #include #include #include #include #include void Engine::event_keypress(sf::Key::Code key) { switch(key) { case sf::Key::Space: paused = !paused; break; default: Application::event_keypress(key); } } Engine::Engine() { init_window(Config::window_w, Config::window_h, Config::fullscreen); // Texturing glEnable(GL_TEXTURE_2D); // Blending glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); // Smooth shading glShadeModel(GL_SMOOTH); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glEnable(GL_POINT_SPRITE); glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); glClearColor(0, 0, 0, 0); glClearDepth(1); font = new FTTextureFont("fonts/VeraMono.ttf"); font->FaceSize(20); background = new TextureSTBI("textures/background.png"); paused = false; } void Engine::update() { if(!paused) { stage->update(); } glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0, 0, Config::window_w, Config::window_h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); float xo = float(Config::window_w)/float(Config::window_h)/2.5 - 0.5; glOrtho(-xo, 1 + xo, 0, 0.8, 0, 10); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); background->bind(); glBegin(GL_QUADS); glTexCoord2f(0, 1); glVertex2f(-1.9/9.0, 0); glTexCoord2f(0, 0); glVertex2f(-1.9/9.0, 0.8); glTexCoord2f(1, 0); glVertex2f(10.9/9.0, 0.8); glTexCoord2f(1, 1); glVertex2f(10.9/9.0, 0); glEnd(); glDisable(GL_TEXTURE_2D); glColor4f(1, 1, 0, 1); if(++fps_frames >= 60) { fps = float(fps_frames) / fps_clock.GetElapsedTime(); fps_clock.Reset(); fps_frames = 0; } glScalef(0.0005, 0.0005, 0.0005); font->Render((boost::format("FPS: %.2f") % fps).str().c_str()); float v_x = Config::window_w * (Config::viewport_x + xo) / (1 + 2 * xo); float v_y = Config::window_h * Config::viewport_y; float v_w = Config::window_h * Config::viewport_w; float v_h = Config::window_h * Config::viewport_h; glViewport(v_x - v_w * 0.5, v_y - v_h * 0.5, v_w * 2, v_h * 2); glScissor(v_x, v_y, v_w, v_h); glEnable(GL_SCISSOR_TEST); stage->draw(); glDisable(GL_SCISSOR_TEST); }