summaryrefslogtreecommitdiff
path: root/engine/engine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engine/engine.cpp')
-rw-r--r--engine/engine.cpp159
1 files changed, 159 insertions, 0 deletions
diff --git a/engine/engine.cpp b/engine/engine.cpp
new file mode 100644
index 0000000..4c7d426
--- /dev/null
+++ b/engine/engine.cpp
@@ -0,0 +1,159 @@
+#include "engine.h"
+
+#include "config.h"
+
+#include <wriggle/texturesdl.h>
+
+#include <SDL/SDL_opengl.h>
+
+#include <iostream>
+
+#include <cmath>
+
+#include <boost/format.hpp>
+
+void Engine::event_keypress(SDLKey key) {
+ switch(key) {
+ case SDLK_SPACE:
+ paused = !paused;
+ break;
+ default:
+ Application::event_keypress(key);
+ }
+}
+
+Engine::Engine() {
+ init_window(Config::window_w, Config::window_h);
+
+ // 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 TextureSDL("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();
+
+ glBindTexture(GL_TEXTURE_2D, background->tex());
+ 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);
+
+ unsigned int tick = SDL_GetTicks();
+ if(tick - lastframes >= 1000) {
+ fps = (float)frames * ((float)(tick - lastframes) / 1000.0f);
+ frames = 1;
+ lastframes = tick;
+ } else {
+ frames++;
+ }
+
+ 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 - Config::viewport_overscan,
+ v_y - Config::viewport_overscan,
+ v_w + Config::viewport_overscan * 2,
+ v_h + Config::viewport_overscan * 2);
+ glScissor(v_x, v_y, v_w, v_h);
+ glEnable(GL_SCISSOR_TEST);
+
+ glClearColor(0.2, 0.2, 0.2, 0);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(45, (float)660 / (float)740, 1, 100);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ float f = tick * 0.0005;
+
+ gluLookAt(
+ 5 * sinf(f), 1, 5 * cosf(f),
+ 0, 0, 0,
+ 5 * sinf(f), 2, 5 * cosf(f));
+
+ glBegin(GL_LINES);
+ for(int i = -10; i < 11; i++) {
+ if(i % 5 == 0)
+ glColor3f(1, 1, 1);
+ else
+ glColor3f(.5, .5, .5);
+ glVertex3f(i, 0, -10);
+ glVertex3f(i, 0, 10);
+ glVertex3f(-10, 0, i);
+ glVertex3f(10, 0, i);
+ }
+ glEnd();
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(
+ -float(Config::viewport_overscan) / float(v_w),
+ 1.0 + float(Config::viewport_overscan) / float(v_w),
+ -float(Config::viewport_overscan) / float(v_w),
+ Config::viewport_aspect + float(Config::viewport_overscan) / float(v_w),
+ 0, 10);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ stage->draw();
+
+ glDisable(GL_SCISSOR_TEST);
+
+ SDL_GL_SwapBuffers();
+}