00001 #include "OgreException.h" 00002 #include "OgreLogManager.h" 00003 #include "OgreStringConverter.h" 00004 00005 #include "OgreSDLGLSupport.h" 00006 00007 #include "OgreSDLWindow.h" 00008 00009 using namespace Ogre; 00010 00011 SDLGLSupport::SDLGLSupport() 00012 { 00013 00014 SDL_Init(SDL_INIT_VIDEO); 00015 } 00016 00017 SDLGLSupport::~SDLGLSupport() 00018 { 00019 } 00020 00021 void SDLGLSupport::addConfig(void) 00022 { 00023 mVideoModes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_OPENGL); 00024 00025 if (mVideoModes == (SDL_Rect **)0) 00026 { 00027 Except(999, "Unable to load video modes", 00028 "SDLRenderSystem::initConfigOptions"); 00029 } 00030 00031 ConfigOption optFullScreen; 00032 ConfigOption optVideoMode; 00033 ConfigOption optFSAA; 00034 00035 // FS setting possiblities 00036 optFullScreen.name = "Full Screen"; 00037 optFullScreen.possibleValues.push_back("Yes"); 00038 optFullScreen.possibleValues.push_back("No"); 00039 optFullScreen.currentValue = "Yes"; 00040 optFullScreen.immutable = false; 00041 00042 // Video mode possiblities 00043 optVideoMode.name = "Video Mode"; 00044 optVideoMode.immutable = false; 00045 for (size_t i = 0; mVideoModes[i]; i++) 00046 { 00047 char szBuf[16]; 00048 snprintf(szBuf, 16, "%d x %d", mVideoModes[i]->w, mVideoModes[i]->h); 00049 optVideoMode.possibleValues.push_back(szBuf); 00050 // Make the first one default 00051 if (i == 0) 00052 { 00053 optVideoMode.currentValue = szBuf; 00054 } 00055 } 00056 00057 //FSAA possibilities 00058 optFSAA.name = "FSAA"; 00059 optFSAA.possibleValues.push_back("0"); 00060 optFSAA.possibleValues.push_back("2"); 00061 optFSAA.possibleValues.push_back("4"); 00062 optFSAA.possibleValues.push_back("6"); 00063 optFSAA.currentValue = "0"; 00064 optFSAA.immutable = false; 00065 00066 mOptions[optFullScreen.name] = optFullScreen; 00067 mOptions[optVideoMode.name] = optVideoMode; 00068 mOptions[optFSAA.name] = optFSAA; 00069 } 00070 00071 String SDLGLSupport::validateConfig(void) 00072 { 00073 return String(""); 00074 } 00075 00076 RenderWindow* SDLGLSupport::createWindow(bool autoCreateWindow, GLRenderSystem* renderSystem, const String& windowTitle) 00077 { 00078 if (autoCreateWindow) 00079 { 00080 ConfigOptionMap::iterator opt = mOptions.find("Full Screen"); 00081 if (opt == mOptions.end()) 00082 Except(999, "Can't find full screen options!", "SDLGLSupport::createWindow"); 00083 bool fullscreen = (opt->second.currentValue == "Yes"); 00084 00085 opt = mOptions.find("Video Mode"); 00086 if (opt == mOptions.end()) 00087 Except(999, "Can't find video mode options!", "SDLGLSupport::createWindow"); 00088 String val = opt->second.currentValue; 00089 String::size_type pos = val.find('x'); 00090 if (pos == String::npos) 00091 Except(999, "Invalid Video Mode provided", "SDLGLSupport::createWindow"); 00092 00093 int fsaa_x_samples = 0; 00094 opt = mOptions.find("FSAA"); 00095 if(opt != mOptions.end()) //check for FSAA parameter, if not ignore it... 00096 { 00097 fsaa_x_samples = StringConverter::parseInt(opt->second.currentValue); 00098 if(fsaa_x_samples>1) { 00099 // If FSAA is enabled in the parameters, enable the MULTISAMPLEBUFFERS 00100 // and set the number of samples before the render window is created. 00101 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS,1); 00102 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES,fsaa_x_samples); 00103 } 00104 } 00105 00106 unsigned int w = StringConverter::parseUnsignedInt(val.substr(0, pos)); 00107 unsigned int h = StringConverter::parseUnsignedInt(val.substr(pos + 1)); 00108 00109 const SDL_VideoInfo* videoInfo = SDL_GetVideoInfo(); 00110 return renderSystem->createRenderWindow(windowTitle, w, h, videoInfo->vfmt->BitsPerPixel, fullscreen); 00111 } 00112 else 00113 { 00114 // XXX What is the else? 00115 return NULL; 00116 } 00117 } 00118 00119 RenderWindow* SDLGLSupport::newWindow(const String& name, unsigned int width, unsigned int height, unsigned int colourDepth, 00120 bool fullScreen, int left, int top, bool depthBuffer, RenderWindow* parentWindowHandle, 00121 bool vsync) 00122 { 00123 SDLWindow* window = new SDLWindow(); 00124 window->create(name, width, height, colourDepth, fullScreen, left, top, depthBuffer, 00125 parentWindowHandle); 00126 return window; 00127 } 00128 00129 void SDLGLSupport::start() 00130 { 00131 LogManager::getSingleton().logMessage( 00132 "******************************\n" 00133 "*** Starting SDL Subsystem ***\n" 00134 "******************************"); 00135 00136 SDL_Init(SDL_INIT_VIDEO); 00137 } 00138 00139 void SDLGLSupport::stop() 00140 { 00141 LogManager::getSingleton().logMessage( 00142 "******************************\n" 00143 "*** Stopping SDL Subsystem ***\n" 00144 "******************************"); 00145 00146 SDL_Quit(); 00147 } 00148 00149 void* SDLGLSupport::getProcAddress(const String& procname) 00150 { 00151 return SDL_GL_GetProcAddress(procname.c_str()); 00152 }
Copyright © 2002-2003 by The OGRE Team
Last modified Sun Nov 28 19:48:45 2004