X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;ds=inline;f=Source%2FOpenGL_Windows.cpp;h=6d684ba1d2cbe4e413aebc9264cf924459d2d065;hb=cd043e3f9e26c2b3406b40a354c2840941e9db7f;hp=5c32c25ecd6d3f1d3da9ce40447b75d8af1503ba;hpb=dcacd1c62fda9af9a042b2327041ea057652f1b3;p=lugaru.git
diff --git a/Source/OpenGL_Windows.cpp b/Source/OpenGL_Windows.cpp
index 5c32c25..6d684ba 100644
--- a/Source/OpenGL_Windows.cpp
+++ b/Source/OpenGL_Windows.cpp
@@ -3,47 +3,30 @@ Copyright (C) 2003, 2010 - Wolfire Games
This file is part of Lugaru.
-Lugaru is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
+Lugaru is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
-This program is distributed in the hope that it will be useful,
+Lugaru 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 General Public License for more details.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+along with Lugaru. If not, see .
*/
#ifdef WIN32
-#define UINT8 WIN32API_UINT8
-#define UINT16 WIN32API_UINT16
-#define boolean WIN32API_boolean
#include
-#undef UINT8
-#undef UINT16
-#undef boolean
#endif
-
-
#include "Game.h"
-extern "C" {
-#include "zlib.h"
-#include "png.h"
-#ifdef WIN32
-#define INT32 INT32_jpeg
-#include "jpeglib.h"
-#undef INT32
-#else
-#include "jpeglib.h"
-#endif
-}
+
+#include
+#include
+#include
using namespace Game;
@@ -80,6 +63,7 @@ extern float slomofreq;
#include
#include
#include
+#include
#include "gamegl.h"
#include "MacCompatibility.h"
#include "Settings.h"
@@ -93,7 +77,7 @@ extern SDL_Window *sdlwindow;
using namespace std;
-SDL_Rect **resolutions = NULL;
+set> resolutions;
Boolean SetUp ();
void DoUpdate ();
@@ -107,6 +91,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; \
@@ -114,6 +99,7 @@ void CleanUp (void);
}
#include "glstubs.h"
#undef GL_FUNC
+#endif // __MINGW32__
#ifdef _MSC_VER
#pragma warning(pop)
@@ -132,17 +118,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
@@ -227,8 +217,9 @@ void initGL()
}
}
-static void toggleFullscreen()
+void toggleFullscreen()
{
+ fullscreen = !fullscreen;
Uint32 flags = SDL_GetWindowFlags(sdlwindow);
if (flags & SDL_WINDOW_FULLSCREEN) {
flags &= ~SDL_WINDOW_FULLSCREEN;
@@ -279,8 +270,6 @@ static Point gMidPoint;
Boolean SetUp ()
{
- char string[10];
-
LOGFUNC;
osx = 0;
@@ -291,8 +280,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());
@@ -312,19 +299,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);
@@ -332,45 +319,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) {
@@ -378,13 +345,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) {
@@ -421,9 +388,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();
@@ -438,6 +404,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;
@@ -592,12 +564,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__
}
@@ -665,7 +639,6 @@ char *calcBaseDir(const char *argv0)
char *retval;
char *envr;
- const char *ptr = strrchr((char *)argv0, '/');
if (strchr(argv0, '/')) {
retval = strdup(argv0);
if (retval)
@@ -890,7 +863,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");
@@ -936,7 +908,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];