X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FOpenGL_Windows.cpp;h=b0dc01dd60d1dd839ca5bdc8448ee8d07acd643f;hb=e08a65d1b8613dfbe0f48a7d868c5b0459b411a6;hp=b12cf8b74ebf7d50af9fc1d06f5cea0992ed5682;hpb=3df5b67a683de08084f79b5910254f799fc3b4a8;p=lugaru.git diff --git a/Source/OpenGL_Windows.cpp b/Source/OpenGL_Windows.cpp index b12cf8b..b0dc01d 100644 --- a/Source/OpenGL_Windows.cpp +++ b/Source/OpenGL_Windows.cpp @@ -65,6 +65,7 @@ extern float slomofreq; #include #include #include +#include #include "gamegl.h" #include "MacCompatibility.h" #include "Settings.h" @@ -78,7 +79,7 @@ extern SDL_Window *sdlwindow; using namespace std; -SDL_Rect **resolutions = NULL; +set> resolutions; Boolean SetUp (); void DoUpdate (); @@ -92,6 +93,7 @@ void CleanUp (void); #pragma warning(disable: 4273) #endif +#ifndef __MINGW32__ // FIXME: Temporary workaround for GL-8 #define GL_FUNC(ret,fn,params,call,rt) \ extern "C" { \ static ret (GLAPIENTRY *p##fn) params = NULL; \ @@ -99,6 +101,7 @@ void CleanUp (void); } #include "glstubs.h" #undef GL_FUNC +#endif // __MINGW32__ #ifdef _MSC_VER #pragma warning(pop) @@ -117,17 +120,21 @@ static bool lookup_glsym(const char *funcname, void **func) static bool lookup_all_glsyms(void) { bool retval = true; +#ifndef __MINGW32__ // FIXME: Temporary workaround for GL-8 #define GL_FUNC(ret,fn,params,call,rt) \ if (!lookup_glsym(#fn, (void **) &p##fn)) retval = false; #include "glstubs.h" #undef GL_FUNC +#endif // __MINGW32__ return retval; } +#ifndef __MINGW32__ // FIXME: Temporary workaround for GL-8 static void GLAPIENTRY glDeleteTextures_doNothing(GLsizei n, const GLuint *textures) { // no-op. } +#endif // __MINGW32__ #ifdef MessageBox #undef MessageBox @@ -212,8 +219,9 @@ void initGL() } } -static void toggleFullscreen() +void toggleFullscreen() { + fullscreen = !fullscreen; Uint32 flags = SDL_GetWindowFlags(sdlwindow); if (flags & SDL_WINDOW_FULLSCREEN) { flags &= ~SDL_WINDOW_FULLSCREEN; @@ -264,8 +272,6 @@ static Point gMidPoint; Boolean SetUp () { - char string[10]; - LOGFUNC; osx = 0; @@ -276,8 +282,6 @@ Boolean SetUp () DefaultSettings(); - const int displayIdx = 0; // !!! FIXME: other monitors? - if (!SDL_WasInit(SDL_INIT_VIDEO)) if (SDL_Init(SDL_INIT_VIDEO) == -1) { fprintf(stderr, "SDL_Init() failed: %s\n", SDL_GetError()); @@ -297,19 +301,19 @@ Boolean SetUp () return false; } - int count = 0; - const int nummodes = SDL_GetNumDisplayModes(displayIdx); - for (int i = 0; i < nummodes; i++) - { - SDL_DisplayMode mode; - if (SDL_GetDisplayMode(displayIdx, i, &mode) == -1) - continue; - if ((mode.w < 640) || (mode.h < 480)) - continue; // sane lower limit. - count++; + for (int displayIdx = 0; displayIdx < SDL_GetNumVideoDisplays(); ++displayIdx) { + for (int i = 0; i < SDL_GetNumDisplayModes(displayIdx); ++i) { + SDL_DisplayMode mode; + if (SDL_GetDisplayMode(displayIdx, i, &mode) == -1) + continue; + if ((mode.w < 640) || (mode.h < 480)) + continue; // sane lower limit. + pair resolution(mode.w, mode.h); + resolutions.insert(resolution); + } } - if (count == 0) { + if (resolutions.empty()) { const std::string error = "No suitable video resolutions found."; cerr << error << endl; SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Lugaru init failed!", error.c_str(), NULL); @@ -317,45 +321,25 @@ Boolean SetUp () return false; } - static SDL_Rect *resolutions_block = NULL; - resolutions_block = (SDL_Rect*) realloc(resolutions_block, sizeof (SDL_Rect) * count); - resolutions = (SDL_Rect**) realloc(resolutions, sizeof (SDL_Rect *) * (count + 1)); - if ((resolutions_block == NULL) || (resolutions == NULL)) { - SDL_Quit(); - fprintf(stderr, "Out of memory!\n"); - return false; - } - - resolutions[count--] = NULL; - for (int i = 0; count >= 0; i++, count--) { - /* FIXME - Pretty sure this should use nummodes and not count */ - SDL_DisplayMode mode; - if (SDL_GetDisplayMode(displayIdx, i, &mode) == -1) - continue; - if ((mode.w < 640) || (mode.h < 480)) - continue; // sane lower limit. - resolutions_block[count].x = resolutions_block[count].y = 0; - resolutions_block[count].w = mode.w; - resolutions_block[count].h = mode.h; - resolutions[count] = &resolutions_block[count]; - } - if (cmdline("showresolutions")) { - printf("Resolutions we think are okay:\n"); - for (int i = 0; resolutions[i]; i++) - printf(" %d x %d\n", (int) resolutions[i]->w, (int) resolutions[i]->h); + printf("Available resolutions:\n"); + for (auto resolution = resolutions.begin(); resolution != resolutions.end(); resolution++) { + printf(" %d x %d\n", (int) resolution->first, (int) resolution->second); + } } SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1); Uint32 sdlflags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN; - if (!cmdline("windowed")) + if ((fullscreen || cmdline("fullscreen")) && !cmdline("windowed")) { + fullscreen = 1; sdlflags |= SDL_WINDOW_FULLSCREEN; + } if (!cmdline("nomousegrab")) sdlflags |= SDL_WINDOW_INPUT_GRABBED; - sdlwindow = SDL_CreateWindow("Lugaru", SDL_WINDOWPOS_CENTERED_DISPLAY(displayIdx), SDL_WINDOWPOS_CENTERED_DISPLAY(displayIdx), + sdlwindow = SDL_CreateWindow("Lugaru", SDL_WINDOWPOS_CENTERED_DISPLAY(0), SDL_WINDOWPOS_CENTERED_DISPLAY(0), kContextWidth, kContextHeight, sdlflags); if (!sdlwindow) { @@ -363,13 +347,13 @@ Boolean SetUp () fprintf(stderr, "forcing 640x480...\n"); kContextWidth = 640; kContextHeight = 480; - sdlwindow = SDL_CreateWindow("Lugaru", SDL_WINDOWPOS_CENTERED_DISPLAY(displayIdx), SDL_WINDOWPOS_CENTERED_DISPLAY(displayIdx), + sdlwindow = SDL_CreateWindow("Lugaru", SDL_WINDOWPOS_CENTERED_DISPLAY(0), SDL_WINDOWPOS_CENTERED_DISPLAY(0), kContextWidth, kContextHeight, sdlflags); if (!sdlwindow) { fprintf(stderr, "SDL_CreateWindow() failed: %s\n", SDL_GetError()); fprintf(stderr, "forcing 640x480 windowed mode...\n"); sdlflags &= ~SDL_WINDOW_FULLSCREEN; - sdlwindow = SDL_CreateWindow("Lugaru", SDL_WINDOWPOS_CENTERED_DISPLAY(displayIdx), SDL_WINDOWPOS_CENTERED_DISPLAY(displayIdx), + sdlwindow = SDL_CreateWindow("Lugaru", SDL_WINDOWPOS_CENTERED_DISPLAY(0), SDL_WINDOWPOS_CENTERED_DISPLAY(0), kContextWidth, kContextHeight, sdlflags); if (!sdlwindow) { @@ -406,9 +390,8 @@ Boolean SetUp () SDL_GL_SetSwapInterval(1); SDL_ShowCursor(0); - SDL_SetWindowGrab(sdlwindow, SDL_TRUE); - SDL_SetRelativeMouseMode(SDL_TRUE); - + if (!cmdline("nomousegrab")) + SDL_SetRelativeMouseMode(SDL_TRUE); initGL(); @@ -423,6 +406,12 @@ Boolean SetUp () newscreenwidth = screenwidth; newscreenheight = screenheight; + /* If saved resolution is not in the list, add it to the list (so that it’s selectable in the options) */ + pair startresolution(width,height); + if (resolutions.find(startresolution) == resolutions.end()) { + resolutions.insert(startresolution); + } + InitGame(); return true; @@ -577,12 +566,14 @@ void CleanUp (void) LOGFUNC; SDL_Quit(); +#ifndef __MINGW32__ // FIXME: Temporary workaround for GL-8 #define GL_FUNC(ret,fn,params,call,rt) p##fn = NULL; #include "glstubs.h" #undef GL_FUNC // cheat here...static destructors are calling glDeleteTexture() after // the context is destroyed and libGL unloaded by SDL_Quit(). pglDeleteTextures = glDeleteTextures_doNothing; +#endif // __MINGW32__ } @@ -650,7 +641,6 @@ char *calcBaseDir(const char *argv0) char *retval; char *envr; - const char *ptr = strrchr((char *)argv0, '/'); if (strchr(argv0, '/')) { retval = strdup(argv0); if (retval) @@ -875,7 +865,6 @@ static bool load_png(const char *file_name, TGAImageRec &tex) png_infop info_ptr = NULL; png_uint_32 width, height; int bit_depth, color_type, interlace_type; - png_byte **rows = NULL; bool retval = false; png_byte **row_pointers = NULL; FILE *fp = fopen(file_name, "rb"); @@ -921,7 +910,7 @@ static bool load_png(const char *file_name, TGAImageRec &tex) png_byte *dst = tex.data; for (int i = height - 1; i >= 0; i--) { png_byte *src = row_pointers[i]; - for (int j = 0; j < width; j++) { + for (unsigned j = 0; j < width; j++) { dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2];