diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/transform/transform_convert_sequencer.c | 15 | ||||
-rw-r--r-- | source/blender/sequencer/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/sequencer/SEQ_iterator.h | 1 | ||||
-rw-r--r-- | source/blender/sequencer/intern/iterator.c | 8 | ||||
-rw-r--r-- | source/blender/sequencer/intern/strip_transform.c | 10 |
5 files changed, 27 insertions, 8 deletions
diff --git a/source/blender/editors/transform/transform_convert_sequencer.c b/source/blender/editors/transform/transform_convert_sequencer.c index 17512c79d03..45ed0f3b664 100644 --- a/source/blender/editors/transform/transform_convert_sequencer.c +++ b/source/blender/editors/transform/transform_convert_sequencer.c @@ -400,15 +400,14 @@ static void seq_transform_handle_overlap(TransInfo *t, SeqCollection *transforme if (seq_transform_check_strip_effects(transformed_strips)) { /* Update effect strips based on strips just moved in time. */ seq_transform_update_effects(t, transformed_strips); + } - /* If any effects still overlap, we need to move them up. */ - Sequence *seq; - SEQ_ITERATOR_FOREACH (seq, transformed_strips) { - if ((seq->type & SEQ_TYPE_EFFECT) && seq->seq1) { - if (SEQ_transform_test_overlap(seqbasep, seq)) { - SEQ_transform_seqbase_shuffle(seqbasep, seq, t->scene); - } - } + /* If any effects still overlap, we need to move them up. + * In some cases other strips can be overlapping still, see T90646. */ + Sequence *seq; + SEQ_ITERATOR_FOREACH (seq, transformed_strips) { + if (SEQ_transform_test_overlap(seqbasep, seq)) { + SEQ_transform_seqbase_shuffle(seqbasep, seq, t->scene); } } } diff --git a/source/blender/sequencer/CMakeLists.txt b/source/blender/sequencer/CMakeLists.txt index e324bc8b407..f060e6ad69b 100644 --- a/source/blender/sequencer/CMakeLists.txt +++ b/source/blender/sequencer/CMakeLists.txt @@ -33,6 +33,7 @@ set(INC ../render ../windowmanager ../../../intern/atomic + ../../../intern/clog ../../../intern/guardedalloc # dna_type_offsets.h diff --git a/source/blender/sequencer/SEQ_iterator.h b/source/blender/sequencer/SEQ_iterator.h index cb2091511a9..3ade7309f89 100644 --- a/source/blender/sequencer/SEQ_iterator.h +++ b/source/blender/sequencer/SEQ_iterator.h @@ -73,6 +73,7 @@ struct Sequence *SEQ_iterator_yield(SeqIterator *iterator); SeqCollection *SEQ_collection_create(const char *name); SeqCollection *SEQ_collection_duplicate(SeqCollection *collection); uint SEQ_collection_len(const SeqCollection *collection); +bool SEQ_collection_has_strip(const struct Sequence *seq, const SeqCollection *collection); bool SEQ_collection_append_strip(struct Sequence *seq, SeqCollection *data); bool SEQ_collection_remove_strip(struct Sequence *seq, SeqCollection *data); void SEQ_collection_free(SeqCollection *collection); diff --git a/source/blender/sequencer/intern/iterator.c b/source/blender/sequencer/intern/iterator.c index 09f033e70fb..333a8e46c44 100644 --- a/source/blender/sequencer/intern/iterator.c +++ b/source/blender/sequencer/intern/iterator.c @@ -123,6 +123,14 @@ uint SEQ_collection_len(const SeqCollection *collection) } /** + * Check if seq is in collection. + */ +bool SEQ_collection_has_strip(const Sequence *seq, const SeqCollection *collection) +{ + return BLI_gset_haskey(collection->set, seq); +} + +/** * Query strips from seqbase. seq_reference is used by query function as filter condition. * * \param seq_reference: reference strip for query function diff --git a/source/blender/sequencer/intern/strip_transform.c b/source/blender/sequencer/intern/strip_transform.c index c9af2fced65..9f69f434ca0 100644 --- a/source/blender/sequencer/intern/strip_transform.c +++ b/source/blender/sequencer/intern/strip_transform.c @@ -40,6 +40,10 @@ #include "SEQ_time.h" #include "SEQ_transform.h" +#include "CLG_log.h" + +static CLG_LogRef LOG = {"seq.strip_transform"}; + static int seq_tx_get_start(Sequence *seq) { return seq->start; @@ -315,6 +319,12 @@ static int shuffle_seq_time_offset_test(SeqCollection *strips_to_shuffle, if (!seq_overlap(seq, seq_other)) { continue; } + if (UNLIKELY(SEQ_collection_has_strip(seq_other, strips_to_shuffle))) { + CLOG_WARN(&LOG, + "Strip overlaps with itself or another strip, that is to be shuffled." + "This should never happen."); + continue; + } if (dir == 'L') { offset = min_ii(offset, seq_other->startdisp - seq->enddisp); } |