X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FOpenGL_Windows.cpp;h=8a9b6923c2662945978da3161d66777ea4d3c4ce;hb=735daf95aba0eef54d151daae01285f0959825d0;hp=1ee4964f94c8182969e026bbb9548276c25ac75c;hpb=0acdb5e7e90ddd677a5e72cc97731dad12edf230;p=lugaru.git diff --git a/Source/OpenGL_Windows.cpp b/Source/OpenGL_Windows.cpp index 1ee4964..8a9b692 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 @@ -29,34 +30,27 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #undef boolean #endif -#define USE_DEVIL 0 -#ifndef USE_DEVIL -# ifdef WIN32 -# define USE_DEVIL -# endif -#endif -#if USE_DEVIL - #include "IL/il.h" - #include "IL/ilu.h" - #include "IL/ilut.h" - #include "Game.h" -#else - - #include "Game.h" - extern "C" { - #include "zlib.h" - #include "png.h" +#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 +} + +static bool load_image(const char * fname, TGAImageRec & tex); +static bool load_png(const char * fname, TGAImageRec & tex); +static bool load_jpg(const char * fname, TGAImageRec & tex); +static bool save_image(const char * fname); +static bool save_png(const char * fname); - static bool load_image(const char * fname, TGAImageRec & tex); - static bool load_png(const char * fname, TGAImageRec & tex); - static bool load_jpg(const char * fname, TGAImageRec & tex); - static bool save_image(const char * fname); - static bool save_png(const char * fname); -#endif #include "openal_wrapper.h" @@ -67,53 +61,29 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #pragma comment(lib, "glaux.lib") #endif -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 @@ -122,19 +92,17 @@ extern float volume; #include #include "gamegl.h" #include "MacCompatibility.h" +#include "Settings.h" #ifdef WIN32 #include +#include "win-res/resource.h" #endif -#include "fmod.h" - -#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 }; @@ -145,25 +113,20 @@ static SDL_Rect *hardcoded_resolutions[] = { &rect_640_480, NULL }; -#endif + unsigned int resolutionDepths[8][2] = {0}; -bool selectDetail(int & width, int & height, int & bpp, int & detail); int closestResolution(int width, int height); int resolutionID(int width, int height); void ReportError (char * strError); -void SetupDSpFullScreen(); -void ShutdownDSp(); - void DrawGL(Game & game); void CreateGLWindow (void); Boolean SetUp (Game & game); -void DoKey (SInt8 theKey, SInt8 theCode); void DoUpdate (Game & game); void DoEvent (void); @@ -178,7 +141,7 @@ typedef struct tagPOINT { } POINT, *PPOINT; #endif -#if USE_SDL + #ifdef _MSC_VER #pragma warning(push) @@ -227,10 +190,7 @@ static void GLAPIENTRY glDeleteTextures_doNothing(GLsizei n, const GLuint *textu void sdlGetCursorPos(POINT *pt) { - int x, y; - SDL_GetMouseState(&x, &y); - pt->x = x; - pt->y = y; + SDL_GetMouseState(&(pt->x), &(pt->y)); } #define GetCursorPos(x) sdlGetCursorPos(x) #define SetCursorPos(x, y) SDL_WarpMouse(x, y) @@ -240,7 +200,7 @@ void sdlGetCursorPos(POINT *pt) #undef MessageBox #endif #define MessageBox(hwnd,text,title,flags) STUBBED("msgbox") -#endif + Point delta; @@ -312,147 +272,18 @@ void ReportError (char * strError) */ } -void SetupDSpFullScreen () -{ -} - - -void ShutdownDSp () -{ -} - - //----------------------------------------------------------------------------------------------------------------------- // OpenGL Drawing void DrawGL (Game & game) { - game.DrawGLScene(); -} - - -static KeyMap g_theKeys; - -void SetKey( int key) -{ - g_theKeys[ key >> 3] |= (1 << (key & 7)); -} - -void ClearKey( int key) -{ - g_theKeys[ key >> 3] &= (0xff ^ (1 << (key & 7))); -} - -void GetKeys( unsigned char theKeys[16]) -{ - memcpy( theKeys, &g_theKeys, 16); -} - -Boolean Button() -{ - return g_button; -} - -#if !USE_SDL -static void initSDLKeyTable(void) {} -#else -#define MAX_SDLKEYS SDLK_LAST -static unsigned short KeyTable[MAX_SDLKEYS]; - -static void initSDLKeyTable(void) -{ - memset(KeyTable, 0xFF, sizeof (KeyTable)); - KeyTable[SDLK_BACKSPACE] = MAC_DELETE_KEY; - KeyTable[SDLK_TAB] = MAC_TAB_KEY; - KeyTable[SDLK_RETURN] = MAC_RETURN_KEY; - KeyTable[SDLK_ESCAPE] = MAC_ESCAPE_KEY; - KeyTable[SDLK_SPACE] = MAC_SPACE_KEY; - KeyTable[SDLK_PAGEUP] = MAC_PAGE_UP_KEY; - KeyTable[SDLK_PAGEDOWN] = MAC_PAGE_DOWN_KEY; - KeyTable[SDLK_END] = MAC_END_KEY; - KeyTable[SDLK_HOME] = MAC_HOME_KEY; - KeyTable[SDLK_LEFT] = MAC_ARROW_LEFT_KEY; - KeyTable[SDLK_UP] = MAC_ARROW_UP_KEY; - KeyTable[SDLK_RIGHT] = MAC_ARROW_RIGHT_KEY; - KeyTable[SDLK_DOWN] = MAC_ARROW_DOWN_KEY; - KeyTable[SDLK_INSERT] = MAC_INSERT_KEY; - KeyTable[SDLK_DELETE] = MAC_DEL_KEY; - KeyTable[SDLK_0] = MAC_0_KEY; - KeyTable[SDLK_1] = MAC_1_KEY; - KeyTable[SDLK_2] = MAC_2_KEY; - KeyTable[SDLK_3] = MAC_3_KEY; - KeyTable[SDLK_4] = MAC_4_KEY; - KeyTable[SDLK_5] = MAC_5_KEY; - KeyTable[SDLK_6] = MAC_6_KEY; - KeyTable[SDLK_7] = MAC_7_KEY; - KeyTable[SDLK_8] = MAC_8_KEY; - KeyTable[SDLK_9] = MAC_9_KEY; - KeyTable[SDLK_a] = MAC_A_KEY; - KeyTable[SDLK_b] = MAC_B_KEY; - KeyTable[SDLK_c] = MAC_C_KEY; - KeyTable[SDLK_d] = MAC_D_KEY; - KeyTable[SDLK_e] = MAC_E_KEY; - KeyTable[SDLK_f] = MAC_F_KEY; - KeyTable[SDLK_g] = MAC_G_KEY; - KeyTable[SDLK_h] = MAC_H_KEY; - KeyTable[SDLK_i] = MAC_I_KEY; - KeyTable[SDLK_j] = MAC_J_KEY; - KeyTable[SDLK_k] = MAC_K_KEY; - KeyTable[SDLK_l] = MAC_L_KEY; - KeyTable[SDLK_m] = MAC_M_KEY; - KeyTable[SDLK_n] = MAC_N_KEY; - KeyTable[SDLK_o] = MAC_O_KEY; - KeyTable[SDLK_p] = MAC_P_KEY; - KeyTable[SDLK_q] = MAC_Q_KEY; - KeyTable[SDLK_r] = MAC_R_KEY; - KeyTable[SDLK_s] = MAC_S_KEY; - KeyTable[SDLK_t] = MAC_T_KEY; - KeyTable[SDLK_u] = MAC_U_KEY; - KeyTable[SDLK_v] = MAC_V_KEY; - KeyTable[SDLK_w] = MAC_W_KEY; - KeyTable[SDLK_x] = MAC_X_KEY; - KeyTable[SDLK_y] = MAC_Y_KEY; - KeyTable[SDLK_z] = MAC_Z_KEY; - KeyTable[SDLK_KP0] = MAC_NUMPAD_0_KEY; - KeyTable[SDLK_KP1] = MAC_NUMPAD_1_KEY; - KeyTable[SDLK_KP2] = MAC_NUMPAD_2_KEY; - KeyTable[SDLK_KP3] = MAC_NUMPAD_3_KEY; - KeyTable[SDLK_KP4] = MAC_NUMPAD_4_KEY; - KeyTable[SDLK_KP5] = MAC_NUMPAD_5_KEY; - KeyTable[SDLK_KP6] = MAC_NUMPAD_6_KEY; - KeyTable[SDLK_KP7] = MAC_NUMPAD_7_KEY; - KeyTable[SDLK_KP8] = MAC_NUMPAD_8_KEY; - KeyTable[SDLK_KP9] = MAC_NUMPAD_9_KEY; - KeyTable[SDLK_KP_MULTIPLY] = MAC_NUMPAD_ASTERISK_KEY; - KeyTable[SDLK_KP_PLUS] = MAC_NUMPAD_PLUS_KEY; - KeyTable[SDLK_KP_ENTER] = MAC_NUMPAD_ENTER_KEY; - KeyTable[SDLK_KP_MINUS] = MAC_NUMPAD_MINUS_KEY; - KeyTable[SDLK_KP_PERIOD] = MAC_NUMPAD_PERIOD_KEY; - KeyTable[SDLK_KP_DIVIDE] = MAC_NUMPAD_SLASH_KEY; - KeyTable[SDLK_F1] = MAC_F1_KEY; - KeyTable[SDLK_F2] = MAC_F2_KEY; - KeyTable[SDLK_F3] = MAC_F3_KEY; - KeyTable[SDLK_F4] = MAC_F4_KEY; - KeyTable[SDLK_F5] = MAC_F5_KEY; - KeyTable[SDLK_F6] = MAC_F6_KEY; - KeyTable[SDLK_F7] = MAC_F7_KEY; - KeyTable[SDLK_F8] = MAC_F8_KEY; - KeyTable[SDLK_F9] = MAC_F9_KEY; - KeyTable[SDLK_F10] = MAC_F10_KEY; - KeyTable[SDLK_F11] = MAC_F11_KEY; - KeyTable[SDLK_F12] = MAC_F12_KEY; - KeyTable[SDLK_SEMICOLON] = MAC_SEMICOLON_KEY; - KeyTable[SDLK_PLUS] = MAC_PLUS_KEY; - KeyTable[SDLK_COMMA] = MAC_COMMA_KEY; - KeyTable[SDLK_MINUS] = MAC_MINUS_KEY; - KeyTable[SDLK_PERIOD] = MAC_PERIOD_KEY; - KeyTable[SDLK_SLASH] = MAC_SLASH_KEY; - KeyTable[SDLK_BACKQUOTE] = MAC_TILDE_KEY; - KeyTable[SDLK_LEFTBRACKET] = MAC_LEFTBRACKET_KEY; - KeyTable[SDLK_BACKSLASH] = MAC_BACKSLASH_KEY; - KeyTable[SDLK_RIGHTBRACKET] = MAC_RIGHTBRACKET_KEY; - KeyTable[SDLK_QUOTE] = MAC_APOSTROPHE_KEY; + if ( stereomode == stereoNone ) { + game.DrawGLScene(stereoCenter); + } else { + game.DrawGLScene(stereoLeft); + game.DrawGLScene(stereoRight); + } } static inline int clamp_sdl_mouse_button(Uint8 button) @@ -470,7 +301,6 @@ static inline int clamp_sdl_mouse_button(Uint8 button) static void sdlEventProc(const SDL_Event &e, Game &game) { int val; - bool skipkey = false; SDLMod mod; switch(e.type) @@ -480,97 +310,21 @@ static void sdlEventProc(const SDL_Event &e, Game &game) game.deltav += e.motion.yrel; return; - case SDL_MOUSEBUTTONDOWN: - { - val = clamp_sdl_mouse_button(e.button.button); - if ((val >= 0) && (val <= 2)) - { - if (val == 0) - g_button = true; - buttons[val] = true; - } - } - return; - - case SDL_MOUSEBUTTONUP: - { - val = clamp_sdl_mouse_button(e.button.button); - if ((val >= 0) && (val <= 2)) - { - if (val == 0) - g_button = false; - buttons[val] = false; - } - } - return; - case SDL_KEYDOWN: - if (e.key.keysym.sym == SDLK_g) - { - if (e.key.keysym.mod & KMOD_CTRL) - { - skipkey = true; - 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) - { - if (e.key.keysym.mod & KMOD_ALT) - { - skipkey = true; - SDL_WM_ToggleFullScreen(SDL_GetVideoSurface()); - } + if ((e.key.keysym.sym == SDLK_g) && + (e.key.keysym.mod & KMOD_CTRL) && + !(SDL_GetVideoSurface()->flags & SDL_FULLSCREEN) ) { + SDL_WM_GrabInput( ((SDL_WM_GrabInput(SDL_GRAB_QUERY)==SDL_GRAB_ON) ? SDL_GRAB_OFF:SDL_GRAB_ON) ); + } else if ( (e.key.keysym.sym == SDLK_RETURN) && (e.key.keysym.mod & KMOD_ALT) ) { + SDL_WM_ToggleFullScreen(SDL_GetVideoSurface()); } - - if ((!skipkey) && (e.key.keysym.sym < SDLK_LAST)) - { - if (KeyTable[e.key.keysym.sym] != 0xffff) - SetKey(KeyTable[e.key.keysym.sym]); - } - - mod = SDL_GetModState(); - if (mod & KMOD_CTRL) - SetKey(MAC_CONTROL_KEY); - if (mod & KMOD_ALT) - SetKey(MAC_OPTION_KEY); - if (mod & KMOD_META) - SetKey(MAC_COMMAND_KEY); - if (mod & KMOD_SHIFT) - SetKey(MAC_SHIFT_KEY); - if (mod & KMOD_CAPS) - SetKey(MAC_CAPS_LOCK_KEY); - return; case SDL_KEYUP: - if (e.key.keysym.sym < SDLK_LAST) - { - if (KeyTable[e.key.keysym.sym] != 0xffff) - ClearKey(KeyTable[e.key.keysym.sym]); - } - - mod = SDL_GetModState(); - if ((mod & KMOD_CTRL) == 0) - ClearKey(MAC_CONTROL_KEY); - if ((mod & KMOD_ALT) == 0) - ClearKey(MAC_OPTION_KEY); - if ((mod & KMOD_META) == 0) - ClearKey(MAC_COMMAND_KEY); - if ((mod & KMOD_SHIFT) == 0) - ClearKey(MAC_SHIFT_KEY); - if ((mod & KMOD_CAPS) == 0) - ClearKey(MAC_CAPS_LOCK_KEY); return; } } -#endif + // -------------------------------------------------------------------------- @@ -585,347 +339,71 @@ 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; - - 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(kBitsPerPixel!=32&&kBitsPerPixel!=16){ - kBitsPerPixel=16; - } - - - selectDetail(kContextWidth, kContextHeight, kBitsPerPixel, detail); - - SetupDSpFullScreen(); + + DefaultSettings(game); -#if USE_SDL if (!SDL_WasInit(SDL_INIT_VIDEO)) - { if (SDL_Init(SDL_INIT_VIDEO) == -1) { fprintf(stderr, "SDL_Init() failed: %s\n", SDL_GetError()); return false; } + if(!LoadSettings(game)) { + fprintf(stderr, "Failed to load config, creating default\n"); + SaveSettings(game); + } + if(kBitsPerPixel!=32&&kBitsPerPixel!=16){ + kBitsPerPixel=16; + } - if (SDL_GL_LoadLibrary(NULL) == -1) - { - fprintf(stderr, "SDL_GL_LoadLibrary() failed: %s\n", SDL_GetError()); - SDL_Quit(); - return false; - } + if (SDL_GL_LoadLibrary(NULL) == -1) + { + fprintf(stderr, "SDL_GL_LoadLibrary() failed: %s\n", SDL_GetError()); + SDL_Quit(); + return false; + } - SDL_Rect **res = SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_OPENGL); - if ( (res == NULL) || (res == ((SDL_Rect **)-1)) || (res[0] == NULL) || (res[0]->w < 640) || (res[0]->h < 480) ) - res = hardcoded_resolutions; + SDL_Rect **res = SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_OPENGL); + if ( (res == NULL) || (res == ((SDL_Rect **)-1)) || (res[0] == NULL) || (res[0]->w < 640) || (res[0]->h < 480) ) + res = hardcoded_resolutions; - // reverse list (it was sorted biggest to smallest by SDL)... - int count; - for (count = 0; res[count]; count++) - { - if ((res[count]->w < 640) || (res[count]->h < 480)) - break; // sane lower limit. - } + // reverse list (it was sorted biggest to smallest by SDL)... + int count; + for (count = 0; res[count]; count++) + { + if ((res[count]->w < 640) || (res[count]->h < 480)) + break; // sane lower limit. + } - 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; - } + 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--) - { - memcpy(&resolutions_block[count], res[i], sizeof (SDL_Rect)); - resolutions[count] = &resolutions_block[count]; - } + resolutions[count--] = NULL; + for (int i = 0; count >= 0; i++, count--) + { + memcpy(&resolutions_block[count], res[i], sizeof (SDL_Rect)); + 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); - } - } + 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); + } Uint32 sdlflags = SDL_OPENGL; if (!cmdline("windowed")) @@ -936,7 +414,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()); @@ -972,7 +451,7 @@ Boolean SetUp (Game & game) if (!cmdline("nomousegrab")) SDL_WM_GrabInput(SDL_GRAB_ON); -#endif + glClear( GL_COLOR_BUFFER_BIT ); swap_gl_buffers(); @@ -985,7 +464,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); @@ -1016,25 +494,6 @@ Boolean SetUp (Game & game) glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glAlphaFunc( GL_GREATER, 0.5f); -#if USE_DEVIL - if (ilGetInteger(IL_VERSION_NUM) < IL_VERSION || - iluGetInteger(ILU_VERSION_NUM) < ILU_VERSION || - ilutGetInteger(ILUT_VERSION_NUM) < ILUT_VERSION) - { - ReportError("DevIL version is different...exiting!\n"); - return false; - } - - ilInit(); - iluInit(); - ilutInit(); - - ilutRenderer(ILUT_OPENGL); - - ilEnable(IL_ORIGIN_SET); - ilOriginFunc(IL_ORIGIN_LOWER_LEFT); -#endif - GLint width = kContextWidth; GLint height = kContextHeight; gMidPoint.h = width / 2; @@ -1046,6 +505,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; @@ -1054,7 +520,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; @@ -1070,22 +536,9 @@ static void DoMouse(Game & game) else if (game.mousecoordv >= kContextHeight) game.mousecoordv = kContextHeight - 1; } -#endif -} - - -// -------------------------------------------------------------------------- - -void DoKey (SInt8 theKey, SInt8 theCode) -{ - // do nothing } -// -------------------------------------------------------------------------- - - - void DoFrameRate (int update) { static long frames = 0; @@ -1101,9 +554,9 @@ void DoFrameRate (int update) deltaTime /= 1000.0; multiplier=deltaTime; - if(multiplier<.001)multiplier=.001; - if(multiplier>10)multiplier=10; - if(update)frametime = currTime; // reset for next time interval + if(multiplier<.001) multiplier=.001; + if(multiplier>10) multiplier=10; + if(update) frametime = currTime; // reset for next time interval deltaTime = (float) AbsoluteDeltaToDuration (currTime, time); @@ -1206,11 +659,9 @@ void CleanUp (void) // game.Dispose(); -#if USE_DEVIL - ilShutDown(); -#endif -#if USE_SDL + + SDL_Quit(); #define GL_FUNC(ret,fn,params,call,rt) p##fn = NULL; #include "glstubs.h" @@ -1218,18 +669,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); } @@ -1316,12 +763,12 @@ char *calcBaseDir(const char *argv0) char *retval; char *envr; - char *ptr = strrchr((char *)argv0, '/'); + const char *ptr = strrchr((char *)argv0, '/'); if (strchr(argv0, '/')) { retval = strdup(argv0); if (retval) - *(strrchr(retval, '/')) = '\0'; + *((char *) strrchr(retval, '/')) = '\0'; return(retval); } @@ -1373,9 +820,9 @@ int main(int argc, char **argv) LOGFUNC; - memset( &g_theKeys, 0, sizeof( KeyMap)); + //memset( &g_theKeys, 0, sizeof( KeyMap)); - initSDLKeyTable(); + //initSDLKeyTable(); try { @@ -1392,28 +839,29 @@ 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; - // message pump - while( SDL_PollEvent( &e ) ) - { - if( e.type == SDL_QUIT ) + if(!game.isWaiting()) { + // message pump + while( SDL_PollEvent( &e ) ) { - gDone=true; - break; + if( e.type == SDL_QUIT ) + { + gDone=true; + break; + } + sdlEventProc(e, game); } - sdlEventProc(e, game); } - #endif // game DoUpdate(game); @@ -1428,7 +876,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; } } @@ -1437,21 +890,7 @@ int main(int argc, char **argv) pgame = 0; CleanUp (); -// if(game.registernow){ - if(regnow) - { - #if (defined(__APPLE__) && defined(__MACH__)) - launch_web_browser("http://www.wolfire.com/purchase/lugaru/mac"); - #elif PLATFORM_LINUX - launch_web_browser("http://www.wolfire.com/purchase/lugaru/linux"); - #else - launch_web_browser("http://www.wolfire.com/purchase/lugaru/pc"); - #endif - } - #if PLATFORM_LINUX // (this may not be necessary any more.) - _exit(0); // !!! FIXME: hack...crashes on exit! - #endif return 0; } catch (const std::exception& error) @@ -1475,121 +914,6 @@ 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) - { - bool res = true; - - // 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; - } - extern int channels[100]; extern OPENAL_SAMPLE * samp[100]; extern OPENAL_STREAM * strm[20]; @@ -1646,109 +970,25 @@ int main(int argc, char **argv) } } + bool LoadImage(const char * fname, TGAImageRec & tex) { - bool res = true; - if ( tex.data == NULL ) - { - return false; - } - - #if USE_DEVIL - ILstring f = strdup(ConvertFileName(fname)); - if (!f) - { return false; - } - - ILuint iid=0; - ilGenImages(1, &iid); - ilBindImage(iid); - if (ilLoadImage(f)) - { - //iluFlipImage(); - tex.sizeX = ilGetInteger(IL_IMAGE_WIDTH); - tex.sizeY = ilGetInteger(IL_IMAGE_HEIGHT); - tex.bpp = ilGetInteger(IL_IMAGE_BITS_PER_PIXEL); - ILuint Bpp = ilGetInteger(IL_IMAGE_BYTES_PER_PIXEL), - imageSize = tex.sizeX * tex.sizeY * Bpp; - ILubyte *Data = ilGetData(); - memcpy(tex.data, Data, imageSize); - - // Truvision Targa files are stored as BGR colors - // We want RGB so Blue and Red bytes are switched - if (IL_TGA == ilGetInteger(IL_IMAGE_FORMAT)) - { - // Loop Through The Image Data - for (GLuint i = 0; i < int(imageSize); i += Bpp) - { - // Swaps The 1st And 3rd Bytes ('R'ed and 'B'lue) - GLbyte temp; // Temporary Variable - temp = tex.data[i]; // Temporarily Store The Value At Image Data 'i' - tex.data[i] = tex.data[i + 2]; // Set The 1st Byte To The Value Of The 3rd Byte - tex.data[i + 2] = temp; // Set The 3rd Byte To The Value In 'temp' (1st Byte Value) - } - } - } - else - { - res = false; - } - ilDeleteImages(1, &iid); -/* - if (tid) - { - GLuint texid = ilutGLLoadImage(f); - *tid = texid; - } - else if (mip) - { - ilutGLBuildMipmaps() - } else - { - ilutGLTexImage(0); - } -*/ - free(f); - #else - res = load_image(fname, tex); - //if (!res) printf("failed to load %s\n", fname); - #endif - - return res; + return load_image(fname, tex); } void ScreenShot(const char * fname) { - #if USE_DEVIL - ILstring f = strdup(fname); - if (!f) - { - return; - } - - ILuint iid; - ilGenImages(1, &iid); - ilBindImage(iid); - if (ilutGLScreen()) - { - ilSaveImage(f); - } - ilDeleteImages(1, &iid); - - free(f); - #else save_image(fname); - #endif } -#if !USE_DEVIL + static bool load_image(const char *file_name, TGAImageRec &tex) { - char *ptr = strrchr((char *)file_name, '.'); + const char *ptr = strrchr((char *)file_name, '.'); if (ptr) { if (strcasecmp(ptr+1, "png") == 0) @@ -1912,7 +1152,7 @@ png_done: static bool save_image(const char *file_name) { - char *ptr = strrchr((char *)file_name, '.'); + const char *ptr = strrchr((char *)file_name, '.'); if (ptr) { if (strcasecmp(ptr+1, "png") == 0) @@ -1993,5 +1233,5 @@ save_png_done: return retval; } -#endif +