X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FOpenGL_Windows.cpp;h=c74939ec77a30f3472b2e3c6e9aece7263eb7561;hb=386dc30166871cd37cc4619c9c9b8bbd4ae3bcf8;hp=3f7b321daa50846da2ae8865568aca30b8151973;hpb=6468ba0b10be934e097a7b841333e9f168ca34fb;p=lugaru.git diff --git a/Source/OpenGL_Windows.cpp b/Source/OpenGL_Windows.cpp index 3f7b321..c74939e 100644 --- a/Source/OpenGL_Windows.cpp +++ b/Source/OpenGL_Windows.cpp @@ -48,34 +48,21 @@ extern "C" { 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); +bool save_image(const char * fname); static bool save_png(const char * fname); #include "openal_wrapper.h" -// ADDED GWC -#ifdef _MSC_VER -#pragma comment(lib, "opengl32.lib") -#pragma comment(lib, "glu32.lib") -#pragma comment(lib, "glaux.lib") -#endif - extern float multiplier; extern float sps; extern float realmultiplier; extern int slomo; extern bool cellophane; -// MODIFIED GWC -//extern int terraindetail; -//extern int texdetail; -extern float terraindetail; extern float texdetail; extern bool osx; -extern int numplayers; extern bool freeze; -extern Person player[maxplayers]; extern bool stillloading; extern int mainmenu; /*extern*/ bool gameFocused; @@ -101,8 +88,6 @@ extern float slomofreq; using namespace std; - - SDL_Rect **resolutions = NULL; static SDL_Rect rect_1024_768 = { 0, 0, 1024, 768 }; static SDL_Rect rect_800_600 = { 0, 0, 800, 600 }; @@ -114,34 +99,14 @@ static SDL_Rect *hardcoded_resolutions[] = { NULL }; - - -unsigned int resolutionDepths[8][2] = {0}; - -int closestResolution(int width, int height); -int resolutionID(int width, int height); - -void ReportError (char * strError); - void DrawGL(Game & game); -void CreateGLWindow (void); Boolean SetUp (Game & game); void DoUpdate (Game & game); -void DoEvent (void); void CleanUp (void); - // statics/globals (internal only) ------------------------------------------ -#ifndef WIN32 -typedef struct tagPOINT { - int x; - int y; -} POINT, *PPOINT; -#endif - - #ifdef _MSC_VER #pragma warning(push) @@ -186,50 +151,17 @@ static void GLAPIENTRY glDeleteTextures_doNothing(GLsizei n, const GLuint *textu // no-op. } - - -void sdlGetCursorPos(POINT *pt) -{ - SDL_GetMouseState(&(pt->x), &(pt->y)); -} -#define GetCursorPos(x) sdlGetCursorPos(x) -#define SetCursorPos(x, y) SDL_WarpMouse(x, y) -#define ScreenToClient(x, pt) -#define ClientToScreen(x, pt) #ifdef MessageBox #undef MessageBox #endif #define MessageBox(hwnd,text,title,flags) STUBBED("msgbox") - -Point delta; - -static bool g_button, fullscreen = true; - - // Menu defs -enum -{ - kFileQuit = 1 -}; - -enum -{ - kForegroundSleep = 10, - kBackgroundSleep = 10000 -}; - int kContextWidth; int kContextHeight; -const RGBColor rgbBlack = { 0x0000, 0x0000, 0x0000 }; - -GLuint gFontList; -char gcstrMode [256] = ""; - -UInt32 gSleepTime = kForegroundSleep; -Boolean gDone = false, gfFrontProcess = true; +Boolean gDone = false; Game * pgame = 0; @@ -252,61 +184,99 @@ bool cmdline(const char *cmd) return false; } +//----------------------------------------------------------------------------------------------------------------------- -// -------------------------------------------------------------------------- - -void ReportError (char * strError) -{ -#ifdef _MSC_VER // !!! FIXME. --ryan. - throw std::exception( strError); -#endif - - /* char errMsgCStr [256]; - Str255 strErr; - - sprintf (errMsgCStr, "%s", strError); +// OpenGL Drawing - // out as debug string - CToPStr (strErr, errMsgCStr); - DebugStr (strErr); - */ -} +void initGL(){ + glClear( GL_COLOR_BUFFER_BIT ); + swap_gl_buffers(); -//----------------------------------------------------------------------------------------------------------------------- + // clear all states + glDisable( GL_ALPHA_TEST); + glDisable( GL_BLEND); + glDisable( GL_DEPTH_TEST); + // glDisable( GL_DITHER); + glDisable( GL_FOG); + glDisable( GL_LIGHTING); + glDisable( GL_LOGIC_OP); + glDisable( GL_TEXTURE_1D); + glDisable( GL_TEXTURE_2D); + glPixelTransferi( GL_MAP_COLOR, GL_FALSE); + glPixelTransferi( GL_RED_SCALE, 1); + glPixelTransferi( GL_RED_BIAS, 0); + glPixelTransferi( GL_GREEN_SCALE, 1); + glPixelTransferi( GL_GREEN_BIAS, 0); + glPixelTransferi( GL_BLUE_SCALE, 1); + glPixelTransferi( GL_BLUE_BIAS, 0); + glPixelTransferi( GL_ALPHA_SCALE, 1); + glPixelTransferi( GL_ALPHA_BIAS, 0); -// OpenGL Drawing + // set initial rendering states + glShadeModel( GL_SMOOTH); + glClearDepth( 1.0f); + glDepthFunc( GL_LEQUAL); + glDepthMask( GL_TRUE); + // glDepthRange( FRONT_CLIP, BACK_CLIP); + glEnable( GL_DEPTH_TEST); + glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); + glCullFace( GL_FRONT); + glEnable( GL_CULL_FACE); + glEnable( GL_LIGHTING); +// glEnable( GL_LIGHT_MODEL_AMBIENT); + glEnable( GL_DITHER); + glEnable( GL_COLOR_MATERIAL); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glAlphaFunc( GL_GREATER, 0.5f); -void DrawGL (Game & game) -{ - if ( stereomode == stereoNone ) { - game.DrawGLScene(stereoCenter); + if ( CanInitStereo(stereomode) ) { + InitStereo(stereomode); } else { - game.DrawGLScene(stereoLeft); - game.DrawGLScene(stereoRight); + fprintf(stderr, "Failed to initialize stereo, disabling.\n"); + stereomode = stereoNone; } + + //TODO: load textures here } -static void sdlEventProc(const SDL_Event &e, Game &game) -{ - int val; - SDLMod mod; +static void toggleFullscreen(){ + SDL_Surface* screen=SDL_GetVideoSurface(); + Uint32 flags=screen->flags; + screen=SDL_SetVideoMode(0,0,0,flags^SDL_FULLSCREEN); + if(!screen) + screen=SDL_SetVideoMode(0,0,0,flags); + if(!screen) + exit(1); + initGL(); +} - switch(e.type) - { +static void sdlEventProc(const SDL_Event &e, Game &game){ + switch(e.type){ case SDL_MOUSEMOTION: game.deltah += e.motion.xrel; game.deltav += e.motion.yrel; - return; - + break; case SDL_KEYDOWN: 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()); + toggleFullscreen(); } - return; + break; + case SDL_ACTIVEEVENT: + if(e.active.state&SDL_APPINPUTFOCUS){ + if(e.active.gain){ + SDL_WM_GrabInput(SDL_GRAB_ON); + gameFocused=true; + }else{ + SDL_WM_GrabInput(SDL_GRAB_OFF); + gameFocused=false; + } + } + break; } } @@ -321,12 +291,9 @@ Boolean SetUp (Game & game) LOGFUNC; - randSeed = UpTime().lo; - osx = 0; cellophane=0; texdetail=4; - terraindetail=2; slomospeed=0.25; slomofreq=8012; numplayers=1; @@ -400,6 +367,9 @@ Boolean SetUp (Game & game) SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1); +#if SDL_VERSION_ATLEAST(1, 2, 10) + SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, vblsync); +#endif if (SDL_SetVideoMode(kContextWidth, kContextHeight, 0, sdlflags) == NULL) { @@ -438,46 +408,7 @@ Boolean SetUp (Game & game) SDL_WM_GrabInput(SDL_GRAB_ON); - glClear( GL_COLOR_BUFFER_BIT ); - swap_gl_buffers(); - - // clear all states - glDisable( GL_ALPHA_TEST); - glDisable( GL_BLEND); - glDisable( GL_DEPTH_TEST); - // glDisable( GL_DITHER); - glDisable( GL_FOG); - glDisable( GL_LIGHTING); - glDisable( GL_LOGIC_OP); - glDisable( GL_TEXTURE_1D); - glDisable( GL_TEXTURE_2D); - glPixelTransferi( GL_MAP_COLOR, GL_FALSE); - glPixelTransferi( GL_RED_SCALE, 1); - glPixelTransferi( GL_RED_BIAS, 0); - glPixelTransferi( GL_GREEN_SCALE, 1); - glPixelTransferi( GL_GREEN_BIAS, 0); - glPixelTransferi( GL_BLUE_SCALE, 1); - glPixelTransferi( GL_BLUE_BIAS, 0); - glPixelTransferi( GL_ALPHA_SCALE, 1); - glPixelTransferi( GL_ALPHA_BIAS, 0); - - // set initial rendering states - glShadeModel( GL_SMOOTH); - glClearDepth( 1.0f); - glDepthFunc( GL_LEQUAL); - glDepthMask( GL_TRUE); - // glDepthRange( FRONT_CLIP, BACK_CLIP); - glEnable( GL_DEPTH_TEST); - glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); - glCullFace( GL_FRONT); - glEnable( GL_CULL_FACE); - glEnable( GL_LIGHTING); -// glEnable( GL_LIGHT_MODEL_AMBIENT); - glEnable( GL_DITHER); - glEnable( GL_COLOR_MATERIAL); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glAlphaFunc( GL_GREATER, 0.5f); + initGL(); GLint width = kContextWidth; GLint height = kContextHeight; @@ -490,13 +421,6 @@ 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; @@ -506,7 +430,7 @@ Boolean SetUp (Game & game) static void DoMouse(Game & game) { - if(mainmenu||(abs(game.deltah)<10*realmultiplier*1000&&abs(game.deltav)<10*realmultiplier*1000)) + if(mainmenu|| ( (abs(game.deltah)<10*realmultiplier*1000) && (abs(game.deltav)<10*realmultiplier*1000) )) { game.deltah *= usermousesensitivity; game.deltav *= usermousesensitivity; @@ -573,7 +497,6 @@ void DoUpdate (Game & game) count = multiplier*sps; if(count<2)count=2; - //if(count>10)count=10; realmultiplier=multiplier; multiplier*=gamespeed; @@ -581,9 +504,7 @@ void DoUpdate (Game & game) if(difficulty==0)multiplier*=.8; if(game.loading==4)multiplier*=.00001; - //multiplier*.9; if(slomo&&!mainmenu)multiplier*=slomospeed; - //if(freeze)multiplier*=0.00001; oldmult=multiplier; multiplier/=(float)count; @@ -632,7 +553,7 @@ void DoUpdate (Game & game) num_channels = 0; } */ - DrawGL (game); + game.DrawGL(); } // -------------------------------------------------------------------------- @@ -642,11 +563,6 @@ void CleanUp (void) { LOGFUNC; -// game.Dispose(); - - - - SDL_Quit(); #define GL_FUNC(ret,fn,params,call,rt) p##fn = NULL; #include "glstubs.h" @@ -665,29 +581,6 @@ static bool IsFocused() } -static void launch_web_browser(const char *url) -{ -#ifdef WIN32 - ShellExecute(NULL, "open", url, NULL, NULL, SW_SHOWNORMAL); - -#elif (defined(__APPLE__) && defined(__MACH__)) - const char *fmt = "open '%s'"; - const size_t len = strlen(fmt) + strlen(url) + 16; - char *buf = new char[len]; - snprintf(buf, len, fmt, url); - system(buf); - delete[] buf; - -#elif PLATFORM_LINUX - const char *fmt = "PATH=$PATH:. xdg-open '%s'"; - const size_t len = strlen(fmt) + strlen(url) + 16; - char *buf = new char[len]; - snprintf(buf, len, fmt, url); - system(buf); - delete[] buf; -#endif -} - #ifndef WIN32 // (code lifted from physfs: http://icculus.org/physfs/ ... zlib license.) @@ -805,13 +698,8 @@ int main(int argc, char **argv) LOGFUNC; - //memset( &g_theKeys, 0, sizeof( KeyMap)); - - //initSDLKeyTable(); - try { - bool regnow = false; { Game game; pgame = &game; @@ -826,9 +714,8 @@ int main(int argc, char **argv) while (!gDone&&!game.quit&&(!game.tryquit)) { - if (IsFocused()) - { - gameFocused = true; + //if (IsFocused()) { + //gameFocused = true; // check windows messages @@ -837,22 +724,24 @@ int main(int argc, char **argv) SDL_Event e; if(!game.isWaiting()) { // message pump - while( SDL_PollEvent( &e ) ) - { - if( e.type == SDL_QUIT ) - { - gDone=true; - break; + while( SDL_PollEvent( &e ) ){ + switch(e.type){ + case SDL_QUIT: + gDone=true; + break; + default: + sdlEventProc(e, game); + break; } - sdlEventProc(e, game); } } // game DoUpdate(game); - } - else - { + /* + } + else + { if (gameFocused) { // allow game chance to pause @@ -868,9 +757,9 @@ int main(int argc, char **argv) else if (evt.type == SDL_QUIT) gDone = true; } + */ } - regnow = game.registernow; } pgame = 0; @@ -897,77 +786,21 @@ int main(int argc, char **argv) - // -------------------------------------------------------------------------- - - extern int channels[100]; - extern OPENAL_SAMPLE * samp[100]; - extern OPENAL_STREAM * strm[20]; - - extern "C" void PlaySoundEx(int chan, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused) - { - const OPENAL_SAMPLE * currSample = OPENAL_GetCurrentSample(channels[chan]); - if (currSample && currSample == samp[chan]) - { - if (OPENAL_GetPaused(channels[chan])) - { - OPENAL_StopSound(channels[chan]); - channels[chan] = OPENAL_FREE; - } - else if (OPENAL_IsPlaying(channels[chan])) - { - int loop_mode = OPENAL_GetLoopMode(channels[chan]); - if (loop_mode & OPENAL_LOOP_OFF) - { - channels[chan] = OPENAL_FREE; - } - } - } - else - { - channels[chan] = OPENAL_FREE; - } - - channels[chan] = OPENAL_PlaySoundEx(channels[chan], sptr, dsp, startpaused); - if (channels[chan] < 0) - { - channels[chan] = OPENAL_PlaySoundEx(OPENAL_FREE, sptr, dsp, startpaused); - } - } - - extern "C" void PlayStreamEx(int chan, OPENAL_STREAM *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused) - { - const OPENAL_SAMPLE * currSample = OPENAL_GetCurrentSample(channels[chan]); - if (currSample && currSample == OPENAL_Stream_GetSample(sptr)) - { - OPENAL_StopSound(channels[chan]); - OPENAL_Stream_Stop(sptr); - } - else - { - OPENAL_Stream_Stop(sptr); - channels[chan] = OPENAL_FREE; - } - - channels[chan] = OPENAL_Stream_PlayEx(channels[chan], sptr, dsp, startpaused); - if (channels[chan] < 0) - { - channels[chan] = OPENAL_Stream_PlayEx(OPENAL_FREE, sptr, dsp, startpaused); - } - } +// -------------------------------------------------------------------------- - bool LoadImage(const char * fname, TGAImageRec & tex) - { - if ( tex.data == NULL ) - return false; - else - return load_image(fname, tex); - } +bool LoadImage(const char * fname, TGAImageRec & tex) +{ + if ( tex.data == NULL ) + return false; + else + return load_image(fname, tex); +} - void ScreenShot(const char * fname) - { - save_image(fname); - } +void ScreenShot(const char * fname) +{ + +} @@ -1135,7 +968,7 @@ png_done: } -static bool save_image(const char *file_name) +bool save_image(const char *file_name) { const char *ptr = strrchr((char *)file_name, '.'); if (ptr)