From 59cd9c6da682675c439731781d127b1b02f12a76 Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Fri, 27 Aug 2021 12:59:46 +0200 Subject: VSE: Transform overwrite mode Add mode to overwrite strips on overlap instead of resolving overlap. When overlap is created, 3 things can happen: - On partial overlap, handles of overlapped strip are moved - On complete overlap with smaller strip, overlapped strip is split - On complete overlap with larger strip, overlapped strip is removed This mode can be enabled in header. Reviewed By: fsiddi, mano-wii Differential Revision: https://developer.blender.org/D11805 --- source/blender/sequencer/SEQ_iterator.h | 11 +++++++---- source/blender/sequencer/SEQ_sequencer.h | 1 + source/blender/sequencer/SEQ_transform.h | 1 + source/blender/sequencer/intern/iterator.c | 18 ++++++++++++++++++ source/blender/sequencer/intern/sequencer.c | 8 ++++++++ source/blender/sequencer/intern/strip_transform.c | 6 +++--- 6 files changed, 38 insertions(+), 7 deletions(-) (limited to 'source/blender/sequencer') diff --git a/source/blender/sequencer/SEQ_iterator.h b/source/blender/sequencer/SEQ_iterator.h index 055db07f646..9fca25653e1 100644 --- a/source/blender/sequencer/SEQ_iterator.h +++ b/source/blender/sequencer/SEQ_iterator.h @@ -34,10 +34,12 @@ struct GSet; struct GSetIterator; struct Sequence; -#define SEQ_ITERATOR_FOREACH(var, collection) \ - for (SeqIterator iter = {{{NULL}}}; \ - SEQ_iterator_ensure(collection, &iter, &var) && var != NULL; \ - var = SEQ_iterator_yield(&iter)) +#define SEQ_ITERATOR_FOREACH_IMPL(var, collection, suffix) \ + for (SeqIterator iter##suffix = {{{NULL}}}; \ + SEQ_iterator_ensure(collection, &iter##suffix, &var) && var != NULL; \ + var = SEQ_iterator_yield(&iter##suffix)) + +#define SEQ_ITERATOR_FOREACH(var, collection) SEQ_ITERATOR_FOREACH_IMPL(var, collection, __LINE__) typedef struct SeqCollection { struct GSet *set; @@ -79,6 +81,7 @@ SeqCollection *SEQ_query_by_reference(struct Sequence *seq_reference, struct ListBase *seqbase, SeqCollection *collection)); SeqCollection *SEQ_query_selected_strips(struct ListBase *seqbase); +SeqCollection *SEQ_query_unselected_strips(struct ListBase *seqbase); SeqCollection *SEQ_query_all_strips(struct ListBase *seqbase); SeqCollection *SEQ_query_all_strips_recursive(struct ListBase *seqbase); void SEQ_query_strip_effect_chain(struct Sequence *seq_reference, diff --git a/source/blender/sequencer/SEQ_sequencer.h b/source/blender/sequencer/SEQ_sequencer.h index 54ef37b9049..15fe0be3571 100644 --- a/source/blender/sequencer/SEQ_sequencer.h +++ b/source/blender/sequencer/SEQ_sequencer.h @@ -63,6 +63,7 @@ void SEQ_tool_settings_fit_method_set(struct Scene *scene, eSeqImageFitMethod fi short SEQ_tool_settings_snap_flag_get(struct Scene *scene); short SEQ_tool_settings_snap_mode_get(struct Scene *scene); int SEQ_tool_settings_snap_distance_get(struct Scene *scene); +eSeqOverlapMode SEQ_tool_settings_overlap_mode_get(struct Scene *scene); struct SequencerToolSettings *SEQ_tool_settings_copy(struct SequencerToolSettings *tool_settings); struct Editing *SEQ_editing_get(struct Scene *scene, bool alloc); struct Editing *SEQ_editing_ensure(struct Scene *scene); diff --git a/source/blender/sequencer/SEQ_transform.h b/source/blender/sequencer/SEQ_transform.h index 9ff827333be..1977835f627 100644 --- a/source/blender/sequencer/SEQ_transform.h +++ b/source/blender/sequencer/SEQ_transform.h @@ -41,6 +41,7 @@ bool SEQ_transform_sequence_can_be_translated(struct Sequence *seq); bool SEQ_transform_single_image_check(struct Sequence *seq); void SEQ_transform_fix_single_image_seq_offsets(struct Sequence *seq); bool SEQ_transform_test_overlap(struct ListBase *seqbasep, struct Sequence *test); +bool SEQ_transform_test_overlap_seq_seq(struct Sequence *seq1, struct Sequence *seq2); void SEQ_transform_translate_sequence(struct Scene *scene, struct Sequence *seq, int delta); bool SEQ_transform_seqbase_shuffle_ex(struct ListBase *seqbasep, struct Sequence *test, diff --git a/source/blender/sequencer/intern/iterator.c b/source/blender/sequencer/intern/iterator.c index a9cbf4879f1..58f68205f51 100644 --- a/source/blender/sequencer/intern/iterator.c +++ b/source/blender/sequencer/intern/iterator.c @@ -340,6 +340,24 @@ SeqCollection *SEQ_query_selected_strips(ListBase *seqbase) return collection; } +/** + * Query all unselected strips in seqbase. + * + * \param seqbase: ListBase in which strips are queried + * \return strip collection + */ +SeqCollection *SEQ_query_unselected_strips(ListBase *seqbase) +{ + SeqCollection *collection = SEQ_collection_create(__func__); + LISTBASE_FOREACH (Sequence *, seq, seqbase) { + if ((seq->flag & SELECT) != 0) { + continue; + } + SEQ_collection_append_strip(seq, collection); + } + return collection; +} + /** * Query all effect strips that are directly or indirectly connected to seq_reference. * This includes all effects of seq_reference, strips used by another inputs and their effects, so diff --git a/source/blender/sequencer/intern/sequencer.c b/source/blender/sequencer/intern/sequencer.c index 2863af8fb2e..a62b76cd832 100644 --- a/source/blender/sequencer/intern/sequencer.c +++ b/source/blender/sequencer/intern/sequencer.c @@ -323,6 +323,8 @@ SequencerToolSettings *SEQ_tool_settings_init(void) tool_settings->snap_mode = SEQ_SNAP_TO_STRIPS | SEQ_SNAP_TO_CURRENT_FRAME | SEQ_SNAP_TO_STRIP_HOLD; tool_settings->snap_distance = 15; + tool_settings->overlap_mode = SEQ_OVERLAP_SHUFFLE; + return tool_settings; } @@ -372,6 +374,12 @@ void SEQ_tool_settings_fit_method_set(Scene *scene, eSeqImageFitMethod fit_metho tool_settings->fit_method = fit_method; } +eSeqOverlapMode SEQ_tool_settings_overlap_mode_get(Scene *scene) +{ + const SequencerToolSettings *tool_settings = SEQ_tool_settings_ensure(scene); + return tool_settings->overlap_mode; +} + /** * Get seqbase that is being viewed currently. This can be main seqbase or meta strip seqbase * diff --git a/source/blender/sequencer/intern/strip_transform.c b/source/blender/sequencer/intern/strip_transform.c index 9f69f434ca0..3a5f93a72b0 100644 --- a/source/blender/sequencer/intern/strip_transform.c +++ b/source/blender/sequencer/intern/strip_transform.c @@ -208,7 +208,7 @@ bool SEQ_transform_sequence_can_be_translated(Sequence *seq) return !(seq->type & SEQ_TYPE_EFFECT) || (SEQ_effect_get_num_inputs(seq->type) == 0); } -static bool seq_overlap(Sequence *seq1, Sequence *seq2) +bool SEQ_transform_test_overlap_seq_seq(Sequence *seq1, Sequence *seq2) { return (seq1 != seq2 && seq1->machine == seq2->machine && ((seq1->enddisp <= seq2->startdisp) || (seq1->startdisp >= seq2->enddisp)) == 0); @@ -220,7 +220,7 @@ bool SEQ_transform_test_overlap(ListBase *seqbasep, Sequence *test) seq = seqbasep->first; while (seq) { - if (seq_overlap(test, seq)) { + if (SEQ_transform_test_overlap_seq_seq(test, seq)) { return true; } @@ -316,7 +316,7 @@ static int shuffle_seq_time_offset_test(SeqCollection *strips_to_shuffle, SEQ_ITERATOR_FOREACH (seq, strips_to_shuffle) { LISTBASE_FOREACH (Sequence *, seq_other, seqbasep) { - if (!seq_overlap(seq, seq_other)) { + if (!SEQ_transform_test_overlap_seq_seq(seq, seq_other)) { continue; } if (UNLIKELY(SEQ_collection_has_strip(seq_other, strips_to_shuffle))) { -- cgit v1.2.3