From: Vadim Trochinsky Date: Thu, 20 May 2010 20:57:06 +0000 (+0200) Subject: merge X-Git-Url: https://git.jsancho.org/?a=commitdiff_plain;h=ca0addc190070545ea6204dfb4132f196d7acd1c;hp=e8ddf63c8ead49835644a81a2fdfc25d819d0257;p=lugaru.git merge --- diff --git a/.hgsigs b/.hgsigs new file mode 100644 index 0000000..45f4f08 --- /dev/null +++ b/.hgsigs @@ -0,0 +1,7 @@ +2c45b18d41b6b7abd7d7013cf126ed9dbc852835 0 iEYEABECAAYFAkvwQE4ACgkQvCkUtBccqkqlBACgvkql8deTM/JVjlxyZaSN9m7xB2QAoLjYZ8niqpaRQEWGLTQJbyBCcpwH +a117f6eeffe2ea0591b83b3da4f76b17ca182d6e 0 iEYEABECAAYFAkvwQm0ACgkQvCkUtBccqkpkKACcCWqhpf+Th/x8dFXGjpvQDNA72cIAoIgnFi3cWppe8T2TTrX4IGe+f+zB +308aeba396559bd925a192b491141a6413d32d43 0 iEYEABECAAYFAkvwTMUACgkQvCkUtBccqkp3FgCfexqbHcBeO9NCC4Bb5CKXWHcXF+AAnArGHvXmPcn3XO+XTnqC39wGtDeT +cb8570a4c328dcccda31fce4958cea8f5fac748c 0 iEYEABECAAYFAkvwUU8ACgkQvCkUtBccqkoylgCeKkaH+UpP8HC2IM2XowP7TkRseHEAoIYLhHVj3XQzgrMiqPHIpNf49Pn8 +e22c5c02ba45c5392a9e5a1f48b3c1f3123ab806 0 iEYEABECAAYFAkvwU/UACgkQvCkUtBccqkprdwCgrj1L7BHYA66jWWicQn+GAuv/sSYAnjGwWAuF8M0x8GCTK2rKdeSAnC7O +38fd6c455d143f6167cf7a1037d87846b88b7449 0 iEYEABECAAYFAkvwWgwACgkQvCkUtBccqkqJ2wCeIWGrWuK+4ReIIgmEqXucl6nxFboAnicyYk42m88+QPE263JlkDkKTKfg +9b260ab4978b283d853000fa17d30d32c25376dd 0 iEYEABECAAYFAkvwdT4ACgkQvCkUtBccqkoWdwCgmjRiRb/Zq+JO6avdBlQZd8+CAzAAnjABDfXj7AFQOWw9/Fv7ni1/oWoW diff --git a/CMakeLists.txt b/CMakeLists.txt index 4280154..766bd37 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -78,6 +78,7 @@ set(LUGARU_SRCS ${SRCDIR}/openal_wrapper.cpp ${SRCDIR}/WinInput.cpp ${SRCDIR}/Settings.cpp + ${SRCDIR}/Stereo.cpp ) set(LUGARU_H @@ -112,6 +113,7 @@ set(LUGARU_H ${SRCDIR}/private.h ${SRCDIR}/unpack_private.h ${SRCDIR}/Settings.h + ${SRCDIR}/Stereo.h ) if(UNIX) diff --git a/Data/config.txt b/Data/config.txt index f613b60..203c615 100644 --- a/Data/config.txt +++ b/Data/config.txt @@ -69,4 +69,10 @@ q Attack key: mouse1 Chat key: -unknown \ No newline at end of file +unknown +StereoMode: +0 +StereoSeparation: +0.05 +StereoReverse: +0 diff --git a/Source/Game.h b/Source/Game.h index bda4324..1297fbd 100644 --- a/Source/Game.h +++ b/Source/Game.h @@ -62,6 +62,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "binio.h" #include #include "gamegl.h" +#include "Stereo.h" extern GLuint rabbittexture; @@ -246,7 +247,7 @@ public: void LoadingScreen(); void FadeLoadingScreen(float howmuch); void Dispose(); - int DrawGLScene(void); + int DrawGLScene(StereoSide side); void Tick(); void TickOnce(); void TickOnceAfter(); diff --git a/Source/GameDraw.cpp b/Source/GameDraw.cpp index ea75d51..3e07606 100644 --- a/Source/GameDraw.cpp +++ b/Source/GameDraw.cpp @@ -211,7 +211,7 @@ long long Game::MD5_string (char *string){ //return 1111111111111111; } -int Game::DrawGLScene(void) +int Game::DrawGLScene(StereoSide side) { static float texcoordwidth,texcoordheight; static float texviewwidth, texviewheight; @@ -230,8 +230,18 @@ int Game::DrawGLScene(void) lastcheck+=multiplier; - glColorMask( 1.0, 1.0, 1.0, 1.0 ); - + if ( stereomode == stereoAnaglyph ) { + switch(side) { + case stereoLeft: glColorMask( 0.0, 1.0, 1.0, 1.0 ); break; + case stereoRight: glColorMask( 1.0, 0.0, 0.0, 1.0 ); break; + } + } else { + glColorMask( 1.0, 1.0, 1.0, 1.0 ); + + if ( stereomode == stereoHorizontalInterlaced || stereomode == stereoVerticalInterlaced ) { + glStencilFunc(side == stereoLeft ? GL_NOTEQUAL : GL_EQUAL, 0x01, 0x01); + } + } if(freeze||winfreeze||(mainmenu&&gameon)||(!gameon&&gamestarted)){ tempmult=multiplier; @@ -347,6 +357,11 @@ int Game::DrawGLScene(void) glMatrixMode (GL_MODELVIEW); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glLoadIdentity (); + + // Move the camera for the current eye's point of view. + // Reverse the movement if we're reversing stereo + glTranslatef((stereoseparation/2) * side * (stereoreverse ? -1 : 1), 0, 0); + if(!cameramode&&!freeze&&!winfreeze){ glRotatef(float(Random()%100)/10*camerashake/*+(woozy*woozy)/10*/,0,0,1); glRotatef(rotation2+sin(woozy/2)*(player[0].damage/player[0].damagetolerance)*5,1,0,0); @@ -3793,10 +3808,11 @@ int Game::DrawGLScene(void) //glFlush(); - if(drawmode!=motionblurmode||mainmenu){ - - swap_gl_buffers(); - } + if ( side == stereoRight || side == stereoCenter ) { + if(drawmode!=motionblurmode||mainmenu){ + swap_gl_buffers(); + } + } //myassert(glGetError() == GL_NO_ERROR); glDrawBuffer(GL_BACK); diff --git a/Source/GameTick.cpp b/Source/GameTick.cpp index 57d7722..8010f4f 100644 --- a/Source/GameTick.cpp +++ b/Source/GameTick.cpp @@ -2609,6 +2609,43 @@ void Game::Tick() static bool mainmenutogglekeydown; + + if (IsKeyDown(theKeyMap, MAC_F6_KEY) && !freezetogglekeydown) { + if (IsKeyDown(theKeyMap, MAC_SHIFT_KEY)) { + stereoreverse=true; + } else { + stereoreverse=false; + } + + if (stereoreverse) { + printf("Stereo reversed\n"); + } else { + printf("Stereo unreversed\n"); + } + freezetogglekeydown=1; + } + + if (IsKeyDown(theKeyMap, MAC_F7_KEY)) { + if (IsKeyDown(theKeyMap, MAC_SHIFT_KEY)) { + stereoseparation -= 0.001; + } else { + stereoseparation -= 0.010; + } + + printf("Stereo decreased increased to %f\n", stereoseparation); + } + + if (IsKeyDown(theKeyMap, MAC_F8_KEY)) { + if (IsKeyDown(theKeyMap, MAC_SHIFT_KEY)) { + stereoseparation += 0.001; + } else { + stereoseparation += 0.010; + } + + printf("Stereo separation increased to %f\n", stereoseparation); + } + + if(!console){ if(mainmenu&&endgame==1)mainmenu=10; if(IsKeyDown(theKeyMap, MAC_ESCAPE_KEY)&&!mainmenutogglekeydown&&(mainmenu==7&&entername)){ @@ -4060,6 +4097,12 @@ void Game::Tick() opstream << KeyToChar(attackkey); opstream << "\nChat key:\n"; opstream << KeyToChar(chatkey); + opstream << "\nStereoMode:\n"; + opstream << stereomode; + opstream << "\nStereoSeparation:\n"; + opstream << stereoseparation; + opstream << "\nStereoReverse:\n"; + opstream << stereoreverse; opstream.close(); } } diff --git a/Source/Globals.cpp b/Source/Globals.cpp index 2eae6fb..b360ce0 100644 --- a/Source/Globals.cpp +++ b/Source/Globals.cpp @@ -33,6 +33,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Person.h" #include "TGALoader.h" #include "openal_wrapper.h" +#include "Stereo.h" #include "Constants.h" @@ -267,3 +268,6 @@ bool gamestarted = 0; //TextureList textures; +StereoMode stereomode = stereoNone; +float stereoseparation = 0.05; +bool stereoreverse = false; \ No newline at end of file diff --git a/Source/OpenGL_Windows.cpp b/Source/OpenGL_Windows.cpp index 8542abf..5759ddc 100644 --- a/Source/OpenGL_Windows.cpp +++ b/Source/OpenGL_Windows.cpp @@ -297,7 +297,12 @@ void ShutdownDSp () void DrawGL (Game & game) { - game.DrawGLScene(); + if ( stereomode == stereoNone ) { + game.DrawGLScene(stereoCenter); + } else { + game.DrawGLScene(stereoLeft); + game.DrawGLScene(stereoRight); + } } @@ -639,7 +644,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()); @@ -688,7 +694,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); @@ -730,6 +735,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; diff --git a/Source/Settings.cpp b/Source/Settings.cpp index 34cf99f..754c2ac 100644 --- a/Source/Settings.cpp +++ b/Source/Settings.cpp @@ -117,6 +117,13 @@ void SaveSettings(Game &game) { opstream << KeyToChar(game.attackkey); opstream << "\nChat key:\n"; opstream << KeyToChar(game.chatkey); + opstream << "\nStereoMode:\n"; + opstream << stereomode; + opstream << "\nStereoSeparation:\n"; + opstream << stereoseparation; + opstream << "\nStereoReverse:\n"; + opstream << stereoreverse; + opstream.close(); } @@ -233,6 +240,14 @@ bool LoadSettings(Game &game) { } else if ( !strncmp(setting, "Chat key", 8) ) { ipstream >> string; game.chatkey = CharToKey(string); + } else if ( !strncmp(setting, "StereoMode", 10) ) { + int i; + ipstream >> i; + stereomode = (StereoMode)i; + } else if ( !strncmp(setting, "StereoSeparation", 16) ) { + ipstream >> stereoseparation; + } else if ( !strncmp(setting, "StereoReverse", 13) ) { + ipstream >> stereoreverse; } else { ipstream >> string; fprintf(stderr, "Unknown config option '%s' with value '%s'. Ignoring.\n", setting, string); diff --git a/Source/Stereo.cpp b/Source/Stereo.cpp new file mode 100644 index 0000000..815e177 --- /dev/null +++ b/Source/Stereo.cpp @@ -0,0 +1,86 @@ + +#include "Game.h" +#include "Stereo.h" + + +extern int kContextWidth; +extern int kContextHeight; + +bool CanInitStereo(StereoMode mode) { + GLint stencilbits = 0; + + switch(mode) { + case stereoNone: + return true; + break; + case stereoAnaglyph: + return true; + break; + case stereoHorizontalInterlaced: + case stereoVerticalInterlaced: + glGetIntegerv(GL_STENCIL_BITS, &stencilbits); + if ( stencilbits < 1 ) { + fprintf(stderr, "Failed to get a stencil buffer, interlaced stereo not available.\n"); + return false; + } else { + fprintf(stderr, "Stencil buffer has %i bits, good.\n", stencilbits); + } + + default: + return false; + } + +} + +void InitStereo(StereoMode mode) { + switch(mode) { + case stereoNone: + return; + case stereoAnaglyph: + return; + case stereoHorizontalInterlaced: + case stereoVerticalInterlaced: + + fprintf(stderr, "Screen width is %i, height is %i\n", kContextWidth, kContextHeight); + + glEnable( GL_STENCIL_TEST); + glClearStencil(0); + glClear( GL_STENCIL_BUFFER_BIT ); + glStencilFunc(GL_ALWAYS, 0x1, 0x1); + glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); + + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glPixelStorei(GL_UNPACK_ROW_LENGTH, 3); + glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + glColorMask( 1.0, 1.0, 1.0, 1.0 ); + char stencil[] = {64,127,255}; + + glViewport(0,0, kContextWidth, kContextHeight); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho((GLdouble)0, (GLdouble)kContextWidth, (GLdouble)kContextHeight, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + for(int y=0;y