[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34645] trunk/blender/source/blender/ editors/curve/editcurve.c: - Drivers should now be updated correct when curve changes topology

Sergey Sharybin g.ulairi at gmail.com
Fri Feb 4 22:10:28 CET 2011


Revision: 34645
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=34645
Author:   nazgul
Date:     2011-02-04 21:10:27 +0000 (Fri, 04 Feb 2011)
Log Message:
-----------
- Drivers should now be updated correct when curve changes topology
- Fixed regression with keeping alive f=curves for deleted CVs
  (was a mistake in previous commit in this area)

Modified Paths:
--------------
    trunk/blender/source/blender/editors/curve/editcurve.c

Modified: trunk/blender/source/blender/editors/curve/editcurve.c
===================================================================
--- trunk/blender/source/blender/editors/curve/editcurve.c	2011-02-04 16:28:19 UTC (rev 34644)
+++ trunk/blender/source/blender/editors/curve/editcurve.c	2011-02-04 21:10:27 UTC (rev 34645)
@@ -85,7 +85,7 @@
 	ListBase nubase;
 	void *lastsel;
 	GHash *undoIndex;
-	ListBase fcurves;
+	ListBase fcurves, drivers;
 } UndoCurve;
 
 /* Definitions needed for shape keys */
@@ -1008,7 +1008,7 @@
 	Curve *cu= (Curve*)ob->data;
 	AnimData *ad= BKE_animdata_from_id(&cu->id);
 
-	return ad && ad->action;
+	return ad && (ad->action || ad->drivers.first);
 }
 
 static void fcurve_path_rename(AnimData *ad, char *orig_rna_path, char *rna_path, ListBase *orig_curves, ListBase *curves)
@@ -1030,8 +1030,10 @@
 				action_groups_remove_channel(ad->action, fcu);
 				action_groups_add_channel(ad->action, fcu->grp, nfcu);
 			}
-			else if (ad->action)
+			else if (ad->action && &ad->action->curves == orig_curves)
 				BLI_remlink(&ad->action->curves, fcu);
+			else
+				BLI_remlink(&ad->drivers, fcu);
 
 			free_fcurve(fcu);
 
@@ -1041,9 +1043,16 @@
 	}
 }
 
-/* return 0 if animation data wasn't changed, 1 otherwise */
-int ED_curve_updateAnimPaths(Object *obedit)
+static void fcurve_remove(AnimData *ad, ListBase *orig_curves, FCurve *fcu)
 {
+	if(orig_curves==&ad->drivers) BLI_remlink(&ad->drivers, fcu);
+	else action_groups_remove_channel(ad->action, fcu);
+
+	free_fcurve(fcu);
+}
+
+static void curve_rename_fcurves(Object *obedit, ListBase *orig_curves)
+{
 	int nu_index= 0, a, pt_index;
 	Curve *cu= (Curve*)obedit->data;
 	EditNurb *editnurb= cu->editnurb;
@@ -1051,14 +1060,9 @@
 	CVKeyIndex *keyIndex;
 	char rna_path[64], orig_rna_path[64];
 	AnimData *ad= BKE_animdata_from_id(&cu->id);
-	ListBase *orig_curves= NULL;
 	ListBase curves= {0, 0};
 	FCurve *fcu, *next;
 
-	if(!curve_is_animated(obedit)) return 0;
-
-	orig_curves= &ad->action->curves;
-
 	while(nu) {
 		if(nu->bezt) {
 			BezTriple *bezt= nu->bezt;
@@ -1115,6 +1119,21 @@
 		nu_index++;
 	}
 
+	/* remove pathes for removed control points
+	   need this to make further step with copying non-cv related curves copying
+	   not touching cv's f-cruves */
+	fcu= orig_curves->first;
+	for(fcu= orig_curves->first; fcu; fcu= next) {
+		next= fcu->next;
+
+		if(!strncmp(fcu->rna_path, "splines", 7)) {
+			char *ch= strchr(fcu->rna_path, '.');
+
+			if (ch && (!strncmp(ch, ".bezier_points", 14) || !strncmp(ch, ".points", 8)))
+				fcurve_remove(ad, orig_curves, fcu);
+		}
+	}
+
 	nu_index= 0;
 	nu= editnurb->nurbs.first;
 	while(nu) {
@@ -1127,7 +1146,7 @@
 		if(keyIndex) {
 			sprintf(rna_path, "splines[%d]", nu_index);
 			sprintf(orig_rna_path, "splines[%d]", keyIndex->nu_index);
-			fcurve_path_rename(ad, orig_rna_path, rna_path, &ad->action->curves, &curves);
+			fcurve_path_rename(ad, orig_rna_path, rna_path, orig_curves, &curves);
 		}
 
 		nu_index++;
@@ -1139,14 +1158,26 @@
 	for(fcu= orig_curves->first; fcu; fcu= next) {
 		next= fcu->next;
 
-		if(!strncmp(fcu->rna_path, "splines", 7)) {
-			action_groups_remove_channel(ad->action, fcu);
-			free_fcurve(fcu);
-		} else BLI_addtail(&curves, fcu);
+		if(!strncmp(fcu->rna_path, "splines", 7)) fcurve_remove(ad, orig_curves, fcu);
+		else BLI_addtail(&curves, fcu);
 	}
-	
-	ad->action->curves= curves;
 
+	*orig_curves= curves;
+}
+
+/* return 0 if animation data wasn't changed, 1 otherwise */
+int ED_curve_updateAnimPaths(Object *obedit)
+{
+	Curve *cu= (Curve*)obedit->data;
+	AnimData *ad= BKE_animdata_from_id(&cu->id);
+
+	if(!curve_is_animated(obedit)) return 0;
+
+	if(ad->action)
+		curve_rename_fcurves(obedit, &ad->action->curves);
+
+	curve_rename_fcurves(obedit, &ad->drivers);
+
 	return 1;
 }
 
@@ -1193,7 +1224,6 @@
 	EditNurb *editnurb= cu->editnurb;
 	Nurb *nu, *newnu, *nu_act= NULL;
 	KeyBlock *actkey;
-	int is_anim;
 
 	if(obedit==NULL) return;
 
@@ -1201,7 +1231,6 @@
 
 	if (ELEM(obedit->type, OB_CURVE, OB_SURF)) {
 		actkey= ob_get_keyblock(obedit);
-		is_anim= curve_is_animated(obedit);
 
 		if(actkey) {
 			// XXX strcpy(G.editModeTitleExtra, "(Key) ");
@@ -1209,10 +1238,6 @@
 			key_to_curve(actkey, cu, &cu->nurb);
 		}
 
-		if (is_anim) {
-			undo_editmode_clear();
-		}
-
 		if(editnurb) {
 			freeNurblist(&editnurb->nurbs);
 			free_editNurb_keyIndex(editnurb);
@@ -6882,9 +6907,14 @@
 		editnurb->keyindex= dupli_keyIndexHash(undoCurve->undoIndex);
 	}
 
-	if(ad && ad->action) {
-		free_fcurves(&ad->action->curves);
-		copy_fcurves(&ad->action->curves, &undoCurve->fcurves);
+	if(ad) {
+		if(ad->action) {
+			free_fcurves(&ad->action->curves);
+			copy_fcurves(&ad->action->curves, &undoCurve->fcurves);
+		}
+
+		free_fcurves(&ad->drivers);
+		copy_fcurves(&ad->drivers, &undoCurve->drivers);
 	}
 
 	/* copy  */
@@ -6925,9 +6955,13 @@
 		tmpEditnurb.keyindex= undoCurve->undoIndex;
 	}
 
-	if(ad && ad->action)
-		copy_fcurves(&undoCurve->fcurves, &ad->action->curves);
+	if(ad) {
+		if(ad->action)
+			copy_fcurves(&undoCurve->fcurves, &ad->action->curves);
 
+		copy_fcurves(&undoCurve->drivers, &ad->drivers);
+	}
+
 	/* copy  */
 	for(nu= nubase->first; nu; nu= nu->next) {
 		newnu= duplicateNurb(nu);
@@ -6958,6 +6992,7 @@
 		BLI_ghash_free(undoCurve->undoIndex, NULL, (GHashValFreeFP)free_cvKeyIndex);
 
 	free_fcurves(&undoCurve->fcurves);
+	free_fcurves(&undoCurve->drivers);
 
 	MEM_freeN(undoCurve);
 }




More information about the Bf-blender-cvs mailing list