]> git.jsancho.org Git - lugaru.git/blobdiff - Source/OpenGL_Windows.cpp
Add default stereo settings to config file
[lugaru.git] / Source / OpenGL_Windows.cpp
index e112066ebb79df5d3c0946be2b206cc709278283..576df7ecafdd761ca1b138d6448a567f9491c6b4 100644 (file)
@@ -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);
@@ -110,16 +117,16 @@ extern float volume;
 #include "gamegl.h"
 #include "MacCompatibility.h"
 
+
 #ifdef WIN32
 #include <shellapi.h>
+#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 +137,7 @@ static SDL_Rect *hardcoded_resolutions[] = {
     &rect_640_480,
     NULL
 };
-#endif
+
 
 
 unsigned int resolutionDepths[8][2] = {0};
@@ -163,7 +170,7 @@ typedef struct tagPOINT {
 } POINT, *PPOINT; 
 #endif
 
-#if USE_SDL
+
 
 #ifdef _MSC_VER
 #pragma warning(push)
@@ -225,7 +232,7 @@ void sdlGetCursorPos(POINT *pt)
 #undef MessageBox
 #endif
 #define MessageBox(hwnd,text,title,flags) STUBBED("msgbox")
-#endif
+
 
 Point delta;
 
@@ -313,7 +320,12 @@ void ShutdownDSp ()
 
 void DrawGL (Game & game)
 {
-       game.DrawGLScene();
+       if ( stereomode == stereoNone ) {
+               game.DrawGLScene(stereoCenter);
+       } else {
+               game.DrawGLScene(stereoLeft);
+               game.DrawGLScene(stereoRight);
+       }
 }
 
 
@@ -339,9 +351,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 +565,7 @@ static void sdlEventProc(const SDL_Event &e, Game &game)
             return;
     }
 }
-#endif
+
 
 // --------------------------------------------------------------------------
 
@@ -693,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){
@@ -839,16 +855,25 @@ Boolean SetUp (Game & game)
                ipstream.ignore(256,'\n');
                ipstream >> string;
                game.chatkey=CharToKey(string);
+               ipstream.ignore(256,'\n');
+               ipstream.ignore(256,'\n');
+               if (!ipstream.eof()) {
+                       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;
                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;
@@ -859,7 +884,7 @@ Boolean SetUp (Game & game)
 
        SetupDSpFullScreen();
 
-#if USE_SDL
+
     if (!SDL_WasInit(SDL_INIT_VIDEO))
     {
         if (SDL_Init(SDL_INIT_VIDEO) == -1)
@@ -921,7 +946,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 +983,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 +996,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 +1037,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;
@@ -1020,7 +1097,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 +1113,7 @@ static void DoMouse(Game & game)
         else if (game.mousecoordv >= kContextHeight)
             game.mousecoordv = kContextHeight - 1;
        }
-#endif
+
 }
 
 
@@ -1174,7 +1251,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 +1259,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 +1429,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 +1450,7 @@ int main(int argc, char **argv)
                                                }
                                                sdlEventProc(e, game);
                                        }
-                                       #endif
+                               
 
                                        // game
                                        DoUpdate(game);
@@ -1439,41 +1512,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 +1520,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 +1581,7 @@ int main(int argc, char **argv)
                }
        }
 
+
        bool LoadImage(const char * fname, TGAImageRec & tex)
        {
                bool res = true;