diff options
Diffstat (limited to 'source/creator/creator.c')
-rw-r--r-- | source/creator/creator.c | 515 |
1 files changed, 515 insertions, 0 deletions
diff --git a/source/creator/creator.c b/source/creator/creator.c new file mode 100644 index 00000000000..e9be9be2579 --- /dev/null +++ b/source/creator/creator.c @@ -0,0 +1,515 @@ +/* + * $Id$ + * + * ***** BEGIN GPL/BL DUAL 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. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * 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. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#include <stdlib.h> + +/* This little block needed for linking to Blender... */ + +#include "MEM_guardedalloc.h" + +#ifdef WIN32 +#include "BLI_winstuff.h" +#endif + +#include "GEN_messaging.h" + +#include "DNA_ID.h" + +#include "BLI_blenlib.h" + +#include "BKE_utildefines.h" +#include "BKE_blender.h" +#include "BKE_global.h" +#include "BKE_main.h" +#include "BKE_scene.h" + +#include "BIF_gl.h" +#include "BIF_graphics.h" +#include "BIF_mainqueue.h" +#include "BIF_graphics.h" +#include "BIF_editsound.h" +#include "BIF_usiblender.h" +#include "BIF_drawscene.h" /* set_scene() */ +#include "BIF_screen.h" /* waitcursor and more */ +#include "BIF_usiblender.h" +#include "BIF_toolbox.h" + +#include "BLO_writefile.h" +#include "BLO_readfile.h" + +#include "BPY_extern.h" // for init of blender python extension + +#include "BSE_headerbuttons.h" // for BIF_read_homefile + +#include "BDR_drawmesh.h" + +#include "RE_renderconverter.h" +#include "blendertimer.h" + +#include "playanim_ext.h" +#include "mydevice.h" +#include "render.h" +#include "nla.h" + +#include "license_key.h" + +/* for passing information between creator and gameengine */ +#include "SYS_System.h" + +#include <signal.h> +#ifdef __FreeBSD__ + #ifndef __OpenBSD__ + #include <floatingpoint.h> + #include <sys/rtprio.h> + #endif +#endif + +// from buildinfo.c +extern char * build_date; +extern char * build_time; +extern char * build_platform; +extern char * build_type; + +/* Local Function prototypes */ +static void print_help(); + +/* for the callbacks: */ + +extern int pluginapi_force_ref(void); /* from blenpluginapi:pluginapi.c */ + +char bprogname[FILE_MAXDIR+FILE_MAXFILE]; + +/* Initialise callbacks for the modules that need them */ +void setCallbacks(void); + +static void fpe_handler(int sig) +{ + // printf("SIGFPE trapped\n"); +} + +static void print_help(void) +{ + printf ("Blender V %d.%02d\n", G.version/100, G.version%100); + printf ("Usage: blender [options ...] [file]\n"); + + printf ("\nRender options:\n"); + printf (" -b <file>\tRender <file> in background\n"); + printf (" -S <name>\tSet scene <name>\n"); + printf (" -f <frame>\tRender frame <frame> and save it\n"); + printf (" -s <frame>\tSet start to frame <frame> (use with -a)\n"); + printf (" -e <frame>\tSet end to frame (use with -a)<frame>\n"); + printf (" -a\t\tRender animation\n"); + + printf ("\nAnimation options:\n"); + printf (" -a <file(s)>\tPlayback <file(s)>\n"); + printf (" -p <sx> <sy>\tOpen with lower left corner at <sx>, <sy>\n"); + printf (" -m\t\tRead from disk (Don't buffer)\n"); + + printf ("\nWindow options:\n"); + printf (" -w\t\tForce opening with borders\n"); +#ifdef WIN32 + printf (" -W\t\tForce opening without borders\n"); +#endif + printf (" -p <sx> <sy> <w> <h>\tOpen with lower left corner at <sx>, <sy>\n"); + printf (" \tand width and height <w>, <h>\n"); + printf ("\nGame Engine specific options:\n"); + printf (" -g fixedtime\t\tRun on 50 hertz without dropping frames\n"); + printf (" -g vertexarrays\tUse Vertex Arrays for rendering (usually faster)\n"); + printf (" -g noaudio\t\tNo audio in Game Engine\n"); + printf (" -g nomipmap\t\tNo Texture Mipmapping\n"); + printf (" -g linearmipmap\tLinear Texture Mipmapping instead of Nearest (default)\n"); + + + + + printf ("\nMisc options:\n"); + printf (" -d\t\tTurn debugging on\n"); + printf (" -noaudio\tDisable audio on systems that support audio\n"); + printf (" -h\t\tPrint this help text\n"); + printf (" -y\t\tDisable OnLoad scene scripts, use -Y to find out why its -y\n"); +#ifdef WIN32 + printf (" -R\t\tRegister .blend extension\n"); +#endif +} +double PIL_check_seconds_timer(void); +int main(int argc, char **argv) +{ + int a, i, stax, stay, sizx, sizy; + SYS_SystemHandle syshandle; + Scene *sce; + +#if defined(WIN32) || defined (__linux__) + int audio = 1; +#else + int audio = 0; +#endif + + setCallbacks(); + +#ifdef __APPLE__ + /* patch to ignore argument finder gives us (pid?) */ + if (argc==2 && strncmp(argv[1], "-psn_", 5)==0) { + extern int GHOST_HACK_getFirstFile(char buf[]); + static char firstfilebuf[512]; + int scr_x,scr_y; + + argc= 1; + + setprefsize(100, 100, 800, 600); + + winlay_get_screensize(&scr_x, &scr_y); + winlay_process_events(0); + if (GHOST_HACK_getFirstFile(firstfilebuf)) { + argc= 2; + argv[1]= firstfilebuf; + } + } +#endif + +#ifdef __FreeBSD__ + fpsetmask(0); +#endif +#ifdef __linux__ + #ifdef __alpha__ + signal (SIGFPE, fpe_handler); + #endif +#endif +#if defined(__sgi) + signal (SIGFPE, fpe_handler); +#endif + + // copy path to executable in bprogname. playanim and creting runtimes + // need this. + + BLI_where_am_i(bprogname, argv[0]); + + /* Hack - force inclusion of the plugin api functions, + * see blenpluginapi:pluginapi.c + */ + pluginapi_force_ref(); + + initglobals(); /* blender.c */ + + syshandle = SYS_GetSystem(); + GEN_init_messaging_system(); + + /* eerste testen op background */ + G.f |= G_SCENESCRIPT; /* scenescript always set! */ + for(a=1; a<argc; a++) { + + /* Handle unix and windows style help requests */ + if ((!strcmp(argv[a], "--help")) || (!strcmp(argv[a], "/?"))){ + print_help(); + exit(0); + } + + /* Handle -* switches */ + else if(argv[a][0] == '-') { + switch(argv[a][1]) { + case 'a': + playanim(argc-1, argv+1); + exit(0); + break; + case 'b': + case 'B': + G.background = 1; + a= argc; + break; + + case 'm': + /* unified render pipeline */ +/* G.magic = 1; has become obsolete */ + printf("-m: enable unified renderer has become obsolete. Set \n"); + printf("\tthis option per individual file now.\n"); + break; + + case 'y': + G.f &= ~G_SCENESCRIPT; + break; + + case 'Y': + printf ("-y was used to disable scene scripts because,\n"); + printf ("\t-p being taken, Ton was of the opinion that Y\n"); + printf ("\tlooked like a split (disabled) snake, and also\n"); + printf ("\twas similar to a python's tongue (unproven).\n\n"); + + printf ("\tZr agreed because it gave him a reason to add a\n"); + printf ("\tcompletely useless text into Blender.\n\n"); + + printf ("\tADDENDUM! Ton, in defense, found this picture of\n"); + printf ("\tan Australian python, exhibiting her (his/its) forked\n"); + printf ("\tY tongue. It could be part of an H Zr retorted!\n\n"); + printf ("\thttp://www.users.bigpond.com/snake.man/\n"); + + exit(252); + + case 'h': + print_help(); + exit(0); + + default: + break; + } + } + } + +#ifdef __sgi + setuid(getuid()); /* einde superuser */ +#endif + + RE_init_render_data(); /* moet vooraan staan ivm R.winpos uit defaultfile */ + + if(G.background==0) { + for(a=1; a<argc; a++) { + if(argv[a][0] == '-') { + switch(argv[a][1]) { + case 'p': /* prefsize */ + if (argc-a < 5) { + printf ("-p requires four arguments\n"); + exit(1); + } + a++; + stax= atoi(argv[a]); + a++; + stay= atoi(argv[a]); + a++; + sizx= atoi(argv[a]); + a++; + sizy= atoi(argv[a]); + + setprefsize(stax, stay, sizx, sizy); + break; + case 'd': + G.f |= G_DEBUG; /* std output printf's */ + printf ("Blender V %d.%02d\n", G.version/100, G.version%100); +#ifdef NAN_BUILDINFO + printf("Build: %s %s %s %s\n", build_date, build_time, build_platform, build_type); + +#endif // NAN_BUILDINFO + for (i = 0; i < argc; i++) { + printf("argv[%d] = %s\n", i, argv[i]); + } + break; + + case 'w': + /* XXX, fixme zr, with borders */ + break; + case 'W': + /* XXX, fixme zr, borderless on win32 */ + break; + case 'n': + case 'N': + if (strcasecmp(argv[a], "-noaudio") == 0|| strcasecmp(argv[a], "-nosound") == 0) { + /** + notify the gameengine that no audio is wanted, even if the user didn't give + the flag -g noaudio + */ + + SYS_WriteCommandLineInt(syshandle,"noaudio",1); + audio = 0; + if (G.f & G_DEBUG) printf("setting audio to: %d\n", audio); + } + else if (strcasecmp(argv[a], "-nofrozen") == 0) { + /* disable initialization of frozen python modules */ + if (G.f & G_DEBUG) printf("disable frozen modules\n"); + G.f |= G_NOFROZEN; + } + break; + } + } + } + + BPY_start_python(); + + /* NOTE: initialize_sound *must be* after start_python, + * at least on FreeBSD */ + + sound_init_audio(); + + BIF_init(); + } + else { + BPY_start_python(); + SYS_WriteCommandLineInt(syshandle,"noaudio",1); + audio = 0; + sound_init_audio(); + if (G.f & G_DEBUG) printf("setting audio to: %d\n", audio); + } + + RE_init_filt_mask(); + + /* OK we zijn er klaar voor */ + + for(a=1; a<argc; a++) { + if (G.afbreek==1) break; + + if(argv[a][0] == '-') { + switch(argv[a][1]) { + case 'p': /* prefsize */ + a+= 4; + break; + + case 'g': + { + /** + gameengine parameters are automaticly put into system + -g [paramname = value] + -g [boolparamname] + example: + -g novertexarrays + -g maxvertexarraysize = 512 + */ + + if(++a < argc) + { + char* paramname = argv[a]; + /* check for single value versus assignment */ + if (a+1 < argc && (*(argv[a+1]) == '=')) + { + a++; + if (a+1 < argc) + { + a++; + /* assignment */ + SYS_WriteCommandLineString(syshandle,paramname,argv[a]); + } else + { + printf("error: argument assignment (%s) without value.\n",paramname); + } + /* name arg eaten */ + + } else + { + + SYS_WriteCommandLineInt(syshandle,argv[a],1); + + /* doMipMap */ + if (!strcmp(argv[a],"nomipmap")) + { + set_mipmap(0); //doMipMap = 0; + } + /* linearMipMap */ + if (!strcmp(argv[a],"linearmipmap")) + { + set_linear_mipmap(1); //linearMipMap = 1; + } + + + } /* if (*(argv[a+1]) == '=') */ + } /* if(++a < argc) */ + break; + } + case 'f': + a++; + if (G.scene && a < argc) { + G.real_sfra = (G.scene->r.sfra); + G.real_efra = (G.scene->r.efra); + (G.scene->r.sfra) = atoi(argv[a]); + (G.scene->r.efra) = (G.scene->r.sfra); + RE_animrender(NULL); + } + break; + case 'a': + if (G.scene) { + G.real_sfra = (G.scene->r.sfra); + G.real_efra = (G.scene->r.efra); + RE_animrender(NULL); + } + break; + case 'S': + if(++a < argc) { + set_scene_name(argv[a]); + } + break; + case 's': + a++; + if(G.scene) { + if (a < argc) (G.scene->r.sfra) = atoi(argv[a]); + } + break; + case 'e': + a++; + if(G.scene) { + if (a < argc) (G.scene->r.efra) = atoi(argv[a]); + } + break; + case 'R': + /* Registering filetypes only makes sense on windows... */ +#ifdef WIN32 + RegisterBlendExtension(argv[0]); +#endif + break; + } + } + else { + BKE_read_file(argv[a], NULL); + sound_initialize_sounds(); + } + } + + if(G.background) + { + exit_usiblender(); + } + + setscreen(G.curscreen); + + if(G.main->scene.first==0) { + sce= add_scene("1"); + set_scene(sce); + } + + screenmain(); + + return 0; +} /* end of int main(argc,argv) */ + +static void error_cb(char *err) +{ + error("%s", err); +} + +void setCallbacks(void) +{ + /* Error output from the alloc routines: */ + MEM_set_error_stream(stderr); + + + /* BLI_blenlib: */ + + BLI_setErrorCallBack(error_cb); /* */ + BLI_setInterruptCallBack(MISC_test_break); + + /* render module: execution flow, timers, cursors and display. */ + RE_set_getrenderdata_callback(RE_rotateBlenderScene); + RE_set_freerenderdata_callback(RE_freeRotateBlenderScene); +} |