#include "glsdlscreen.h" GLSDLScreen::GLSDLScreen() { width = 0; height = 1; bpp = 16; znear = 1.0f; zfar = 100.0f; opengl = false; glsetup = true; resizable = false; fullscreen = false; extraglparam = 0; } int GLSDLScreen::getFlags() { const SDL_VideoInfo *videoInfo = SDL_GetVideoInfo(); int videoflags = 0; if(videoInfo->hw_available) videoflags |= SDL_HWSURFACE; else videoflags |= SDL_SWSURFACE; if(videoInfo->blit_hw) videoflags |= SDL_HWACCEL; if(opengl) { videoflags |= SDL_OPENGL; videoflags |= SDL_GL_DOUBLEBUFFER; videoflags |= SDL_HWPALETTE; } return videoflags; } void GLSDLScreen::enableOpenGL(bool w) { opengl = w; } void GLSDLScreen::enableResizable(bool w) { resizable = w; } void GLSDLScreen::enableFullscreen(bool w) { fullscreen = w; } void GLSDLScreen::setGLNearFar(float _znear, float _zfar) { znear = _znear; zfar = _zfar; } void GLSDLScreen::enableGLSetup(bool w) { glsetup = w; } void GLSDLScreen::setExtraGLParamFunc(void (*extrafunc)()) { extraglparam = extrafunc; } void GLSDLScreen::setVideoMode(int _width, int _height, int _bpp) { width = _width; height = _height; bpp = _bpp; if(height==0) height = 1; } bool GLSDLScreen::isOK() { return SDL_VideoModeOK(width, height, bpp, getFlags()); } bool GLSDLScreen::apply() { if(!SDL_WasInit(SDL_INIT_VIDEO)) { if(SDL_Init(SDL_INIT_VIDEO)==-1) { return false; } } screen = SDL_SetVideoMode(width, height, bpp, getFlags()); if(!screen) { return false; } if(opengl) { SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); // Setup GL if(glsetup) { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glDepthFunc(GL_LEQUAL); glShadeModel(GL_SMOOTH); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.1); } // Projection glViewport(0, 0, (GLsizei)width, (GLsizei)height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, znear, zfar); if(extraglparam) { extraglparam(); } glMatrixMode(GL_MODELVIEW); // Texturen neuladen, eigentlich nur für Windows. Aber egal. GLTexture::reloadAll(); } return true; }