[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18282] branches/blender2.5/blender/source /blender/editors: 2.5 - Action Editor: IPO Curve Protect works now

Joshua Leung aligorith at gmail.com
Sat Jan 3 07:01:12 CET 2009


Revision: 18282
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18282
Author:   aligorith
Date:     2009-01-03 07:01:11 +0100 (Sat, 03 Jan 2009)

Log Message:
-----------
2.5 - Action Editor: IPO Curve Protect works now

* Added the relevant filtering necessary for this to work, into the animation-channel filtering code. 
* Updated most of the keyframe-editing tools to respect this
* Renamed keyframe-editing API loopers (added ANIM_ prefix) for consistency
* Added function for mapping keyframes to/from NLA-mapping for Ipo-Curves in addition to the one for IPO blocks. As a result, renamed the latter for consistency.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/animation/anim_draw.c
    branches/blender2.5/blender/source/blender/editors/animation/anim_filter.c
    branches/blender2.5/blender/source/blender/editors/animation/keyframes_draw.c
    branches/blender2.5/blender/source/blender/editors/animation/keyframes_edit.c
    branches/blender2.5/blender/source/blender/editors/include/ED_anim_api.h
    branches/blender2.5/blender/source/blender/editors/include/ED_keyframes_edit.h
    branches/blender2.5/blender/source/blender/editors/space_action/action_edit.c
    branches/blender2.5/blender/source/blender/editors/space_action/action_select.c
    branches/blender2.5/blender/source/blender/editors/transform/transform_conversions.c

Modified: branches/blender2.5/blender/source/blender/editors/animation/anim_draw.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/anim_draw.c	2009-01-03 05:41:58 UTC (rev 18281)
+++ branches/blender2.5/blender/source/blender/editors/animation/anim_draw.c	2009-01-03 06:01:11 UTC (rev 18282)
@@ -51,6 +51,7 @@
 #include "BKE_utildefines.h"
 
 #include "ED_anim_api.h"
+#include "ED_keyframes_edit.h"
 #include "ED_util.h"
 
 #include "WM_api.h"
@@ -180,7 +181,7 @@
 }
 
 /* *************************************************** */
-/* KEYFRAME DRAWING UTILITIES */
+/* NLA-MAPPING UTILITIES (required for drawing and also editing keyframes)  */
 
 /* Obtain the Object providing NLA-scaling for the given channel (if applicable) */
 Object *ANIM_nla_mapping_get(bAnimContext *ac, bAnimListElem *ale)
@@ -255,38 +256,81 @@
 	}
 }
 
+/* ------------------- */
+
+/* helper function for ANIM_nla_mapping_apply_ipocurve() -> "restore", i.e. mapping points back to IPO-time */
+static short bezt_nlamapping_restore(BeztEditData *bed, BezTriple *bezt)
+{
+	/* object providing scaling is stored in 'data', only_keys option is stored in i1 */
+	Object *ob= (Object *)bed->data;
+	short only_keys= (short)bed->i1;
+	
+	/* adjust BezTriple handles only if allowed to */
+	if (only_keys == 0) {
+		bezt->vec[0][0]= get_action_frame(ob, bezt->vec[0][0]);
+		bezt->vec[2][0]= get_action_frame(ob, bezt->vec[2][0]);
+	}					
+	bezt->vec[1][0]= get_action_frame(ob, bezt->vec[1][0]);
+}
+
+/* helper function for ANIM_nla_mapping_apply_ipocurve() -> "apply", i.e. mapping points to NLA-mapped global time */
+static short bezt_nlamapping_apply(BeztEditData *bed, BezTriple *bezt)
+{
+	/* object providing scaling is stored in 'data', only_keys option is stored in i1 */
+	Object *ob= (Object *)bed->data;
+	short only_keys= (short)bed->i1;
+	
+	/* adjust BezTriple handles only if allowed to */
+	if (only_keys == 0) {
+		bezt->vec[0][0]= get_action_frame_inv(ob, bezt->vec[0][0]);
+		bezt->vec[2][0]= get_action_frame_inv(ob, bezt->vec[2][0]);
+	}
+	bezt->vec[1][0]= get_action_frame_inv(ob, bezt->vec[1][0]);
+}
+
+
+
+/* Apply/Unapply NLA mapping to all keyframes in the nominated IPO-Curve 
+ *	- restore = whether to map points back to ipo-time 
+ * 	- only_keys = whether to only adjust the location of the center point of beztriples
+ */
+void ANIM_nla_mapping_apply_ipocurve(Object *ob, IpoCurve *icu, short restore, short only_keys)
+{
+	BeztEditData bed;
+	BeztEditFunc map_cb;
+	
+	/* init edit data 
+	 *	- ob is stored in 'data'
+	 *	- only_keys is stored in 'i1'
+	 */
+	memset(&bed, 0, sizeof(BeztEditData));
+	bed.data= (void *)ob;
+	bed.i1= (int)only_keys;
+	
+	/* get editing callback */
+	if (restore)
+		map_cb= bezt_nlamapping_restore;
+	else
+		map_cb= bezt_nlamapping_apply;
+	
+	/* apply to IPO curve */
+	ANIM_icu_keys_bezier_loop(&bed, icu, NULL, map_cb, NULL);
+} 
+
 /* Apply/Unapply NLA mapping to all keyframes in the nominated IPO block
  * 	- restore = whether to map points back to ipo-time 
  * 	- only_keys = whether to only adjust the location of the center point of beztriples
  */
 // was called actstrip_map_ipo_keys()
-void ANIM_nla_mapping_apply(Object *ob, Ipo *ipo, short restore, short only_keys)
+void ANIM_nla_mapping_apply_ipo(Object *ob, Ipo *ipo, short restore, short only_keys)
 {
 	IpoCurve *icu;
-	BezTriple *bezt;
-	int a;
 	
-	if (ipo==NULL) return;
+	if (ipo == NULL) return;
 	
 	/* loop through all ipo curves, adjusting the times of the selected keys */
 	for (icu= ipo->curve.first; icu; icu= icu->next) {
-		for (a=0, bezt=icu->bezt; a<icu->totvert; a++, bezt++) {
-			/* are the times being adjusted for editing, or has editing finished */
-			if (restore) {
-				if (only_keys == 0) {
-					bezt->vec[0][0]= get_action_frame(ob, bezt->vec[0][0]);
-					bezt->vec[2][0]= get_action_frame(ob, bezt->vec[2][0]);
-				}					
-				bezt->vec[1][0]= get_action_frame(ob, bezt->vec[1][0]);
-			}
-			else {
-				if (only_keys == 0) {
-					bezt->vec[0][0]= get_action_frame_inv(ob, bezt->vec[0][0]);
-					bezt->vec[2][0]= get_action_frame_inv(ob, bezt->vec[2][0]);
-				}
-				bezt->vec[1][0]= get_action_frame_inv(ob, bezt->vec[1][0]);
-			}
-		}
+		ANIM_nla_mapping_apply_ipocurve(ob, icu, restore, only_keys);
 	}
 }
 

Modified: branches/blender2.5/blender/source/blender/editors/animation/anim_filter.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/anim_filter.c	2009-01-03 05:41:58 UTC (rev 18281)
+++ branches/blender2.5/blender/source/blender/editors/animation/anim_filter.c	2009-01-03 06:01:11 UTC (rev 18282)
@@ -465,6 +465,7 @@
 				IpoCurve *icu= (IpoCurve *)data;
 				
 				ale->flag= icu->flag;
+				
 				ale->key_data= icu;
 				ale->datatype= ALE_ICU;
 			}
@@ -486,6 +487,7 @@
 			case ANIMTYPE_IPO:
 			{
 				ale->flag= 0;
+				
 				ale->key_data= data;
 				ale->datatype= ALE_IPO;
 			}
@@ -510,6 +512,36 @@
  
 /* ----------------------------------------- */
 
+// FIXME: use this...
+static int animdata_filter_ipocurves (ListBase *anim_data, Ipo *ipo, int filter_mode, void *owner, short ownertype, ID *owner_id)
+{
+	bAnimListElem *ale = NULL;
+	IpoCurve *icu;
+	int items = 0;
+	
+	/* loop over ipo curves - assume that the caller of this has already checked that these should be included */
+	for (icu= ipo->curve.first; icu; icu= icu->next) {
+		/* only work with this channel and its subchannels if it is editable */
+		if (!(filter_mode & ANIMFILTER_FOREDIT) || EDITABLE_ICU(icu)) {
+			/* only include this curve if selected or we are including all IPO-curves */
+			if (!(filter_mode & ANIMFILTER_SEL) || (filter_mode & ANIMFILTER_ONLYICU) || (SEL_ICU(icu))) {
+				/* owner/ownertype will be either object or action-channel, depending if it was dopesheet or part of an action */
+				ale= make_new_animlistelem(icu, ANIMTYPE_ICU, owner, ownertype);
+				
+				if (ale) {
+					/* ID will only be Object if data to write to directly belongs there, otherwise, another pointer will be used */
+					ale->id= owner_id;
+					BLI_addtail(anim_data, ale);
+					items++;
+				}
+			}
+		}
+	}
+	
+	/* return the number of items added to the list */
+	return items;
+}
+
 static int animdata_filter_actionchannel (ListBase *anim_data, bActionChannel *achan, int filter_mode, void *owner, short ownertype)
 {
 	bAnimListElem *ale = NULL;
@@ -563,15 +595,7 @@
 				/* add ipo-curve channels? */
 				if (FILTER_IPO_ACHAN(achan) || (filter_mode & ANIMFILTER_ONLYICU)) {
 					/* loop through ipo-curve channels, adding them */
-					for (icu= achan->ipo->curve.first; icu; icu=icu->next) {
-						ale= make_new_animlistelem(icu, ANIMTYPE_ICU, achan, ANIMTYPE_ACHAN);
-						
-						if (ale) {
-							if (owned) ale->id= owner;
-							BLI_addtail(anim_data, ale); 
-							items++;
-						}
-					}
+					items += animdata_filter_ipocurves(anim_data, achan->ipo, filter_mode, achan, ANIMTYPE_ACHAN, (owned)?(owner):(NULL));
 				}
 			}
 			
@@ -755,14 +779,7 @@
 				}
 			}
 			else {
-				for (icu= key->ipo->curve.first; icu; icu=icu->next) {
-					ale= make_new_animlistelem(icu, ANIMTYPE_ICU, key, ANIMTYPE_SHAPEKEY);
-					if (ale) {
-						if (owned) ale->id= owner;
-						BLI_addtail(anim_data, ale);
-						items++;
-					}
-				}
+				items += animdata_filter_ipocurves(anim_data, key->ipo, filter_mode, key, ANIMTYPE_SHAPEKEY, (owned)?(owner):(NULL));
 			}
 		}
 	}
@@ -877,21 +894,10 @@
 			if ( (FILTER_MAT_OBJD(ma) || (filter_mode & ANIMFILTER_ONLYICU)) && 
 				  !(filter_mode & ANIMFILTER_IPOKEYS) ) 
 			{
-				/* loop through ipo-curve channels, adding them */
-				for (icu= ma->ipo->curve.first; icu; icu=icu->next) {
-					/* only if selected (if checking for selection) */
-					if ( !(filter_mode & ANIMFILTER_SEL) || (SEL_ICU(icu)) ) {
-						ale= make_new_animlistelem(icu, ANIMTYPE_ICU, base, ANIMTYPE_OBJECT);
-						if (ale) {
-							/* make owner the material not object, so that indent is not just object level */
-							ale->id= (ID *)ma;
-							BLI_addtail(anim_data, ale);
-							items++;
-						}
-					}
-				}
+				items += animdata_filter_ipocurves(anim_data, ma->ipo, filter_mode, base, ANIMTYPE_OBJECT, (ID *)ma);
 			}
 		}
+
 	}
 	
 	/* return the number of items added to the list */
@@ -903,7 +909,6 @@
 	bAnimListElem *ale=NULL;
 	Object *ob= base->object;
 	Camera *ca= (Camera *)ob->data;
-	IpoCurve *icu;
 	int items = 0;
 	
 	/* include camera-expand widget? */
@@ -919,19 +924,7 @@
 	if ( (FILTER_CAM_OBJD(ca) || (filter_mode & ANIMFILTER_ONLYICU)) && 
 		  !(filter_mode & ANIMFILTER_IPOKEYS) ) 
 	{
-		/* loop through ipo-curve channels, adding them */
-		for (icu= ca->ipo->curve.first; icu; icu=icu->next) {
-			/* only if selected (if checking for selection) */
-			if ( !(filter_mode & ANIMFILTER_SEL) || (SEL_ICU(icu)) ) {
-				ale= make_new_animlistelem(icu, ANIMTYPE_ICU, base, ANIMTYPE_OBJECT);
-				if (ale) {
-					/* make owner the material not object, so that indent is not just object level */
-					ale->id= (ID *)ca;
-					BLI_addtail(anim_data, ale);
-					items++;
-				}
-			}
-		}
+		items += animdata_filter_ipocurves(anim_data, ca->ipo, filter_mode, base, ANIMTYPE_OBJECT, (ID *)ca);
 	}
 	
 	/* return the number of items added to the list */
@@ -943,7 +936,6 @@
 	bAnimListElem *ale=NULL;
 	Object *ob= base->object;
 	Lamp *la= (Lamp *)ob->data;
-	IpoCurve *icu;
 	int items = 0;
 	
 	/* include lamp-expand widget? */
@@ -959,19 +951,7 @@
 	if ( (FILTER_LAM_OBJD(la) || (filter_mode & ANIMFILTER_ONLYICU)) && 
 		  !(filter_mode & ANIMFILTER_IPOKEYS) ) 
 	{
-		/* loop through ipo-curve channels, adding them */
-		for (icu= la->ipo->curve.first; icu; icu=icu->next) {
-			/* only if selected (if checking for selection) */
-			if ( !(filter_mode & ANIMFILTER_SEL) || (SEL_ICU(icu)) ) {
-				ale= make_new_animlistelem(icu, ANIMTYPE_ICU, base, ANIMTYPE_OBJECT);
-				if (ale) {
-					/* make owner the material not object, so that indent is not just object level */
-					ale->id= (ID *)la;
-					BLI_addtail(anim_data, ale);
-					items++;
-				}
-			}
-		}
+		items += animdata_filter_ipocurves(anim_data, la->ipo, filter_mode, base, ANIMTYPE_OBJECT, (ID *)la);
 	}
 	
 	/* return the number of items added to the list */
@@ -983,7 +963,6 @@
 	bAnimListElem *ale=NULL;
 	Object *ob= base->object;
 	Curve *cu= (Curve *)ob->data;
-	IpoCurve *icu;
 	int items = 0;
 	
 	/* include curve-expand widget? */

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list