[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24054] trunk/blender/source/blender: after transform if strips overlap, move the frame rather then the channel to fix.

Campbell Barton ideasman42 at gmail.com
Thu Oct 22 16:40:32 CEST 2009


Revision: 24054
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24054
Author:   campbellbarton
Date:     2009-10-22 16:40:32 +0200 (Thu, 22 Oct 2009)

Log Message:
-----------
after transform if strips overlap, move the frame rather then the channel to fix.
useful while snap isnt working. metastrips still need to be supported.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_sequence.h
    trunk/blender/source/blender/blenkernel/intern/sequence.c
    trunk/blender/source/blender/editors/transform/transform_conversions.c

Modified: trunk/blender/source/blender/blenkernel/BKE_sequence.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_sequence.h	2009-10-22 12:59:14 UTC (rev 24053)
+++ trunk/blender/source/blender/blenkernel/BKE_sequence.h	2009-10-22 14:40:32 UTC (rev 24054)
@@ -182,6 +182,7 @@
 void fix_single_seq(struct Sequence *seq);
 int seq_test_overlap(struct ListBase * seqbasep, struct Sequence *test);
 int shuffle_seq(struct ListBase * seqbasep, struct Sequence *test);
+int shuffle_seq_time(ListBase * seqbasep);
 void free_imbuf_seq(struct ListBase * seqbasep, int check_mem_usage);
 
 void seq_update_sound(struct Sequence *seq);

Modified: trunk/blender/source/blender/blenkernel/intern/sequence.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/sequence.c	2009-10-22 12:59:14 UTC (rev 24053)
+++ trunk/blender/source/blender/blenkernel/intern/sequence.c	2009-10-22 14:40:32 UTC (rev 24054)
@@ -3341,18 +3341,25 @@
 	return (seq->type < SEQ_EFFECT) || (get_sequence_effect_num_inputs(seq->type) == 0);
 }
 
+static int seq_overlap(Sequence *seq1, Sequence *seq2)
+{
+	if(seq1 != seq2)
+		if(seq1->machine==seq2->machine)
+			if(((seq1->enddisp <= seq2->startdisp) || (seq1->startdisp >= seq2->enddisp))==0)
+				return 1;
+
+	return 0;
+}
+
 int seq_test_overlap(ListBase * seqbasep, Sequence *test)
 {
 	Sequence *seq;
 
 	seq= seqbasep->first;
 	while(seq) {
-		if(seq!=test) {
-			if(test->machine==seq->machine) {
-				if( (test->enddisp <= seq->startdisp) || (test->startdisp >= seq->enddisp) );
-				else return 1;
-			}
-		}
+		if(seq_overlap(test, seq))
+			return 1;
+
 		seq= seq->next;
 	}
 	return 0;
@@ -3410,6 +3417,76 @@
 	}
 }
 
+static int shuffle_seq_time_offset_test(ListBase * seqbasep, char dir)
+{
+	int offset= 0;
+	Sequence *seq, *seq_other;
+
+	for(seq= seqbasep->first; seq; seq= seq->next) {
+		if(seq->tmp) {
+			for(seq_other= seqbasep->first; seq_other; seq_other= seq_other->next) {
+				if(seq_overlap(seq, seq_other)) {
+					if(dir=='L') {
+						offset= MIN2(offset, seq_other->startdisp - seq->enddisp);
+					}
+					else {
+						offset= MAX2(offset, seq_other->enddisp - seq->startdisp);
+					}
+				}
+			}
+		}
+	}
+	return offset;
+}
+
+static int shuffle_seq_time_offset(ListBase * seqbasep, char dir)
+{
+	int ofs= 0;
+	int tot_ofs= 0;
+	Sequence *seq;
+	while( (ofs= shuffle_seq_time_offset_test(seqbasep, dir)) ) {
+		for(seq= seqbasep->first; seq; seq= seq->next) {
+			if(seq->tmp) {
+				/* seq_test_overlap only tests display values */
+				seq->startdisp +=	ofs;
+				seq->enddisp +=		ofs;
+			}
+		}
+
+		tot_ofs+= ofs;
+	}
+
+	for(seq= seqbasep->first; seq; seq= seq->next) {
+		if(seq->tmp)
+			calc_sequence_disp(seq); /* corrects dummy startdisp/enddisp values */
+	}
+
+	return tot_ofs;
+}
+
+int shuffle_seq_time(ListBase * seqbasep)
+{
+	/* note: metastrinps untested */
+	/* note: seq->tmp is used to tag strips to move */
+
+	Sequence *seq;
+
+	int offset_l = shuffle_seq_time_offset(seqbasep, 'L');
+	int offset_r = shuffle_seq_time_offset(seqbasep, 'R');
+	int offset = (-offset_l < offset_r) ?  offset_l:offset_r;
+
+	if(offset) {
+		for(seq= seqbasep->first; seq; seq= seq->next) {
+			if(seq->tmp) {
+				seq->start += offset;
+				seq->flag &= ~SEQ_OVERLAP;
+				calc_sequence(seq);
+			}
+		}
+	}
+}
+
+
 void seq_update_sound(struct Sequence *seq)
 {
 	if(seq->type == SEQ_SOUND)

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c	2009-10-22 12:59:14 UTC (rev 24053)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c	2009-10-22 14:40:32 UTC (rev 24054)
@@ -4039,7 +4039,6 @@
 	return tot;
 }
 
-
 static void freeSeqData(TransInfo *t)
 {
 	Editing *ed= seq_give_editing(t->scene, FALSE);
@@ -4058,16 +4057,49 @@
 
 		if (!(t->state == TRANS_CANCEL)) {
 
+#if 0		// default 2.4 behavior
+
 			/* flush to 2d vector from internally used 3d vector */
 			for(a=0; a<t->total; a++, td++) {
+				if ((seq != seq_prev) && (seq->depth==0) && (seq->flag & SEQ_OVERLAP)) {
 				seq= ((TransDataSeq *)td->extra)->seq;
-				if ((seq != seq_prev) && (seq->depth==0) && (seq->flag & SEQ_OVERLAP)) {
 					shuffle_seq(seqbasep, seq);
 				}
 
 				seq_prev= seq;
 			}
 
+#else		// durian hack
+			{
+				int overlap= 0;
+
+				for(a=0; a<t->total; a++, td++) {
+					seq= ((TransDataSeq *)td->extra)->seq;
+					if ((seq != seq_prev) && (seq->depth==0) && (seq->flag & SEQ_OVERLAP)) {
+						overlap= 1;
+						break;
+					}
+					seq_prev= seq;
+				}
+
+				if(overlap) {
+					for(seq= seqbasep->first; seq; seq= seq->next)
+						seq->tmp= NULL;
+
+					td= t->data;
+
+					for(a=0; a<t->total; a++, td++) {
+						seq= ((TransDataSeq *)td->extra)->seq;
+						if ((seq != seq_prev)) {
+							seq->tmp= 1;
+						}
+					}
+
+					shuffle_seq_time(seqbasep);
+				}
+			}
+#endif
+
 			for(seq= seqbasep->first; seq; seq= seq->next) {
 				/* We might want to build a list of effects that need to be updated during transform */
 				if(seq->type & SEQ_EFFECT) {





More information about the Bf-blender-cvs mailing list