From 27b2ab8cf4ae9140ff53d812c142e7d65cbeee11 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 12 Feb 2015 06:18:02 +1100 Subject: Fix VSE strip channel skip overlapping strips D1096 by @mangostaniko (with some edits) --- source/blender/blenkernel/BKE_sequencer.h | 6 +++++- source/blender/blenkernel/intern/sequencer.c | 23 +++++++++++++++-------- source/blender/makesrna/intern/rna_sequencer.c | 9 ++++++--- 3 files changed, 26 insertions(+), 12 deletions(-) (limited to 'source/blender') diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h index 7a47d7cecc1..c936ce5284d 100644 --- a/source/blender/blenkernel/BKE_sequencer.h +++ b/source/blender/blenkernel/BKE_sequencer.h @@ -314,7 +314,11 @@ struct Sequence *BKE_sequence_metastrip(ListBase *seqbase /* = ed->seqbase */, s void BKE_sequencer_offset_animdata(struct Scene *scene, struct Sequence *seq, int ofs); void BKE_sequencer_dupe_animdata(struct Scene *scene, const char *name_src, const char *name_dst); -bool BKE_sequence_base_shuffle(struct ListBase *seqbasep, struct Sequence *test, struct Scene *evil_scene); +bool BKE_sequence_base_shuffle_ex( + struct ListBase *seqbasep, struct Sequence *test, struct Scene *evil_scene, + int channel_delta); +bool BKE_sequence_base_shuffle( + struct ListBase *seqbasep, struct Sequence *test, struct Scene *evil_scene); bool BKE_sequence_base_shuffle_time(ListBase *seqbasep, struct Scene *evil_scene); bool BKE_sequence_base_isolated_sel_check(struct ListBase *seqbase); void BKE_sequencer_free_imbuf(struct Scene *scene, struct ListBase *seqbasep, bool for_render); diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index 83287fe7725..cb23b1eb88e 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -3764,21 +3764,23 @@ Sequence *BKE_sequencer_foreground_frame_get(Scene *scene, int frame) } /* return 0 if there werent enough space */ -bool BKE_sequence_base_shuffle(ListBase *seqbasep, Sequence *test, Scene *evil_scene) +bool BKE_sequence_base_shuffle_ex(ListBase *seqbasep, Sequence *test, Scene *evil_scene, int channel_delta) { - int orig_machine = test->machine; - test->machine++; + const int orig_machine = test->machine; + BLI_assert(ELEM(channel_delta, -1, 1)); + + test->machine += channel_delta; BKE_sequence_calc(evil_scene, test); - while (BKE_sequence_test_overlap(seqbasep, test) ) { - if (test->machine >= MAXSEQ) { + while (BKE_sequence_test_overlap(seqbasep, test)) { + if ((channel_delta > 0) ? (test->machine >= MAXSEQ) : (test->machine <= 1)) { break; } - test->machine++; + + test->machine += channel_delta; BKE_sequence_calc(evil_scene, test); // XXX - I don't think this is needed since were only moving vertically, Campbell. } - - if (test->machine >= MAXSEQ) { + if ((test->machine < 1) || (test->machine > MAXSEQ)) { /* Blender 2.4x would remove the strip. * nicer to move it to the end */ @@ -3802,6 +3804,11 @@ bool BKE_sequence_base_shuffle(ListBase *seqbasep, Sequence *test, Scene *evil_s } } +bool BKE_sequence_base_shuffle(ListBase *seqbasep, Sequence *test, Scene *evil_scene) +{ + return BKE_sequence_base_shuffle_ex(seqbasep, test, evil_scene, 1); +} + static int shuffle_seq_time_offset_test(ListBase *seqbasep, char dir) { int offset = 0; diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c index 927e77960d7..8ad7d313c1e 100644 --- a/source/blender/makesrna/intern/rna_sequencer.c +++ b/source/blender/makesrna/intern/rna_sequencer.c @@ -290,11 +290,14 @@ static void rna_Sequence_channel_set(PointerRNA *ptr, int value) Scene *scene = (Scene *)ptr->id.data; Editing *ed = BKE_sequencer_editing_get(scene, false); ListBase *seqbase = BKE_sequence_seqbase(&ed->seqbase, seq); - - seq->machine = value; + /* check channel increment or decrement */ + const int channel_delta = (value >= seq->machine) ? 1 : -1; + seq->machine = value; + if (BKE_sequence_test_overlap(seqbase, seq)) { - BKE_sequence_base_shuffle(seqbase, seq, scene); /* XXX - BROKEN!, uses context seqbasep */ + /* XXX - BROKEN!, uses context seqbasep */ + BKE_sequence_base_shuffle_ex(seqbase, seq, scene, channel_delta); } BKE_sequencer_sort(scene); } -- cgit v1.2.3