Commit: 121fa8b997c900edef9ffaf7307a64ffe0679177 Author: Thomas Lachmann Date: Mon Jun 14 13:44:18 2021 +0200 Branches: override-recursive-resync https://developer.blender.org/rB121fa8b997c900edef9ffaf7307a64ffe0679177
Python API: option for render engines to disable image file saving For some custom rendering engines it's advantageous not to write the image files to disk. An example would be a network rendering engine which does it's own image writing. This feature is only supported when bl_use_postprocess is also disabled, since render engines can't influence the saving behavior of the sequencer or compositor. Differential Revision: https://developer.blender.org/D11512 =================================================================== M source/blender/makesrna/intern/rna_render.c M source/blender/render/RE_engine.h M source/blender/render/intern/pipeline.c =================================================================== diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c index dd91a5509f5..6715941ae2a 100644 --- a/source/blender/makesrna/intern/rna_render.c +++ b/source/blender/makesrna/intern/rna_render.c @@ -856,6 +856,15 @@ static void rna_def_render_engine(BlenderRNA *brna) "Use Custom Freestyle", "Handles freestyle rendering on its own, instead of delegating it to EEVEE"); + prop = RNA_def_property(srna, "bl_use_image_save", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "type->flag", RE_USE_NO_IMAGE_SAVE); + RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); + RNA_def_property_ui_text( + prop, + "Use Image Save", + "Save images/movie to disk while rendering an animation. " + "Disabling image saving is only supported when bl_use_postprocess is also disabled"); + prop = RNA_def_property(srna, "bl_use_gpu_context", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "type->flag", RE_USE_GPU_CONTEXT); RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); diff --git a/source/blender/render/RE_engine.h b/source/blender/render/RE_engine.h index 7352ac7b12e..6b2861bbefd 100644 --- a/source/blender/render/RE_engine.h +++ b/source/blender/render/RE_engine.h @@ -65,6 +65,7 @@ extern "C" { #define RE_USE_STEREO_VIEWPORT 256 #define RE_USE_GPU_CONTEXT 512 #define RE_USE_CUSTOM_FREESTYLE 1024 +#define RE_USE_NO_IMAGE_SAVE 2048 /* RenderEngine.flag */ #define RE_ENGINE_ANIMATION 1 diff --git a/source/blender/render/intern/pipeline.c b/source/blender/render/intern/pipeline.c index a39214b609d..20f868ca86f 100644 --- a/source/blender/render/intern/pipeline.c +++ b/source/blender/render/intern/pipeline.c @@ -2215,35 +2215,42 @@ static int do_write_image_or_movie(Render *re, RenderResult rres; double render_time; bool ok = true; + RenderEngineType *re_type = RE_engines_find(re->r.engine); - RE_AcquireResultImageViews(re, &rres); + /* Only disable file writing if postprocessing is also disabled. */ + const bool do_write_file = !(re_type->flag & RE_USE_NO_IMAGE_SAVE) || + (re_type->flag & RE_USE_POSTPROCESS); - /* write movie or image */ - if (BKE_imtype_is_movie(scene->r.im_format.imtype)) { - RE_WriteRenderViewsMovie( - re->reports, &rres, scene, &re->r, mh, re->movie_ctx_arr, totvideos, false); - } - else { - if (name_override) { - BLI_strncpy(name, name_override, sizeof(name)); + if (do_write_file) { + RE_AcquireResultImageViews(re, &rres); + + /* write movie or image */ + if (BKE_imtype_is_movie(scene->r.im_format.imtype)) { + RE_WriteRenderViewsMovie( + re->reports, &rres, scene, &re->r, mh, re->movie_ctx_arr, totvideos, false); } else { - BKE_image_path_from_imformat(name, - scene->r.pic, - BKE_main_blendfile_path(bmain), - scene->r.cfra, - &scene->r.im_format, - (scene->r.scemode & R_EXTENSION) != 0, - true, - NULL); + if (name_override) { + BLI_strncpy(name, name_override, sizeof(name)); + } + else { + BKE_image_path_from_imformat(name, + scene->r.pic, + BKE_main_blendfile_path(bmain), + scene->r.cfra, + &scene->r.im_format, + (scene->r.scemode & R_EXTENSION) != 0, + true, + NULL); + } + + /* write images as individual images or stereo */ + ok = RE_WriteRenderViewsImage(re->reports, &rres, scene, true, name); } - /* write images as individual images or stereo */ - ok = RE_WriteRenderViewsImage(re->reports, &rres, scene, true, name); + RE_ReleaseResultImageViews(re, &rres); } - RE_ReleaseResultImageViews(re, &rres); - render_time = re->i.lastframetime; re->i.lastframetime = PIL_check_seconds_timer() - re->i.starttime; @@ -2257,8 +2264,10 @@ static int do_write_image_or_movie(Render *re, * 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); - BLI_timecode_string_from_time_simple(name, sizeof(name), re->i.lastframetime - render_time); - printf(" (Saving: %s)\n", name); + if (do_write_file) { + BLI_timecode_string_from_time_simple(name, sizeof(name), re->i.lastframetime - render_time); + printf(" (Saving: %s)\n", name); + } fputc('\n', stdout); fflush(stdout); @@ -2330,9 +2339,15 @@ void RE_RenderAnim(Render *re, return; } + RenderEngineType *re_type = RE_engines_find(re->r.engine); + + /* Only disable file writing if postprocessing is also disabled. */ + const bool do_write_file = !(re_type->flag & RE_USE_NO_IMAGE_SAVE) || + (re_type->flag & RE_USE_POSTPROCESS); + render_init_depsgraph(re); - if (is_movie) { + if (is_movie && do_write_file) { size_t width, height; int i; bool is_error = false; @@ -2415,7 +2430,7 @@ void RE_RenderAnim(Render *re, nfra += tfra; /* Touch/NoOverwrite options are only valid for image's */ - if (is_movie == false) { + if (is_movie == false && do_write_file) { if (rd.mode & (R_NO_OVERWRITE | R_TOUCH)) { BKE_image_path_from_imformat(name, rd.pic, @@ -2508,7 +2523,7 @@ void RE_RenderAnim(Render *re, if (G.is_break == true) { /* remove touched file */ - if (is_movie == false) { + if (is_movie == false && do_write_file) { if ((rd.mode & R_TOUCH)) { if (!is_multiview_name) { if ((BLI_file_size(name) == 0)) { @@ -2548,7 +2563,7 @@ void RE_RenderAnim(Render *re, } /* end movie */ - if (is_movie) { + if (is_movie && do_write_file) { re_movie_free_all(re, mh, totvideos); } _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs