]> git.jsancho.org Git - lugaru.git/blobdiff - Source/OpenGL_Windows.cpp
merge
[lugaru.git] / Source / OpenGL_Windows.cpp
index 37520284c8900ef45464d0fa6b24e74924c9e98f..a2a58c21f3bb0d24be4299f47e73fbee388b81fc 100644 (file)
@@ -320,7 +320,12 @@ void ShutdownDSp ()
 
 void DrawGL (Game & game)
 {
-       game.DrawGLScene();
+       if ( stereomode == stereoNone ) {
+               game.DrawGLScene(stereoCenter);
+       } else {
+               game.DrawGLScene(stereoLeft);
+               game.DrawGLScene(stereoRight);
+       }
 }
 
 
@@ -698,6 +703,12 @@ Boolean SetUp (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();
        }
        if(ipstream){
@@ -844,6 +855,17 @@ Boolean SetUp (Game & game)
                ipstream.ignore(256,'\n');
                ipstream >> string;
                game.chatkey=CharToKey(string);
+               ipstream.ignore(256,'\n');
+               ipstream.ignore(256,'\n');
+               ipstream >> i;
+               stereomode = (StereoMode)i;
+               ipstream.ignore(256,'\n');
+               ipstream.ignore(256,'\n');
+               ipstream >> stereoseparation;
+               ipstream.ignore(256,'\n');
+               ipstream.ignore(256,'\n');
+               ipstream >> stereoreverse;
+
                ipstream.close();
 
                if(detail>2)detail=2;
@@ -923,7 +945,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 +995,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);
@@ -1014,6 +1036,58 @@ Boolean SetUp (Game & game)
        game.newscreenwidth=screenwidth;
        game.newscreenheight=screenheight;
 
+       GLint stencilbits = 0;
+       glGetIntegerv(GL_STENCIL_BITS, &stencilbits);
+       if ( stencilbits < 1 ) {
+               fprintf(stderr, "Failed to get a stencil buffer!\n");
+               SDL_Quit();
+               return false; 
+       }
+       
+       if ( stereomode == stereoHorizontalInterlaced || stereomode == stereoVerticalInterlaced ) {
+               fprintf(stderr, "Stencil buffer has %i bits, good.\n", stencilbits);
+               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<kContextHeight;y+=2) {
+                       
+                       for(int x=0;x<kContextWidth;x++) {
+                               glRasterPos2i(x, y);
+                               glDrawPixels(1, 1, GL_RGB, GL_UNSIGNED_BYTE, &stencil);
+                       }
+               }
+               
+               glStencilFunc(GL_NOTEQUAL, 0x01, 0x01);
+               glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+
+               // Something gets screwed up due to the changes above
+               // revert to default.
+               glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+               glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+               glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
+               glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
+       }
+
        game.InitGame();
 
        return true;