[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24997] trunk/blender/source/blender/ editors: Animation Editor (mostly Graph Editor) bugfixes:

Joshua Leung aligorith at gmail.com
Sun Nov 29 05:52:06 CET 2009


Revision: 24997
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24997
Author:   aligorith
Date:     2009-11-29 05:52:01 +0100 (Sun, 29 Nov 2009)

Log Message:
-----------
Animation Editor (mostly Graph Editor) bugfixes:
* Durian Report / Own Todo: Action Groups with no F-Curves in them visible were still shown in the animation editors. After several failed attempts in the past, finally got this working by making a little shuffling + a simpler solution.

* Bugfix #20134: Graph Editor Keys -> Transform Menu was using the wrong operators. C+P error from copying menus over from Dopesheet

* Muting Action Groups didn't draw all F-Curves contained in group as being muted too.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/animation/anim_filter.c
    trunk/blender/source/blender/editors/space_graph/graph_draw.c
    trunk/blender/source/blender/editors/space_graph/graph_header.c

Modified: trunk/blender/source/blender/editors/animation/anim_filter.c
===================================================================
--- trunk/blender/source/blender/editors/animation/anim_filter.c	2009-11-29 02:42:47 UTC (rev 24996)
+++ trunk/blender/source/blender/editors/animation/anim_filter.c	2009-11-29 04:52:01 UTC (rev 24997)
@@ -734,7 +734,6 @@
 				
 				ale->flag= nlt->flag;
 				
-					// XXX or should this be done some other way?
 				ale->key_data= &nlt->strips;
 				ale->datatype= ALE_NLASTRIP;
 			}
@@ -755,12 +754,10 @@
  
 /* ----------------------------------------- */
 
-
-static int animdata_filter_fcurves (ListBase *anim_data, bDopeSheet *ads, FCurve *first, bActionGroup *grp, void *owner, short ownertype, int filter_mode, ID *owner_id)
+/* find the next F-Curve that is usable for inclusion */
+static FCurve *animdata_filter_fcurve_next (bDopeSheet *ads, FCurve *first, bActionGroup *grp, int filter_mode, ID *owner_id)
 {
-	bAnimListElem *ale = NULL;
-	FCurve *fcu;
-	int items = 0;
+	FCurve *fcu = NULL;
 	
 	/* loop over F-Curves - assume that the caller of this has already checked that these should be included 
 	 * NOTE: we need to check if the F-Curves belong to the same group, as this gets called for groups too...
@@ -803,18 +800,42 @@
 				if ( ANIMCHANNEL_SELOK(SEL_FCU(fcu)) && ANIMCHANNEL_SELEDITOK(SEL_FCU(fcu)) ) {
 					/* only include if this curve is active */
 					if (!(filter_mode & ANIMFILTER_ACTIVE) || (fcu->flag & FCURVE_ACTIVE)) {
-						ale= make_new_animlistelem(fcu, ANIMTYPE_FCURVE, owner, ownertype, owner_id);
-						
-						if (ale) {
-							BLI_addtail(anim_data, ale);
-							items++;
-						}
+						/* this F-Curve can be used, so return it */
+						return fcu;
 					}
 				}
 			}
 		}
 	}
 	
+	/* no (more) F-Curves from the list are suitable... */
+	return NULL;
+}
+
+static int animdata_filter_fcurves (ListBase *anim_data, bDopeSheet *ads, FCurve *first, bActionGroup *grp, void *owner, short ownertype, int filter_mode, ID *owner_id)
+{
+	FCurve *fcu;
+	int items = 0;
+	
+	/* loop over every F-Curve able to be included 
+	 *	- this for-loop works like this: 
+	 *		1) the starting F-Curve is assigned to the fcu pointer so that we have a starting point to search from
+	 *		2) the first valid F-Curve to start from (which may include the one given as 'first') in the remaining 
+	 *		   list of F-Curves is found, and verified to be non-null
+	 *		3) the F-Curve referenced by fcu pointer is added to the list
+	 *		4) the fcu pointer is set to the F-Curve after the one we just added, so that we can keep going through 
+	 *		   the rest of the F-Curve list without an eternal loop. Back to step 2 :)
+	 */
+	for (fcu=first; ( (fcu = animdata_filter_fcurve_next(ads, fcu, grp, filter_mode, owner_id)) ); fcu=fcu->next)
+	{
+		bAnimListElem *ale = make_new_animlistelem(fcu, ANIMTYPE_FCURVE, owner, ownertype, owner_id);
+		
+		if (ale) {
+			BLI_addtail(anim_data, ale);
+			items++;
+		}
+	}
+	
 	/* return the number of items added to the list */
 	return items;
 }
@@ -829,50 +850,57 @@
 	/* loop over groups */
 	// TODO: in future, should we expect to need nested groups?
 	for (agrp= act->groups.first; agrp; agrp= agrp->next) {
-		/* add this group as a channel first */
-		if ((filter_mode & ANIMFILTER_CHANNELS) || !(filter_mode & ANIMFILTER_CURVESONLY)) {
-			/* check if filtering by selection */
-			if ( ANIMCHANNEL_SELOK(SEL_AGRP(agrp)) ) {
-				ale= make_new_animlistelem(agrp, ANIMTYPE_GROUP, NULL, ANIMTYPE_NONE, owner_id);
-				if (ale) {
-					BLI_addtail(anim_data, ale);
-					items++;
-				}
-			}
-		}
+		FCurve *first_fcu;
 		
 		/* store reference to last channel of group */
 		if (agrp->channels.last) 
 			lastchan= agrp->channels.last;
 		
+		/* get the first F-Curve in this group we can start to use, 
+		 * and if there isn't any F-Curve to start from, then don't 
+		 * this group at all...
+		 */
+		first_fcu = animdata_filter_fcurve_next(ads, agrp->channels.first, agrp, filter_mode, owner_id);
 		
-		/* there are some situations, where only the channels of the action group should get considered */
-		if (!(filter_mode & ANIMFILTER_ACTGROUPED) || (agrp->flag & AGRP_ACTIVE)) {
-			/* filters here are a bit convoulted...
-			 *	- groups show a "summary" of keyframes beside their name which must accessable for tools which handle keyframes
-			 *	- groups can be collapsed (and those tools which are only interested in channels rely on knowing that group is closed)
-			 *
-			 * cases when we should include F-Curves inside group:
-			 *	- we don't care about visibility
-			 *	- group is expanded
-			 *	- we just need the F-Curves present
-			 */
-			if ( (!(filter_mode & ANIMFILTER_VISIBLE) || EXPANDED_AGRP(agrp)) || (filter_mode & ANIMFILTER_CURVESONLY) ) 
-			{
-				/* for the Graph Editor, curves may be set to not be visible in the view to lessen clutter,
-				 * but to do this, we need to check that the group doesn't have it's not-visible flag set preventing 
-				 * all its sub-curves to be shown
+		if (first_fcu) {
+			/* add this group as a channel first */
+			if ((filter_mode & ANIMFILTER_CHANNELS) || !(filter_mode & ANIMFILTER_CURVESONLY)) {
+				/* check if filtering by selection */
+				if ( ANIMCHANNEL_SELOK(SEL_AGRP(agrp)) ) {
+					ale= make_new_animlistelem(agrp, ANIMTYPE_GROUP, NULL, ANIMTYPE_NONE, owner_id);
+					if (ale) {
+						BLI_addtail(anim_data, ale);
+						items++;
+					}
+				}
+			}
+			
+			/* there are some situations, where only the channels of the action group should get considered */
+			if (!(filter_mode & ANIMFILTER_ACTGROUPED) || (agrp->flag & AGRP_ACTIVE)) {
+				/* filters here are a bit convoulted...
+				 *	- groups show a "summary" of keyframes beside their name which must accessable for tools which handle keyframes
+				 *	- groups can be collapsed (and those tools which are only interested in channels rely on knowing that group is closed)
+				 *
+				 * cases when we should include F-Curves inside group:
+				 *	- we don't care about visibility
+				 *	- group is expanded
+				 *	- we just need the F-Curves present
 				 */
-				if ( !(filter_mode & ANIMFILTER_CURVEVISIBLE) || !(agrp->flag & AGRP_NOTVISIBLE) )
+				if ( (!(filter_mode & ANIMFILTER_VISIBLE) || EXPANDED_AGRP(agrp)) || (filter_mode & ANIMFILTER_CURVESONLY) ) 
 				{
-					if (!(filter_mode & ANIMFILTER_FOREDIT) || EDITABLE_AGRP(agrp)) {
-						items += animdata_filter_fcurves(anim_data, ads, agrp->channels.first, agrp, owner, ownertype, filter_mode, owner_id);
+					/* for the Graph Editor, curves may be set to not be visible in the view to lessen clutter,
+					 * but to do this, we need to check that the group doesn't have it's not-visible flag set preventing 
+					 * all its sub-curves to be shown
+					 */
+					if ( !(filter_mode & ANIMFILTER_CURVEVISIBLE) || !(agrp->flag & AGRP_NOTVISIBLE) )
+					{
+						if (!(filter_mode & ANIMFILTER_FOREDIT) || EDITABLE_AGRP(agrp)) {
+							items += animdata_filter_fcurves(anim_data, ads, first_fcu, agrp, owner, ownertype, filter_mode, owner_id);
+						}
 					}
 				}
 			}
 		}
-		
-		// TODO: but we still need to deal with the case when the group may be closed, but it has no visible curves too
 	}
 	
 	/* loop over un-grouped F-Curves (only if we're not only considering those channels in the animive group) */

Modified: trunk/blender/source/blender/editors/space_graph/graph_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_graph/graph_draw.c	2009-11-29 02:42:47 UTC (rev 24996)
+++ trunk/blender/source/blender/editors/space_graph/graph_draw.c	2009-11-29 04:52:01 UTC (rev 24997)
@@ -818,7 +818,7 @@
 				/* protected curves (non editable) are drawn with dotted lines */
 				setlinestyle(2);
 			}
-			if (fcu->flag & FCURVE_MUTED) {
+			if ( ((fcu->grp) && (fcu->grp->flag & AGRP_MUTED)) || (fcu->flag & FCURVE_MUTED) ) {
 				/* muted curves are drawn in a greyish hue */
 				// XXX should we have some variations?
 				UI_ThemeColorShade(TH_HEADER, 50);

Modified: trunk/blender/source/blender/editors/space_graph/graph_header.c
===================================================================
--- trunk/blender/source/blender/editors/space_graph/graph_header.c	2009-11-29 02:42:47 UTC (rev 24996)
+++ trunk/blender/source/blender/editors/space_graph/graph_header.c	2009-11-29 04:52:01 UTC (rev 24997)
@@ -154,9 +154,10 @@
 
 static void graph_edit_transformmenu(bContext *C, uiLayout *layout, void *arg_unused)
 {
-	uiItemEnumO(layout, "Grab/Move", 0, "TFM_OT_transform", "mode", TFM_TIME_TRANSLATE);
+	uiItemO(layout, "Grab/Move", 0, "TFM_OT_translate");
 	uiItemEnumO(layout, "Extend", 0, "TFM_OT_transform", "mode", TFM_TIME_EXTEND);
-	uiItemEnumO(layout, "Scale", 0, "TFM_OT_transform", "mode", TFM_TIME_SCALE);
+	uiItemO(layout, "Rotate", 0, "TFM_OT_rotate");
+	uiItemO(layout, "Scale", 0, "TFM_OT_resize");
 }
 
 static void graph_editmenu(bContext *C, uiLayout *layout, void *arg_unused)





More information about the Bf-blender-cvs mailing list