Commit: 59cd9c6da682675c439731781d127b1b02f12a76 Author: Richard Antalik Date: Fri Aug 27 12:59:46 2021 +0200 Branches: master https://developer.blender.org/rB59cd9c6da682675c439731781d127b1b02f12a76
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 =================================================================== M release/scripts/startup/bl_ui/space_sequencer.py M source/blender/blenkernel/BKE_blender_version.h M source/blender/blenloader/intern/versioning_300.c M source/blender/editors/space_sequencer/sequencer_draw.c M source/blender/editors/transform/transform_convert_sequencer.c M source/blender/editors/transform/transform_mode_edge_seq_slide.c M source/blender/makesdna/DNA_scene_types.h M source/blender/makesrna/intern/rna_scene.c M source/blender/sequencer/SEQ_iterator.h M source/blender/sequencer/SEQ_sequencer.h M source/blender/sequencer/SEQ_transform.h M source/blender/sequencer/intern/iterator.c M source/blender/sequencer/intern/sequencer.c M source/blender/sequencer/intern/strip_transform.c =================================================================== diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py index 20fb39e8c1f..79c1cb973ca 100644 --- a/release/scripts/startup/bl_ui/space_sequencer.py +++ b/release/scripts/startup/bl_ui/space_sequencer.py @@ -150,6 +150,9 @@ class SEQUENCER_HT_header(Header): if st.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}: tool_settings = context.tool_settings + sequencer_tool_settings = tool_settings.sequencer_tool_settings + row = layout.row(align=True) + row.prop(sequencer_tool_settings, "overlap_mode", text="") row = layout.row(align=True) row.prop(tool_settings, "use_snap_sequencer", text="") sub = row.row(align=True) diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index 4ed4225c836..315a77499e5 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -39,7 +39,7 @@ extern "C" { /* Blender file format version. */ #define BLENDER_FILE_VERSION BLENDER_VERSION -#define BLENDER_FILE_SUBVERSION 18 +#define BLENDER_FILE_SUBVERSION 19 /* Minimum Blender version that supports reading file written with the current * version. Older Blender versions will test this and show a warning if the file diff --git a/source/blender/blenloader/intern/versioning_300.c b/source/blender/blenloader/intern/versioning_300.c index 72572b05ef6..aee6d798799 100644 --- a/source/blender/blenloader/intern/versioning_300.c +++ b/source/blender/blenloader/intern/versioning_300.c @@ -776,18 +776,7 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain) } } - /** - * Versioning code until next subversion bump goes here. - * - * \note Be sure to check when bumping the version: - * - "versioning_userdef.c", #blo_do_versions_userdef - * - "versioning_userdef.c", #do_versions_theme - * - * \note Keep this message at the bottom of the function. - */ - { - /* Keep this block, even when empty. */ - + if (!MAIN_VERSION_ATLEAST(bmain, 300, 19)) { /* Add node storage for subdivision surface node. */ FOREACH_NODETREE_BEGIN (bmain, ntree, id) { if (ntree->type == NTREE_GEOMETRY) { @@ -818,5 +807,23 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain) } } } + + LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { + SequencerToolSettings *sequencer_tool_settings = SEQ_tool_settings_ensure(scene); + sequencer_tool_settings->overlap_mode = SEQ_OVERLAP_SHUFFLE; + } + } + + /** + * Versioning code until next subversion bump goes here. + * + * \note Be sure to check when bumping the version: + * - "versioning_userdef.c", #blo_do_versions_userdef + * - "versioning_userdef.c", #do_versions_theme + * + * \note Keep this message at the bottom of the function. + */ + { + /* Keep this block, even when empty. */ } } diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c index b3c39e2fa6f..fe3ff469e50 100644 --- a/source/blender/editors/space_sequencer/sequencer_draw.c +++ b/source/blender/editors/space_sequencer/sequencer_draw.c @@ -737,7 +737,8 @@ static void draw_seq_handle(View2D *v2d, } } -static void draw_seq_outline(Sequence *seq, +static void draw_seq_outline(Scene *scene, + Sequence *seq, uint pos, float x1, float x2, @@ -765,7 +766,9 @@ static void draw_seq_outline(Sequence *seq, * - Slightly lighter. * - Red when overlapping with other strips. */ - if ((G.moving & G_TRANSFORM_SEQ) && (seq->flag & SELECT)) { + const eSeqOverlapMode overlap_mode = SEQ_tool_settings_overlap_mode_get(scene); + if ((G.moving & G_TRANSFORM_SEQ) && (seq->flag & SELECT) && + overlap_mode != SEQ_OVERLAP_OVERWRITE) { if (seq->flag & SEQ_OVERLAP) { col[0] = 255; col[1] = col[2] = 33; @@ -1383,7 +1386,7 @@ static void draw_seq_strip(const bContext *C, v2d, seq, handsize_clamped, SEQ_RIGHTHANDLE, pos, seq_active, pixelx, y_threshold); } - draw_seq_outline(seq, pos, x1, x2, y1, y2, pixelx, pixely, seq_active); + draw_seq_outline(scene, seq, pos, x1, x2, y1, y2, pixelx, pixely, seq_active); immUnbindProgram(); diff --git a/source/blender/editors/transform/transform_convert_sequencer.c b/source/blender/editors/transform/transform_convert_sequencer.c index 45ed0f3b664..9548498f0b8 100644 --- a/source/blender/editors/transform/transform_convert_sequencer.c +++ b/source/blender/editors/transform/transform_convert_sequencer.c @@ -29,10 +29,13 @@ #include "BLI_math.h" #include "BKE_context.h" +#include "BKE_main.h" #include "BKE_report.h" #include "ED_markers.h" +#include "SEQ_edit.h" +#include "SEQ_effects.h" #include "SEQ_iterator.h" #include "SEQ_relations.h" #include "SEQ_sequencer.h" @@ -341,12 +344,17 @@ static bool seq_transform_check_strip_effects(SeqCollection *transformed_strips) return false; } +static ListBase *seqbase_active_get(const TransInfo *t) +{ + Editing *ed = SEQ_editing_get(t->scene, false); + return SEQ_active_seqbase_get(ed); +} + /* Offset all strips positioned after left edge of transformed strips boundbox by amount equal * to overlap of transformed strips. */ static void seq_transform_handle_expand_to_fit(TransInfo *t, SeqCollection *transformed_strips) { - Editing *ed = SEQ_editing_get(t->scene, false); - ListBase *seqbasep = SEQ_active_seqbase_get(ed); + ListBase *seqbasep = seqbase_active_get(t); ListBase *markers = &t->scene->markers; const bool use_sync_markers = (((SpaceSeq *)t->area->spacedata.first)->flag & SEQ_MARKER_TRANS) != 0; @@ -378,23 +386,178 @@ static void seq_transform_handle_expand_to_fit(TransInfo *t, SeqCollection *tran SEQ_collection_free(right_side_strips); } -static void seq_transform_handle_overlap(TransInfo *t, SeqCollection *transformed_strips) +static SeqCollection *query_overwrite_targets(const TransInfo *t, + SeqCollection *transformed_strips) { - Editing *ed = SEQ_editing_get(t->scene, false); - ListBase *seqbasep = SEQ_active_seqbase_get(ed); + SeqCollection *collection = SEQ_query_unselected_strips(seqbase_active_get(t)); + + Sequence *seq, *seq_transformed; + SEQ_ITERATOR_FOREACH (seq, collection) { + bool does_overlap = false; - if (t->flag & T_ALT_TRANSFORM) { - seq_transform_handle_expand_to_fit(t, transformed_strips); + SEQ_ITERATOR_FOREACH (seq_transformed, transformed_strips) { + /* Effects of transformed strips can be unselected. These must not be included. */ + if (seq == seq_transformed) { + SEQ_collection_remove_strip(seq, collection); + } + if (SEQ_transform_test_overlap_seq_seq(seq, seq_transformed)) { + does_overlap = true; + } + } + + if (!does_overlap) { + SEQ_collection_remove_strip(seq, collection); + } } - else { - ListBase *markers = &t->scene->markers; - const bool use_sync_markers = (((SpaceSeq *)t->area->spacedata.first)->flag & - SEQ_MARKER_TRANS) != 0; - /* Shuffle non strips with no effects attached. */ - SeqCollection *standalone_strips = extract_standalone_strips(transformed_strips); - SEQ_transform_seqbase_shuffle_time( - standalone_strips, seqbasep, t->scene, markers, use_sync_markers); - SEQ_collection_free(standalone_strips); + + return collection; +} + +typedef enum eOvelapDescrition { + /* No overlap. */ + STRIP_OVERLAP_NONE, + /* Overlapping strip covers overlapped completely. */ + STRIP_OVERLAP_IS_FULL, + /* Overlapping strip is inside overlapped. */ + STRIP_OVERLAP_IS_INSIDE, + /* Partial overlap between 2 strips. */ + STRIP_OVERLAP_LEFT_SIDE, + STRIP_OVERLAP_RIGHT_SIDE, +} eOvelapDescrition; + +static eOvelapDescrition overlap_description_get(const Sequence *transformed, + const Sequence *target) +{ + if (transformed->startdisp <= target->startdisp && transformed->enddisp >= target->enddisp) { + return STRIP_OVERLAP_IS_FULL; + } + if (transformed->startdisp > target->startdisp && transformed->enddisp < target->enddisp) { + return STRIP_OVERLAP_IS_INSIDE; + } + if (transformed->startdisp <= target->startdisp && target->startdisp <= transformed->enddisp) { + return STRIP_OVERLAP_LEFT_SIDE; + } + if (transformed->startdisp <= target->enddisp && target->enddisp <= transformed->enddisp) { + return STRIP_OVERLAP_RIGHT_SIDE; + } + return STRIP_OVERLAP_NONE; +} + +/* Split strip in 3 parts, remove middle part and fit transformed inside. */ +static void seq_transform_handle_overwrite_split(const TransInfo *t, + const Sequence *transformed, + Sequence *target) +{ + Main *bmain = CTX_data_main(t->context); + Scene *scene = t->scene; + ListBase *seqbase = seqbase_active_get(t); + + Sequence *split_strip = SEQ_edit_strip_split( + bmain, scene, seqbase, target, transformed->startdisp, SEQ_SPLIT_SOFT, NULL); + SEQ_edit_strip_split( + bmain, scene, seqbase, split_strip, transformed->enddisp, SEQ_SPLIT_SOFT, NULL); + SEQ_edit_flag_for_removal(scene, seqbase_active_get(t), split_strip); +} + +/* Trim strips by adjusting handle position. + * This is bit more complicated in case overlap happens on effect. */ +static void seq_transform_handle_overwrite_trim(const TransInfo *t, + const Sequence *transformed, + Sequence *target, + const eOvelapDescrition overlap) +{ + SeqCollection *targets = SEQ_query_by_reference( + target, seqbase_active_get(t), SEQ_query_strip_effect_chain); + + /* Expand collection by adding all target's children, effects and their children. */ + if ((target->type & SEQ_TYPE @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
