X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FOpenGL_Windows.cpp;h=618ef4742d4218bfbb9ff5571775816b46fd8c7b;hb=decb00e82a2e65e25dbcdd8f16fff5a6a07d31d6;hp=e112066ebb79df5d3c0946be2b206cc709278283;hpb=a04b9ae281db1ca19937c0c30e138e9ed57b0d21;p=lugaru.git diff --git a/Source/OpenGL_Windows.cpp b/Source/OpenGL_Windows.cpp index e112066..618ef47 100644 --- a/Source/OpenGL_Windows.cpp +++ b/Source/OpenGL_Windows.cpp @@ -19,6 +19,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + #ifdef WIN32 #define UINT8 WIN32API_UINT8 #define UINT16 WIN32API_UINT16 @@ -35,7 +36,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. extern "C" { #include "zlib.h" #include "png.h" - #include "jpeglib.h" + #ifdef WIN32 + #define INT32 INT32_jpeg + #include "jpeglib.h" + #undef INT32 + #else + #include "jpeglib.h" + #endif } static bool load_image(const char * fname, TGAImageRec & tex); @@ -56,51 +63,28 @@ static bool save_png(const char * fname); extern bool buttons[3]; extern float multiplier; -extern float screenwidth,screenheight; extern float sps; extern float realmultiplier; extern int slomo; -extern bool ismotionblur; -extern float usermousesensitivity; -extern int detail; -extern bool floatjump; extern bool cellophane; // MODIFIED GWC //extern int terraindetail; //extern int texdetail; extern float terraindetail; extern float texdetail; -extern int bloodtoggle; + extern bool osx; -extern bool autoslomo; -extern bool foliage; -extern bool musictoggle; -extern bool trilinear; -extern float gamespeed; -extern int difficulty; -extern bool damageeffects; extern int numplayers; -extern bool decals; -extern bool invertmouse; -extern bool texttoggle; -extern bool ambientsound; -extern bool mousejump; extern bool freeze; extern Person player[maxplayers]; -extern bool vblsync; extern bool stillloading; -extern bool showpoints; -extern bool alwaysblur; -extern bool immediate; -extern bool velocityblur; -extern bool debugmode; extern int mainmenu; /*extern*/ bool gameFocused; -extern int kBitsPerPixel; + extern float slomospeed; extern float slomofreq; -extern float oldgamespeed; -extern float volume; + + #include #include @@ -109,17 +93,17 @@ extern float volume; #include #include "gamegl.h" #include "MacCompatibility.h" +#include "Settings.h" #ifdef WIN32 #include +#include "win-res/resource.h" #endif -#include "res/resource.h" - using namespace std; -#if USE_SDL + SDL_Rect **resolutions = NULL; static SDL_Rect rect_1024_768 = { 0, 0, 1024, 768 }; static SDL_Rect rect_800_600 = { 0, 0, 800, 600 }; @@ -130,7 +114,7 @@ static SDL_Rect *hardcoded_resolutions[] = { &rect_640_480, NULL }; -#endif + unsigned int resolutionDepths[8][2] = {0}; @@ -163,7 +147,7 @@ typedef struct tagPOINT { } POINT, *PPOINT; #endif -#if USE_SDL + #ifdef _MSC_VER #pragma warning(push) @@ -225,7 +209,7 @@ void sdlGetCursorPos(POINT *pt) #undef MessageBox #endif #define MessageBox(hwnd,text,title,flags) STUBBED("msgbox") -#endif + Point delta; @@ -313,7 +297,12 @@ void ShutdownDSp () void DrawGL (Game & game) { - game.DrawGLScene(); + if ( stereomode == stereoNone ) { + game.DrawGLScene(stereoCenter); + } else { + game.DrawGLScene(stereoLeft); + game.DrawGLScene(stereoRight); + } } @@ -339,9 +328,7 @@ Boolean Button() return g_button; } -#if !USE_SDL -static void initSDLKeyTable(void) {} -#else + #define MAX_SDLKEYS SDLK_LAST static unsigned short KeyTable[MAX_SDLKEYS]; @@ -555,7 +542,7 @@ static void sdlEventProc(const SDL_Event &e, Game &game) return; } } -#endif + // -------------------------------------------------------------------------- @@ -570,285 +557,20 @@ Boolean SetUp (Game & game) randSeed = UpTime().lo; osx = 0; - ifstream ipstream(ConvertFileName(":Data:config.txt"), std::ios::in /*| std::ios::nocreate*/); - detail=1; - ismotionblur=0; - usermousesensitivity=1; - kContextWidth=640; - kContextHeight=480; - kBitsPerPixel = 32; - floatjump=0; cellophane=0; texdetail=4; - autoslomo=1; - decals=1; - invertmouse=0; - bloodtoggle=0; terraindetail=2; - foliage=1; - musictoggle=1; - trilinear=1; - gamespeed=1; - difficulty=1; - damageeffects=0; - texttoggle=1; - alwaysblur=0; - showpoints=0; - immediate=0; - velocityblur=0; - slomospeed=0.25; slomofreq=8012; - - volume = 0.8f; - - game.crouchkey=MAC_SHIFT_KEY; - game.jumpkey=MAC_SPACE_KEY; - game.leftkey=MAC_A_KEY; - game.forwardkey=MAC_W_KEY; - game.backkey=MAC_S_KEY; - game.rightkey=MAC_D_KEY; - game.drawkey=MAC_E_KEY; - game.throwkey=MAC_Q_KEY; - game.attackkey=MAC_MOUSEBUTTON1; - game.chatkey=MAC_T_KEY; numplayers=1; - ambientsound=1; - vblsync=0; - debugmode=0; + + DefaultSettings(game); selectDetail(kContextWidth, kContextHeight, kBitsPerPixel, detail); - if(!ipstream) { - ofstream opstream(ConvertFileName(":Data:config.txt", "w")); - opstream << "Screenwidth:\n"; - opstream << kContextWidth; - opstream << "\nScreenheight:\n"; - opstream << kContextHeight; - opstream << "\nMouse sensitivity:\n"; - opstream << usermousesensitivity; - opstream << "\nBlur(0,1):\n"; - opstream << ismotionblur; - opstream << "\nOverall Detail(0,1,2) higher=better:\n"; - opstream << detail; - opstream << "\nFloating jump:\n"; - opstream << floatjump; - opstream << "\nMouse jump:\n"; - opstream << mousejump; - opstream << "\nAmbient sound:\n"; - opstream << ambientsound; - opstream << "\nBlood (0,1,2):\n"; - opstream << bloodtoggle; - opstream << "\nAuto slomo:\n"; - opstream << autoslomo; - opstream << "\nFoliage:\n"; - opstream << foliage; - opstream << "\nMusic:\n"; - opstream << musictoggle; - opstream << "\nTrilinear:\n"; - opstream << trilinear; - opstream << "\nDecals(shadows,blood puddles,etc):\n"; - opstream << decals; - opstream << "\nInvert mouse:\n"; - opstream << invertmouse; - opstream << "\nGamespeed:\n"; - opstream << gamespeed; - opstream << "\nDifficulty(0,1,2) higher=harder:\n"; - opstream << difficulty; - opstream << "\nDamage effects(blackout, doublevision):\n"; - opstream << damageeffects; - opstream << "\nText:\n"; - opstream << texttoggle; - opstream << "\nDebug:\n"; - opstream << debugmode; - opstream << "\nVBL Sync:\n"; - opstream << vblsync; - opstream << "\nShow Points:\n"; - opstream << showpoints; - opstream << "\nAlways Blur:\n"; - opstream << alwaysblur; - opstream << "\nImmediate mode (turn on on G5):\n"; - opstream << immediate; - opstream << "\nVelocity blur:\n"; - opstream << velocityblur; - opstream << "\nVolume:\n"; - opstream << volume; - opstream << "\nForward key:\n"; - opstream << KeyToChar(game.forwardkey); - opstream << "\nBack key:\n"; - opstream << KeyToChar(game.backkey); - opstream << "\nLeft key:\n"; - opstream << KeyToChar(game.leftkey); - opstream << "\nRight key:\n"; - opstream << KeyToChar(game.rightkey); - opstream << "\nJump key:\n"; - opstream << KeyToChar(game.jumpkey); - opstream << "\nCrouch key:\n"; - opstream << KeyToChar(game.crouchkey); - opstream << "\nDraw key:\n"; - opstream << KeyToChar(game.drawkey); - opstream << "\nThrow key:\n"; - opstream << KeyToChar(game.throwkey); - opstream << "\nAttack key:\n"; - opstream << KeyToChar(game.attackkey); - opstream << "\nChat key:\n"; - opstream << KeyToChar(game.chatkey); - opstream.close(); - } - if(ipstream){ - int i; - ipstream.ignore(256,'\n'); - ipstream >> kContextWidth; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> kContextHeight; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> usermousesensitivity; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> i; - ismotionblur = (i != 0); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> detail; - if(detail!=0)kBitsPerPixel=32; - else kBitsPerPixel=16; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> i; - floatjump = (i != 0); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> i; - mousejump = (i != 0); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> i; - ambientsound = (i != 0); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> bloodtoggle; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> i; - autoslomo = (i != 0); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> i; - foliage = (i != 0); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> i; - musictoggle = (i != 0); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> i; - trilinear = (i != 0); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> i; - decals = (i != 0); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> i; - invertmouse = (i != 0); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> gamespeed; - oldgamespeed=gamespeed; - if(oldgamespeed==0){ - gamespeed=1; - oldgamespeed=1; - } - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> difficulty; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> i; - damageeffects = (i != 0); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> i; - texttoggle = (i != 0); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> i; - debugmode = (i != 0); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> i; - vblsync = (i != 0); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> i; - showpoints = (i != 0); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> i; - alwaysblur = (i != 0); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> i; - immediate = (i != 0); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> i; - velocityblur = (i != 0); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> volume; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.forwardkey=CharToKey(string); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.backkey=CharToKey(string); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.leftkey=CharToKey(string); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.rightkey=CharToKey(string); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.jumpkey=CharToKey(string); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.crouchkey=CharToKey(string); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.drawkey=CharToKey(string); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.throwkey=CharToKey(string); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.attackkey=CharToKey(string); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.chatkey=CharToKey(string); - ipstream.close(); - - if(detail>2)detail=2; - if(detail<0)detail=0; - if(screenwidth<0)screenwidth=640; - if(screenheight<0)screenheight=480; -#if !USE_SDL // we'll take anything that works. - if(screenwidth>3000)screenwidth=640; - if(screenheight>3000)screenheight=480; -#endif + if(!LoadSettings(game)) { + fprintf(stderr, "Failed to load config, creating default\n"); + SaveSettings(game); } if(kBitsPerPixel!=32&&kBitsPerPixel!=16){ kBitsPerPixel=16; @@ -859,7 +581,7 @@ Boolean SetUp (Game & game) SetupDSpFullScreen(); -#if USE_SDL + if (!SDL_WasInit(SDL_INIT_VIDEO)) { if (SDL_Init(SDL_INIT_VIDEO) == -1) @@ -921,7 +643,8 @@ Boolean SetUp (Game & game) SDL_ShowCursor(0); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - + SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1); + if (SDL_SetVideoMode(kContextWidth, kContextHeight, 0, sdlflags) == NULL) { fprintf(stderr, "SDL_SetVideoMode() failed: %s\n", SDL_GetError()); @@ -957,7 +680,7 @@ Boolean SetUp (Game & game) if (!cmdline("nomousegrab")) SDL_WM_GrabInput(SDL_GRAB_ON); -#endif + glClear( GL_COLOR_BUFFER_BIT ); swap_gl_buffers(); @@ -970,7 +693,6 @@ Boolean SetUp (Game & game) glDisable( GL_FOG); glDisable( GL_LIGHTING); glDisable( GL_LOGIC_OP); - glDisable( GL_STENCIL_TEST); glDisable( GL_TEXTURE_1D); glDisable( GL_TEXTURE_2D); glPixelTransferi( GL_MAP_COLOR, GL_FALSE); @@ -1012,6 +734,13 @@ Boolean SetUp (Game & game) game.newscreenwidth=screenwidth; game.newscreenheight=screenheight; + if ( CanInitStereo(stereomode) ) { + InitStereo(stereomode); + } else { + fprintf(stderr, "Failed to initialize stereo, disabling.\n"); + stereomode = stereoNone; + } + game.InitGame(); return true; @@ -1020,7 +749,7 @@ 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; @@ -1036,7 +765,7 @@ static void DoMouse(Game & game) else if (game.mousecoordv >= kContextHeight) game.mousecoordv = kContextHeight - 1; } -#endif + } @@ -1174,7 +903,7 @@ void CleanUp (void) -#if USE_SDL + SDL_Quit(); #define GL_FUNC(ret,fn,params,call,rt) p##fn = NULL; #include "glstubs.h" @@ -1182,18 +911,14 @@ void CleanUp (void) // cheat here...static destructors are calling glDeleteTexture() after // the context is destroyed and libGL unloaded by SDL_Quit(). pglDeleteTextures = glDeleteTextures_doNothing; -#endif + } // -------------------------------------------------------------------------- -static bool g_focused = true; - - static bool IsFocused() { - STUBBED("write me"); - return true; + return ((SDL_GetAppState() & SDL_APPINPUTFOCUS) != 0); } @@ -1356,14 +1081,14 @@ int main(int argc, char **argv) if (!SetUp (game)) return 42; - while (!gDone&&!game.quit&&(!game.tryquit||!game.registered)) + while (!gDone&&!game.quit&&(!game.tryquit)) { if (IsFocused()) { gameFocused = true; // check windows messages - #if USE_SDL + game.deltah = 0; game.deltav = 0; SDL_Event e; @@ -1377,7 +1102,7 @@ int main(int argc, char **argv) } sdlEventProc(e, game); } - #endif + // game DoUpdate(game); @@ -1392,7 +1117,12 @@ int main(int argc, char **argv) } // game is not in focus, give CPU time to other apps by waiting for messages instead of 'peeking' - STUBBED("give up CPU but sniff the event queue"); + SDL_ActiveEvent evt; + SDL_WaitEvent((SDL_Event*)&evt); + if (evt.type == SDL_ACTIVEEVENT && evt.gain == 1) + gameFocused = true; + else if (evt.type == SDL_QUIT) + gDone = true; } } @@ -1439,41 +1169,7 @@ int main(int argc, char **argv) // -------------------------------------------------------------------------- -#if !USE_SDL - int resolutionID(int width, int height) - { - int whichres; - whichres=-1; - if(width==640 && height==480)whichres=0; - if(width==800 && height==600)whichres=1; - if(width==1024 && height==768)whichres=2; - if(width==1280 && height==1024)whichres=3; - if(width==1600 && height==1200)whichres=4; - if(width==840 && height==524)whichres=5; - if(width==1024 && height==640)whichres=6; - if(width==1344 && height==840)whichres=7; - if(width==1920 && height==1200)whichres=8; - - return whichres; - } - int closestResolution(int width, int height) - { - int whichres; - whichres=-1; - if(width>=640 && height>=480)whichres=0; - if(width>=800 && height>=600)whichres=1; - if(width>=1024 && height>=768)whichres=2; - if(width>=1280 && height>=1024)whichres=3; - if(width>=1600 && height>=1200)whichres=4; - if(width==840 && height==524)whichres=5; - if(width==1024 && height==640)whichres=6; - if(width==1344 && height==840)whichres=7; - if(width>=1920 && height>=1200)whichres=8; - - return whichres; - } -#endif bool selectDetail(int & width, int & height, int & bpp, int & detail) { @@ -1481,75 +1177,7 @@ int main(int argc, char **argv) // currently with SDL, we just use whatever is requested // and don't care. --ryan. - #if !USE_SDL - int whichres = closestResolution(width, height); - - while (true) - { - if(whichres<=0 || whichres>8){ - whichres = 0; - width=640; - height=480; - } - if(whichres==1){ - width=800; - height=600; - } - if(whichres==2){ - width=1024; - height=768; - } - if(whichres==3){ - width=1280; - height=1024; - } - if(whichres==4){ - width=1600; - height=1200; - } - if(whichres==5){ - width=840; - height=524; - } - if(whichres==6){ - width=1024; - height=640; - } - if(whichres==7){ - width=1344; - height=840; - } - if(whichres==8){ - width=1920; - height=1200; - } - - if ((detail != 0) && (resolutionDepths[whichres][1] != 0)) - { - break; - } - else if ((detail == 0) && (resolutionDepths[whichres][0] != 0)) - { - break; - } - else if ((detail != 0) && (resolutionDepths[whichres][0] != 0)) - { - res = false; - detail = 0; - break; - } - else - - if (0 == whichres) - { - break; - } - - --whichres; - } - - bpp = resolutionDepths[whichres][(detail != 0)]; - #endif + return res; } @@ -1610,6 +1238,7 @@ int main(int argc, char **argv) } } + bool LoadImage(const char * fname, TGAImageRec & tex) { bool res = true;