.scr patch (from Raymond Penners)
[blender.git] / source / gameengine / GamePlayer / ghost / GPG_ghost.cpp
index c55e572ccbd270532ec39325dca5c9a6932c78e7..d7a9ad2b41dcb6754988ddebb20d0c417a660d0a 100644 (file)
@@ -85,8 +85,8 @@ extern "C"
 #include "BKE_utildefines.h"
 
 #ifdef WIN32
-#ifdef NDEBUG
 #include <windows.h>
+#ifdef NDEBUG
 #include <wincon.h>
 #endif // NDEBUG
 #endif // WIN32
@@ -96,6 +96,62 @@ const int kMinWindowHeight = 100;
 
 char bprogname[FILE_MAXDIR+FILE_MAXFILE];
 
+#ifdef WIN32
+typedef enum 
+{
+  SCREEN_SAVER_MODE_NONE = 0,
+  SCREEN_SAVER_MODE_PREVIEW,
+  SCREEN_SAVER_MODE_SAVER,
+  SCREEN_SAVER_MODE_CONFIGURATION,
+  SCREEN_SAVER_MODE_PASSWORD,
+} ScreenSaverMode;
+
+static ScreenSaverMode scr_saver_mode = SCREEN_SAVER_MODE_NONE;
+static HWND scr_saver_hwnd = NULL;
+
+static BOOL scr_saver_init(int argc, char **argv) 
+{
+       scr_saver_mode = SCREEN_SAVER_MODE_NONE;
+       scr_saver_hwnd = NULL;
+       BOOL ret = FALSE;
+
+       int len = ::strlen(argv[0]);
+       if (len > 4 && !::stricmp(".scr", argv[0] + len - 4))
+       {
+               scr_saver_mode = SCREEN_SAVER_MODE_CONFIGURATION;
+               ret = TRUE;
+               if (argc >= 2)
+               {
+                       if (argc >= 3)
+                       {
+                               scr_saver_hwnd = (HWND) ::atoi(argv[2]);
+                       }
+                       if (!::stricmp("/c", argv[1]))
+                       {
+                               scr_saver_mode = SCREEN_SAVER_MODE_CONFIGURATION;
+                               if (scr_saver_hwnd == NULL)
+                                       scr_saver_hwnd = ::GetForegroundWindow();
+                       }
+                       else if (!::stricmp("/s", argv[1]))
+                       {
+                               scr_saver_mode = SCREEN_SAVER_MODE_SAVER;
+                       }
+                       else if (!::stricmp("/a", argv[1]))
+                       {
+                               scr_saver_mode = SCREEN_SAVER_MODE_PASSWORD;
+                       }
+                       else if (!::stricmp("/p", argv[1])
+                                || !::stricmp("/l", argv[1]))
+                       {
+                               scr_saver_mode = SCREEN_SAVER_MODE_PREVIEW;
+                       }
+               }
+       }
+       return ret;
+}
+
+#endif /* WIN32 */
+
 void usage(char* program)
 {
        char * consoleoption;
@@ -107,24 +163,40 @@ void usage(char* program)
        
        printf("usage:   %s [-w [-p l t w h]] %s[-g gamengineoptions] "
                "[-s stereomode] filename.blend\n", program, consoleoption);
+       printf("  -h: Prints this command summary\n");
        printf("  -w: display in a window\n");
        printf("  -p: specify window position\n");
        printf("       l = window left coordinate\n");
        printf("       t = window top coordinate\n");
        printf("       w = window width\n");
        printf("       h = window height\n");
-/*     printf("  -f: start game in full screen mode\n");
+       printf("  -f: start game in full screen mode\n");
        printf("       fw = full screen mode pixel width\n");
        printf("       fh = full screen mode pixel height\n");
        printf("       fb = full screen mode bits per pixel\n");
-       printf("       ff = full screen mode frequency\n"); */
+       printf("       ff = full screen mode frequency\n");
        printf("  -s: start player in stereo\n");
-       printf("       stereomode = hwpageflip or syncdoubling depending on the type of stereo you want\n");
+       printf("       stereomode: hwpageflip       (Quad buffered shutter glasses)\n");
+       printf("                   syncdoubling     (Above Below)\n");
+       printf("                   sidebyside       (Left Right)\n");
+       printf("                   anaglyph         (Red-Blue glasses)\n");
+       printf("                   vinterlace       (Vertical interlace for autostereo display)\n");
+       printf("                             depending on the type of stereo you want\n");
 #ifdef _WIN32
        printf("  -c: keep console window open\n");
 #endif
+       printf("  -g: game engine options:\n");
+       printf("       Name            Default      Description\n");
+       printf("       ----------------------------------------\n");
+       printf("       fixedtime          0         Do the same timestep each frame \"Enable all frames\"\n");
+       printf("       nomipmap           0         Disable mipmaps\n");
+       printf("       show_framerate     0         Show the frame rate\n");
+       printf("       show_properties    0         Show debug properties\n");
+       printf("       show_profile       0         Show profiling information\n");
+       printf("       vertexarrays       1         Enable vertex arrays\n");
        printf("\n");
        printf("example: %s -p 10 10 320 200 -g noaudio c:\\loadtest.blend\n", program);
+       printf("example: %s -g vertexarrays = 0 c:\\loadtest.blend\n", program);
 }
 
 char *get_filename(int argc, char **argv) {
@@ -212,11 +284,11 @@ int main(int argc, char** argv)
        int i;
        bool error = false;
        SYS_SystemHandle syshandle = SYS_GetSystem();
-       bool fullScreen = true;
-       bool fullScreenParFound = true;
+       bool fullScreen = false;
+       bool fullScreenParFound = false;
        bool windowParFound = false;
        bool closeConsole = true;
-       int stereomode = RAS_IRasterizer::RAS_STEREO_NOSTEREO;
+       RAS_IRasterizer::StereoMode stereomode = RAS_IRasterizer::RAS_STEREO_NOSTEREO;
        bool stereoWindow = false;
        bool stereoParFound = false;
        int windowLeft = 100;
@@ -225,7 +297,7 @@ int main(int argc, char** argv)
        int windowHeight = 480;
        GHOST_TUns32 fullScreenWidth = 0;
        GHOST_TUns32 fullScreenHeight= 0;
-       int fullScreenBpp = 16;
+       int fullScreenBpp = 32;
        int fullScreenFrequency = 60;
        
 #ifdef __linux__
@@ -258,17 +330,45 @@ int main(int argc, char** argv)
 #endif // __APPLE__
        
        GEN_init_messaging_system();
-       
        // Parse command line options
 #ifndef NDEBUG
        printf("argv[0] = '%s'\n", argv[0]);
 #endif
-       for (i = 1; (i < argc) && !error; i++)
+
+
+#ifdef WIN32
+       if (scr_saver_init(argc, argv))
+       {
+               switch (scr_saver_mode)
+               {
+               case SCREEN_SAVER_MODE_CONFIGURATION:
+                       MessageBox(scr_saver_hwnd, "This screen saver has no options that you can set", "Screen Saver", MB_OK);
+                       break;
+               case SCREEN_SAVER_MODE_PASSWORD:
+                       /* This is W95 only, which we currently do not support.
+                          Fall-back to normal screen saver behaviour in that case... */
+               case SCREEN_SAVER_MODE_SAVER:
+                       fullScreen = true;
+                       fullScreenParFound = true;
+                       break;
+
+               case SCREEN_SAVER_MODE_PREVIEW:
+                       /* This will actually be handled somewhere below... */
+                       break;
+               }
+       }
+#endif
+       for (i = 1; (i < argc) && !error 
+#ifdef WIN32
+               && scr_saver_mode == SCREEN_SAVER_MODE_NONE
+#endif
+               ;)
+
        {
 #ifndef NDEBUG
-               printf("argv[%d] = '%s'\n", i, argv[i]);
+               printf("argv[%d] = '%s'   , %i\n", i, argv[i],argc);
 #endif
-               
                if (argv[i][0] == '-')
                {
                        switch (argv[i][1])
@@ -288,7 +388,13 @@ int main(int argc, char** argv)
                                                        {
                                                                i++;
                                                                // Assignment
+                                                               SYS_WriteCommandLineInt(syshandle, paramname, atoi(argv[i]));
+                                                               SYS_WriteCommandLineFloat(syshandle, paramname, atof(argv[i]));
                                                                SYS_WriteCommandLineString(syshandle, paramname, argv[i]);
+#ifndef NDEBUG
+                                                               printf("%s = '%s'\n", paramname, argv[i]);
+#endif
+                                                               i++;
                                                        }
                                                        else
                                                        {
@@ -298,7 +404,7 @@ int main(int argc, char** argv)
                                                }
                                                else
                                                {
-                                                       SYS_WriteCommandLineInt(syshandle, argv[i], 1);
+                                                       SYS_WriteCommandLineInt(syshandle, argv[i++], 1);
                                                }
                                        }
                                }
@@ -313,7 +419,7 @@ int main(int argc, char** argv)
                                                windowLeft = atoi(argv[i++]);
                                                windowTop = atoi(argv[i++]);
                                                windowWidth = atoi(argv[i++]);
-                                               windowHeight = atoi(argv[i]);
+                                               windowHeight = atoi(argv[i++]);
                                                windowParFound = true;
                                        }
                                        else
@@ -321,17 +427,40 @@ int main(int argc, char** argv)
                                                error = true;
                                                printf("error: too few options for window argument.\n");
                                        }
+                               } else { /* mac specific */
+                               
+                    if (strncmp(argv[i], "-psn_", 5)==0) 
+                        i++; /* skip process serial number */
+                               }
+                               break;
+                       case 'f':
+                               i++;
+                               fullScreen = true;
+                               fullScreenParFound = true;
+                               if ((i + 2) < argc && argv[i][0] != '-' && argv[i+1][0] != '-')
+                               {
+                                       fullScreenWidth = atoi(argv[i++]);
+                                       fullScreenHeight = atoi(argv[i++]);
+                                       if ((i + 1) < argc && argv[i][0] != '-')
+                                       {
+                                               fullScreenBpp = atoi(argv[i++]);
+                                               if ((i + 1) < argc && argv[i][0] != '-')
+                                                       fullScreenFrequency = atoi(argv[i++]);
+                                       }
                                }
                                break;
-                               
                        case 'w':
                                // Parse window position and size options
                                {
                                        fullScreen = false;
-                                               fullScreenParFound = true;
+                                       fullScreenParFound = true;
                                        i++;
                                }
                                break;
+                       case 'h':
+                               usage(argv[0]);
+                               return 0;
+                               break;
                        case 'c':
                                i++;
                                closeConsole = false;
@@ -340,6 +469,10 @@ int main(int argc, char** argv)
                                i++;
                                if ((i + 1) < argc)
                                {
+                                       stereomode = (RAS_IRasterizer::StereoMode) atoi(argv[i]);
+                                       if (stereomode < RAS_IRasterizer::RAS_STEREO_NOSTEREO || stereomode >= RAS_IRasterizer::RAS_STEREO_MAXSTEREO)
+                                               stereomode = RAS_IRasterizer::RAS_STEREO_NOSTEREO;
+                                       
                                        if(!strcmp(argv[i], "nostereo"))  // ok, redundant but clear
                                                stereomode = RAS_IRasterizer::RAS_STEREO_NOSTEREO;
                                        
@@ -350,6 +483,16 @@ int main(int argc, char** argv)
                                        }
                                        if(!strcmp(argv[i], "syncdoubling"))
                                                stereomode = RAS_IRasterizer::RAS_STEREO_ABOVEBELOW;
+                                       
+                                       if(!strcmp(argv[i], "anaglyph"))
+                                               stereomode = RAS_IRasterizer::RAS_STEREO_ANAGLYPH;
+                                       
+                                       if(!strcmp(argv[i], "sidebyside"))
+                                               stereomode = RAS_IRasterizer::RAS_STEREO_SIDEBYSIDE;
+                                       
+                                       if(!strcmp(argv[i], "vinterlace"))
+                                               stereomode = RAS_IRasterizer::RAS_STEREO_VINTERLACE;
+                                       
 #if 0
                                        // future stuff
                                        if(strcmp(argv[i], "stencil")
@@ -365,10 +508,14 @@ int main(int argc, char** argv)
                                        printf("error: too few options for stereo argument.\n");
                                }
                                break;
+                       default:
+                               printf("Unkown argument: %s\n", argv[i++]);
+                               break;
                        }
                }
                else
                {
+                       i++;
                }
        }
        
@@ -383,6 +530,9 @@ int main(int argc, char** argv)
                usage(argv[0]);
        }
        else
+#ifdef WIN32
+               if (scr_saver_mode != SCREEN_SAVER_MODE_CONFIGURATION)
+#endif
        {
 #ifdef __APPLE__
                //SYS_WriteCommandLineInt(syshandle, "show_framerate", 1);
@@ -400,7 +550,8 @@ int main(int argc, char** argv)
                        GHOST_ISystem* system = GHOST_ISystem::getSystem();
                        assertd(system);
                        
-                       system->getMainDisplayDimensions(fullScreenWidth, fullScreenHeight);
+                       if (!fullScreenWidth || !fullScreenHeight)
+                               system->getMainDisplayDimensions(fullScreenWidth, fullScreenHeight);
                        // process first batch of events. If the user
                        // drops a file on top off the blenderplayer icon, we 
                        // recieve an event with the filename
@@ -488,21 +639,9 @@ int main(int argc, char** argv)
                                                // Check whether the game should be displayed in stereo
                                                if (!stereoParFound)
                                                {
-                                                       if(scene->r.stereomode == RAS_IRasterizer::RAS_STEREO_NOSTEREO)  // ok, redundant but clear
-                                                               stereomode = RAS_IRasterizer::RAS_STEREO_NOSTEREO;
-                                                       
-                                                       // only the hardware pageflip method needs a stereo window
-                                                       if(scene->r.stereomode == RAS_IRasterizer::RAS_STEREO_QUADBUFFERED) {
-                                                               stereomode = RAS_IRasterizer::RAS_STEREO_QUADBUFFERED;
+                                                       stereomode = (RAS_IRasterizer::StereoMode) scene->r.stereomode;
+                                                       if (stereomode == RAS_IRasterizer::RAS_STEREO_QUADBUFFERED)
                                                                stereoWindow = true;
-                                                       }
-                                                       if(scene->r.stereomode == RAS_IRasterizer::RAS_STEREO_ABOVEBELOW)
-                                                               stereomode = RAS_IRasterizer::RAS_STEREO_ABOVEBELOW;
-#if 0
-                                                       // future stuff
-                                                       if(scene->r.stereomode == RAS_IRasterizer::RAS_STEREO_STENCIL)
-                                                               stereomode = RAS_STEREO_STENCIL;
-#endif
                                                }
                                                
                                                //                                      GPG_Application app (system, maggie, startscenename);
@@ -514,8 +653,18 @@ int main(int argc, char** argv)
                                                        
                                                        if (fullScreen)
                                                        {
-                                                               app.startFullScreen(fullScreenWidth, fullScreenHeight, fullScreenBpp, fullScreenFrequency,
-                                                                       stereoWindow, stereomode);
+#ifdef WIN32
+                                                               if (scr_saver_mode == SCREEN_SAVER_MODE_SAVER)
+                                                               {
+                                                                       app.startScreenSaverFullScreen(fullScreenWidth, fullScreenHeight, fullScreenBpp, fullScreenFrequency,
+                                                                               stereoWindow, stereomode);
+                                                               }
+                                                               else
+#endif
+                                                               {
+                                                                       app.startFullScreen(fullScreenWidth, fullScreenHeight, fullScreenBpp, fullScreenFrequency,
+                                                                               stereoWindow, stereomode);
+                                                               }
                                                        }
                                                        else
                                                        {
@@ -551,8 +700,17 @@ int main(int argc, char** argv)
                                                                {
                                                                        title = "blenderplayer";
                                                                }
-                                                               app.startWindow(title, windowLeft, windowTop, windowWidth, windowHeight,
-                                                                       stereoWindow, stereomode);
+#ifdef WIN32
+                                                               if (scr_saver_mode == SCREEN_SAVER_MODE_PREVIEW)
+                                                               {
+                                                                       app.startScreenSaverPreview(scr_saver_hwnd, stereoWindow, stereomode);
+                                                               }
+                                                               else
+#endif
+                                                               {
+                                                                       app.startWindow(title, windowLeft, windowTop, windowWidth, windowHeight,
+                                                                               stereoWindow, stereomode);
+                                                               }
                                                        }
                                                }
                                                else