X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FOpenGL_Windows.cpp;h=5c8f491fd2dfc67e38d413a840fb8cd505f3102d;hb=464f909216b95d2a35bc332f0fc83e278e7b8864;hp=77f0c305162f129d027c723b9238c3f55c2d5cd3;hpb=d9bff07d8752bf235679170c94faf3501ccd7627;p=lugaru.git diff --git a/Source/OpenGL_Windows.cpp b/Source/OpenGL_Windows.cpp index 77f0c30..5c8f491 100644 --- a/Source/OpenGL_Windows.cpp +++ b/Source/OpenGL_Windows.cpp @@ -134,6 +134,43 @@ typedef struct tagPOINT { #endif #if USE_SDL +#define GL_FUNC(ret,fn,params,call,rt) \ + extern "C" { \ + static ret GLAPIENTRY (*p##fn) params = NULL; \ + ret GLAPIENTRY fn params { rt p##fn call; } \ + } +#include "glstubs.h" +#undef GL_FUNC + +static bool lookup_glsym(const char *funcname, void **func, const char *libname) +{ + *func = SDL_GL_GetProcAddress(funcname); + if (*func == NULL) + { + fprintf(stderr, "Failed to find OpenGL symbol \"%s\" in \"%s\"\n", + funcname, libname); + return false; + } + return true; +} + +static bool lookup_all_glsyms(const char *libname) +{ + bool retval = true; + #define GL_FUNC(ret,fn,params,call,rt) \ + if (!lookup_glsym(#fn, (void **) &p##fn, libname)) retval = false; + #include "glstubs.h" + #undef GL_FUNC + return retval; +} + +static void GLAPIENTRY glDeleteTextures_doNothing(GLsizei n, const GLuint *textures) +{ + // no-op. +} + + + void sdlGetCursorPos(POINT *pt) { int x, y; @@ -186,8 +223,6 @@ Boolean gDone = false, gfFrontProcess = true; Game * pgame = 0; -static bool gMouseGrabbed = true; - // -------------------------------------------------------------------------- void ReportError (char * strError) @@ -395,11 +430,16 @@ static inline int clamp_sdl_mouse_button(Uint8 button) return -1; } -static void sdlEventProc(const SDL_Event &e) +static void sdlEventProc(const SDL_Event &e, Game &game) { int val; switch(e.type) { + case SDL_MOUSEMOTION: + game.deltah += e.motion.xrel; + game.deltav += e.motion.yrel; + return; + case SDL_MOUSEBUTTONDOWN: { val = clamp_sdl_mouse_button(e.button.button); @@ -442,7 +482,15 @@ static void sdlEventProc(const SDL_Event &e) if (e.key.keysym.sym == SDLK_g) { if (e.key.keysym.mod & KMOD_CTRL) - gMouseGrabbed = !gMouseGrabbed; + { + SDL_GrabMode mode = SDL_GRAB_ON; + if ((SDL_GetVideoSurface()->flags & SDL_FULLSCREEN) == 0) + { + mode = SDL_WM_GrabInput(SDL_GRAB_QUERY); + mode = (mode==SDL_GRAB_ON) ? SDL_GRAB_OFF:SDL_GRAB_ON; + } + SDL_WM_GrabInput(mode); + } } else if (e.key.keysym.sym == SDLK_RETURN) @@ -798,9 +846,20 @@ Boolean SetUp (Game & game) fprintf(stderr, "SDL_Init() failed: %s\n", SDL_GetError()); return false; } + + const char *libname = "libGL.so.1"; // !!! FIXME: Linux specific! + if (SDL_GL_LoadLibrary(libname) == -1) + { + fprintf(stderr, "SDL_GL_LoadLibrary(\"%s\") failed: %s\n", + libname, SDL_GetError()); + return false; + } + + if (!lookup_all_glsyms(libname)) + return false; } - Uint32 sdlflags = SDL_OPENGL; + Uint32 sdlflags = SDL_OPENGL; // !!! FIXME: SDL_FULLSCREEN? SDL_WM_SetCaption("Lugaru", "lugaru"); SDL_ShowCursor(0); if (SDL_SetVideoMode(kContextWidth, kContextHeight, 0, sdlflags) == NULL) @@ -809,6 +868,8 @@ Boolean SetUp (Game & game) return false; } + + #elif (defined WIN32) //------------------------------------------------------------------ // create window @@ -999,6 +1060,23 @@ Boolean SetUp (Game & game) static void DoMouse(Game & game) { +#if USE_SDL + if(mainmenu||(abs(game.deltah)<10*realmultiplier*1000&&abs(game.deltav)<10*realmultiplier*1000)) + { + game.deltah *= usermousesensitivity; + game.deltav *= usermousesensitivity; + game.mousecoordh += game.deltah; + game.mousecoordv += game.deltav; + if (game.mousecoordh < 0) + game.mousecoordh = 0; + else if (game.mousecoordh >= kContextWidth) + game.mousecoordh = kContextWidth - 1; + if (game.mousecoordv < 0) + game.mousecoordv = 0; + else if (game.mousecoordv >= kContextHeight) + game.mousecoordv = kContextHeight - 1; + } +#else static Point lastMouse = {-1,-1}; Point globalMouse; @@ -1030,7 +1108,7 @@ static void DoMouse(Game & game) game.mousecoordv=globalMouse.v; } - if((!mainmenu)&&(gMouseGrabbed)) + if(!mainmenu) { if(lastMouse.h>gMidPoint.h+100||lastMouse.hgMidPoint.v+100||lastMouse.v