[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23346] trunk/blender/source/blender: 2. 5 - Animation Bugfixes:

Joshua Leung aligorith at gmail.com
Sat Sep 19 13:59:26 CEST 2009


Revision: 23346
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23346
Author:   aligorith
Date:     2009-09-19 13:59:23 +0200 (Sat, 19 Sep 2009)

Log Message:
-----------
2.5 - Animation Bugfixes:

* Breakdown tool for Poses (Shift-E in PoseMode) now works. Now this works as a modal operator when invoked, with the horizontal movement of the mouse (left to right) corresponding the placement of the breakdown relative to the endpoint keyframes.

* Moving bones between armature layers in Edit Mode didn't work (wrong variable name used)
* Fixed several notifier-related bugs regarding editing armature settings and the 3d-view not refreshing
* Duplicating bones preserves the rotation mode

* Animation Data for Nodes is now show in Datablocks viewer (i.e. AnimData for NodeTrees has now been wrapped)

Modified Paths:
--------------
    trunk/blender/source/blender/editors/animation/keyframes_draw.c
    trunk/blender/source/blender/editors/armature/editarmature.c
    trunk/blender/source/blender/editors/armature/poseSlide.c
    trunk/blender/source/blender/editors/armature/poseobject.c
    trunk/blender/source/blender/editors/space_view3d/space_view3d.c
    trunk/blender/source/blender/makesrna/intern/rna_nodetree.c

Modified: trunk/blender/source/blender/editors/animation/keyframes_draw.c
===================================================================
--- trunk/blender/source/blender/editors/animation/keyframes_draw.c	2009-09-19 02:00:42 UTC (rev 23345)
+++ trunk/blender/source/blender/editors/animation/keyframes_draw.c	2009-09-19 11:59:23 UTC (rev 23346)
@@ -332,6 +332,7 @@
 }
 
 /* helper function - find actkeycolumn that occurs on cframe, or the nearest one if not found */
+// FIXME: this is buggy... next() is ignored completely...
 ActKeyColumn *cfra_find_nearest_next_ak (ActKeyColumn *ak, float cframe, short next)
 {
 	ActKeyColumn *akn= NULL;

Modified: trunk/blender/source/blender/editors/armature/editarmature.c
===================================================================
--- trunk/blender/source/blender/editors/armature/editarmature.c	2009-09-19 02:00:42 UTC (rev 23345)
+++ trunk/blender/source/blender/editors/armature/editarmature.c	2009-09-19 11:59:23 UTC (rev 23346)
@@ -2630,6 +2630,9 @@
 								/* copy transform locks */
 								channew->protectflag = chanold->protectflag;
 								
+								/* copy rotation mode */
+								channew->rotmode = chanold->rotmode;
+								
 								/* copy bone group */
 								channew->agrp_index= chanold->agrp_index;
 								

Modified: trunk/blender/source/blender/editors/armature/poseSlide.c
===================================================================
--- trunk/blender/source/blender/editors/armature/poseSlide.c	2009-09-19 02:00:42 UTC (rev 23345)
+++ trunk/blender/source/blender/editors/armature/poseSlide.c	2009-09-19 11:59:23 UTC (rev 23346)
@@ -103,6 +103,7 @@
 	Scene *scene;		/* current scene */
 	ARegion *ar;		/* region that we're operating in (needed for  */
 	Object *ob;			/* active object that Pose Info comes from */
+	bArmature *arm;		/* armature for pose */
 	
 	ListBase pfLinks;	/* links between posechannels and f-curves  */
 	DLRBT_Tree keys;	/* binary tree for quicker searching for keyframes (when applicable) */
@@ -151,6 +152,7 @@
 	/* get info from context */
 	pso->scene= CTX_data_scene(C);
 	pso->ob= CTX_data_active_object(C);
+	pso->arm= (pso->ob)? pso->ob->data : NULL;
 	pso->ar= CTX_wm_region(C); /* only really needed when doing modal() */
 	
 	pso->cframe= pso->scene->r.cfra;
@@ -162,7 +164,7 @@
 	pso->nextFrame= RNA_int_get(op->ptr, "next_frame");
 	
 	/* check the settings from the context */
-	if (ELEM3(NULL, pso->ob, pso->ob->adt, pso->ob->adt->action))
+	if (ELEM4(NULL, pso->ob, pso->arm, pso->ob->adt, pso->ob->adt->action))
 		return 0;
 	else
 		act= pso->ob->adt->action;
@@ -204,6 +206,11 @@
 	}
 	CTX_DATA_END;
 	
+	/* set depsgraph flags */
+		/* make sure the lock is set OK, unlock can be accidentally saved? */
+	pso->ob->pose->flag |= POSE_LOCKED;
+	pso->ob->pose->flag &= ~POSE_DO_UNLOCK;
+	
 	/* do basic initialise of RB-BST used for finding keyframes, but leave the filling of it up 
 	 * to the caller of this (usually only invoke() will do it, to make things more efficient).
 	 */
@@ -289,8 +296,8 @@
 	/* using this path, find each matching F-Curve for the variables we're interested in */
 	while ( (ld= find_next_fcurve_link(&pfl->fcurves, ld, path)) ) {
 		FCurve *fcu= (FCurve *)ld->data;
-		float w1, w2, wtot, ctrl, ictrl;
 		float sVal, eVal;
+		float w1, w2;
 		int ch;
 		
 		/* get keyframe values for endpoint poses to blend with */
@@ -302,22 +309,27 @@
 		/* get channel index */
 		ch= fcu->array_index;
 		
-		/* get the influence of the control */
-		ctrl= pso->percentage;
-		ictrl= 1.0f - pso->percentage;
+		/* calculate the relative weights of the endpoints */
+		if (pso->mode == POSESLIDE_BREAKDOWN) {
+			/* get weights from the percentage control */
+			w1= pso->percentage;	/* this must come second */
+			w2= 1.0f - w1;			/* this must come first */
+		}
+		else {
+			/*	- these weights are derived from the relative distance of these 
+			 *	  poses from the current frame
+			 *	- they then get normalised so that they only sum up to 1
+			 */
+			float wtot; 
+			
+			w1 = cframe - (float)pso->prevFrame;
+			w2 = (float)pso->nextFrame - cframe;
+			
+			wtot = w1 + w2;
+			w1 = (w1/wtot);
+			w2 = (w2/wtot);
+		}
 		
-		/* calculate the relative weights of the endpoints 
-		 *	- these weights are derived from the relative distance of these 
-		 *	  poses from the current frame
-		 *	- they then get normalised, with the results of these normalised 
-		 */
-		w1 = cframe - (float)pso->prevFrame;
-		w2 = (float)pso->nextFrame - cframe;
-		
-		wtot = w1 + w2;
-		w1 = w1/wtot;
-		w2 = w2/wtot;
-		
 		/* depending on the mode, */
 		switch (pso->mode) {
 			case POSESLIDE_PUSH: /* make the current pose more pronounced */
@@ -332,10 +344,8 @@
 				break;
 				
 			case POSESLIDE_BREAKDOWN: /* make the current pose slide around between the endpoints */
-				// NOTE: just linear interpolation for now, but could add small component of our key if necessary...
-				// TODO: this doesn't work at all
-				w2= 1.0f - w1;
-				vec[ch]= ((sVal * w1) + (eVal * w2));
+				/* perform simple linear interpolation - coefficient for start must come from pso->percentage... */
+				vec[ch]= ((sVal * w2) + (eVal * w1));
 				break;
 		}
 		
@@ -449,15 +459,18 @@
 		}
 	}
 	
-	/* funky depsgraph flags - are these still needed? */
-	pso->ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
+	/* old optimize trick... this enforces to bypass the depgraph 
+	 *	- note: code copied from transform_generics.c -> recalcData()
+	 */
+	// FIXME: shouldn't this use the builtin stuff?
+	if ((pso->arm->flag & ARM_DELAYDEFORM)==0)
+		DAG_id_flush_update(&pso->ob->id, OB_RECALC_DATA);  /* sets recalc flags */
+	else
+		where_is_pose(pso->scene, pso->ob);
 	
-	/* do depsgraph flush */
-	DAG_id_flush_update(&pso->ob->id, OB_RECALC_DATA);
-	
 	/* note, notifier might evolve */
-	//WM_event_add_notifier(C, NC_OBJECT|ND_POSE, pso->ob);
-	WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, pso->ob);
+	WM_event_add_notifier(C, NC_OBJECT|ND_POSE, pso->ob);
+	WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
 }
 
 /* ------------------------------------ */
@@ -482,7 +495,7 @@
 	/* consolidate these keyframes, and figure out the nearest ones */
 	BLI_dlrbTree_linkedlist_sync(&pso->keys);
 	
-	/* cancel if no keyframes found... */
+		/* cancel if no keyframes found... */
 	if (pso->keys.root) {
 		ActKeyColumn *ak;
 		
@@ -491,14 +504,24 @@
 		
 		if (ak == NULL) {
 			/* current frame is not a keyframe, so search */
+			ActKeyColumn *pk= cfra_find_nearest_next_ak(pso->keys.root, pso->cframe, 0);
+			ActKeyColumn *nk= cfra_find_nearest_next_ak(pso->keys.root, pso->cframe, 1);
+			
+			/* check if we found good keyframes */
+			if ((pk == nk) && (pk != NULL)) {
+				if (pk->cfra < pso->cframe)
+					nk= nk->next;
+				else if (nk->cfra > pso->cframe)
+					pk= pk->prev;
+			}
+			
+			/* new set the frames */
 				/* prev frame */
-			ak= cfra_find_nearest_next_ak(pso->keys.root, pso->cframe, 0);
-			pso->prevFrame= (ak)? (ak->cfra) : (pso->cframe - 1);
+			pso->prevFrame= (pk)? (pk->cfra) : (pso->cframe - 1);
 			RNA_int_set(op->ptr, "prev_frame", pso->prevFrame);
 				/* next frame */
-			ak= cfra_find_nearest_next_ak(pso->keys.root, pso->cframe, 1);
-			pso->nextFrame= (ak)? (ak->cfra) : (pso->cframe + 1);
-			RNA_int_set(op->ptr, "next_frame", pso->prevFrame);
+			pso->nextFrame= (nk)? (nk->cfra) : (pso->cframe + 1);
+			RNA_int_set(op->ptr, "next_frame", pso->nextFrame);
 		}
 		else {
 			/* current frame itself is a keyframe, so just take keyframes on either side */
@@ -515,19 +538,64 @@
 		return OPERATOR_CANCELLED;
 	}
 	
+	// FIXME: for now, just do modal for breakdowns... 
+	if (pso->mode == POSESLIDE_BREAKDOWN) {	
+		/* initial apply for operator... */
+		pose_slide_apply(C, op, pso);
+		
+		/* add a modal handler for this operator */
+		WM_event_add_modal_handler(C, op);
+		return OPERATOR_RUNNING_MODAL;
+	}
+	else {
+		/* temp static operator code... until a way to include percentage in the formulation comes up */
+		pose_slide_apply(C, op, pso);
+		pose_slide_exit(C, op);
+		return OPERATOR_FINISHED;
+	}
+}
+
+/* common code for modal() */
+static int pose_slide_modal (bContext *C, wmOperator *op, wmEvent *evt)
+{
+	tPoseSlideOp *pso= op->customdata;
 	
-	// TODO -----------------------------------
-	// from here on, we should just invoke the modal operator, but for now, just do static...
+	switch (evt->type) {
+		case LEFTMOUSE:	/* confirm */
+			pose_slide_exit(C, op);
+			return OPERATOR_FINISHED;
+		
+		case ESCKEY:	/* cancel */
+		case RIGHTMOUSE: 
+			pose_slide_exit(C, op);
+			return OPERATOR_CANCELLED;
+			
+		case MOUSEMOVE: /* calculate new position */
+		{
+			/* calculate percentage based on position of mouse (we only use x-axis for now.
+			 * since this is more conveninent for users to do), and store new percentage value 
+			 */
+			pso->percentage= (evt->x - pso->ar->winrct.xmin) / ((float)pso->ar->winx);
+			RNA_float_set(op->ptr, "percentage", pso->percentage);
+			
+			/* apply... */
+			pose_slide_apply(C, op, pso);
+		}
+			break;
+	}
 	
-	/* temp static operator code... */
-	pose_slide_apply(C, op, pso);
+	/* still running... */
+	return OPERATOR_RUNNING_MODAL;
+}
+
+/* common code for cancel() */
+static int pose_slide_cancel (bContext *C, wmOperator *op)
+{
+	/* cleanup and done */
 	pose_slide_exit(C, op);
-	return OPERATOR_FINISHED;
+	return OPERATOR_CANCELLED;
 }
 
-// TODO: common modal + cancel
-
-
 /* common code for exec() methods */
 static int pose_slide_exec_common (bContext *C, wmOperator *op, tPoseSlideOp *pso)
 {
@@ -708,12 +776,12 @@
 	/* callbacks */
 	ot->exec= pose_slide_breakdown_exec;
 	ot->invoke= pose_slide_breakdown_invoke;
-	//ot->modal= pose_slide_modal;
-	//ot->cancel= pose_slide_cancel;
+	ot->modal= pose_slide_modal;
+	ot->cancel= pose_slide_cancel;
 	ot->poll= ED_operator_posemode;
 	
 	/* flags */
-	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;//|OPTYPE_BLOCKING;
+	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
 	
 	/* Properties */
 	pose_slide_opdef_properties(ot);

Modified: trunk/blender/source/blender/editors/armature/poseobject.c
===================================================================
--- trunk/blender/source/blender/editors/armature/poseobject.c	2009-09-19 02:00:42 UTC (rev 23345)
+++ trunk/blender/source/blender/editors/armature/poseobject.c	2009-09-19 11:59:23 UTC (rev 23346)
@@ -1942,7 +1942,7 @@
 /* Set the visible layers for the active armature (edit and pose modes) */

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list