Changeset View
Changeset View
Standalone View
Standalone View
source/blender/render/intern/source/pipeline.c
| Show First 20 Lines • Show All 92 Lines • ▼ Show 20 Lines | |||||
| /* ********* globals ******** */ | /* ********* globals ******** */ | ||||
| /* here we store all renders */ | /* here we store all renders */ | ||||
| static struct { | static struct { | ||||
| ListBase renderlist; | ListBase renderlist; | ||||
| } RenderGlobal = {{NULL, NULL}}; | } RenderGlobal = {{NULL, NULL}}; | ||||
| /* ********* callbacks ******** */ | |||||
| static void render_callback_exec_null(Render *re, Main *bmain, eCbEvent evt) | |||||
| { | |||||
| if (re->r.scemode & R_BUTS_PREVIEW) { | |||||
| return; | |||||
| } | |||||
| BKE_callback_exec_null(bmain, evt); | |||||
| } | |||||
| static void render_callback_exec_id(Render *re, Main *bmain, ID *id, eCbEvent evt) | |||||
| { | |||||
| if (re->r.scemode & R_BUTS_PREVIEW) { | |||||
| return; | |||||
| } | |||||
| BKE_callback_exec_id(bmain, id, evt); | |||||
| } | |||||
| /* ********* alloc and free ******** */ | /* ********* alloc and free ******** */ | ||||
| static int do_write_image_or_movie(Render *re, | static int do_write_image_or_movie(Render *re, | ||||
| Main *bmain, | Main *bmain, | ||||
| Scene *scene, | Scene *scene, | ||||
| bMovieHandle *mh, | bMovieHandle *mh, | ||||
| const int totvideos, | const int totvideos, | ||||
| const char *name_override); | const char *name_override); | ||||
| ▲ Show 20 Lines • Show All 76 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| } | } | ||||
| /* Flush stdout to be sure python callbacks are printing stuff after blender. */ | /* Flush stdout to be sure python callbacks are printing stuff after blender. */ | ||||
| fflush(stdout); | fflush(stdout); | ||||
| /* NOTE: using G_MAIN seems valid here??? | /* NOTE: using G_MAIN seems valid here??? | ||||
| * Not sure it's actually even used anyway, we could as well pass NULL? */ | * Not sure it's actually even used anyway, we could as well pass NULL? */ | ||||
| BKE_callback_exec_null(G_MAIN, BKE_CB_EVT_RENDER_STATS); | BKE_callback_exec(G_MAIN, NULL, BKE_CB_EVT_RENDER_STATS); | ||||
| fputc('\n', stdout); | fputc('\n', stdout); | ||||
| fflush(stdout); | fflush(stdout); | ||||
| } | } | ||||
| static void render_print_save_message(ReportList *reports, const char *name, int ok, int err) | static void render_print_save_message(ReportList *reports, const char *name, int ok, int err) | ||||
| { | { | ||||
| if (ok) { | if (ok) { | ||||
| ▲ Show 20 Lines • Show All 184 Lines • ▼ Show 20 Lines | |||||
| int UNUSED(anim_init)) | int UNUSED(anim_init)) | ||||
| { | { | ||||
| PTCacheBaker baker; | PTCacheBaker baker; | ||||
| memset(&baker, 0, sizeof(baker)); | memset(&baker, 0, sizeof(baker)); | ||||
| baker.bmain = re->main; | baker.bmain = re->main; | ||||
| baker.scene = scene; | baker.scene = scene; | ||||
| baker.view_layer = view_layer; | baker.view_layer = view_layer; | ||||
| baker.depsgraph = BKE_scene_get_depsgraph(re->main, scene, view_layer, true); | baker.depsgraph = BKE_scene_get_depsgraph(scene, view_layer, true); | ||||
| baker.bake = 0; | baker.bake = 0; | ||||
| baker.render = 1; | baker.render = 1; | ||||
| baker.anim_init = 1; | baker.anim_init = 1; | ||||
| baker.quick_step = 1; | baker.quick_step = 1; | ||||
| BKE_ptcache_bake(&baker); | BKE_ptcache_bake(&baker); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 99 Lines • ▼ Show 20 Lines | |||||
| BKE_scene_update_sound(re->pipeline_depsgraph, re->main); | BKE_scene_update_sound(re->pipeline_depsgraph, re->main); | ||||
| } | } | ||||
| static void render_init_depsgraph(Render *re) | static void render_init_depsgraph(Render *re) | ||||
| { | { | ||||
| Scene *scene = re->scene; | Scene *scene = re->scene; | ||||
| ViewLayer *view_layer = BKE_view_layer_default_render(re->scene); | ViewLayer *view_layer = BKE_view_layer_default_render(re->scene); | ||||
| re->pipeline_depsgraph = DEG_graph_new(re->main, scene, view_layer, DAG_EVAL_RENDER); | re->pipeline_depsgraph = DEG_graph_new(scene, view_layer, DAG_EVAL_RENDER); | ||||
| DEG_debug_name_set(re->pipeline_depsgraph, "RENDER PIPELINE"); | DEG_debug_name_set(re->pipeline_depsgraph, "RENDER PIPELINE"); | ||||
| /* Make sure there is a correct evaluated scene pointer. */ | /* Make sure there is a correct evaluated scene pointer. */ | ||||
| DEG_graph_build_for_render_pipeline(re->pipeline_depsgraph, re->main, scene, view_layer); | DEG_graph_build_for_render_pipeline(re->pipeline_depsgraph, re->main, scene, view_layer); | ||||
| /* Update immediately so we have proper evaluated scene. */ | /* Update immediately so we have proper evaluated scene. */ | ||||
| render_update_depsgraph(re); | render_update_depsgraph(re); | ||||
| re->pipeline_scene_eval = DEG_get_evaluated_scene(re->pipeline_depsgraph); | re->pipeline_scene_eval = DEG_get_evaluated_scene(re->pipeline_depsgraph); | ||||
| } | } | ||||
| /* general Blender frame render call */ | /* general Blender frame render call */ | ||||
| void RE_RenderFrame(Render *re, | void RE_RenderFrame(Render *re, | ||||
| Main *bmain, | Main *bmain, | ||||
| Scene *scene, | Scene *scene, | ||||
| ViewLayer *single_layer, | ViewLayer *single_layer, | ||||
| Object *camera_override, | Object *camera_override, | ||||
| int frame, | int frame, | ||||
| const bool write_still) | const bool write_still) | ||||
| { | { | ||||
| render_callback_exec_id(re, re->main, &scene->id, BKE_CB_EVT_RENDER_INIT); | BKE_callback_exec(re->main, (ID *)scene, BKE_CB_EVT_RENDER_INIT); | ||||
| /* Ugly global still... | /* Ugly global still... | ||||
| * is to prevent preview events and signal subsurfs etc to make full resol. */ | * is to prevent preview events and signal subsurfs etc to make full resol. */ | ||||
| G.is_rendering = true; | G.is_rendering = true; | ||||
| scene->r.cfra = frame; | scene->r.cfra = frame; | ||||
| if (render_initialize_from_main( | if (render_initialize_from_main( | ||||
| re, &scene->r, bmain, scene, single_layer, camera_override, 0, 0)) { | re, &scene->r, bmain, scene, single_layer, camera_override, 0, 0)) { | ||||
| const RenderData rd = scene->r; | const RenderData rd = scene->r; | ||||
| MEM_reset_peak_memory(); | MEM_reset_peak_memory(); | ||||
| render_callback_exec_id(re, re->main, &scene->id, BKE_CB_EVT_RENDER_PRE); | |||||
| render_init_depsgraph(re); | render_init_depsgraph(re); | ||||
| BKE_callback_exec(re->main, (ID *)scene, BKE_CB_EVT_RENDER_PRE); | |||||
| do_render_all_options(re); | do_render_all_options(re); | ||||
| if (write_still && !G.is_break) { | if (write_still && !G.is_break) { | ||||
| if (BKE_imtype_is_movie(rd.im_format.imtype)) { | if (BKE_imtype_is_movie(rd.im_format.imtype)) { | ||||
| /* operator checks this but in case its called from elsewhere */ | /* operator checks this but in case its called from elsewhere */ | ||||
| printf("Error: cant write single images with a movie format!\n"); | printf("Error: cant write single images with a movie format!\n"); | ||||
| } | } | ||||
| else { | else { | ||||
| char name[FILE_MAX]; | char name[FILE_MAX]; | ||||
| BKE_image_path_from_imformat(name, | BKE_image_path_from_imformat(name, | ||||
| rd.pic, | rd.pic, | ||||
| BKE_main_blendfile_path(bmain), | BKE_main_blendfile_path(bmain), | ||||
| scene->r.cfra, | scene->r.cfra, | ||||
| &rd.im_format, | &rd.im_format, | ||||
| (rd.scemode & R_EXTENSION) != 0, | (rd.scemode & R_EXTENSION) != 0, | ||||
| false, | false, | ||||
| NULL); | NULL); | ||||
| /* reports only used for Movie */ | /* reports only used for Movie */ | ||||
| do_write_image_or_movie(re, bmain, scene, NULL, 0, name); | do_write_image_or_movie(re, bmain, scene, NULL, 0, name); | ||||
| } | } | ||||
| } | } | ||||
| /* keep after file save */ | /* keep after file save */ | ||||
| render_callback_exec_id(re, re->main, &scene->id, BKE_CB_EVT_RENDER_POST); | BKE_callback_exec(re->main, (ID *)scene, BKE_CB_EVT_RENDER_POST); | ||||
| if (write_still) { | if (write_still) { | ||||
| render_callback_exec_id(re, re->main, &scene->id, BKE_CB_EVT_RENDER_WRITE); | BKE_callback_exec(re->main, (ID *)scene, BKE_CB_EVT_RENDER_WRITE); | ||||
| } | } | ||||
| } | } | ||||
| render_callback_exec_id(re, | BKE_callback_exec( | ||||
| re->main, | re->main, (ID *)scene, G.is_break ? BKE_CB_EVT_RENDER_CANCEL : BKE_CB_EVT_RENDER_COMPLETE); | ||||
| &scene->id, | |||||
| G.is_break ? BKE_CB_EVT_RENDER_CANCEL : BKE_CB_EVT_RENDER_COMPLETE); | |||||
| RE_CleanAfterRender(re); | RE_CleanAfterRender(re); | ||||
| /* UGLY WARNING */ | /* UGLY WARNING */ | ||||
| G.is_rendering = false; | G.is_rendering = false; | ||||
| } | } | ||||
| #ifdef WITH_FREESTYLE | #ifdef WITH_FREESTYLE | ||||
| ▲ Show 20 Lines • Show All 184 Lines • ▼ Show 20 Lines | |||||
| BLI_timecode_string_from_time_simple(name, sizeof(name), re->i.lastframetime); | BLI_timecode_string_from_time_simple(name, sizeof(name), re->i.lastframetime); | ||||
| printf(" Time: %s", name); | printf(" Time: %s", name); | ||||
| /* Flush stdout to be sure python callbacks are printing stuff after blender. */ | /* Flush stdout to be sure python callbacks are printing stuff after blender. */ | ||||
| fflush(stdout); | fflush(stdout); | ||||
| /* NOTE: using G_MAIN seems valid here??? | /* NOTE: using G_MAIN seems valid here??? | ||||
| * Not sure it's actually even used anyway, we could as well pass NULL? */ | * Not sure it's actually even used anyway, we could as well pass NULL? */ | ||||
| render_callback_exec_null(re, G_MAIN, BKE_CB_EVT_RENDER_STATS); | BKE_callback_exec(G_MAIN, NULL, BKE_CB_EVT_RENDER_STATS); | ||||
| BLI_timecode_string_from_time_simple(name, sizeof(name), re->i.lastframetime - render_time); | BLI_timecode_string_from_time_simple(name, sizeof(name), re->i.lastframetime - render_time); | ||||
| printf(" (Saving: %s)\n", name); | printf(" (Saving: %s)\n", name); | ||||
| fputc('\n', stdout); | fputc('\n', stdout); | ||||
| fflush(stdout); /* needed for renderd !! (not anymore... (ton)) */ | fflush(stdout); /* needed for renderd !! (not anymore... (ton)) */ | ||||
| return ok; | return ok; | ||||
| ▲ Show 20 Lines • Show All 49 Lines • ▼ Show 20 Lines | |||||
| bMovieHandle *mh = NULL; | bMovieHandle *mh = NULL; | ||||
| const int cfrao = rd.cfra; | const int cfrao = rd.cfra; | ||||
| int nfra, totrendered = 0, totskipped = 0; | int nfra, totrendered = 0, totskipped = 0; | ||||
| const int totvideos = BKE_scene_multiview_num_videos_get(&rd); | const int totvideos = BKE_scene_multiview_num_videos_get(&rd); | ||||
| const bool is_movie = BKE_imtype_is_movie(rd.im_format.imtype); | const bool is_movie = BKE_imtype_is_movie(rd.im_format.imtype); | ||||
| const bool is_multiview_name = ((rd.scemode & R_MULTIVIEW) != 0 && | const bool is_multiview_name = ((rd.scemode & R_MULTIVIEW) != 0 && | ||||
| (rd.im_format.views_format == R_IMF_VIEWS_INDIVIDUAL)); | (rd.im_format.views_format == R_IMF_VIEWS_INDIVIDUAL)); | ||||
| render_callback_exec_id(re, re->main, &scene->id, BKE_CB_EVT_RENDER_INIT); | BKE_callback_exec(re->main, (ID *)scene, BKE_CB_EVT_RENDER_INIT); | ||||
| /* do not fully call for each frame, it initializes & pops output window */ | /* do not fully call for each frame, it initializes & pops output window */ | ||||
| if (!render_initialize_from_main(re, &rd, bmain, scene, single_layer, camera_override, 0, 1)) { | if (!render_initialize_from_main(re, &rd, bmain, scene, single_layer, camera_override, 0, 1)) { | ||||
| return; | return; | ||||
| } | } | ||||
| render_init_depsgraph(re); | render_init_depsgraph(re); | ||||
| ▲ Show 20 Lines • Show All 148 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| re->r.cfra = scene->r.cfra; /* weak.... */ | re->r.cfra = scene->r.cfra; /* weak.... */ | ||||
| /* run callbacks before rendering, before the scene is updated */ | /* run callbacs before rendering, before the scene is updated */ | ||||
| render_callback_exec_id(re, re->main, &scene->id, BKE_CB_EVT_RENDER_PRE); | BKE_callback_exec(re->main, (ID *)scene, BKE_CB_EVT_RENDER_PRE); | ||||
| do_render_all_options(re); | do_render_all_options(re); | ||||
| totrendered++; | totrendered++; | ||||
| if (re->test_break(re->tbh) == 0) { | if (re->test_break(re->tbh) == 0) { | ||||
| if (!G.is_break) { | if (!G.is_break) { | ||||
| if (!do_write_image_or_movie(re, bmain, scene, mh, totvideos, NULL)) { | if (!do_write_image_or_movie(re, bmain, scene, mh, totvideos, NULL)) { | ||||
| G.is_break = true; | G.is_break = true; | ||||
| Show All 34 Lines | |||||
| } | } | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| if (G.is_break == false) { | if (G.is_break == false) { | ||||
| /* keep after file save */ | /* keep after file save */ | ||||
| render_callback_exec_id(re, re->main, &scene->id, BKE_CB_EVT_RENDER_POST); | BKE_callback_exec(re->main, (ID *)scene, BKE_CB_EVT_RENDER_POST); | ||||
| render_callback_exec_id(re, re->main, &scene->id, BKE_CB_EVT_RENDER_WRITE); | BKE_callback_exec(re->main, (ID *)scene, BKE_CB_EVT_RENDER_WRITE); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /* end movie */ | /* end movie */ | ||||
| if (is_movie) { | if (is_movie) { | ||||
| re_movie_free_all(re, mh, totvideos); | re_movie_free_all(re, mh, totvideos); | ||||
| } | } | ||||
| if (totskipped && totrendered == 0) { | if (totskipped && totrendered == 0) { | ||||
| BKE_report(re->reports, RPT_INFO, "No frames rendered, skipped to not overwrite"); | BKE_report(re->reports, RPT_INFO, "No frames rendered, skipped to not overwrite"); | ||||
| } | } | ||||
| scene->r.cfra = cfrao; | scene->r.cfra = cfrao; | ||||
| re->flag &= ~R_ANIMATION; | re->flag &= ~R_ANIMATION; | ||||
| render_callback_exec_id(re, | BKE_callback_exec( | ||||
| re->main, | re->main, (ID *)scene, G.is_break ? BKE_CB_EVT_RENDER_CANCEL : BKE_CB_EVT_RENDER_COMPLETE); | ||||
| &scene->id, | |||||
| G.is_break ? BKE_CB_EVT_RENDER_CANCEL : BKE_CB_EVT_RENDER_COMPLETE); | |||||
| BKE_sound_reset_scene_specs(re->pipeline_scene_eval); | BKE_sound_reset_scene_specs(re->pipeline_scene_eval); | ||||
| RE_CleanAfterRender(re); | RE_CleanAfterRender(re); | ||||
| /* UGLY WARNING */ | /* UGLY WARNING */ | ||||
| G.is_rendering = false; | G.is_rendering = false; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 92 Lines • Show Last 20 Lines | |||||