Changeset View
Changeset View
Standalone View
Standalone View
source/creator/creator_args.c
| Show First 20 Lines • Show All 358 Lines • ▼ Show 20 Lines | fail: | ||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| /** \} */ | /** \} */ | ||||
| /* -------------------------------------------------------------------- */ | /* -------------------------------------------------------------------- */ | ||||
| /** \name Frame Access | |||||
| * | |||||
| * Avoids writing into scene frame range which interferes with some operations. | |||||
| * | |||||
| * \{ */ | |||||
| struct FrameRangeInfo { | |||||
| int sfra, efra, frame_step; | |||||
| }; | |||||
| static struct FrameRangeInfo frame_range; | |||||
| /** | |||||
| * Run on start, file load and scene switch. | |||||
| */ | |||||
| static void frame_range_reset(void) | |||||
| { | |||||
| frame_range.sfra = INT_MAX; | |||||
| frame_range.efra = INT_MAX; | |||||
| frame_range.frame_step = INT_MAX; | |||||
| } | |||||
| static void frame_range_get(const Scene *scene, struct FrameRangeInfo *frinfo) | |||||
| { | |||||
| /* note, these should be the only instances of: | |||||
| * scene->r.sfra/efra/frame_step in this file. */ | |||||
| frinfo->sfra = (frame_range.sfra != INT_MAX) ? frame_range.sfra : scene->r.sfra; | |||||
| frinfo->efra = (frame_range.efra != INT_MAX) ? frame_range.efra : scene->r.efra; | |||||
| frinfo->frame_step = (frame_range.frame_step != INT_MAX) ? frame_range.frame_step : scene->r.frame_step; | |||||
| } | |||||
| /** \} */ | |||||
| /* -------------------------------------------------------------------- */ | |||||
| #ifdef WITH_PYTHON | #ifdef WITH_PYTHON | ||||
| /** \name Utilities Python Context Macro (#BPY_CTX_SETUP) | /** \name Utilities Python Context Macro (#BPY_CTX_SETUP) | ||||
| * \{ */ | * \{ */ | ||||
| struct BlendePyContextStore { | struct BlendePyContextStore { | ||||
| wmWindowManager *wm; | wmWindowManager *wm; | ||||
| Scene *scene; | Scene *scene; | ||||
| wmWindow *win; | wmWindow *win; | ||||
| ▲ Show 20 Lines • Show All 973 Lines • ▼ Show 20 Lines | static int arg_handle_render_frame(int argc, const char **argv, void *data) | ||||
| if (scene) { | if (scene) { | ||||
| Main *bmain = CTX_data_main(C); | Main *bmain = CTX_data_main(C); | ||||
| if (argc > 1) { | if (argc > 1) { | ||||
| const char *err_msg = NULL; | const char *err_msg = NULL; | ||||
| Render *re; | Render *re; | ||||
| ReportList reports; | ReportList reports; | ||||
| struct FrameRangeInfo frinfo; | |||||
| frame_range_get(scene, &frinfo); | |||||
| int (*frame_range_arr)[2], frames_range_len; | int (*frame_range_arr)[2], frames_range_len; | ||||
| if ((frame_range_arr = parse_int_range_relative_clamp_n( | if ((frame_range_arr = parse_int_range_relative_clamp_n( | ||||
| argv[1], scene->r.sfra, scene->r.efra, MINAFRAME, MAXFRAME, | argv[1], frinfo.sfra, frinfo.efra, MINAFRAME, MAXFRAME, | ||||
| &frames_range_len, &err_msg)) == NULL) | &frames_range_len, &err_msg)) == NULL) | ||||
| { | { | ||||
| printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); | printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| re = RE_NewRender(scene->id.name); | re = RE_NewRender(scene->id.name); | ||||
| BLI_begin_threaded_malloc(); | BLI_begin_threaded_malloc(); | ||||
| BKE_reports_init(&reports, RPT_STORE); | BKE_reports_init(&reports, RPT_STORE); | ||||
| RE_SetReports(re, &reports); | RE_SetReports(re, &reports); | ||||
| for (int i = 0; i < frames_range_len; i++) { | for (int i = 0; i < frames_range_len; i++) { | ||||
| /* We could pass in frame ranges, | /* We could pass in frame ranges, | ||||
| * but prefer having exact behavior as passing in multiple frames */ | * but prefer having exact behavior as passing in multiple frames */ | ||||
| if ((frame_range_arr[i][0] <= frame_range_arr[i][1]) == 0) { | if ((frame_range_arr[i][0] <= frame_range_arr[i][1]) == 0) { | ||||
| printf("\nWarning: negative range ignored '%s %s'.\n", arg_id, argv[1]); | printf("\nWarning: negative range ignored '%s %s'.\n", arg_id, argv[1]); | ||||
| } | } | ||||
| for (int frame = frame_range_arr[i][0]; frame <= frame_range_arr[i][1]; frame++) { | for (int frame = frame_range_arr[i][0]; frame <= frame_range_arr[i][1]; frame++) { | ||||
| RE_BlenderAnim(re, bmain, scene, NULL, scene->lay, frame, frame, scene->r.frame_step); | RE_BlenderAnim(re, bmain, scene, NULL, scene->lay, frame, frame, frinfo.frame_step); | ||||
| } | } | ||||
| } | } | ||||
| RE_SetReports(re, NULL); | RE_SetReports(re, NULL); | ||||
| BKE_reports_clear(&reports); | BKE_reports_clear(&reports); | ||||
| BLI_end_threaded_malloc(); | BLI_end_threaded_malloc(); | ||||
| MEM_freeN(frame_range_arr); | MEM_freeN(frame_range_arr); | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| Show All 14 Lines | |||||
| static int arg_handle_render_animation(int UNUSED(argc), const char **UNUSED(argv), void *data) | static int arg_handle_render_animation(int UNUSED(argc), const char **UNUSED(argv), void *data) | ||||
| { | { | ||||
| bContext *C = data; | bContext *C = data; | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| if (scene) { | if (scene) { | ||||
| Main *bmain = CTX_data_main(C); | Main *bmain = CTX_data_main(C); | ||||
| Render *re = RE_NewRender(scene->id.name); | Render *re = RE_NewRender(scene->id.name); | ||||
| ReportList reports; | ReportList reports; | ||||
| struct FrameRangeInfo frinfo; | |||||
| frame_range_get(scene, &frinfo); | |||||
| BLI_begin_threaded_malloc(); | BLI_begin_threaded_malloc(); | ||||
| BKE_reports_init(&reports, RPT_STORE); | BKE_reports_init(&reports, RPT_STORE); | ||||
| RE_SetReports(re, &reports); | RE_SetReports(re, &reports); | ||||
| RE_BlenderAnim(re, bmain, scene, NULL, scene->lay, scene->r.sfra, scene->r.efra, scene->r.frame_step); | RE_BlenderAnim(re, bmain, scene, NULL, scene->lay, frinfo.sfra, frinfo.efra, frinfo.frame_step); | ||||
| RE_SetReports(re, NULL); | RE_SetReports(re, NULL); | ||||
| BKE_reports_clear(&reports); | BKE_reports_clear(&reports); | ||||
| BLI_end_threaded_malloc(); | BLI_end_threaded_malloc(); | ||||
| } | } | ||||
| else { | else { | ||||
| printf("\nError: no blend loaded. cannot use '-a'.\n"); | printf("\nError: no blend loaded. cannot use '-a'.\n"); | ||||
| } | } | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| static const char arg_handle_scene_set_doc[] = | static const char arg_handle_scene_set_doc[] = | ||||
| "<name>\n" | "<name>\n" | ||||
| "\tSet the active scene <name> for rendering" | "\tSet the active scene <name> for rendering" | ||||
| ; | ; | ||||
| static int arg_handle_scene_set(int argc, const char **argv, void *data) | static int arg_handle_scene_set(int argc, const char **argv, void *data) | ||||
| { | { | ||||
| if (argc > 1) { | if (argc > 1) { | ||||
| bContext *C = data; | bContext *C = data; | ||||
| Scene *scene = BKE_scene_set_name(CTX_data_main(C), argv[1]); | Scene *scene = BKE_scene_set_name(CTX_data_main(C), argv[1]); | ||||
| if (scene) { | if (scene) { | ||||
| frame_range_reset(); | |||||
| CTX_data_scene_set(C, scene); | CTX_data_scene_set(C, scene); | ||||
| } | } | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| else { | else { | ||||
| printf("\nError: Scene name must follow '-S / --scene'.\n"); | printf("\nError: Scene name must follow '-S / --scene'.\n"); | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| } | } | ||||
| static const char arg_handle_frame_start_set_doc[] = | static const char arg_handle_frame_start_set_doc[] = | ||||
| "<frame>\n" | "<frame>\n" | ||||
| "\tSet start to frame <frame>, supports +/- for relative frames too." | "\tSet start to frame <frame>, supports +/- for relative frames too." | ||||
| ; | ; | ||||
| static int arg_handle_frame_start_set(int argc, const char **argv, void *data) | static int arg_handle_frame_start_set(int argc, const char **argv, void *data) | ||||
| { | { | ||||
| const char *arg_id = "-s / --frame-start"; | const char *arg_id = "-s / --frame-start"; | ||||
| bContext *C = data; | bContext *C = data; | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| if (scene) { | if (scene) { | ||||
| if (argc > 1) { | if (argc > 1) { | ||||
| const char *err_msg = NULL; | const char *err_msg = NULL; | ||||
| struct FrameRangeInfo frinfo; | |||||
| frame_range_get(scene, &frinfo); | |||||
| if (!parse_int_relative_clamp( | if (!parse_int_relative_clamp( | ||||
| argv[1], NULL, scene->r.sfra, scene->r.sfra - 1, MINAFRAME, MAXFRAME, | argv[1], NULL, frinfo.sfra, frinfo.sfra - 1, MINAFRAME, MAXFRAME, | ||||
| &scene->r.sfra, &err_msg)) | &frame_range.sfra, &err_msg)) | ||||
| { | { | ||||
| printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); | printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); | ||||
| } | } | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| else { | else { | ||||
| printf("\nError: frame number must follow '%s'.\n", arg_id); | printf("\nError: frame number must follow '%s'.\n", arg_id); | ||||
| return 0; | return 0; | ||||
| Show All 12 Lines | |||||
| static int arg_handle_frame_end_set(int argc, const char **argv, void *data) | static int arg_handle_frame_end_set(int argc, const char **argv, void *data) | ||||
| { | { | ||||
| const char *arg_id = "-e / --frame-end"; | const char *arg_id = "-e / --frame-end"; | ||||
| bContext *C = data; | bContext *C = data; | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| if (scene) { | if (scene) { | ||||
| if (argc > 1) { | if (argc > 1) { | ||||
| const char *err_msg = NULL; | const char *err_msg = NULL; | ||||
| struct FrameRangeInfo frinfo; | |||||
| frame_range_get(scene, &frinfo); | |||||
| if (!parse_int_relative_clamp( | if (!parse_int_relative_clamp( | ||||
| argv[1], NULL, scene->r.efra, scene->r.efra - 1, MINAFRAME, MAXFRAME, | argv[1], NULL, frinfo.efra, frinfo.efra - 1, MINAFRAME, MAXFRAME, | ||||
| &scene->r.efra, &err_msg)) | &frame_range.efra, &err_msg)) | ||||
| { | { | ||||
| printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); | printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); | ||||
| } | } | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| else { | else { | ||||
| printf("\nError: frame number must follow '%s'.\n", arg_id); | printf("\nError: frame number must follow '%s'.\n", arg_id); | ||||
| return 0; | return 0; | ||||
| Show All 12 Lines | |||||
| static int arg_handle_frame_skip_set(int argc, const char **argv, void *data) | static int arg_handle_frame_skip_set(int argc, const char **argv, void *data) | ||||
| { | { | ||||
| const char *arg_id = "-j / --frame-jump"; | const char *arg_id = "-j / --frame-jump"; | ||||
| bContext *C = data; | bContext *C = data; | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| if (scene) { | if (scene) { | ||||
| if (argc > 1) { | if (argc > 1) { | ||||
| const char *err_msg = NULL; | const char *err_msg = NULL; | ||||
| if (!parse_int_clamp(argv[1], NULL, 1, MAXFRAME, &scene->r.frame_step, &err_msg)) { | if (!parse_int_clamp(argv[1], NULL, 1, MAXFRAME, &frame_range.frame_step, &err_msg)) { | ||||
| printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); | printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); | ||||
| } | } | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| else { | else { | ||||
| printf("\nError: number of frames to step must follow '%s'.\n", arg_id); | printf("\nError: number of frames to step must follow '%s'.\n", arg_id); | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 203 Lines • ▼ Show 20 Lines | static int arg_handle_load_file(int UNUSED(argc), const char **argv, void *data) | ||||
| BLI_strncpy(filename, argv[0], sizeof(filename)); | BLI_strncpy(filename, argv[0], sizeof(filename)); | ||||
| BLI_path_cwd(filename, sizeof(filename)); | BLI_path_cwd(filename, sizeof(filename)); | ||||
| /* load the file */ | /* load the file */ | ||||
| BKE_reports_init(&reports, RPT_PRINT); | BKE_reports_init(&reports, RPT_PRINT); | ||||
| WM_file_autoexec_init(filename); | WM_file_autoexec_init(filename); | ||||
| success = WM_file_read(C, filename, &reports); | success = WM_file_read(C, filename, &reports); | ||||
| BKE_reports_clear(&reports); | BKE_reports_clear(&reports); | ||||
| frame_range_reset(); | |||||
| if (success) { | if (success) { | ||||
| if (G.background) { | if (G.background) { | ||||
| /* ensuer we use 'C->data.scene' for background render */ | /* ensuer we use 'C->data.scene' for background render */ | ||||
| CTX_wm_window_set(C, NULL); | CTX_wm_window_set(C, NULL); | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| Show All 18 Lines | static int arg_handle_load_file(int UNUSED(argc), const char **argv, void *data) | ||||
| G.file_loaded = 1; | G.file_loaded = 1; | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| void main_args_setup(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle) | void main_args_setup(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle) | ||||
| { | { | ||||
| frame_range_reset(); | |||||
| #define CB(a) a##_doc, a | #define CB(a) a##_doc, a | ||||
| #define CB_EX(a, b) a##_doc_##b, a | #define CB_EX(a, b) a##_doc_##b, a | ||||
| //BLI_argsAdd(ba, pass, short_arg, long_arg, doc, cb, C); | //BLI_argsAdd(ba, pass, short_arg, long_arg, doc, cb, C); | ||||
| /* end argument processing after -- */ | /* end argument processing after -- */ | ||||
| BLI_argsAdd(ba, -1, "--", NULL, CB(arg_handle_arguments_end), NULL); | BLI_argsAdd(ba, -1, "--", NULL, CB(arg_handle_arguments_end), NULL); | ||||
| ▲ Show 20 Lines • Show All 131 Lines • Show Last 20 Lines | |||||