=bmesh= merge from trunk at r36529
[blender.git] / source / creator / creator.c
index 2b146822194183394749d6b9a74b89dada18830c..0b76699996eb5a9557585f6ec765cb4e750ab179 100644 (file)
@@ -45,6 +45,7 @@
 #include <stdlib.h>
 #include <stddef.h>
 #include <string.h>
+#include <signal.h>
 
 /* for setuid / getuid */
 #ifdef __sgi
 #include "binreloc.h"
 #endif
 
+static int no_handler = 0;
+
 // from buildinfo.c
 #ifdef BUILD_DATE
 extern char build_date[];
@@ -257,6 +260,9 @@ static int print_help(int UNUSED(argc), const char **UNUSED(argv), void *data)
        printf ("Misc Options:\n");
        BLI_argsPrintArgDoc(ba, "--debug");
        BLI_argsPrintArgDoc(ba, "--debug-fpe");
+#ifdef EVENT_RECORDER
+       BLI_argsPrintArgDoc(ba, "--eventmacro");
+#endif
        printf("\n");
        BLI_argsPrintArgDoc(ba, "--factory-startup");
        printf("\n");
@@ -350,6 +356,34 @@ double PIL_check_seconds_timer(void);
        }
 }*/
 
+int segmentation_handler(int sig)
+{
+       char fname[256];
+
+       if (!G.main->name[0]) {
+               char str[FILE_MAXDIR+FILE_MAXFILE];
+
+               BLI_make_file_string("/", fname, btempdir, "crash.blend");
+       } else
+               sprintf(fname, "%s.crash.blend", G.main->name);
+
+       BKE_undo_save(fname);
+
+       /*induce a real crash*/
+       signal(SIGSEGV, SIG_DFL);
+       *(int*)NULL = 0;
+
+       return 0;
+}
+
+static int nocrashhandler(int argc, char **argv, void *data)
+{
+       no_handler = 1;
+
+       return 0;
+}
+
+
 static int end_arguments(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data))
 {
        return -1;
@@ -842,6 +876,20 @@ static int set_start_frame(int argc, const char **argv, void *data)
        }
 }
 
+#ifdef EVENT_RECORDER
+static int set_macro_playback(int argc, char **argv, void *data)
+{
+       bContext *C = data;
+       
+       if (argc < 2)
+               return 0;
+               
+       CTX_set_events_path(C, argv[1]);
+       
+       return 0;
+}
+#endif
+
 static int set_end_frame(int argc, const char **argv, void *data)
 {
        bContext *C = data;
@@ -1112,13 +1160,15 @@ static void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle)
        BLI_argsAdd(ba, 2, "-con", "--start-console", "\n\tStart with the console window open (ignored if -b is set)", start_with_console, NULL);
        BLI_argsAdd(ba, 2, "-R", NULL, "\n\tRegister .blend extension, then exit (Windows only)", register_extension, NULL);
        BLI_argsAdd(ba, 2, "-r", NULL, "\n\tSilently register .blend extension, then exit (Windows only)", register_extension, ba);
-
+       BLI_argsAdd(ba, 2,  "--no_crash_handler", NULL, "disable crash handler", nocrashhandler, NULL);
+       
        /* third pass: disabling things and forcing settings */
        BLI_argsAddCase(ba, 3, "-nojoystick", 1, NULL, 0, "\n\tDisable joystick support", no_joystick, syshandle);
        BLI_argsAddCase(ba, 3, "-noglsl", 1, NULL, 0, "\n\tDisable GLSL shading", no_glsl, NULL);
        BLI_argsAddCase(ba, 3, "-noaudio", 1, NULL, 0, "\n\tForce sound system to None", no_audio, NULL);
        BLI_argsAddCase(ba, 3, "-setaudio", 1, NULL, 0, "\n\tForce sound system to a specific device\n\tNULL SDL OPENAL JACK", set_audio, NULL);
 
+
        /* fourth pass: processing arguments */
        BLI_argsAdd(ba, 4, "-g", NULL, game_doc, set_ge_parameters, syshandle);
        BLI_argsAdd(ba, 4, "-f", "--render-frame", "<frame>\n\tRender frame <frame> and save it.\n\t+<frame> start frame relative, -<frame> end frame relative.", render_frame, C);
@@ -1138,6 +1188,10 @@ static void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle)
        BLI_argsAdd(ba, 4, "-t", "--threads", "<threads>\n\tUse amount of <threads> for rendering in background\n\t[1-" STRINGIFY(BLENDER_MAX_THREADS) "], 0 for systems processor count.", set_threads, NULL);
        BLI_argsAdd(ba, 4, "-x", "--use-extension", "<bool>\n\tSet option to add the file extension to the end of the file", set_extension, C);
 
+#ifdef EVENT_RECORDER
+       BLI_argsAdd(ba, 4, "--eventmacro", NULL, "<file>\n\tevent macro", set_macro_playback, C);
+#endif
+       
 }
 
 #ifdef WITH_PYTHON_MODULE
@@ -1150,7 +1204,6 @@ int main(int argc, const char **argv)
        SYS_SystemHandle syshandle;
        bContext *C= CTX_create();
        bArgs *ba;
-
 #ifdef WITH_PYTHON_MODULE
 #undef main
 #endif
@@ -1225,6 +1278,11 @@ int main(int argc, const char **argv)
 
        BLI_argsParse(ba, 1, NULL, NULL);
 
+       if (!no_handler) {
+               signal(SIGSEGV, segmentation_handler);
+               //signal(SIGFPE, segmentation_handler);
+       }
+
 #ifdef __sgi
        setuid(getuid()); /* end superuser */
 #endif
@@ -1303,12 +1361,16 @@ int main(int argc, const char **argv)
                        if(WM_init_game(C))
                                return 0;
                }
-               else if(!G.file_loaded)
+#ifdef EVENT_RECORDER
+               else if(!G.file_loaded && !CTX_play_events(C, NULL))
+#else
+                       else if(!G.file_loaded)
+#endif
                        WM_init_splash(C);
        }
 
        WM_main(C);
-
+       
 
        /*XXX if (scr_init==0) {
                main_init_screen();