Commit: 27b2ab8cf4ae9140ff53d812c142e7d65cbeee11
Author: Campbell Barton
Date:   Thu Feb 12 06:18:02 2015 +1100
Branches: master
https://developer.blender.org/rB27b2ab8cf4ae9140ff53d812c142e7d65cbeee11

Fix VSE strip channel skip overlapping strips

D1096 by @mangostaniko (with some edits)

===================================================================

M       source/blender/blenkernel/BKE_sequencer.h
M       source/blender/blenkernel/intern/sequencer.c
M       source/blender/makesrna/intern/rna_sequencer.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_sequencer.h 
b/source/blender/blenkernel/BKE_sequencer.h
index 7a47d7c..c936ce5 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 83287fe..cb23b1e 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 927e779..8ad7d31 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);
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to