2002-10-12 11:37:38 +00:00
|
|
|
/**
|
|
|
|
* $Id$
|
|
|
|
*
|
2008-04-16 22:40:48 +00:00
|
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
2002-10-12 11:37:38 +00:00
|
|
|
*
|
|
|
|
* 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
|
2008-04-16 22:40:48 +00:00
|
|
|
* of the License, or (at your option) any later version.
|
2002-10-12 11:37:38 +00:00
|
|
|
*
|
|
|
|
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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.
|
|
|
|
*
|
2008-04-16 22:40:48 +00:00
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
2002-10-12 11:37:38 +00:00
|
|
|
* Start up of the Blender Player on GHOST.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <iostream>
|
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
#ifdef __linux__
|
|
|
|
#ifdef __alpha__
|
|
|
|
#include <signal.h>
|
|
|
|
#endif /* __alpha__ */
|
|
|
|
#endif /* __linux__ */
|
|
|
|
|
|
|
|
#ifdef __APPLE__
|
|
|
|
// Can't use Carbon right now because of double defined type ID (In Carbon.h and DNA_ID.h, sigh)
|
|
|
|
//#include <Carbon/Carbon.h>
|
|
|
|
//#include <CFBundle.h>
|
|
|
|
#endif // __APPLE__
|
|
|
|
#include "GEN_messaging.h"
|
|
|
|
#include "KX_KetsjiEngine.h"
|
|
|
|
|
|
|
|
/**********************************
|
|
|
|
* Begin Blender include block
|
|
|
|
**********************************/
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C"
|
|
|
|
{
|
|
|
|
#endif // __cplusplus
|
2008-09-15 12:40:17 +00:00
|
|
|
#include "MEM_guardedalloc.h"
|
2006-02-13 03:37:00 +00:00
|
|
|
#include "BKE_global.h"
|
2007-01-08 04:22:23 +00:00
|
|
|
#include "BKE_icons.h"
|
2008-09-14 03:51:51 +00:00
|
|
|
#include "BKE_node.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
#include "BLI_blenlib.h"
|
|
|
|
#include "DNA_scene_types.h"
|
|
|
|
#include "BLO_readfile.h"
|
2004-04-24 06:29:51 +00:00
|
|
|
#include "BLO_readblenfile.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
int GHOST_HACK_getFirstFile(char buf[]);
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif // __cplusplus
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
|
|
|
|
#include "GPU_draw.h"
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
/**********************************
|
|
|
|
* End Blender include block
|
|
|
|
**********************************/
|
|
|
|
|
|
|
|
#include "SYS_System.h"
|
|
|
|
#include "GPG_Application.h"
|
|
|
|
|
|
|
|
#include "GHOST_ISystem.h"
|
|
|
|
#include "RAS_IRasterizer.h"
|
|
|
|
|
|
|
|
#include "BKE_main.h"
|
2004-03-22 22:02:18 +00:00
|
|
|
#include "BKE_utildefines.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
#ifdef WIN32
|
|
|
|
#include <windows.h>
|
2004-12-01 08:35:38 +00:00
|
|
|
#ifdef NDEBUG
|
2002-10-12 11:37:38 +00:00
|
|
|
#include <wincon.h>
|
|
|
|
#endif // NDEBUG
|
|
|
|
#endif // WIN32
|
|
|
|
|
|
|
|
const int kMinWindowWidth = 100;
|
|
|
|
const int kMinWindowHeight = 100;
|
|
|
|
|
2004-03-22 22:02:18 +00:00
|
|
|
char bprogname[FILE_MAXDIR+FILE_MAXFILE];
|
|
|
|
|
2004-12-01 08:35:38 +00:00
|
|
|
#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 */
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
void usage(char* program)
|
|
|
|
{
|
|
|
|
char * consoleoption;
|
|
|
|
#ifdef _WIN32
|
|
|
|
consoleoption = "-c ";
|
|
|
|
#else
|
|
|
|
consoleoption = "";
|
|
|
|
#endif
|
|
|
|
|
2004-04-11 02:50:02 +00:00
|
|
|
printf("usage: %s [-w [-p l t w h]] %s[-g gamengineoptions] "
|
|
|
|
"[-s stereomode] filename.blend\n", program, consoleoption);
|
2004-10-15 12:46:57 +00:00
|
|
|
printf(" -h: Prints this command summary\n");
|
2004-03-22 22:02:18 +00:00
|
|
|
printf(" -w: display in a window\n");
|
2002-10-12 11:37:38 +00:00
|
|
|
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");
|
2004-08-10 11:34:12 +00:00
|
|
|
printf(" -f: start game in full screen mode\n");
|
2002-10-12 11:37:38 +00:00
|
|
|
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");
|
2004-08-10 11:34:12 +00:00
|
|
|
printf(" ff = full screen mode frequency\n");
|
2002-10-12 11:37:38 +00:00
|
|
|
printf(" -s: start player in stereo\n");
|
2004-08-10 11:34:12 +00:00
|
|
|
printf(" stereomode: hwpageflip (Quad buffered shutter glasses)\n");
|
|
|
|
printf(" syncdoubling (Above Below)\n");
|
|
|
|
printf(" sidebyside (Left Right)\n");
|
|
|
|
printf(" anaglyph (Red-Blue glasses)\n");
|
2004-10-24 11:03:18 +00:00
|
|
|
printf(" vinterlace (Vertical interlace for autostereo display)\n");
|
2004-08-10 11:34:12 +00:00
|
|
|
printf(" depending on the type of stereo you want\n");
|
2008-09-09 21:15:30 +00:00
|
|
|
#ifndef _WIN32
|
|
|
|
printf(" -i: parent windows ID \n");
|
|
|
|
#endif
|
2002-10-12 11:37:38 +00:00
|
|
|
#ifdef _WIN32
|
|
|
|
printf(" -c: keep console window open\n");
|
|
|
|
#endif
|
2008-09-15 12:40:17 +00:00
|
|
|
printf(" -d: turn debugging on\n");
|
2004-08-10 11:34:12 +00:00
|
|
|
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");
|
2006-01-06 03:46:54 +00:00
|
|
|
printf(" blender_material 0 Enable material settings\n");
|
2002-10-12 11:37:38 +00:00
|
|
|
printf("\n");
|
|
|
|
printf("example: %s -p 10 10 320 200 -g noaudio c:\\loadtest.blend\n", program);
|
2008-06-29 21:51:27 +00:00
|
|
|
printf("example: %s -g show_framerate = 0 c:\\loadtest.blend\n", program);
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
2008-09-12 16:06:17 +00:00
|
|
|
static void get_filename(int argc, char **argv, char *filename)
|
|
|
|
{
|
2002-10-12 11:37:38 +00:00
|
|
|
#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;
|
2008-09-12 16:06:17 +00:00
|
|
|
char *gamefile = NULL;
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2008-09-12 16:06:17 +00:00
|
|
|
filename[0] = '\0';
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
if (argc > 1) {
|
|
|
|
if (BLI_exists(argv[argc-1])) {
|
2008-09-12 16:06:17 +00:00
|
|
|
BLI_strncpy(filename, argv[argc-1], FILE_MAXDIR + FILE_MAXFILE);
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
if (::strncmp(argv[argc-1], "-psn_", 5)==0) {
|
|
|
|
static char firstfilebuf[512];
|
|
|
|
if (GHOST_HACK_getFirstFile(firstfilebuf)) {
|
2008-09-12 16:06:17 +00:00
|
|
|
BLI_strncpy(filename, firstfilebuf, FILE_MAXDIR + FILE_MAXFILE);
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
srclen -= ::strlen("MacOS/blenderplayer");
|
|
|
|
if (srclen > 0) {
|
|
|
|
len = srclen + ::strlen("Resources/game.blend");
|
2008-09-12 16:06:17 +00:00
|
|
|
gamefile = new char [len + 1];
|
|
|
|
::strcpy(gamefile, argv[0]);
|
|
|
|
::strcpy(gamefile + srclen, "Resources/game.blend");
|
2002-10-12 11:37:38 +00:00
|
|
|
//::printf("looking for file: %s\n", filename);
|
|
|
|
|
2008-09-12 16:06:17 +00:00
|
|
|
if (BLI_exists(gamefile))
|
|
|
|
BLI_strncpy(filename, gamefile, FILE_MAXDIR + FILE_MAXFILE);
|
|
|
|
|
|
|
|
delete gamefile;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#else
|
2008-09-12 16:06:17 +00:00
|
|
|
filename[0] = '\0';
|
|
|
|
|
|
|
|
if(argc > 1)
|
|
|
|
BLI_strncpy(filename, argv[argc-1], FILE_MAXDIR + FILE_MAXFILE);
|
2002-10-12 11:37:38 +00:00
|
|
|
#endif // !_APPLE
|
|
|
|
}
|
|
|
|
|
2008-09-12 16:06:17 +00:00
|
|
|
static BlendFileData *load_game_data(char *progname, char *filename = NULL, char *relativename = NULL) {
|
2002-10-12 11:37:38 +00:00
|
|
|
BlendReadError error;
|
2004-04-24 06:29:51 +00:00
|
|
|
BlendFileData *bfd = NULL;
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
/* try to load ourself, will only work if we are a runtime */
|
2004-04-24 06:29:51 +00:00
|
|
|
if (blo_is_a_runtime(progname)) {
|
|
|
|
bfd= blo_read_runtime(progname, &error);
|
2004-04-29 10:51:02 +00:00
|
|
|
if (bfd) {
|
|
|
|
bfd->type= BLENFILETYPE_RUNTIME;
|
|
|
|
strcpy(bfd->main->name, progname);
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
2004-04-29 10:51:02 +00:00
|
|
|
} else {
|
|
|
|
bfd= BLO_read_from_file(progname, &error);
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
2004-04-29 10:51:02 +00:00
|
|
|
|
2002-12-22 22:02:57 +00:00
|
|
|
/*
|
|
|
|
if (bfd && bfd->type == BLENFILETYPE_BLEND) {
|
2002-10-12 11:37:38 +00:00
|
|
|
BLO_blendfiledata_free(bfd);
|
|
|
|
bfd = NULL;
|
|
|
|
error = BRE_NOT_A_PUBFILE;
|
|
|
|
}
|
2002-12-22 22:02:57 +00:00
|
|
|
*/
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2004-04-29 10:51:02 +00:00
|
|
|
if (!bfd && filename) {
|
|
|
|
bfd = load_game_data(filename);
|
|
|
|
if (!bfd) {
|
2002-10-12 11:37:38 +00:00
|
|
|
printf("Loading %s failed: %s\n", filename, BLO_bre_as_string(error));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return bfd;
|
|
|
|
}
|
|
|
|
|
|
|
|
int main(int argc, char** argv)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
bool error = false;
|
|
|
|
SYS_SystemHandle syshandle = SYS_GetSystem();
|
2004-07-17 00:48:59 +00:00
|
|
|
bool fullScreen = false;
|
|
|
|
bool fullScreenParFound = false;
|
2002-10-12 11:37:38 +00:00
|
|
|
bool windowParFound = false;
|
|
|
|
bool closeConsole = true;
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
RAS_IRasterizer::StereoMode stereomode = RAS_IRasterizer::RAS_STEREO_NOSTEREO;
|
2002-10-12 11:37:38 +00:00
|
|
|
bool stereoWindow = false;
|
|
|
|
bool stereoParFound = false;
|
|
|
|
int windowLeft = 100;
|
|
|
|
int windowTop = 100;
|
|
|
|
int windowWidth = 640;
|
|
|
|
int windowHeight = 480;
|
2004-03-22 22:02:18 +00:00
|
|
|
GHOST_TUns32 fullScreenWidth = 0;
|
|
|
|
GHOST_TUns32 fullScreenHeight= 0;
|
2004-08-10 11:34:12 +00:00
|
|
|
int fullScreenBpp = 32;
|
2002-10-12 11:37:38 +00:00
|
|
|
int fullScreenFrequency = 60;
|
2008-09-09 21:15:30 +00:00
|
|
|
GHOST_TEmbedderWindowID parentWindow = 0;
|
|
|
|
|
|
|
|
|
2008-08-20 06:11:11 +00:00
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
#ifdef __linux__
|
|
|
|
#ifdef __alpha__
|
|
|
|
signal (SIGFPE, SIG_IGN);
|
|
|
|
#endif /* __alpha__ */
|
|
|
|
#endif /* __linux__ */
|
2004-03-22 22:02:18 +00:00
|
|
|
BLI_where_am_i(bprogname, argv[0]);
|
2002-10-12 11:37:38 +00:00
|
|
|
#ifdef __APPLE__
|
|
|
|
// Can't use Carbon right now because of double defined type ID (In Carbon.h and DNA_ID.h, sigh)
|
|
|
|
/*
|
|
|
|
IBNibRef nibRef;
|
|
|
|
WindowRef window;
|
|
|
|
OSStatus err;
|
|
|
|
|
|
|
|
// Create a Nib reference passing the name of the nib file (without the .nib extension)
|
|
|
|
// CreateNibReference only searches into the application bundle.
|
|
|
|
err = ::CreateNibReference(CFSTR("main"), &nibRef);
|
|
|
|
if (err) return -1;
|
|
|
|
|
|
|
|
// Once the nib reference is created, set the menu bar. "MainMenu" is the name of the menu bar
|
|
|
|
// object. This name is set in InterfaceBuilder when the nib is created.
|
|
|
|
err = ::SetMenuBarFromNib(nibRef, CFSTR("MenuBar"));
|
|
|
|
if (err) return -1;
|
|
|
|
|
|
|
|
// We don't need the nib reference anymore.
|
|
|
|
::DisposeNibReference(nibRef);
|
|
|
|
*/
|
|
|
|
#endif // __APPLE__
|
2008-09-14 03:51:51 +00:00
|
|
|
|
|
|
|
init_nodesystem();
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
GEN_init_messaging_system();
|
2004-11-07 22:21:47 +00:00
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
// Parse command line options
|
|
|
|
#ifndef NDEBUG
|
|
|
|
printf("argv[0] = '%s'\n", argv[0]);
|
|
|
|
#endif
|
2004-12-01 08:35:38 +00:00
|
|
|
|
|
|
|
#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
|
|
|
|
;)
|
2004-11-07 22:21:47 +00:00
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
|
|
|
#ifndef NDEBUG
|
2004-11-07 22:21:47 +00:00
|
|
|
printf("argv[%d] = '%s' , %i\n", i, argv[i],argc);
|
2002-10-12 11:37:38 +00:00
|
|
|
#endif
|
|
|
|
if (argv[i][0] == '-')
|
|
|
|
{
|
|
|
|
switch (argv[i][1])
|
|
|
|
{
|
|
|
|
case 'g':
|
|
|
|
// Parse game options
|
|
|
|
{
|
|
|
|
i++;
|
|
|
|
if (i < argc)
|
|
|
|
{
|
|
|
|
char* paramname = argv[i];
|
|
|
|
// Check for single value versus assignment
|
|
|
|
if (i+1 < argc && (*(argv[i+1]) == '='))
|
|
|
|
{
|
|
|
|
i++;
|
|
|
|
if (i + 1 < argc)
|
|
|
|
{
|
|
|
|
i++;
|
|
|
|
// Assignment
|
2004-08-10 11:34:12 +00:00
|
|
|
SYS_WriteCommandLineInt(syshandle, paramname, atoi(argv[i]));
|
|
|
|
SYS_WriteCommandLineFloat(syshandle, paramname, atof(argv[i]));
|
2002-10-12 11:37:38 +00:00
|
|
|
SYS_WriteCommandLineString(syshandle, paramname, argv[i]);
|
2004-08-10 11:34:12 +00:00
|
|
|
#ifndef NDEBUG
|
|
|
|
printf("%s = '%s'\n", paramname, argv[i]);
|
|
|
|
#endif
|
|
|
|
i++;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
error = true;
|
|
|
|
printf("error: argument assignment %s without value.\n", paramname);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2007-06-27 15:08:31 +00:00
|
|
|
// SYS_WriteCommandLineInt(syshandle, argv[i++], 1);
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2008-09-15 12:40:17 +00:00
|
|
|
|
|
|
|
case 'd':
|
|
|
|
i++;
|
|
|
|
G.f |= G_DEBUG; /* std output printf's */
|
|
|
|
MEM_set_memory_debug();
|
|
|
|
break;
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
case 'p':
|
|
|
|
// Parse window position and size options
|
|
|
|
if (argv[i][2] == 0) {
|
|
|
|
i++;
|
|
|
|
if ((i + 4) < argc)
|
|
|
|
{
|
|
|
|
windowLeft = atoi(argv[i++]);
|
|
|
|
windowTop = atoi(argv[i++]);
|
|
|
|
windowWidth = atoi(argv[i++]);
|
2004-08-10 11:34:12 +00:00
|
|
|
windowHeight = atoi(argv[i++]);
|
2002-10-12 11:37:38 +00:00
|
|
|
windowParFound = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
error = true;
|
|
|
|
printf("error: too few options for window argument.\n");
|
|
|
|
}
|
2004-11-07 22:21:47 +00:00
|
|
|
} else { /* mac specific */
|
|
|
|
|
|
|
|
if (strncmp(argv[i], "-psn_", 5)==0)
|
|
|
|
i++; /* skip process serial number */
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
break;
|
2004-08-10 11:34:12 +00:00
|
|
|
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;
|
2004-03-22 22:02:18 +00:00
|
|
|
case 'w':
|
2002-10-12 11:37:38 +00:00
|
|
|
// Parse window position and size options
|
|
|
|
{
|
2004-03-22 22:02:18 +00:00
|
|
|
fullScreen = false;
|
2004-08-10 11:34:12 +00:00
|
|
|
fullScreenParFound = true;
|
2004-03-22 22:02:18 +00:00
|
|
|
i++;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
break;
|
2004-10-15 12:46:57 +00:00
|
|
|
case 'h':
|
|
|
|
usage(argv[0]);
|
|
|
|
return 0;
|
|
|
|
break;
|
2008-09-09 21:15:30 +00:00
|
|
|
#ifndef _WIN32
|
|
|
|
case 'i':
|
|
|
|
i++;
|
|
|
|
if ( (i + 1) < argc )
|
|
|
|
parentWindow = atoi(argv[i++]);
|
|
|
|
#ifndef NDEBUG
|
|
|
|
printf("XWindows ID = %d\n", parentWindow);
|
|
|
|
#endif //NDEBUG
|
|
|
|
|
|
|
|
#endif // _WIN32
|
2002-10-12 11:37:38 +00:00
|
|
|
case 'c':
|
|
|
|
i++;
|
|
|
|
closeConsole = false;
|
|
|
|
break;
|
|
|
|
case 's': // stereo
|
|
|
|
i++;
|
|
|
|
if ((i + 1) < argc)
|
|
|
|
{
|
2004-10-24 11:03:18 +00:00
|
|
|
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;
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
if(!strcmp(argv[i], "nostereo")) // ok, redundant but clear
|
|
|
|
stereomode = RAS_IRasterizer::RAS_STEREO_NOSTEREO;
|
|
|
|
|
|
|
|
// only the hardware pageflip method needs a stereo window
|
|
|
|
if(!strcmp(argv[i], "hwpageflip")) {
|
|
|
|
stereomode = RAS_IRasterizer::RAS_STEREO_QUADBUFFERED;
|
|
|
|
stereoWindow = true;
|
|
|
|
}
|
|
|
|
if(!strcmp(argv[i], "syncdoubling"))
|
|
|
|
stereomode = RAS_IRasterizer::RAS_STEREO_ABOVEBELOW;
|
2004-08-10 11:34:12 +00:00
|
|
|
|
|
|
|
if(!strcmp(argv[i], "anaglyph"))
|
|
|
|
stereomode = RAS_IRasterizer::RAS_STEREO_ANAGLYPH;
|
|
|
|
|
|
|
|
if(!strcmp(argv[i], "sidebyside"))
|
|
|
|
stereomode = RAS_IRasterizer::RAS_STEREO_SIDEBYSIDE;
|
2004-10-24 11:03:18 +00:00
|
|
|
|
|
|
|
if(!strcmp(argv[i], "vinterlace"))
|
|
|
|
stereomode = RAS_IRasterizer::RAS_STEREO_VINTERLACE;
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
#if 0
|
|
|
|
// future stuff
|
|
|
|
if(strcmp(argv[i], "stencil")
|
|
|
|
stereomode = RAS_STEREO_STENCIL;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
i++;
|
|
|
|
stereoParFound = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
error = true;
|
|
|
|
printf("error: too few options for stereo argument.\n");
|
|
|
|
}
|
|
|
|
break;
|
2004-08-10 11:34:12 +00:00
|
|
|
default:
|
|
|
|
printf("Unkown argument: %s\n", argv[i++]);
|
|
|
|
break;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-08-10 11:34:12 +00:00
|
|
|
i++;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((windowWidth < kMinWindowWidth) || (windowHeight < kMinWindowHeight))
|
|
|
|
{
|
|
|
|
error = true;
|
|
|
|
printf("error: window size too small.\n");
|
|
|
|
}
|
|
|
|
|
2007-08-07 16:34:45 +00:00
|
|
|
if (error )
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
|
|
|
usage(argv[0]);
|
2007-06-27 15:08:31 +00:00
|
|
|
return 0;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
2007-06-27 15:08:31 +00:00
|
|
|
|
2004-12-01 08:35:38 +00:00
|
|
|
#ifdef WIN32
|
2007-06-27 15:08:31 +00:00
|
|
|
if (scr_saver_mode != SCREEN_SAVER_MODE_CONFIGURATION)
|
2004-12-01 08:35:38 +00:00
|
|
|
#endif
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
|
|
|
#ifdef __APPLE__
|
|
|
|
//SYS_WriteCommandLineInt(syshandle, "show_framerate", 1);
|
2008-09-14 01:10:45 +00:00
|
|
|
//SYS_WriteCommandLineInt(syshandle, "nomipmap", 1);
|
2002-10-12 11:37:38 +00:00
|
|
|
//fullScreen = false; // Can't use full screen
|
|
|
|
#endif
|
2007-06-27 15:08:31 +00:00
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
if (SYS_GetCommandLineInt(syshandle, "nomipmap", 0))
|
|
|
|
{
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
GPU_set_mipmap(0);
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Create the system
|
|
|
|
if (GHOST_ISystem::createSystem() == GHOST_kSuccess)
|
|
|
|
{
|
|
|
|
GHOST_ISystem* system = GHOST_ISystem::getSystem();
|
|
|
|
assertd(system);
|
|
|
|
|
2004-08-10 11:34:12 +00:00
|
|
|
if (!fullScreenWidth || !fullScreenHeight)
|
|
|
|
system->getMainDisplayDimensions(fullScreenWidth, fullScreenHeight);
|
2002-10-12 11:37:38 +00:00
|
|
|
// process first batch of events. If the user
|
|
|
|
// drops a file on top off the blenderplayer icon, we
|
|
|
|
// recieve 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 = "";
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
GPG_Application app(system);
|
2002-10-12 11:37:38 +00:00
|
|
|
bool firstTimeRunning = true;
|
2008-09-12 16:06:17 +00:00
|
|
|
char filename[FILE_MAXDIR + FILE_MAXFILE];
|
2008-05-11 18:45:30 +00:00
|
|
|
char *titlename;
|
|
|
|
char pathname[160];
|
2008-09-12 16:06:17 +00:00
|
|
|
|
|
|
|
get_filename(argc, argv, filename);
|
2008-09-14 00:32:18 +00:00
|
|
|
if(filename[0])
|
2008-09-15 02:18:37 +00:00
|
|
|
BLI_convertstringcwd(filename);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
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)
|
|
|
|
{
|
2008-03-30 16:18:01 +00:00
|
|
|
char basedpath[240];
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
// base the actuator filename with respect
|
|
|
|
// to the original file working directory
|
|
|
|
strcpy(basedpath, exitstring.Ptr());
|
2008-05-04 15:02:48 +00:00
|
|
|
BLI_convertstringcode(basedpath, pathname);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2004-04-29 10:51:02 +00:00
|
|
|
bfd = load_game_data(basedpath);
|
2008-05-11 18:45:30 +00:00
|
|
|
|
|
|
|
if (!bfd)
|
|
|
|
{
|
|
|
|
// just add "//" in front of it
|
|
|
|
char temppath[242];
|
|
|
|
strcpy(temppath, "//");
|
|
|
|
strcat(temppath, basedpath);
|
|
|
|
|
|
|
|
BLI_convertstringcode(temppath, pathname);
|
|
|
|
bfd = load_game_data(temppath);
|
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2008-09-12 16:06:17 +00:00
|
|
|
bfd = load_game_data(bprogname, filename[0]? filename: NULL);
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//::printf("game data loaded from %s\n", filename);
|
|
|
|
|
|
|
|
if (!bfd) {
|
|
|
|
usage(argv[0]);
|
|
|
|
error = true;
|
|
|
|
exitcode = KX_EXIT_REQUEST_QUIT_GAME;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
#ifdef WIN32
|
|
|
|
#ifdef NDEBUG
|
|
|
|
if (closeConsole)
|
|
|
|
{
|
2006-02-13 03:37:00 +00:00
|
|
|
//::FreeConsole(); // Close a console window
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
#endif // NDEBUG
|
|
|
|
#endif // WIN32
|
|
|
|
Main *maggie = bfd->main;
|
|
|
|
Scene *scene = bfd->curscene;
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
G.main = maggie;
|
2006-02-13 03:37:00 +00:00
|
|
|
G.fileflags = bfd->fileflags;
|
|
|
|
|
2007-01-08 04:22:23 +00:00
|
|
|
//Seg Fault; icon.c gIcons == 0
|
|
|
|
BKE_icons_init(1);
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
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->r.fullscreen) {
|
|
|
|
//printf("fullscreen option found in Blender file\n");
|
|
|
|
fullScreen = true;
|
|
|
|
fullScreenWidth= scene->r.xplay;
|
|
|
|
fullScreenHeight= scene->r.yplay;
|
|
|
|
fullScreenFrequency= scene->r.freqplay;
|
|
|
|
fullScreenBpp = scene->r.depth;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
fullScreen = false;
|
|
|
|
windowWidth = scene->r.xplay;
|
|
|
|
windowHeight = scene->r.yplay;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Check whether the game should be displayed in stereo
|
|
|
|
if (!stereoParFound)
|
|
|
|
{
|
2004-08-10 11:34:12 +00:00
|
|
|
stereomode = (RAS_IRasterizer::StereoMode) scene->r.stereomode;
|
|
|
|
if (stereomode == RAS_IRasterizer::RAS_STEREO_QUADBUFFERED)
|
2002-10-12 11:37:38 +00:00
|
|
|
stereoWindow = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// GPG_Application app (system, maggie, startscenename);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
app.SetGameEngineData(maggie, scene);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
if (firstTimeRunning)
|
|
|
|
{
|
|
|
|
firstTimeRunning = false;
|
2008-05-11 18:45:30 +00:00
|
|
|
|
|
|
|
// set the filename only the first time as in KetsjiEmbedded
|
|
|
|
strcpy (pathname, maggie->name);
|
|
|
|
// also copy here (used by GameLogic.getBaseDirectory)
|
|
|
|
strcpy (G.sce, maggie->name);
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
if (fullScreen)
|
|
|
|
{
|
2004-12-01 08:35:38 +00:00
|
|
|
#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);
|
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
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";
|
|
|
|
}
|
2004-12-01 08:35:38 +00:00
|
|
|
#ifdef WIN32
|
|
|
|
if (scr_saver_mode == SCREEN_SAVER_MODE_PREVIEW)
|
|
|
|
{
|
|
|
|
app.startScreenSaverPreview(scr_saver_hwnd, stereoWindow, stereomode);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
#endif
|
|
|
|
{
|
2008-09-09 21:15:30 +00:00
|
|
|
if (parentWindow != 0)
|
|
|
|
app.startEmbeddedWindow(title, parentWindow, stereoWindow, stereomode);
|
|
|
|
else
|
|
|
|
app.startWindow(title, windowLeft, windowTop, windowWidth, windowHeight,
|
2004-12-01 08:35:38 +00:00
|
|
|
stereoWindow, stereomode);
|
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
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;
|
|
|
|
while (run)
|
|
|
|
{
|
2004-03-22 22:02:18 +00:00
|
|
|
system->processEvents(false);
|
2002-10-12 11:37:38 +00:00
|
|
|
system->dispatchEvents();
|
2004-04-24 06:29:51 +00:00
|
|
|
if ((exitcode = app.getExitRequested()))
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
|
|
|
run = false;
|
|
|
|
exitstring = app.getExitString();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
app.StopGameEngine();
|
2008-09-16 19:25:35 +00:00
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
BLO_blendfiledata_free(bfd);
|
|
|
|
}
|
|
|
|
} while (exitcode == KX_EXIT_REQUEST_RESTART_GAME || exitcode == KX_EXIT_REQUEST_START_OTHER_GAME);
|
|
|
|
}
|
2007-01-08 04:22:23 +00:00
|
|
|
|
|
|
|
// Seg Fault; icon.c gIcons == 0
|
|
|
|
BKE_icons_free();
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
// Dispose the system
|
|
|
|
GHOST_ISystem::disposeSystem();
|
|
|
|
} else {
|
|
|
|
error = true;
|
|
|
|
printf("error: couldn't create a system.\n");
|
|
|
|
}
|
|
|
|
}
|
2007-06-27 15:08:31 +00:00
|
|
|
|
2008-09-14 03:51:51 +00:00
|
|
|
free_nodesystem();
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
return error ? -1 : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|