[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12245] trunk/blender/source/blender: Sequence editor, (peach request)

Campbell Barton cbarton at metavr.com
Tue Oct 9 22:37:54 CEST 2007


Revision: 12245
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12245
Author:   campbellbarton
Date:     2007-10-09 22:37:53 +0200 (Tue, 09 Oct 2007)

Log Message:
-----------
Sequence editor, (peach request)
Grab/Extend from frame - similar to a feature thats know as ripple editing in other applications. this is a fast way to add or remove frames 
from 
clips. to use.

Select all, drag the playbak head to the area you want to extend and press Ekey, the clips will be extended on the side the playhead that 
the mouse is on.

Also did more cleanups to sequencer transform code.

Modified Paths:
--------------
    trunk/blender/source/blender/include/BIF_editseq.h
    trunk/blender/source/blender/src/drawseq.c
    trunk/blender/source/blender/src/editseq.c
    trunk/blender/source/blender/src/header_seq.c
    trunk/blender/source/blender/src/space.c

Modified: trunk/blender/source/blender/include/BIF_editseq.h
===================================================================
--- trunk/blender/source/blender/include/BIF_editseq.h	2007-10-09 09:30:22 UTC (rev 12244)
+++ trunk/blender/source/blender/include/BIF_editseq.h	2007-10-09 20:37:53 UTC (rev 12245)
@@ -72,6 +72,16 @@
 struct Sequence*	alloc_sequence(ListBase *lb, int cfra, int machine); /*used from python*/
 int 				check_single_image_seq(struct Sequence *seq);
 
+/* sequence transform functions, for internal used */
+int seq_tx_get_start(struct Sequence *seq);
+int seq_tx_get_end(struct Sequence *seq);
+
+int seq_tx_get_final_left(struct Sequence *seq);
+int seq_tx_get_final_right(struct Sequence *seq);
+
+void seq_tx_set_final_left(struct Sequence *seq, int i);
+void seq_tx_set_final_right(struct Sequence *seq, int i);
+
 #define SEQ_DEBUG_INFO(seq) printf("seq into '%s' -- len:%i  start:%i  startstill:%i  endstill:%i  startofs:%i  endofs:%i\n",\
 		    seq->name, seq->len, seq->start, seq->startstill, seq->endstill, seq->startofs, seq->endofs)
 
@@ -81,7 +91,7 @@
  left and right are the bounds at which the setuence is rendered,
 start and end are from the start and fixed length of the sequence.
 */
-
+/*
 #define SEQ_GET_START(seq)	(seq->start)
 #define SEQ_GET_END(seq)	(seq->start+seq->len)
 
@@ -90,22 +100,22 @@
 
 #define SEQ_SET_FINAL_LEFT(seq, val) \
 	if (val < (seq)->start) { \
-		(seq)->startstill = -((seq)->start - val); \
+		(seq)->startstill = abs(val - (seq)->start); \
 		(seq)->startofs = 0; \
 } else { \
-		(seq)->startofs = (val - (seq)->start); \
+		(seq)->startofs = abs(val - (seq)->start); \
 		(seq)->startstill = 0; \
 }
 
 #define SEQ_SET_FINAL_RIGHT(seq, val) \
 	if (val > (seq)->start + (seq)->len) { \
-		(seq)->endstill = (val - ((seq)->start + (seq)->len)); \
+		(seq)->endstill = abs(val - ((seq)->start + (seq)->len)); \
 		(seq)->endofs = 0; \
 } else { \
-		(seq)->endofs = -(val - ((seq)->start + (seq)->len)); \
+		(seq)->endofs = abs(val - ((seq)->start + (seq)->len)); \
 		(seq)->endstill = 0; \
 }
-
+*/
 /* drawseq.c */
 void do_seqbuttons(short);
 

Modified: trunk/blender/source/blender/src/drawseq.c
===================================================================
--- trunk/blender/source/blender/src/drawseq.c	2007-10-09 09:30:22 UTC (rev 12244)
+++ trunk/blender/source/blender/src/drawseq.c	2007-10-09 20:37:53 UTC (rev 12245)
@@ -706,7 +706,7 @@
 	
 	/* draw the main strip body */
 	if (is_single_image) /* single image */
-		draw_shadedstrip(seq, col, SEQ_GET_FINAL_LEFT(seq), y1, SEQ_GET_FINAL_RIGHT(seq), y2);
+		draw_shadedstrip(seq, col, seq_tx_get_final_left(seq), y1, seq_tx_get_final_right(seq), y2);
 	else /* normal operation */
 		draw_shadedstrip(seq, col, x1, y1, x2, y2);
 	

Modified: trunk/blender/source/blender/src/editseq.c
===================================================================
--- trunk/blender/source/blender/src/editseq.c	2007-10-09 09:30:22 UTC (rev 12244)
+++ trunk/blender/source/blender/src/editseq.c	2007-10-09 20:37:53 UTC (rev 12245)
@@ -143,6 +143,53 @@
 	_last_seq_init = 0;
 }
 
+
+
+/* seq funcs's for transforming internally
+ notice the difference between start/end and left/right.
+ 
+ left and right are the bounds at which the setuence is rendered,
+start and end are from the start and fixed length of the sequence.
+*/
+int seq_tx_get_start(Sequence *seq) {
+	return seq->start;
+}
+int seq_tx_get_end(Sequence *seq)
+{
+	return seq->start+seq->len;
+}
+
+int seq_tx_get_final_left(Sequence *seq)
+{
+	return (seq->start - seq->startstill) + seq->startofs;
+}
+int  seq_tx_get_final_right(Sequence *seq)
+{
+	return ((seq->start+seq->len) + seq->endstill) - seq->endofs;
+}
+
+void seq_tx_set_final_left(Sequence *seq, int val)
+{
+	if (val < (seq)->start) {
+		seq->startstill = abs(val - (seq)->start);
+				(seq)->startofs = 0;
+	} else {
+		seq->startofs = abs(val - (seq)->start);
+		seq->startstill = 0;
+	}
+}
+
+void seq_tx_set_final_right(Sequence *seq, int val)
+{
+	if (val > (seq)->start + (seq)->len) {
+		seq->endstill = abs(val - (seq->start + (seq)->len));
+		(seq)->endofs = 0;
+	} else {
+		seq->endofs = abs(val - ((seq)->start + (seq)->len));
+		seq->endstill = 0;
+	}
+}
+
 /* used so we can do a quick check for single image seq
    since they work a bit differently to normal image seq's (during transform) */
 int check_single_image_seq(Sequence *seq)
@@ -161,12 +208,12 @@
 	
 	/* make sure the image is always at the start since there is only one,
 	   adjusting its start should be ok */
-	left = SEQ_GET_FINAL_LEFT(seq);
+	left = seq_tx_get_final_left(seq);
 	start = seq->start;
 	if (start != left) {
 		offset = left - start;
-		SEQ_SET_FINAL_LEFT( seq, SEQ_GET_FINAL_LEFT(seq) - offset );
-		SEQ_SET_FINAL_RIGHT( seq, SEQ_GET_FINAL_RIGHT(seq) - offset );
+		seq_tx_set_final_left( seq, seq_tx_get_final_left(seq) - offset );
+		seq_tx_set_final_right( seq, seq_tx_get_final_right(seq) - offset );
 		seq->start += offset;
 	}
 }
@@ -2464,22 +2511,69 @@
 	int startstill, endstill;
 	int startdisp, enddisp;
 	int startofs, endofs;
+	int final_left, final_right;
 	int len;
 } TransSeq;
 
+/* use to impose limits when dragging/extending - so impossible situations dont happen */
+static void transform_grab_xlimits(Sequence *seq, int leftflag, int rightflag)
+{
+	if(leftflag) {
+		if (seq_tx_get_final_left(seq) >= seq_tx_get_final_right(seq)) {
+			seq_tx_set_final_left(seq, seq_tx_get_final_right(seq)-1);
+		}
+		
+		if (check_single_image_seq(seq)==0) {
+			if (seq_tx_get_final_left(seq) >= seq_tx_get_end(seq)) {
+				seq_tx_set_final_left(seq, seq_tx_get_end(seq)-1);
+			}
+			
+			/* dosnt work now - TODO */
+			/*
+			if (seq_tx_get_start(seq) >= seq_tx_get_final_right(seq)) {
+				int ofs;
+				ofs = seq_tx_get_start(seq) - seq_tx_get_final_right(seq);
+				seq->start -= ofs;
+				seq_tx_set_final_left(seq, seq_tx_get_final_left(seq) + ofs );
+			}*/
+			
+		}
+	}
+	
+	if(rightflag) {
+		if (seq_tx_get_final_right(seq) <=  seq_tx_get_final_left(seq)) {
+			seq_tx_set_final_right(seq, seq_tx_get_final_left(seq)+1);
+		}
+									
+		if (check_single_image_seq(seq)==0) {
+			if (seq_tx_get_final_right(seq) <= seq_tx_get_start(seq)) {
+				seq_tx_set_final_right(seq, seq_tx_get_start(seq)+1);
+			}
+		}
+	}
+	
+	/* sounds cannot be extended past their endpoints */
+	if (seq->type == SEQ_RAM_SOUND || seq->type == SEQ_HD_SOUND) {
+		seq->startstill= 0;
+		seq->endstill= 0;
+	}
+}
+
 void transform_seq(int mode, int context)
 {
 	Sequence *seq;
 	Editing *ed;
 	float dx, dy, dvec[2], div;
 	TransSeq *transmain, *ts;
-	int tot=0, ix, iy, firsttime=1, afbreek=0, midtog= 0, proj= 0;
+	int tot=0, firsttime=1, afbreek=0, midtog= 0, proj= 0;
+	int ix, iy; /* these values are used for storing the mouses offset from its original location */
 	unsigned short event = 0;
 	short mval[2], val, xo, yo, xn, yn;
 	char str[32];
+	char side; /* for extend mode only - use to know which side to extend on */
+	
+	if(mode!='g' && mode!='e') return;	/* from gesture */
 
-	if(mode!='g') return;	/* from gesture */
-
 	/* which seqs are involved */
 	ed= G.scene->ed;
 	if(ed==0) return;
@@ -2498,20 +2592,32 @@
 	WHILE_SEQ(ed->seqbasep) {
 
 		if(seq->flag & SELECT) {
-
 			ts->start= seq->start;
 			ts->machine= seq->machine;
 			ts->startstill= seq->startstill;
 			ts->endstill= seq->endstill;
 			ts->startofs= seq->startofs;
 			ts->endofs= seq->endofs;
-
+			
+			/* for extend only */
+			if (mode=='e') {
+				ts->final_left = seq_tx_get_final_left(seq);
+				ts->final_right = seq_tx_get_final_right(seq);
+			}
 			ts++;
 		}
 	}
 	END_SEQ
 
 	getmouseco_areawin(mval);
+	
+	/* choose the side based on which side of the playhead the mouse is on */
+	if (mode=='e') {
+		float xmouse, ymouse;
+		areamouseco_to_ipoco(G.v2d, mval, &xmouse, &ymouse);
+		side = (xmouse > CFRA) ? 'R' : 'L';
+	}
+	
 	xo=xn= mval[0];
 	yo=yn= mval[1];
 	dvec[0]= dvec[1]= 0.0;
@@ -2521,7 +2627,7 @@
 		if(mval[0]!=xo || mval[1]!=yo || firsttime) {
 			firsttime= 0;
 
-			if(mode=='g') {
+			if(mode=='g' || mode=='e') {
 
 				dx= mval[0]- xo;
 				dy= mval[1]- yo;
@@ -2542,60 +2648,135 @@
 				if(midtog) dvec[proj]= 0.0;
 				ix= floor(dvec[0]+0.5);
 				iy= floor(dvec[1]+0.5);
-
+				
 				ts= transmain;
-
-				WHILE_SEQ(ed->seqbasep) {
-					if(seq->flag & SELECT) {
-						int myofs;
-						//SEQ_DEBUG_INFO(seq);
-						if(seq->flag & SEQ_LEFTSEL) {
-							myofs = (ts->startofs - ts->startstill);
-							SEQ_SET_FINAL_LEFT(seq, ts->start + (myofs + ix));
-							if (SEQ_GET_FINAL_LEFT(seq) >= SEQ_GET_FINAL_RIGHT(seq)) {
-								SEQ_SET_FINAL_LEFT(seq, SEQ_GET_FINAL_RIGHT(seq)-1);
+				
+				if (mode=='g') {
+					/* Grab */
+					WHILE_SEQ(ed->seqbasep) {
+						if(seq->flag & SELECT) {
+							int myofs;
+							// SEQ_DEBUG_INFO(seq);
+							
+							/* X Transformation */
+							if(seq->flag & SEQ_LEFTSEL) {
+								myofs = (ts->startofs - ts->startstill);
+								seq_tx_set_final_left(seq, ts->start + (myofs + ix));
 							}
-							if (check_single_image_seq(seq)==0) {
-								if (SEQ_GET_FINAL_LEFT(seq) >= SEQ_GET_END(seq)) {
-									SEQ_SET_FINAL_LEFT(seq, SEQ_GET_END(seq)-1);
-								}
+							if(seq->flag & SEQ_RIGHTSEL) {
+								myofs = (ts->endstill - ts->endofs);
+								seq_tx_set_final_right(seq, ts->start + seq->len + (myofs + ix));
 							}
+							transform_grab_xlimits(seq, seq->flag & SEQ_LEFTSEL, seq->flag & SEQ_RIGHTSEL);
+							
+							if( (seq->flag & (SEQ_LEFTSEL+SEQ_RIGHTSEL))==0 ) {
+								if(sequence_is_free_transformable(seq)) seq->start= ts->start+ ix;
+	
+								/* Y Transformation */
+								if(seq->depth==0) seq->machine= ts->machine+ iy;
+	
+								if(seq->machine<1) seq->machine= 1;
+								else if(seq->machine>= MAXSEQ) seq->machine= MAXSEQ;
+							}
+							calc_sequence(seq);
+							ts++;
 						}
-						if(seq->flag & SEQ_RIGHTSEL) {
-							myofs = (ts->endstill - ts->endofs);
-							SEQ_SET_FINAL_RIGHT(seq, ts->start + seq->len + (myofs + ix));
-							if (SEQ_GET_FINAL_RIGHT(seq) <= SEQ_GET_FINAL_LEFT(seq)) {
-								SEQ_SET_FINAL_RIGHT(seq, SEQ_GET_FINAL_LEFT(seq)+1);
-							}
-							
-							if (check_single_image_seq(seq)==0) {
-								if (SEQ_GET_FINAL_RIGHT(seq) <= SEQ_GET_START(seq)) {
-									SEQ_SET_FINAL_RIGHT(seq, SEQ_GET_START(seq)+1);
+					}
+					END_SEQ
+				/* Extend, grabs one side of the current frame */
+				} else if (mode=='e') {
+					int cfra = CFRA;
+					int myofs; /* offset from start of the seq clip */

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list