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
This commit is contained in:
Thomas Lachmann 2021-06-14 13:44:18 +02:00 committed by Brecht Van Lommel
parent ada47c4772
commit b84707df17
Notes: blender-bot 2023-02-14 07:45:38 +01:00
Referenced by issue #88529, Impossible to avoid Blender create a image file when baking the animation to a own scene format.
3 changed files with 52 additions and 27 deletions

View File

@ -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);

View File

@ -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

View File

@ -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);
}