/* libsegl - Sebas Extended GL Library * Collection of Opengl/3D-Math helpers * * Copyright (c) 2008 by Sebastian Lohff, seba@seba-geek.de * http://www.seba-geek.de * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "glsdlscreen.h" namespace segl { 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; } if(fullscreen) videoflags |= SDL_FULLSCREEN; 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; } void GLSDLScreen::getVideoRes(std::string vidstr, int *_w, int *_h) { if(_w) *_w = atoi(vidstr.substr(0, vidstr.find("x")).c_str()); if(_h) *_h = atoi(vidstr.substr(vidstr.find("x")+1, (vidstr.length()-vidstr.find("x")-1)).c_str()); } 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) { std::cerr << "Konnte SDL_VIDEO nicht initialisieren" << std::endl; 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); glEnable(GL_DEPTH_TEST); } // Projection glViewport(0, 0, (GLsizei)width, (GLsizei)height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, znear, zfar); if(extraglparam) { extraglparam(); } // Texturen neuladen, eigentlich nur f�r Windows. Aber egal. GLTexture::reloadAll(); glMatrixMode(GL_TEXTURE); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); } return true; } int GLSDLScreen::getWidth() { return width; } int GLSDLScreen::getHeight() { return height; } void GLSDLScreen::clearScreen() { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); } void GLSDLScreen::renderScreen() { SDL_GL_SwapBuffers(); } } // namespace segl