Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Antalik <richardantalik@gmail.com>2021-05-19 23:59:33 +0300
committerRichard Antalik <richardantalik@gmail.com>2021-05-19 23:59:33 +0300
commit0b7744f4da666bccf2005ad0d0e77c5ddc73bfd5 (patch)
tree680fd9939df062cd585aa1d994544a47eaf104b7 /source/blender/sequencer/intern/strip_time.c
parent97cf2a9fb1070614a7428974dd763b4de988d272 (diff)
VSE: Fix rendering inconsistency
Fix issue described in T87678, which was partially a bug and partially change in intended(at least as far as I can tell) behaior. Function `evaluate_seq_frame_gen` that was partially responsible for filtering strips in stack for rendering wasn't working correctly. Intended functionality seems to be removing all effect inputs from stack as it is unlikely that user would want these to be blended in. However there was logic to exclude effects placed into same input, which because of weak implementation caused, that any effect input, that is effect as well will be considered to be part of stack to be blended in. This bug was apparently used to produce effects like glow over original image. Even though this is originally unintended, I have kept this logic, but I have made it explicit. Another change is request made in T87678 to make it possible to keep effect inputs as part of stack when they are placed above the effect, which would imply that blending is intended. This change is again explicitly defined. Whole implementation has been refactored, so logic is consolidated and code should be as explicit as possible and more readable. `must_render_strip function` may be still quite hard to read, not sure if I can make it nicer. Last change is for remove gaps feature code - it used same rendering code, which may be reason why its logic was split in first place. Now it uses sequencer iterator, which will definitely be faster than original code, but I could have used `LISTBASE_FOREACH` in this case. Reviewed By: sergey Differential Revision: https://developer.blender.org/D11301
Diffstat (limited to 'source/blender/sequencer/intern/strip_time.c')
-rw-r--r--source/blender/sequencer/intern/strip_time.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/source/blender/sequencer/intern/strip_time.c b/source/blender/sequencer/intern/strip_time.c
index a7a6e2595be..40d7fade308 100644
--- a/source/blender/sequencer/intern/strip_time.c
+++ b/source/blender/sequencer/intern/strip_time.c
@@ -36,6 +36,7 @@
#include "IMB_imbuf.h"
+#include "SEQ_iterator.h"
#include "SEQ_render.h"
#include "SEQ_sequencer.h"
#include "SEQ_time.h"
@@ -404,6 +405,17 @@ void SEQ_timeline_boundbox(const Scene *scene, const ListBase *seqbase, rctf *re
}
}
+static bool strip_exists_at_frame(SeqCollection *all_strips, const int timeline_frame)
+{
+ Sequence *seq;
+ SEQ_ITERATOR_FOREACH (seq, all_strips) {
+ if ((seq->startdisp <= timeline_frame) && (seq->enddisp > timeline_frame)) {
+ return true;
+ }
+ }
+ return false;
+}
+
/**
* Find first gap between strips after initial_frame and describe it by filling data of r_gap_info
*
@@ -425,10 +437,12 @@ void seq_time_gap_info_get(const Scene *scene,
int timeline_frame = initial_frame;
r_gap_info->gap_exists = false;
- if (SEQ_render_evaluate_frame(seqbase, initial_frame) == 0) {
+ SeqCollection *collection = SEQ_query_all_strips(seqbase);
+
+ if (!strip_exists_at_frame(collection, initial_frame)) {
/* Search backward for gap_start_frame. */
for (; timeline_frame >= sfra; timeline_frame--) {
- if (SEQ_render_evaluate_frame(seqbase, timeline_frame) != 0) {
+ if (strip_exists_at_frame(collection, timeline_frame)) {
break;
}
}
@@ -438,7 +452,7 @@ void seq_time_gap_info_get(const Scene *scene,
else {
/* Search forward for gap_start_frame. */
for (; timeline_frame <= efra; timeline_frame++) {
- if (SEQ_render_evaluate_frame(seqbase, timeline_frame) == 0) {
+ if (!strip_exists_at_frame(collection, timeline_frame)) {
r_gap_info->gap_start_frame = timeline_frame;
break;
}
@@ -446,7 +460,7 @@ void seq_time_gap_info_get(const Scene *scene,
}
/* Search forward for gap_end_frame. */
for (; timeline_frame <= efra; timeline_frame++) {
- if (SEQ_render_evaluate_frame(seqbase, timeline_frame) != 0) {
+ if (strip_exists_at_frame(collection, timeline_frame)) {
const int gap_end_frame = timeline_frame;
r_gap_info->gap_length = gap_end_frame - r_gap_info->gap_start_frame;
r_gap_info->gap_exists = true;