summaryrefslogtreecommitdiff
path: root/lib/glbase.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/glbase.cc')
-rw-r--r--lib/glbase.cc142
1 files changed, 142 insertions, 0 deletions
diff --git a/lib/glbase.cc b/lib/glbase.cc
new file mode 100644
index 0000000..1fb62a5
--- /dev/null
+++ b/lib/glbase.cc
@@ -0,0 +1,142 @@
+#include "glbase.h"
+#include "engine.h"
+#include "generic.h"
+#include <SDL.h>
+#include <SDL_opengl.h>
+
+int mogltk::glbase::width, mogltk::glbase::height, mogltk::glbase::inited = 0, mogltk::glbase::twoD = 0;
+SDL_Surface * mogltk::glbase::surface = 0;
+
+int mogltk::glbase::setup(int w, int h, int flags) throw(GeneralException) {
+ if (inited) {
+ printm(M_WARNING, "mogltk::glbase::setup called twice, ignoring second call...\n");
+ return -1;
+ }
+
+ width = w;
+ height = h;
+
+ mogltk::engine::setup();
+ if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) {
+ throw GeneralException(String("Couldn't initialise Video SubSystem: ") + SDL_GetError());
+ }
+
+ if (!(surface = SDL_SetVideoMode(width, height, 0, flags | SDL_OPENGL))) {
+ throw GeneralException(String("Couldn't set GL mode: ") + SDL_GetError());
+ }
+
+ float ratio = surface->w;
+ ratio /= surface->h;
+
+ printm(M_INFO, "Video resolution: %dx%dx%d (ratio = %3.2f)\n", surface->w, surface->h, surface->format->BitsPerPixel, ratio);
+ printm(M_INFO, "\n");
+ printm(M_INFO, "OpenGL infos\n");
+ printm(M_INFO, "------------\n");
+ printm(M_INFO, String("Vendor : ") + (char *) glGetString(GL_VENDOR) + "\n");
+ printm(M_INFO, String("Renderer : ") + (char *) glGetString(GL_RENDERER) + "\n");
+ printm(M_INFO, String("Version : ") + (char *) glGetString(GL_VERSION) + "\n");
+ printm(M_INFO, String("Extensions: ") + (char *) glGetString(GL_EXTENSIONS) + "\n");
+
+ inited = 1;
+
+ glViewport(0, 0, surface->w, surface->h);
+
+ glCullFace(GL_BACK);
+ glFrontFace(GL_CCW);
+ glEnable(GL_CULL_FACE);
+
+ glClearColor(0, 0, 0, 0);
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LEQUAL);
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(60.0, ratio, 1.0, 1024.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ Flip();
+
+ return 0;
+}
+
+int mogltk::glbase::GetWidth(void) {
+ return width;
+}
+
+int mogltk::glbase::GetHeight(void) {
+ return height;
+}
+
+int mogltk::glbase::GetInited(void) {
+ return inited;
+}
+
+void mogltk::glbase::Enter2DMode(void) {
+ if (twoD)
+ return;
+
+ glPushAttrib(GL_ENABLE_BIT);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_CULL_FACE);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+ glOrtho(0.0, width, height, 0.0, 0.0, 1.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadIdentity();
+
+ twoD = 1;
+}
+
+void mogltk::glbase::Leave2DMode(void) {
+ if (!twoD)
+ return;
+
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+
+ glPopAttrib();
+
+ twoD = 0;
+}
+
+void mogltk::glbase::Flip() {
+ SDL_GL_SwapBuffers();
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+bool mogltk::glbase::is2D() {
+ return twoD;
+}
+
+void mogltk::glbase::glVertex(GLdouble x, GLdouble y, GLdouble z, GLdouble w) {
+ glVertex4d(x, y, z, w);
+}
+
+void mogltk::glbase::glVertex(GLfloat x, GLfloat y, GLfloat z, GLfloat w) {
+ glVertex4f(x, y, z, w);
+}
+
+void mogltk::glbase::glVertex(GLint x, GLint y, GLint z, GLint w) {
+ glVertex4i(x, y, z, w);
+}
+
+void mogltk::glbase::glVertex(GLshort x, GLshort y, GLshort z, GLshot w) {
+ glVertex4i(x, y, z, w);
+}
+