]> 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 9374b1f8f41d4acbdd1594b4248cd2deecd4e1a7..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
@@ -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"
 
@@ -123,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 };
@@ -143,7 +137,7 @@ static SDL_Rect *hardcoded_resolutions[] = {
     &rect_640_480,
     NULL
 };
-#endif
+
 
 
 unsigned int resolutionDepths[8][2] = {0};
@@ -176,7 +170,7 @@ typedef struct tagPOINT {
 } POINT, *PPOINT; 
 #endif
 
-#if USE_SDL
+
 
 #ifdef _MSC_VER
 #pragma warning(push)
@@ -238,7 +232,7 @@ void sdlGetCursorPos(POINT *pt)
 #undef MessageBox
 #endif
 #define MessageBox(hwnd,text,title,flags) STUBBED("msgbox")
-#endif
+
 
 Point delta;
 
@@ -326,7 +320,12 @@ void ShutdownDSp ()
 
 void DrawGL (Game & game)
 {
-       game.DrawGLScene();
+       if ( stereomode == stereoNone ) {
+               game.DrawGLScene(stereoCenter);
+       } else {
+               game.DrawGLScene(stereoLeft);
+               game.DrawGLScene(stereoRight);
+       }
 }
 
 
@@ -352,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];
 
@@ -568,7 +565,7 @@ static void sdlEventProc(const SDL_Event &e, Game &game)
             return;
     }
 }
-#endif
+
 
 // --------------------------------------------------------------------------
 
@@ -706,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){
@@ -852,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;
@@ -872,7 +884,7 @@ Boolean SetUp (Game & game)
 
        SetupDSpFullScreen();
 
-#if USE_SDL
+
     if (!SDL_WasInit(SDL_INIT_VIDEO))
     {
         if (SDL_Init(SDL_INIT_VIDEO) == -1)
@@ -934,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());
@@ -970,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();
@@ -983,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);
@@ -1014,25 +1026,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;
@@ -1044,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;
@@ -1052,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;
@@ -1068,7 +1113,7 @@ static void DoMouse(Game & game)
         else if (game.mousecoordv >= kContextHeight)
             game.mousecoordv = kContextHeight - 1;
        }
-#endif
+
 }
 
 
@@ -1204,11 +1249,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"
@@ -1216,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);
 }
 
 
@@ -1314,12 +1353,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);
     }
 
@@ -1390,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;
@@ -1411,7 +1450,7 @@ int main(int argc, char **argv)
                                                }
                                                sdlEventProc(e, game);
                                        }
-                                       #endif
+                               
 
                                        // game
                                        DoUpdate(game);
@@ -1473,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)
        {
@@ -1515,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;
        }
@@ -1644,6 +1581,7 @@ int main(int argc, char **argv)
                }
        }
 
+
        bool LoadImage(const char * fname, TGAImageRec & tex)
        {
                bool res = true;
@@ -1653,100 +1591,25 @@ int main(int argc, char **argv)
                        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;
        }
 
        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)
@@ -1910,7 +1773,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)
@@ -1991,5 +1854,5 @@ save_png_done:
     return retval;
 }
 
-#endif
+