BGE Dome: Console arguments: angle, tilt, mode and warpdata (not working yet)
authorDalai Felinto <dfelinto@gmail.com>
Wed, 24 Feb 2010 23:01:49 +0000 (23:01 +0000)
committerDalai Felinto <dfelinto@gmail.com>
Wed, 24 Feb 2010 23:01:49 +0000 (23:01 +0000)
2Do:
(1) open external warpdata file
(2) documentation
(3) preserve scene settings (at least scene->gm.dome) even if you load a new file inside the game (e.g. Yo Frankie loading new levels)
otherwise it's a nightmare to update all your files every time you change your projection system. See note.
Maybe SYS_WriteCommandLineInt/Float/String can be used for that. Gotta investigate further.

* Note: an external warpdata file is a must ! Currently every time you need to calibrate your system you have to update the warp file in all your demo files. This is terrible. I'm glad I *now* have a dome near by to test it ;)
* FYI: A recent 'Yo Frankie in a dome' video if you want to see how it works: http://www.vimeo.com/9629626 I'm going to record a better one tomorrow.

source/gameengine/GamePlayer/ghost/GPG_ghost.cpp

index a1fa810e73a83f85cec61304fc27d3044028134d..ce80036de8f63c8db3f8269c33c2dc6d9a7da56f 100644 (file)
@@ -195,6 +195,17 @@ void usage(const char* program)
        printf("                   anaglyph         (Red-Blue glasses)\n");
        printf("                   vinterlace       (Vertical interlace for autostereo display)\n");
        printf("                             depending on the type of stereo you want\n\n");
+       printf("  -D: start player in dome mode\n");
+       printf("       --Optional parameters--\n");
+       printf("       angle = field of view in degrees\n");
+       printf("       tilt = tilt angle in degrees\n");
+       printf("       warpdata = a file to use for warping the image\n");      
+       printf("       mode: fisheye                (Fisheye)\n");
+       printf("             truncatedfront         (Front-Truncated)\n");
+       printf("             truncatedrear          (Rear-Truncated)\n");
+       printf("             cubemap                (Cube Map)\n");
+       printf("             sphericalpanoramic     (Spherical Panoramic)\n");
+       printf("                             depending on the type of dome you are using\n\n");
 #ifndef _WIN32
        printf("  -i: parent windows ID \n\n");
 #endif
@@ -310,6 +321,11 @@ int main(int argc, char** argv)
        RAS_IRasterizer::StereoMode stereomode = RAS_IRasterizer::RAS_STEREO_NOSTEREO;
        bool stereoWindow = false;
        bool stereoParFound = false;
+       int stereoFlag = STEREO_NOSTEREO;
+       int domeFov = -1;
+       int domeTilt = -200;
+       int domeMode = 0;
+       char* domeWarp = NULL;
        int windowLeft = 100;
        int windowTop = 100;
        int windowWidth = 640;
@@ -525,30 +541,31 @@ int main(int argc, char** argv)
                                                stereomode = RAS_IRasterizer::RAS_STEREO_NOSTEREO;
                                        
                                        // only the hardware pageflip method needs a stereo window
-                                       if(!strcmp(argv[i], "hwpageflip")) {
+                                       else if(!strcmp(argv[i], "hwpageflip")) {
                                                stereomode = RAS_IRasterizer::RAS_STEREO_QUADBUFFERED;
                                                stereoWindow = true;
                                        }
-                                       if(!strcmp(argv[i], "syncdoubling"))
+                                       else if(!strcmp(argv[i], "syncdoubling"))
                                                stereomode = RAS_IRasterizer::RAS_STEREO_ABOVEBELOW;
                                        
-                                       if(!strcmp(argv[i], "anaglyph"))
+                                       else if(!strcmp(argv[i], "anaglyph"))
                                                stereomode = RAS_IRasterizer::RAS_STEREO_ANAGLYPH;
                                        
-                                       if(!strcmp(argv[i], "sidebyside"))
+                                       else if(!strcmp(argv[i], "sidebyside"))
                                                stereomode = RAS_IRasterizer::RAS_STEREO_SIDEBYSIDE;
                                        
-                                       if(!strcmp(argv[i], "vinterlace"))
+                                       else if(!strcmp(argv[i], "vinterlace"))
                                                stereomode = RAS_IRasterizer::RAS_STEREO_VINTERLACE;
                                        
 #if 0
                                        // future stuff
-                                       if(strcmp(argv[i], "stencil")
+                                       else if(!strcmp(argv[i], "stencil")
                                                stereomode = RAS_STEREO_STENCIL;
 #endif
                                        
                                        i++;
                                        stereoParFound = true;
+                                       stereoFlag = STEREO_ENABLED;
                                }
                                else
                                {
@@ -556,6 +573,47 @@ int main(int argc, char** argv)
                                        printf("error: too few options for stereo argument.\n");
                                }
                                break;
+                       case 'D':
+                               stereoFlag = STEREO_DOME;
+                               stereomode = RAS_IRasterizer::RAS_STEREO_DOME;
+                               i++;
+                               if ((i + 1) < argc)
+                               {
+                                       if(!strcmp(argv[i], "angle")){
+                                               i++;
+                                               domeFov = atoi(argv[i++]);
+                                       }
+                                       if(!strcmp(argv[i], "tilt")){
+                                               i++;
+                                               domeTilt = atoi(argv[i++]);
+                                       }
+                                       if(!strcmp(argv[i], "warpdata")){
+                                               i++;
+                                               domeWarp = argv[i++];
+                                       }
+                                       if(!strcmp(argv[i], "mode")){
+                                               i++;
+                                               if(!strcmp(argv[i], "fisheye"))
+                                                       domeMode = DOME_FISHEYE;
+                                                       
+                                               else if(!strcmp(argv[i], "truncatedfront"))
+                                                       domeMode = DOME_TRUNCATED_FRONT;
+                                                       
+                                               else if(!strcmp(argv[i], "truncatedrear"))
+                                                       domeMode = DOME_TRUNCATED_REAR;
+                                                       
+                                               else if(!strcmp(argv[i], "cubemap"))
+                                                       domeMode = DOME_ENVMAP;
+                                                       
+                                               else if(!strcmp(argv[i], "sphericalpanoramic"))
+                                                       domeMode = DOME_PANORAM_SPH;
+
+                                               else
+                                                       printf("error: %s is not a valid dome mode.\n", argv[i]);
+                                       }
+                                       i++;
+                               }
+                               break;
                        default:
                                printf("Unkown argument: %s\n", argv[i++]);
                                break;
@@ -714,6 +772,24 @@ int main(int argc, char** argv)
                                                                        stereoWindow = true;
                                                        }
                                                }
+                                               else
+                                                       scene->gm.stereoflag = STEREO_ENABLED;
+
+                                               if (stereoFlag == STEREO_DOME){
+                                                       stereomode = RAS_IRasterizer::RAS_STEREO_DOME;
+                                                       scene->gm.stereoflag = STEREO_DOME;
+                                                       if (domeFov > 89)
+                                                               scene->gm.dome.angle = domeFov;
+                                                       if (domeTilt > -180)
+                                                               scene->gm.dome.tilt = domeTilt;
+                                                       if (domeMode > 0)
+                                                               scene->gm.dome.mode = domeMode;
+                                                       if (domeWarp)
+                                                       {
+                                                               printf("using external file as dome warping. Not implemented yet");
+                                                               //scene->gm.dome.warptext
+                                                       }
+                                               }
                                                
                                                //                                      GPG_Application app (system, maggie, startscenename);
                                                app.SetGameEngineData(maggie, scene, argc, argv); /* this argc cant be argc_py_clamped, since python uses it */