#include "OgreException.h" #include "OgreLogManager.h" #include "OgreStringConverter.h" #include "OgreSDLGLSupport.h" #include "OgreSDLWindow.h" using namespace Ogre; SDLGLSupport::SDLGLSupport() { SDL_Init(SDL_INIT_VIDEO); } SDLGLSupport::~SDLGLSupport() { } void SDLGLSupport::addConfig(void) { mVideoModes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_OPENGL); if (mVideoModes == (SDL_Rect **)0) { OGRE_EXCEPT(999, "Unable to load video modes", "SDLRenderSystem::initConfigOptions"); } ConfigOption optFullScreen; ConfigOption optVideoMode; ConfigOption optFSAA; ConfigOption optRTTMode; // FS setting possiblities optFullScreen.name = "Full Screen"; optFullScreen.possibleValues.push_back("Yes"); optFullScreen.possibleValues.push_back("No"); optFullScreen.currentValue = "Yes"; optFullScreen.immutable = false; // Video mode possiblities optVideoMode.name = "Video Mode"; optVideoMode.immutable = false; for (size_t i = 0; mVideoModes[i]; i++) { char szBuf[16]; snprintf(szBuf, 16, "%d x %d", mVideoModes[i]->w, mVideoModes[i]->h); optVideoMode.possibleValues.push_back(szBuf); // Make the first one default if (i == 0) { optVideoMode.currentValue = szBuf; } } //FSAA possibilities optFSAA.name = "FSAA"; optFSAA.possibleValues.push_back("0"); optFSAA.possibleValues.push_back("2"); optFSAA.possibleValues.push_back("4"); optFSAA.possibleValues.push_back("6"); optFSAA.currentValue = "0"; optFSAA.immutable = false; optRTTMode.name = "RTT Preferred Mode"; optRTTMode.possibleValues.push_back("FBO"); optRTTMode.possibleValues.push_back("PBuffer"); optRTTMode.possibleValues.push_back("Copy"); optRTTMode.currentValue = "FBO"; optRTTMode.immutable = false; mOptions[optFullScreen.name] = optFullScreen; mOptions[optVideoMode.name] = optVideoMode; mOptions[optFSAA.name] = optFSAA; mOptions[optRTTMode.name] = optRTTMode; } String SDLGLSupport::validateConfig(void) { return String(""); } RenderWindow* SDLGLSupport::createWindow(bool autoCreateWindow, GLRenderSystem* renderSystem, const String& windowTitle) { if (autoCreateWindow) { ConfigOptionMap::iterator opt = mOptions.find("Full Screen"); if (opt == mOptions.end()) OGRE_EXCEPT(999, "Can't find full screen options!", "SDLGLSupport::createWindow"); bool fullscreen = (opt->second.currentValue == "Yes"); opt = mOptions.find("Video Mode"); if (opt == mOptions.end()) OGRE_EXCEPT(999, "Can't find video mode options!", "SDLGLSupport::createWindow"); String val = opt->second.currentValue; String::size_type pos = val.find('x'); if (pos == String::npos) OGRE_EXCEPT(999, "Invalid Video Mode provided", "SDLGLSupport::createWindow"); // Parse FSAA config NameValuePairList winOptions; winOptions["title"] = windowTitle; int fsaa_x_samples = 0; opt = mOptions.find("FSAA"); if(opt != mOptions.end()) { winOptions["FSAA"] = opt->second.currentValue; } unsigned int w = StringConverter::parseUnsignedInt(val.substr(0, pos)); unsigned int h = StringConverter::parseUnsignedInt(val.substr(pos + 1)); const SDL_VideoInfo* videoInfo = SDL_GetVideoInfo(); return renderSystem->createRenderWindow(windowTitle, w, h, fullscreen, &winOptions); } else { // XXX What is the else? return NULL; } } RenderWindow* SDLGLSupport::newWindow(const String &name, unsigned int width, unsigned int height, bool fullScreen, const NameValuePairList *miscParams) { SDLWindow* window = new SDLWindow(); window->create(name, width, height, fullScreen, miscParams); return window; } void SDLGLSupport::start() { LogManager::getSingleton().logMessage( "******************************\n" "*** Starting SDL Subsystem ***\n" "******************************"); SDL_Init(SDL_INIT_VIDEO); } void SDLGLSupport::stop() { LogManager::getSingleton().logMessage( "******************************\n" "*** Stopping SDL Subsystem ***\n" "******************************"); SDL_Quit(); } void* SDLGLSupport::getProcAddress(const String& procname) { return SDL_GL_GetProcAddress(procname.c_str()); }