Merge branch 'blender-v2.83-release'

This commit is contained in:
Richard Antalik 2020-05-10 08:05:03 +02:00
commit 78296366df
3 changed files with 74 additions and 0 deletions

View File

@ -35,6 +35,7 @@ struct GSet;
struct ImBuf;
struct Main;
struct Mask;
struct ReportList;
struct Scene;
struct Sequence;
struct SequenceModifierData;
@ -612,6 +613,7 @@ void BKE_sequencer_color_balance_apply(struct StripColorBalance *cb,
struct ImBuf *mask_input);
void BKE_sequencer_all_free_anim_ibufs(struct Scene *scene, int cfra);
bool BKE_sequencer_check_scene_recursion(struct Scene *scene, struct ReportList *reports);
#ifdef __cplusplus
}

View File

@ -39,6 +39,7 @@
#include "DNA_sequence_types.h"
#include "DNA_sound_types.h"
#include "DNA_space_types.h"
#include "DNA_windowmanager_types.h"
#include "BLI_fileops.h"
#include "BLI_linklist.h"
@ -69,6 +70,7 @@
#include "BKE_main.h"
#include "BKE_mask.h"
#include "BKE_movieclip.h"
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_sequencer.h"
#include "BKE_sequencer_offscreen.h"
@ -3468,6 +3470,11 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context,
return NULL;
}
/* Prevent rendering scene recursively. */
if (seq->scene == context->scene) {
return NULL;
}
scene = seq->scene;
frame = (double)scene->r.sfra + (double)nr + (double)seq->anim_startofs;
@ -5961,3 +5968,62 @@ void BKE_sequencer_all_free_anim_ibufs(Scene *scene, int cfra)
sequencer_all_free_anim_ibufs(&ed->seqbase, cfra);
BKE_sequencer_cache_cleanup(scene);
}
static bool sequencer_seq_generates_image(Sequence *seq)
{
switch (seq->type) {
case SEQ_TYPE_IMAGE:
case SEQ_TYPE_SCENE:
case SEQ_TYPE_MOVIE:
case SEQ_TYPE_MOVIECLIP:
case SEQ_TYPE_MASK:
case SEQ_TYPE_COLOR:
case SEQ_TYPE_TEXT:
return true;
}
return false;
}
static Sequence *sequencer_check_scene_recursion(Scene *scene, ListBase *seqbase)
{
LISTBASE_FOREACH (Sequence *, seq, seqbase) {
if (seq->type == SEQ_TYPE_SCENE && seq->scene == scene) {
return seq;
}
if (seq->type == SEQ_TYPE_META && sequencer_check_scene_recursion(scene, &seq->seqbase)) {
return seq;
}
}
return NULL;
}
bool BKE_sequencer_check_scene_recursion(Scene *scene, ReportList *reports)
{
Editing *ed = BKE_sequencer_editing_get(scene, false);
if (ed == NULL) {
return false;
}
Sequence *recursive_seq = sequencer_check_scene_recursion(scene, &ed->seqbase);
if (recursive_seq != NULL) {
BKE_reportf(reports,
RPT_WARNING,
"Recursion detected in video sequencer. Strip %s at frame %d will not be rendered",
recursive_seq->name + 2,
recursive_seq->startdisp);
LISTBASE_FOREACH (Sequence *, seq, &ed->seqbase) {
if (seq->type != SEQ_TYPE_SCENE && sequencer_seq_generates_image(seq)) {
/* There are other strips to render, so render them. */
return false;
}
}
/* No other strips to render - cancel operator. */
return true;
}
return false;
}

View File

@ -945,6 +945,12 @@ static int screen_render_invoke(bContext *C, wmOperator *op, const wmEvent *even
return OPERATOR_CANCELLED;
}
/* Reports are done inside check function, and it will return false if there are other strips to
* render. */
if ((scene->r.scemode & R_DOSEQ) && BKE_sequencer_check_scene_recursion(scene, op->reports)) {
return OPERATOR_CANCELLED;
}
/* stop all running jobs, except screen one. currently previews frustrate Render */
WM_jobs_kill_all_except(CTX_wm_manager(C), CTX_wm_screen(C));