[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28628] trunk/blender/source/blender/ editors: keyframe transform, both through dopesheet/ action editor and graph editor, works a bit better with handles.

Joseph Eagar joeedh at gmail.com
Thu May 6 21:54:43 CEST 2010


Revision: 28628
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28628
Author:   joeedh
Date:     2010-05-06 21:54:43 +0200 (Thu, 06 May 2010)

Log Message:
-----------
keyframe transform, both through dopesheet/action editor and graph editor, works a bit better with handles.  handles now follow keyframes properly in frame snap mode, in situations where they would move (but the keyframe would not) in undesirable ways before.  also hopefully fixed vector scope crash in image editor.  and disabled snapping to seconds (ever); this can be a seperate option, silently switching to second snapping in frame snapping mode is absolutely evil.  also, the action editor draws in hundredth of seconds, not seconds, so it didn't even work.  Aligorith: I hope this code is ok, if not feel free to rewrite it.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/interface/interface_draw.c
    trunk/blender/source/blender/editors/transform/transform.c
    trunk/blender/source/blender/editors/transform/transform.h
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/editors/transform/transform_generics.c

Modified: trunk/blender/source/blender/editors/interface/interface_draw.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_draw.c	2010-05-06 19:16:45 UTC (rev 28627)
+++ trunk/blender/source/blender/editors/interface/interface_draw.c	2010-05-06 19:54:43 UTC (rev 28628)
@@ -1088,9 +1088,13 @@
 
 	glTranslatef(centerx, centery, 0.f);
 	glScalef(diam, diam, 0.f);
-	glVertexPointer(2, GL_FLOAT, 0, scopes->vecscope);
-	glDrawArrays(GL_POINTS, 0, scopes->waveform_tot);
 
+	/*apparently this can sometimes be NULL? - joeedh*/
+	if (scopes) {
+		glVertexPointer(2, GL_FLOAT, 0, scopes->vecscope);
+		glDrawArrays(GL_POINTS, 0, scopes->waveform_tot);
+	}
+
 	glDisableClientState(GL_VERTEX_ARRAY);
 	glPopMatrix();
 	

Modified: trunk/blender/source/blender/editors/transform/transform.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.c	2010-05-06 19:16:45 UTC (rev 28627)
+++ trunk/blender/source/blender/editors/transform/transform.c	2010-05-06 19:54:43 UTC (rev 28628)
@@ -202,17 +202,32 @@
 
 		UI_view2d_to_region_no_clip(t->view, v[0], v[1], adr, adr+1);
 	}
-	else if(ELEM3(t->spacetype, SPACE_IPO, SPACE_NLA, SPACE_ACTION)) {
+	else if(t->spacetype == SPACE_ACTION) {
+		SpaceAction *sact = t->sa->spacedata.first;
 		int out[2] = {0, 0};
 
-		UI_view2d_view_to_region((View2D *)t->view, vec[0], vec[1], out, out+1);
+		if (sact->flag & SACTION_DRAWTIME) {
+			//vec[0] = vec[0]/((t->scene->r.frs_sec / t->scene->r.frs_sec_base));
+
+			UI_view2d_to_region_no_clip((View2D *)t->view, vec[0], vec[1], out, out+1);
+		} else {
+			UI_view2d_to_region_no_clip((View2D *)t->view, vec[0], vec[1], out, out+1);
+		}
+
 		adr[0]= out[0];
 		adr[1]= out[1];
 	}
+	else if(ELEM(t->spacetype, SPACE_IPO, SPACE_NLA)) {
+		int out[2] = {0, 0};
+
+		UI_view2d_to_region_no_clip((View2D *)t->view, vec[0], vec[1], out, out+1);
+		adr[0]= out[0];
+		adr[1]= out[1];
+	}
 	else if(t->spacetype==SPACE_SEQ) { /* XXX not tested yet, but should work */
 		int out[2] = {0, 0};
 
-		UI_view2d_view_to_region((View2D *)t->view, vec[0], vec[1], out, out+1);
+		UI_view2d_to_region_no_clip((View2D *)t->view, vec[0], vec[1], out, out+1);
 		adr[0]= out[0];
 		adr[1]= out[1];
 	}
@@ -5285,12 +5300,12 @@
 /* This function is used by Animation Editor specific transform functions to do
  * the Snap Keyframe to Nearest Frame/Marker
  */
-static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, AnimData *adt, short autosnap)
+static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, TransData2D *td2d, AnimData *adt, short autosnap)
 {
 	/* snap key to nearest frame? */
 	if (autosnap == SACTSNAP_FRAME) {
 		const Scene *scene= t->scene;
-		const short doTime= getAnimEdit_DrawTime(t);
+		const short doTime= 0; //XXX doesn't work - getAnimEdit_DrawTime(t);
 		const double secf= FPS;
 		double val;
 
@@ -5332,6 +5347,14 @@
 		else
 			*(td->val)= val;
 	}
+
+	if ((td->flag & TD_MOVEHANDLE1) && td2d->h1) {
+		td2d->h1[0] = td2d->ih1[0] + *td->val - td->ival;
+	}
+
+	if ((td->flag & TD_MOVEHANDLE2) && td2d->h2) {
+		td2d->h2[0] = td2d->ih2[0] + *td->val - td->ival;
+	}
 }
 
 /* ----------------- Translation ----------------------- */
@@ -5394,6 +5417,7 @@
 static void applyTimeTranslate(TransInfo *t, float sval)
 {
 	TransData *td = t->data;
+	TransData2D *td2d = t->data2d;
 	Scene *scene = t->scene;
 	int i;
 
@@ -5402,16 +5426,18 @@
 
 	const short autosnap= getAnimEdit_SnapMode(t);
 
-	float deltax, val;
+	float deltax, val, valprev;
 
 	/* it doesn't matter whether we apply to t->data or t->data2d, but t->data2d is more convenient */
-	for (i = 0 ; i < t->total; i++, td++) {
+	for (i = 0 ; i < t->total; i++, td++, td2d++) {
 		/* it is assumed that td->extra is a pointer to the AnimData,
 		 * whose active action is where this keyframe comes from
 		 * (this is only valid when not in NLA)
 		 */
 		AnimData *adt= (t->spacetype != SPACE_NLA) ? td->extra : NULL;
 
+		valprev = *td->val;
+
 		/* check if any need to apply nla-mapping */
 		if (adt && t->spacetype != SPACE_SEQ) {
 			deltax = t->values[0];
@@ -5441,7 +5467,7 @@
 		}
 
 		/* apply nearest snapping */
-		doAnimEdit_SnapFrame(t, td, adt, autosnap);
+		doAnimEdit_SnapFrame(t, td, td2d, adt, autosnap);
 	}
 }
 
@@ -5652,6 +5678,7 @@
 static void applyTimeScale(TransInfo *t) {
 	Scene *scene = t->scene;
 	TransData *td = t->data;
+	TransData2D *td2d = t->data2d;
 	int i;
 
 	const short autosnap= getAnimEdit_SnapMode(t);
@@ -5659,7 +5686,7 @@
 	const double secf= FPS;
 
 
-	for (i = 0 ; i < t->total; i++, td++) {
+	for (i = 0 ; i < t->total; i++, td++, td2d++) {
 		/* it is assumed that td->extra is a pointer to the AnimData,
 		 * whose active action is where this keyframe comes from
 		 * (this is only valid when not in NLA)
@@ -5685,7 +5712,7 @@
 		*(td->val) += startx;
 
 		/* apply nearest snapping */
-		doAnimEdit_SnapFrame(t, td, adt, autosnap);
+		doAnimEdit_SnapFrame(t, td, td2d, adt, autosnap);
 	}
 }
 

Modified: trunk/blender/source/blender/editors/transform/transform.h
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.h	2010-05-06 19:16:45 UTC (rev 28627)
+++ trunk/blender/source/blender/editors/transform/transform.h	2010-05-06 19:54:43 UTC (rev 28628)
@@ -151,6 +151,9 @@
 typedef struct TransData2D {
 	float loc[3];		/* Location of data used to transform (x,y,0) */
 	float *loc2d;		/* Pointer to real 2d location of data */
+
+	float *h1, *h2;     /* Pointer to handle locations, if handles aren't being moved independantly*/
+	float ih1[2], ih2[2];
 } TransData2D;
 
 /* we need to store 2 handles for each transdata incase the other handle wasnt selected */
@@ -427,6 +430,8 @@
 #define TD_NOTIMESNAP		(1 << 14)	/* for Graph Editor autosnap, indicates that point should not undergo autosnapping */
 #define TD_INTVALUES	 	(1 << 15) 	/* for Graph Editor - curves that can only have int-values need their keyframes tagged with this */
 #define TD_MIRROR_EDGE	 	(1 << 16) 	/* For editmode mirror, clamp to x = 0 */
+#define TD_MOVEHANDLE1		(1 << 17)	/* For fcurve handles, move them along with their keyframes */
+#define TD_MOVEHANDLE2		(1 << 18)
 
 /* transsnap->status */
 #define SNAP_FORCED		1

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c	2010-05-06 19:16:45 UTC (rev 28627)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c	2010-05-06 19:54:43 UTC (rev 28628)
@@ -2972,9 +2972,8 @@
 			bezt->f1 |= SELECT;
 			bezt->f3 |= SELECT;
 
-			/* increment by 3, as there are 3 points (3 * x-coordinates) that need transform */
 			if (FrameOnMouseSide(side, bezt->vec[1][0], cfra))
-				count += 3;
+				count += 1;
 		}
 	}
 
@@ -3023,9 +3022,10 @@
  * The 'side' argument is needed for the extend mode. 'B' = both sides, 'R'/'L' mean only data
  * on the named side are used.
  */
-static TransData *FCurveToTransData(TransData *td, FCurve *fcu, AnimData *adt, char side, float cfra)
+static TransData *ActionFCurveToTransData(TransData *td, TransData2D **td2dv, FCurve *fcu, AnimData *adt, char side, float cfra)
 {
 	BezTriple *bezt;
+	TransData2D *td2d = *td2dv;
 	int i;
 
 	if (fcu == NULL)
@@ -3036,19 +3036,24 @@
 		if (BEZSELECTED(bezt)) {
 			/* only add if on the right 'side' of the current frame */
 			if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) {
-				/* each control point needs to be added separetely */
-				TimeToTransData(td, bezt->vec[0], adt);
-				td++;
-
 				TimeToTransData(td, bezt->vec[1], adt);
-				td++;
 
-				TimeToTransData(td, bezt->vec[2], adt);
+				/*set flags to move handles as necassary*/
+				td->flag |= TD_MOVEHANDLE1|TD_MOVEHANDLE2;
+				td2d->h1 = bezt->vec[0];
+				td2d->h2 = bezt->vec[2];
+
+				VECCOPY2D(td2d->ih1, td2d->h1);
+				VECCOPY2D(td2d->ih2, td2d->h2);
+
 				td++;
+				td2d++;
 			}
 		}
 	}
 
+	*td2dv = td2d;
+
 	return td;
 }
 
@@ -3116,6 +3121,7 @@
 {
 	Scene *scene= t->scene;
 	TransData *td = NULL;
+	TransData2D *td2d = NULL;
 	tGPFtransdata *tfd = NULL;
 	
 	bAnimContext ac;
@@ -3179,7 +3185,9 @@
 	t->total= count;
 	
 	t->data= MEM_callocN(t->total*sizeof(TransData), "TransData(Action Editor)");
+	t->data2d= MEM_callocN(t->total*sizeof(TransData2D), "transdata2d");
 	td= t->data;
+	td2d = t->data2d;
 	
 	if (ac.datatype == ANIMCONT_GPENCIL) {
 		if (t->mode == TFM_TIME_SLIDE) {
@@ -3216,7 +3224,7 @@
 			else
 				cfra = (float)CFRA;
 			
-			td= FCurveToTransData(td, fcu, adt, t->frame_side, cfra);
+			td= ActionFCurveToTransData(td, &td2d, fcu, adt, t->frame_side, cfra);
 		//}
 	}
 	
@@ -3248,8 +3256,11 @@
 /* Helper function for createTransGraphEditData, which is reponsible for associating
  * source data with transform data
  */
-static void bezt_to_transdata (TransData *td, TransData2D *td2d, AnimData *adt, float *loc, float *cent, short selected, short ishandle, short intvals)
+static void bezt_to_transdata (TransData *td, TransData2D *td2d, AnimData *adt, BezTriple *bezt, int bi, short selected, short ishandle, short intvals)
 {
+	float *loc = bezt->vec[bi];
+	float *cent = bezt->vec[1];
+
 	/* New location from td gets dumped onto the old-location of td2d, which then
 	 * gets copied to the actual data at td2d->loc2d (bezt->vec[n])
 	 *
@@ -3280,7 +3291,17 @@
 		VECCOPY(td->center, cent);
 		VECCOPY(td->iloc, td->loc);
 	}
-	
+
+	if (td->flag & TD_MOVEHANDLE1) {
+		td2d->h1 = bezt->vec[0];
+		VECCOPY2D(td2d->ih1, td2d->h1);
+	} else td2d->h1 = NULL;
+
+	if (td->flag & TD_MOVEHANDLE2) {
+		td2d->h2 = bezt->vec[2];
+		VECCOPY2D(td2d->ih2, td2d->h2);
+	} else td2d->h2 = NULL;
+
 	memset(td->axismtx, 0, sizeof(td->axismtx));
 	td->axismtx[2][2] = 1.0f;
 	
@@ -3300,7 +3321,7 @@
 		td->flag |= TD_NOTIMESNAP;
 	if (intvals)
 		td->flag |= TD_INTVALUES;
-	
+
 	unit_m3(td->mtx);
 	unit_m3(td->smtx);
 }
@@ -3362,11 +3383,11 @@
 		/* F-Curve may not have any keyframes */
 		if (fcu->bezt == NULL)
 			continue;
-		
+
 		/* only include BezTriples whose 'keyframe' occurs on the same side of the current frame as mouse */
 		for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
 			if (FrameOnMouseSide(t->frame_side, bezt->vec[1][0], cfra)) {
-				if (sipo->around == V3D_LOCAL) {
+				if (sipo->around == V3D_LOCAL && !ELEM(t->mode, TFM_TRANSLATION, TFM_TIME_TRANSLATE)) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list