[Bf-animsys] [PATCH] fix non-bezier key translation

Jess Balint jbalint at gmail.com
Fri May 29 09:00:59 CEST 2009


Hi,
As the subject says, this fixes the non-bezier key translation. It's
broken foremestly in that it crashes :), and second that it doesn't take
the handle of the previous bezier segment into account for a non-bezier
segment.

Jess
-------------- next part --------------
Index: source/blender/editors/transform/transform_conversions.c
===================================================================
--- source/blender/editors/transform/transform_conversions.c	(revision 20473)
+++ source/blender/editors/transform/transform_conversions.c	(working copy)
@@ -3117,7 +3117,7 @@
 	bAnimListElem *ale;
 	int filter;
 	
-	BezTriple *bezt, *prevbezt;
+	BezTriple *bezt, *prevbezt, *nextbezt;
 	int count=0, i;
 	float cfra;
 	char side;
@@ -3159,7 +3159,8 @@
 		
 		/* only include BezTriples whose 'keyframe' occurs on the same side of the current frame as mouse */
 		if (fcu->bezt) {
-			for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
+			for (prevbezt=NULL, i=0, bezt=fcu->bezt; i < fcu->totvert; i++, prevbezt=bezt, bezt++) {
+				nextbezt = (i < fcu->totvert - 1) ? bezt + 1 : NULL;
 				if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) {
 					if (v2d->around == V3D_LOCAL) {
 						/* for local-pivot we only need to count the number of selected handles only, so that centerpoitns don't
@@ -3172,13 +3173,14 @@
 						else if (bezt->f2 & SELECT) count++;
 					}
 					else {
-						/* for 'normal' pivots */
-						if (bezt->ipo == BEZT_IPO_BEZ) {
-							if (bezt->f1 & SELECT) count++;
-							if (bezt->f2 & SELECT) count++;
-							if (bezt->f3 & SELECT) count++;
-						}
-						else if (bezt->f2 & SELECT) count++;
+						if ((bezt->f1 & SELECT) &&
+						    (!prevbezt || prevbezt->ipo == BEZT_IPO_BEZ))
+							count++;
+						if (bezt->f2 & SELECT) count++;
+						if ((bezt->f3 & SELECT) &&
+						    (bezt->ipo == BEZT_IPO_BEZ || !nextbezt ||
+						     nextbezt->ipo == BEZT_IPO_BEZ))
+							count++;
 					}
 				}
 			}
@@ -3215,28 +3217,27 @@
 		prevbezt= NULL;
 		
 		for (i=0; i < fcu->totvert; i++, prevbezt=bezt, bezt++) {
+			nextbezt = (i < fcu->totvert - 1) ? bezt + 1 : NULL;
 			if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) {
 				TransDataCurveHandleFlags *hdata = NULL;
 				short h1=1, h2=1;
 				
 				/* only include handles if selected, and interpolaton mode uses beztriples */
-				if ( (!prevbezt && (bezt->ipo==BEZT_IPO_BEZ)) || (prevbezt && (prevbezt->ipo==BEZT_IPO_BEZ)) ) {
-					if (bezt->f1 & SELECT) {
+				if ((bezt->f1 & SELECT) && (!prevbezt || (prevbezt && (prevbezt->ipo==BEZT_IPO_BEZ)))) {
+					hdata = initTransDataCurveHandes(td, bezt);
+					bezt_to_transdata(td++, td2d++, nob, bezt->vec[0], bezt->vec[1], 1, 1, intvals);
+				}
+				else if (bezt->ipo == BEZT_IPO_BEZ)
+					h1= 0;
+
+				if ((bezt->f3 & SELECT) && (!nextbezt || (nextbezt->ipo == BEZT_IPO_BEZ) ||
+							    bezt->ipo == BEZT_IPO_BEZ)) {
+					if (hdata==NULL)
 						hdata = initTransDataCurveHandes(td, bezt);
-						bezt_to_transdata(td++, td2d++, nob, bezt->vec[0], bezt->vec[1], 1, 1, intvals);
-					}
-					else
-						h1= 0;
+					bezt_to_transdata(td++, td2d++, nob, bezt->vec[2], bezt->vec[1], 1, 1, intvals);
 				}
-				if (bezt->ipo == BEZT_IPO_BEZ) {
-					if (bezt->f3 & SELECT) {
-						if (hdata==NULL)
-							hdata = initTransDataCurveHandes(td, bezt);
-						bezt_to_transdata(td++, td2d++, nob, bezt->vec[2], bezt->vec[1], 1, 1, intvals);
-					}
-					else
-						h2= 0;
-				}
+				else if (bezt->ipo == BEZT_IPO_BEZ)
+					h2= 0;
 				
 				/* only include main vert if selected */
 				if (bezt->f2 & SELECT) {


More information about the Bf-animsys mailing list