Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/gameengine/GamePlayer/ghost/GPG_ghost.cpp')
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_ghost.cpp1227
1 files changed, 0 insertions, 1227 deletions
diff --git a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
deleted file mode 100644
index 42b603f8980..00000000000
--- a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
+++ /dev/null
@@ -1,1227 +0,0 @@
-/*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- * Start up of the Blender Player on GHOST.
- */
-
-/** \file gameengine/GamePlayer/ghost/GPG_ghost.cpp
- * \ingroup player
- */
-
-
-#include <iostream>
-#include <math.h>
-
-#ifdef __linux__
-#ifdef __alpha__
-#include <signal.h>
-#endif /* __alpha__ */
-#endif /* __linux__ */
-
-#include "KX_KetsjiEngine.h"
-#include "KX_PythonInit.h"
-#include "KX_PythonMain.h"
-#include "KX_PyConstraintBinding.h" // for PHY_SetActiveEnvironment
-
-/**********************************
- * Begin Blender include block
- **********************************/
-#ifdef __cplusplus
-extern "C"
-{
-#endif // __cplusplus
-#include "MEM_guardedalloc.h"
-#include "MEM_CacheLimiterC-Api.h"
-
-#include "BLI_threads.h"
-#include "BLI_mempool.h"
-#include "BLI_blenlib.h"
-
-#include "DNA_scene_types.h"
-#include "DNA_userdef_types.h"
-#include "DNA_genfile.h"
-
-#include "BLO_readfile.h"
-#include "BLO_runtime.h"
-
-#include "BKE_appdir.h"
-#include "BKE_blender.h"
-#include "BKE_depsgraph.h"
-#include "BKE_global.h"
-#include "BKE_icons.h"
-#include "BKE_image.h"
-#include "BKE_node.h"
-#include "BKE_report.h"
-#include "BKE_library.h"
-#include "BKE_library_remap.h"
-#include "BKE_modifier.h"
-#include "BKE_material.h"
-#include "BKE_text.h"
-#include "BKE_sound.h"
-
-#include "IMB_imbuf.h"
-#include "IMB_moviecache.h"
-
-#ifdef __APPLE__
- int GHOST_HACK_getFirstFile(char buf[]);
-#endif
-
-// For BLF
-#include "BLF_api.h"
-#include "BLT_translation.h"
-#include "BLT_lang.h"
-extern int datatoc_bfont_ttf_size;
-extern char datatoc_bfont_ttf[];
-extern int datatoc_bmonofont_ttf_size;
-extern char datatoc_bmonofont_ttf[];
-
-#ifdef __cplusplus
-}
-#endif // __cplusplus
-
-#include "GPU_draw.h"
-
-/**********************************
- * End Blender include block
- **********************************/
-
-#include "BL_System.h"
-#include "GPG_Application.h"
-
-#include "GHOST_ISystem.h"
-#include "RAS_IRasterizer.h"
-
-#include "BKE_main.h"
-
-#include "RNA_define.h"
-
-#ifdef WIN32
-# include <windows.h>
-# if !defined(DEBUG)
-# include <wincon.h>
-# endif // !defined(DEBUG)
-# if defined(_MSC_VER) && defined(_M_X64)
-# include <math.h> /* needed for _set_FMA3_enable */
-# endif
-# include "utfconv.h"
-#endif // WIN32
-
-#ifdef WITH_SDL_DYNLOAD
-# include "sdlew.h"
-#endif
-
-const int kMinWindowWidth = 100;
-const int kMinWindowHeight = 100;
-
-static void mem_error_cb(const char *errorStr)
-{
- fprintf(stderr, "%s", errorStr);
- fflush(stderr);
-}
-
-// library.c will only free window managers with a callback function.
-// We don't actually use a wmWindowManager, but loading a blendfile
-// loads wmWindows, so we need to free those.
-static void wm_free(bContext *C, wmWindowManager *wm)
-{
- BLI_freelistN(&wm->windows);
-}
-
-#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 */
-
-static void usage(const char* program, bool isBlenderPlayer)
-{
- const char * consoleoption;
- const char * example_filename = "";
- const char * example_pathname = "";
-
-#ifdef _WIN32
- consoleoption = "[-c] ";
-#else
- consoleoption = "";
-#endif
-
- if (isBlenderPlayer) {
- example_filename = "filename.blend";
-#ifdef _WIN32
- example_pathname = "c:\\";
-#else
- example_pathname = "/home/user/";
-#endif
- }
- printf("\n");
- printf("usage: %s [--options] %s\n\n", program, example_filename);
- printf("Available options are: [-w [w h l t]] [-f [fw fh fb ff]] %s[-g gamengineoptions] ", consoleoption);
- printf("[-s stereomode] [-m aasamples]\n");
- printf("Optional parameters must be passed in order.\n");
- printf("Default values are set in the blend file.\n\n");
- printf(" -h: Prints this command summary\n\n");
- printf(" -w: display in a window\n");
- printf(" --Optional parameters--\n");
- printf(" w = window width\n");
- printf(" h = window height\n");
- printf(" l = window left coordinate\n");
- printf(" t = window top coordinate\n");
- printf(" Note: To define 'w' or 'h', both must be used.");
- printf("Also, to define 'l' or 't', all four parameters must be used.\n");
- printf(" Example: -w or -w 500 300 or -w 500 300 0 0\n\n");
- printf(" -f: start game in fullscreen mode\n");
- printf(" --Optional parameters--\n");
- printf(" fw = fullscreen mode pixel width (use 0 to detect automatically)\n");
- printf(" fh = fullscreen mode pixel height (use 0 to detect automatically)\n");
- printf(" fb = fullscreen mode bits per pixel (default unless set in the blend file: 32)\n");
- printf(" ff = fullscreen mode frequency (default unless set in the blend file: 60)\n");
- printf(" Note: To define 'fw'' or 'fh'', both must be used.\n");
- printf(" Example: -f or -f 1024 768 or -f 0 0 16 or -f 1024 728 16 30\n\n");
- printf(" -s: start player in stereoscopy mode (requires 3D capable hardware)\n");
- printf(" stereomode: nostereo (default unless stereo is set in the blend file)\n");
- printf(" anaglyph (Red-Blue glasses)\n");
- printf(" sidebyside (Left Right)\n");
- printf(" syncdoubling (Above Below)\n");
- printf(" 3dtvtopbottom (Squashed Top-Bottom for passive glasses)\n");
- printf(" interlace (Interlace horizontally)\n");
- printf(" vinterlace (Vertical interlace for autostereo display)\n");
- printf(" hwpageflip (Quad buffered shutter glasses)\n");
- printf(" Example: -s sidebyside or -s vinterlace\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 (absolute path)\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(" Example: -D or -D mode cubemap\n\n");
- printf(" -m: maximum anti-aliasing (eg. 2,4,8,16)\n\n");
- printf(" -i: parent window's ID\n\n");
-#ifdef _WIN32
- printf(" -c: keep console window open\n\n");
-#endif
- printf(" -d: turn debugging on\n\n");
- printf(" -g: game engine options:\n\n");
- printf(" Name Default Description\n");
- printf(" ------------------------------------------------------------------------\n");
- printf(" fixedtime 0 \"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(" blender_material 0 Enable material settings\n");
- printf(" ignore_deprecation_warnings 1 Ignore deprecation warnings\n");
- printf("\n");
- printf(" - : all arguments after this are ignored, allowing python to access them from sys.argv\n");
- printf("\n");
- printf("example: %s -w 320 200 10 10 -g noaudio %s%s\n", program, example_pathname, example_filename);
- printf("example: %s -g show_framerate = 0 %s%s\n", program, example_pathname, example_filename);
- printf("example: %s -i 232421 -m 16 %s%s\n\n", program, example_pathname, example_filename);
-}
-
-static void get_filename(int argc, char **argv, char *filename)
-{
-#ifdef __APPLE__
- /* On Mac we park the game file (called game.blend) in the application bundle.
- * The executable is located in the bundle as well.
- * Therefore, we can locate the game relative to the executable.
- */
- int srclen = ::strlen(argv[0]);
- int len = 0;
- char *gamefile = NULL;
-
- filename[0] = '\0';
-
- if (argc > 1) {
- if (BLI_exists(argv[argc-1])) {
- BLI_strncpy(filename, argv[argc-1], FILE_MAX);
- }
- if (::strncmp(argv[argc-1], "-psn_", 5)==0) {
- static char firstfilebuf[512];
- if (GHOST_HACK_getFirstFile(firstfilebuf)) {
- BLI_strncpy(filename, firstfilebuf, FILE_MAX);
- }
- }
- }
-
- srclen -= ::strlen("MacOS/blenderplayer");
- if (srclen > 0) {
- len = srclen + ::strlen("Resources/game.blend");
- gamefile = new char [len + 1];
- ::strcpy(gamefile, argv[0]);
- ::strcpy(gamefile + srclen, "Resources/game.blend");
- //::printf("looking for file: %s\n", filename);
-
- if (BLI_exists(gamefile))
- BLI_strncpy(filename, gamefile, FILE_MAX);
-
- delete [] gamefile;
- }
-
-#else
- filename[0] = '\0';
-
- if (argc > 1)
- BLI_strncpy(filename, argv[argc-1], FILE_MAX);
-#endif // !_APPLE
-}
-
-static BlendFileData *load_game_data(const char *progname, char *filename = NULL, char *relativename = NULL)
-{
- ReportList reports;
- BlendFileData *bfd = NULL;
-
- BKE_reports_init(&reports, RPT_STORE);
-
- /* try to load ourself, will only work if we are a runtime */
- if (BLO_is_a_runtime(progname)) {
- bfd= BLO_read_runtime(progname, &reports);
- if (bfd) {
- bfd->type= BLENFILETYPE_RUNTIME;
- BLI_strncpy(bfd->main->name, progname, sizeof(bfd->main->name));
- }
- } else {
- bfd= BLO_read_from_file(progname, &reports, BLO_READ_SKIP_NONE);
- }
-
- if (!bfd && filename) {
- bfd = load_game_data(filename);
- if (!bfd) {
- printf("Loading %s failed: ", filename);
- BKE_reports_print(&reports, RPT_ERROR);
- }
- }
-
- BKE_reports_clear(&reports);
-
- return bfd;
-}
-
-static bool GPG_NextFrame(GHOST_ISystem* system, GPG_Application *app, int &exitcode, STR_String &exitstring, GlobalSettings *gs)
-{
- bool run = true;
- system->processEvents(false);
- system->dispatchEvents();
- app->EngineNextFrame();
- if ((exitcode = app->getExitRequested())) {
- run = false;
- exitstring = app->getExitString();
- *gs = *app->getGlobalSettings();
- }
- return run;
-}
-
-struct GPG_NextFrameState {
- GHOST_ISystem* system;
- GPG_Application *app;
- GlobalSettings *gs;
-} gpg_nextframestate;
-
-static int GPG_PyNextFrame(void *state0)
-{
- GPG_NextFrameState *state = (GPG_NextFrameState *) state0;
- int exitcode;
- STR_String exitstring;
- bool run = GPG_NextFrame(state->system, state->app, exitcode, exitstring, state->gs);
- if (run) return 0;
- else {
- if (exitcode)
- fprintf(stderr, "Exit code %d: %s\n", exitcode, exitstring.ReadPtr());
- return 1;
- }
-}
-
-int main(
- int argc,
-#ifdef WIN32
- char **UNUSED(argv_c)
-#else
- char **argv
-#endif
- )
-{
- int i;
- int argc_py_clamped= argc; /* use this so python args can be added after ' - ' */
- bool error = false;
- SYS_SystemHandle syshandle = SYS_GetSystem();
- bool fullScreen = false;
- bool fullScreenParFound = false;
- bool windowParFound = false;
-#ifdef WIN32
- bool closeConsole = true;
-#endif
- 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;
- Text *domeText = NULL;
- int windowLeft = 100;
- int windowTop = 100;
- int windowWidth = 640;
- int windowHeight = 480;
- GHOST_TUns32 fullScreenWidth = 0;
- GHOST_TUns32 fullScreenHeight= 0;
- int fullScreenBpp = 32;
- int fullScreenFrequency = 60;
- GHOST_TEmbedderWindowID parentWindow = 0;
- bool isBlenderPlayer = false; //true when lauching from blender or command line. false for bundled player
- int validArguments=0;
- bool samplesParFound = false;
- GHOST_TUns16 aasamples = 0;
- int alphaBackground = 0;
-
-#ifdef WIN32
- char **argv;
- int argv_num;
-
- /* We delay loading of openmp so we can set the policy here. */
-# if defined(_MSC_VER)
- _putenv_s("OMP_WAIT_POLICY", "PASSIVE");
-# endif
-
- /* FMA3 support in the 2013 CRT is broken on Vista and Windows 7 RTM (fixed in SP1). Just disable it. */
-# if defined(_MSC_VER) && defined(_M_X64)
- _set_FMA3_enable(0);
-# endif
-
- /* Win32 Unicode Args */
- /* NOTE: cannot use guardedalloc malloc here, as it's not yet initialized
- * (it depends on the args passed in, which is what we're getting here!)
- */
- {
- wchar_t **argv_16 = CommandLineToArgvW(GetCommandLineW(), &argc);
- argv = (char**)malloc(argc * sizeof(char *));
- for (argv_num = 0; argv_num < argc; argv_num++) {
- argv[argv_num] = alloc_utf_8_from_16(argv_16[argv_num], 0);
- }
- LocalFree(argv_16);
- }
-#endif /* WIN32 */
-
-#ifdef __linux__
-#ifdef __alpha__
- signal (SIGFPE, SIG_IGN);
-#endif /* __alpha__ */
-#endif /* __linux__ */
-
-#ifdef WITH_SDL_DYNLOAD
- sdlewInit();
-#endif
-
- BKE_appdir_program_path_init(argv[0]);
- BKE_tempdir_init(NULL);
-
- // We don't use threads directly in the BGE, but we need to call this so things like
- // freeing up GPU_Textures works correctly.
- BLI_threadapi_init();
-
- DNA_sdna_current_init();
-
- RNA_init();
-
- init_nodesystem();
-
- BKE_blender_globals_init();
-
- // We load our own G.main, so free the one that BKE_blender_globals_init() gives us
- BKE_main_free(G.main);
- G.main = NULL;
-
- MEM_CacheLimiter_set_disabled(true);
- IMB_init();
- BKE_images_init();
- BKE_modifier_init();
- DAG_init();
-
-#ifdef WITH_FFMPEG
- IMB_ffmpeg_init();
-#endif
-
- // Setup builtin font for BLF (mostly copied from creator.c, wm_init_exit.c and interface_style.c)
- BLF_init();
- BLT_lang_init();
- BLT_lang_set("");
-
- BLF_load_mem("default", (unsigned char*)datatoc_bfont_ttf, datatoc_bfont_ttf_size);
- if (blf_mono_font == -1)
- blf_mono_font = BLF_load_mem_unique("monospace", (unsigned char*)datatoc_bmonofont_ttf, datatoc_bmonofont_ttf_size);
-
- // Parse command line options
-#if defined(DEBUG)
- printf("argv[0] = '%s'\n", argv[0]);
-#endif
-
-#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 behavior 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
- // XXX add the ability to change this values to the command line parsing.
- U.mixbufsize = 2048;
- U.audiodevice = 2;
- U.audiorate = 44100;
- U.audioformat = 0x24;
- U.audiochannels = 2;
-
- // XXX this one too
- U.anisotropic_filter = 2;
- // enable fast mipmap generation
- U.use_gpu_mipmap = 1;
-
- BKE_sound_init_once();
-
- // Initialize a default material for meshes without materials.
- init_def_material();
-
- BKE_library_callback_free_window_manager_set(wm_free);
-
- /* if running blenderplayer the last argument can't be parsed since it has to be the filename. else it is bundled */
- isBlenderPlayer = !BLO_is_a_runtime(argv[0]);
- if (isBlenderPlayer)
- validArguments = argc - 1;
- else
- validArguments = argc;
-
-
- /* Parsing command line arguments (can be set from WM_OT_blenderplayer_start) */
-#if defined(DEBUG)
- printf("Parsing command line arguments...\n");
- printf("Num of arguments is: %i\n", validArguments-1); //-1 because i starts at 1
-#endif
-
- for (i = 1; (i < validArguments) && !error
-#ifdef WIN32
- && scr_saver_mode == SCREEN_SAVER_MODE_NONE
-#endif
- ;)
-
- {
-#if defined(DEBUG)
- printf("argv[%d] = '%s'\n", i, argv[i]);
-#endif
- if (argv[i][0] == '-')
- {
- /* ignore all args after " - ", allow python to have own args */
- if (argv[i][1]=='\0') {
- argc_py_clamped= i;
- break;
- }
-
- switch (argv[i][1])
- {
- case 'g': //game engine options (show_framerate, fixedtime, etc)
- {
- i++;
- if (i <= validArguments)
- {
- char* paramname = argv[i];
- // Check for single value versus assignment
- if (i+1 <= validArguments && (*(argv[i+1]) == '='))
- {
- i++;
- if (i + 1 <= validArguments)
- {
- i++;
- // Assignment
- SYS_WriteCommandLineInt(syshandle, paramname, atoi(argv[i]));
- SYS_WriteCommandLineFloat(syshandle, paramname, atof(argv[i]));
- SYS_WriteCommandLineString(syshandle, paramname, argv[i]);
-#if defined(DEBUG)
- printf("%s = '%s'\n", paramname, argv[i]);
-#endif
- i++;
- }
- else
- {
- error = true;
- printf("error: argument assignment %s without value.\n", paramname);
- }
- }
- else
- {
-// SYS_WriteCommandLineInt(syshandle, argv[i++], 1);
- }
- }
- break;
- }
- case 'd': //debug on
- {
- i++;
- G.debug |= G_DEBUG;
- MEM_set_memory_debug();
-#ifndef NDEBUG
- BLI_mempool_set_memory_debug();
-#endif
- break;
- }
- case 'f': //fullscreen mode
- {
- i++;
- fullScreen = true;
- fullScreenParFound = true;
- if ((i + 2) <= validArguments && argv[i][0] != '-' && argv[i+1][0] != '-')
- {
- fullScreenWidth = atoi(argv[i++]);
- fullScreenHeight = atoi(argv[i++]);
- if ((i + 1) <= validArguments && argv[i][0] != '-')
- {
- fullScreenBpp = atoi(argv[i++]);
- if ((i + 1) <= validArguments && argv[i][0] != '-')
- fullScreenFrequency = atoi(argv[i++]);
- }
- }
- else if ((i + 1) <= validArguments && argv[i][0] != '-' && argv[i+1][0] != '-')
- {
- error = true;
- printf("error: to define fullscreen width or height, both options must be used.\n");
- }
- break;
- }
- case 'w': //display in a window
- {
- i++;
- fullScreen = false;
- windowParFound = true;
-
- // Parse window position and size options
- if ((i + 2) <= validArguments && argv[i][0] != '-' && argv[i+1][0] != '-')
- {
- windowWidth = atoi(argv[i++]);
- windowHeight = atoi(argv[i++]);
-
- if ((i + 2) <= validArguments && argv[i][0] != '-' && argv[i+1][0] != '-')
- {
- windowLeft = atoi(argv[i++]);
- windowTop = atoi(argv[i++]);
- }
- else if ((i + 1) <= validArguments && argv[i][0] != '-' && argv[i+1][0] != '-')
- {
- error = true;
- printf("error: to define the window left or right coordinates, both options must be used.\n");
- }
- }
- else if ((i + 1) <= validArguments && argv[i][0] != '-' && argv[i+1][0] != '-')
- {
- error = true;
- printf("error: to define the window's width or height, both options must be used.\n");
- }
- break;
- }
- case 'h': //display help
- {
- usage(argv[0], isBlenderPlayer);
- return 0;
- break;
- }
- case 'i': //parent window ID
- {
- i++;
- if ( (i + 1) <= validArguments )
- parentWindow = (GHOST_TEmbedderWindowID)atoll(argv[i++]);
- else {
- error = true;
- printf("error: too few options for parent window argument.\n");
- }
-#if defined(DEBUG)
- printf("XWindows ID = %d\n", parentWindow);
-#endif // defined(DEBUG)
- break;
- }
- case 'm': //maximum anti-aliasing (eg. 2,4,8,16)
- {
- i++;
- samplesParFound = true;
- if ((i+1) <= validArguments )
- aasamples = atoi(argv[i++]);
- else
- {
- error = true;
- printf("error: No argument supplied for -m");
- }
- break;
- }
- case 'c': //keep console (windows only)
- {
- i++;
-#ifdef WIN32
- closeConsole = false;
-#endif
- break;
- }
- case 's': //stereo mode
- {
- i++;
- if ((i + 1) <= validArguments)
- {
- stereoParFound = true;
- stereoFlag = STEREO_ENABLED;
-
- if (!strcmp(argv[i], "nostereo")) // may not be redundant if the file has different setting
- {
- stereomode = RAS_IRasterizer::RAS_STEREO_NOSTEREO;
- stereoFlag = STEREO_NOSTEREO;
- }
-
- // only the hardware pageflip method needs a stereo window
- else if (!strcmp(argv[i], "hwpageflip")) {
- stereomode = RAS_IRasterizer::RAS_STEREO_QUADBUFFERED;
- stereoWindow = true;
- }
- else if (!strcmp(argv[i], "syncdoubling"))
- stereomode = RAS_IRasterizer::RAS_STEREO_ABOVEBELOW;
-
- else if (!strcmp(argv[i], "3dtvtopbottom"))
- stereomode = RAS_IRasterizer::RAS_STEREO_3DTVTOPBOTTOM;
-
- else if (!strcmp(argv[i], "anaglyph"))
- stereomode = RAS_IRasterizer::RAS_STEREO_ANAGLYPH;
-
- else if (!strcmp(argv[i], "sidebyside"))
- stereomode = RAS_IRasterizer::RAS_STEREO_SIDEBYSIDE;
-
- else if (!strcmp(argv[i], "interlace"))
- stereomode = RAS_IRasterizer::RAS_STEREO_INTERLACED;
-
- else if (!strcmp(argv[i], "vinterlace"))
- stereomode = RAS_IRasterizer::RAS_STEREO_VINTERLACE;
-
-#if 0
-// // future stuff
-// else if (!strcmp(argv[i], "stencil")
-// stereomode = RAS_STEREO_STENCIL;
-#endif
- else
- {
- error = true;
- printf("error: stereomode '%s' unrecognized.\n", argv[i]);
- }
-
- i++;
- }
- else
- {
- error = true;
- printf("error: too few options for stereo argument.\n");
- }
- break;
- }
- case 'D': //dome mode
- {
- stereoFlag = STEREO_DOME;
- stereomode = RAS_IRasterizer::RAS_STEREO_DOME;
- i++;
- if ((i + 1) <= validArguments)
- {
- 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;
- }
- case 'a': // allow window to blend with display background
- {
- i++;
- alphaBackground = 1;
- break;
- }
- default: //not recognized
- {
- printf("Unknown argument: %s\n", argv[i++]);
- break;
- }
- }
- }
- else
- {
- i++;
- }
- }
-
- if ((windowWidth < kMinWindowWidth) || (windowHeight < kMinWindowHeight))
- {
- error = true;
- printf("error: window size too small.\n");
- }
-
- if (error )
- {
- usage(argv[0], isBlenderPlayer);
- return 0;
- }
-
-#ifdef WIN32
- if (scr_saver_mode != SCREEN_SAVER_MODE_CONFIGURATION)
-#endif
- {
- // Create the system
- if (GHOST_ISystem::createSystem() == GHOST_kSuccess) {
- GHOST_ISystem* system = GHOST_ISystem::getSystem();
- assertd(system);
-
- 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
- // receive an event with the filename
-
- system->processEvents(0);
-
- // this bracket is needed for app (see below) to get out
- // of scope before GHOST_ISystem::disposeSystem() is called.
- {
- int exitcode = KX_EXIT_REQUEST_NO_REQUEST;
- STR_String exitstring = "";
- GPG_Application app(system);
- bool firstTimeRunning = true;
- char filename[FILE_MAX];
- char pathname[FILE_MAX];
- char *titlename;
-
- get_filename(argc_py_clamped, argv, filename);
- if (filename[0])
- BLI_path_cwd(filename, sizeof(filename));
-
-
- // fill the GlobalSettings with the first scene files
- // those may change during the game and persist after using Game Actuator
- GlobalSettings gs;
-
- do {
- // Read the Blender file
- BlendFileData *bfd;
-
- // if we got an exitcode 3 (KX_EXIT_REQUEST_START_OTHER_GAME) load a different file
- if (exitcode == KX_EXIT_REQUEST_START_OTHER_GAME)
- {
- char basedpath[FILE_MAX];
-
- // base the actuator filename relative to the last file
- BLI_strncpy(basedpath, exitstring.Ptr(), sizeof(basedpath));
- BLI_path_abs(basedpath, pathname);
-
- bfd = load_game_data(basedpath);
-
- if (!bfd) {
- // just add "//" in front of it
- char temppath[FILE_MAX] = "//";
- BLI_strncpy(temppath + 2, basedpath, FILE_MAX - 2);
-
- BLI_path_abs(temppath, pathname);
- bfd = load_game_data(temppath);
- }
- }
- else {
- bfd = load_game_data(BKE_appdir_program_path(), filename[0]? filename: NULL);
- }
-
-#if defined(DEBUG)
- printf("Game data loaded from %s\n", filename);
-#endif
-
- if (!bfd) {
- usage(argv[0], isBlenderPlayer);
- error = true;
- exitcode = KX_EXIT_REQUEST_QUIT_GAME;
- }
- else {
- /* Setting options according to the blend file if not overriden in the command line */
-#ifdef WIN32
-#if !defined(DEBUG)
- if (closeConsole) {
- system->toggleConsole(0); // Close a console window
- }
-#endif // !defined(DEBUG)
-#endif // WIN32
- Main *maggie = bfd->main;
- Scene *scene = bfd->curscene;
- G.main = maggie;
-
- if (firstTimeRunning) {
- G.fileflags = bfd->fileflags;
-
- gs.matmode= scene->gm.matmode;
- gs.glslflag= scene->gm.flag;
- }
-
- //Seg Fault; icon.c gIcons == 0
- BKE_icons_init(1);
-
- titlename = maggie->name;
-
- // Check whether the game should be displayed full-screen
- if ((!fullScreenParFound) && (!windowParFound)) {
- // Only use file settings when command line did not override
- if ((scene->gm.playerflag & GAME_PLAYER_FULLSCREEN)) {
- //printf("fullscreen option found in Blender file\n");
- fullScreen = true;
- fullScreenWidth= scene->gm.xplay;
- fullScreenHeight= scene->gm.yplay;
- fullScreenFrequency= scene->gm.freqplay;
- fullScreenBpp = scene->gm.depth;
- }
- else
- {
- fullScreen = false;
- windowWidth = scene->gm.xplay;
- windowHeight = scene->gm.yplay;
- }
- }
-
-
- // Check whether the game should be displayed in stereo (dome included)
- if (!stereoParFound) {
- // Only use file settings when command line did not override
- if (scene->gm.stereoflag == STEREO_ENABLED) {
- stereomode = (RAS_IRasterizer::StereoMode) scene->gm.stereomode;
- if (stereomode == RAS_IRasterizer::RAS_STEREO_QUADBUFFERED)
- stereoWindow = true;
- }
- }
- else {
- scene->gm.stereoflag = STEREO_ENABLED;
- }
-
- if (!samplesParFound)
- aasamples = scene->gm.aasamples;
-
- // Dome specific settings
- 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) {
- //XXX to do: convert relative to absolute path
- domeText= BKE_text_load(G.main, domeWarp, "");
- if (!domeText)
- printf("error: invalid warpdata text file - %s\n", domeWarp);
- else
- scene->gm.dome.warptext = domeText;
- }
- }
-
- // GPG_Application app (system, maggie, startscenename);
- app.SetGameEngineData(maggie, scene, &gs, argc, argv); /* this argc cant be argc_py_clamped, since python uses it */
- BLI_strncpy(pathname, maggie->name, sizeof(pathname));
- if (G.main != maggie) {
- BLI_strncpy(G.main->name, maggie->name, sizeof(G.main->name));
- }
-#ifdef WITH_PYTHON
- setGamePythonPath(G.main->name);
-#endif
- if (firstTimeRunning) {
- firstTimeRunning = false;
-
- if (fullScreen) {
-#ifdef WIN32
- if (scr_saver_mode == SCREEN_SAVER_MODE_SAVER)
- {
- app.startScreenSaverFullScreen(fullScreenWidth, fullScreenHeight, fullScreenBpp, fullScreenFrequency,
- stereoWindow, stereomode, aasamples);
- }
- else
-#endif
- {
- app.startFullScreen(fullScreenWidth, fullScreenHeight, fullScreenBpp, fullScreenFrequency,
- stereoWindow, stereomode, alphaBackground, aasamples, (scene->gm.playerflag & GAME_PLAYER_DESKTOP_RESOLUTION));
- }
- }
- else
- {
-#ifdef __APPLE__
- // on Mac's we'll show the executable name instead of the 'game.blend' name
- char tempname[1024], *appstring;
- ::strcpy(tempname, titlename);
-
- appstring = strstr(tempname, ".app/");
- if (appstring) {
- appstring[2] = 0;
- titlename = &tempname[0];
- }
-#endif
- // Strip the path so that we have the name of the game file
- STR_String path = titlename;
-#ifndef WIN32
- vector<STR_String> parts = path.Explode('/');
-#else // WIN32
- vector<STR_String> parts = path.Explode('\\');
-#endif // WIN32
- STR_String title;
- if (parts.size()) {
- title = parts[parts.size()-1];
- parts = title.Explode('.');
- if (parts.size() > 1)
- {
- title = parts[0];
- }
- }
- else {
- title = "blenderplayer";
- }
-#ifdef WIN32
- if (scr_saver_mode == SCREEN_SAVER_MODE_PREVIEW)
- {
- app.startScreenSaverPreview(scr_saver_hwnd, stereoWindow, stereomode, aasamples);
- }
- else
-#endif
- {
- if (parentWindow != 0)
- app.startEmbeddedWindow(title, parentWindow, stereoWindow, stereomode, aasamples);
- else
- app.startWindow(title, windowLeft, windowTop, windowWidth, windowHeight,
- stereoWindow, stereomode, alphaBackground, aasamples);
-
- if (SYS_GetCommandLineInt(syshandle, "nomipmap", 0)) {
- GPU_set_mipmap(G_MAIN, 0);
- }
-
- GPU_set_anisotropic(G_MAIN, U.anisotropic_filter);
- GPU_set_gpu_mipmapping(G_MAIN, U.use_gpu_mipmap);
- }
- }
- }
- else {
- app.StartGameEngine(stereomode);
- exitcode = KX_EXIT_REQUEST_NO_REQUEST;
- }
-
- // Add the application as event consumer
- system->addEventConsumer(&app);
-
- // Enter main loop
- bool run = true;
- char *python_main = NULL;
- pynextframestate.state = NULL;
- pynextframestate.func = NULL;
-#ifdef WITH_PYTHON
- python_main = KX_GetPythonMain(scene);
-#endif // WITH_PYTHON
- if (python_main) {
- char *python_code = KX_GetPythonCode(maggie, python_main);
- if (python_code) {
-#ifdef WITH_PYTHON
- // Set python environement variable.
- KX_Scene *startscene = app.GetStartScene();
- KX_SetActiveScene(startscene);
- PHY_SetActiveEnvironment(startscene->GetPhysicsEnvironment());
-
- gpg_nextframestate.system = system;
- gpg_nextframestate.app = &app;
- gpg_nextframestate.gs = &gs;
- pynextframestate.state = &gpg_nextframestate;
- pynextframestate.func = &GPG_PyNextFrame;
-
- printf("Yielding control to Python script '%s'...\n", python_main);
- PyRun_SimpleString(python_code);
- printf("Exit Python script '%s'\n", python_main);
-#endif // WITH_PYTHON
- MEM_freeN(python_code);
- }
- else {
- fprintf(stderr, "ERROR: cannot yield control to Python: no Python text data-block named '%s'\n", python_main);
- }
- }
- else {
- while (run) {
- run = GPG_NextFrame(system, &app, exitcode, exitstring, &gs);
- }
- }
- app.StopGameEngine();
-
- /* 'app' is freed automatic when out of scope.
- * removal is needed else the system will free an already freed value */
- system->removeEventConsumer(&app);
-
- BLO_blendfiledata_free(bfd);
- /* G.main == bfd->main, it gets referenced in free_nodesystem so we can't have a dangling pointer */
- G.main = NULL;
- if (python_main) MEM_freeN(python_main);
- }
- } while (exitcode == KX_EXIT_REQUEST_RESTART_GAME || exitcode == KX_EXIT_REQUEST_START_OTHER_GAME);
- }
-
- // Seg Fault; icon.c gIcons == 0
- BKE_icons_free();
-
- // Dispose the system
- GHOST_ISystem::disposeSystem();
- }
- else {
- error = true;
- printf("error: couldn't create a system.\n");
- }
- }
-
- /* refer to WM_exit_ext() and BKE_blender_free(),
- * these are not called in the player but we need to match some of there behavior here,
- * if the order of function calls or blenders state isn't matching that of blender proper,
- * we may get troubles later on */
-
- free_nodesystem();
-
- // Cleanup
- RNA_exit();
- BLF_exit();
-
-#ifdef WITH_INTERNATIONAL
- BLF_free_unifont();
- BLF_free_unifont_mono();
- BLT_lang_free();
-#endif
-
- IMB_exit();
- BKE_images_exit();
- DAG_exit();
- IMB_moviecache_destruct();
-
- SYS_DeleteSystem(syshandle);
-
- int totblock= MEM_get_memory_blocks_in_use();
- if (totblock!=0) {
- printf("Error Totblock: %d\n",totblock);
- MEM_set_error_callback(mem_error_cb);
- MEM_printmemlist();
- }
-
- BKE_tempdir_session_purge();
-
-#ifdef WIN32
- while (argv_num) {
- free(argv[--argv_num]);
- }
- free(argv);
- argv = NULL;
-#endif
-
- return error ? -1 : 0;
-}