[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26142] trunk/blender/source/blender/ blenkernel: Fix for proxy fix: copy drivers on synchronize now does proper relinking

Brecht Van Lommel brecht at blender.org
Wed Jan 20 15:28:50 CET 2010


Revision: 26142
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26142
Author:   blendix
Date:     2010-01-20 15:28:49 +0100 (Wed, 20 Jan 2010)

Log Message:
-----------
Fix for proxy fix: copy drivers on synchronize now does proper relinking
of driver targets, sharing code with make proxy.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_object.h
    trunk/blender/source/blender/blenkernel/intern/armature.c
    trunk/blender/source/blender/blenkernel/intern/object.c

Modified: trunk/blender/source/blender/blenkernel/BKE_object.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_object.h	2010-01-20 14:06:38 UTC (rev 26141)
+++ trunk/blender/source/blender/blenkernel/BKE_object.h	2010-01-20 14:28:49 UTC (rev 26142)
@@ -67,6 +67,7 @@
 void object_free_modifiers(struct Object *ob);
 
 void object_make_proxy(struct Object *ob, struct Object *target, struct Object *gob);
+void object_copy_proxy_drivers(struct Object *ob, struct Object *target);
 
 void unlink_object(struct Scene *scene, struct Object *ob);
 int exist_object(struct Object *obtest);

Modified: trunk/blender/source/blender/blenkernel/intern/armature.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/armature.c	2010-01-20 14:06:38 UTC (rev 26141)
+++ trunk/blender/source/blender/blenkernel/intern/armature.c	2010-01-20 14:28:49 UTC (rev 26142)
@@ -61,7 +61,6 @@
 #include "BKE_depsgraph.h"
 #include "BKE_DerivedMesh.h"
 #include "BKE_displist.h"
-#include "BKE_fcurve.h"
 #include "BKE_global.h"
 #include "BKE_idprop.h"
 #include "BKE_library.h"
@@ -1573,15 +1572,6 @@
 			pchan->custom= pchanp->custom;
 		}
 	}
-
-	/* copy drivers */
-	adt= BKE_animdata_from_id(&ob->id);
-	fromadt= BKE_animdata_from_id(&from->id);
-	if(!adt)
-		adt= BKE_id_add_animdata(&ob->id);
-
-	free_fcurves(&adt->drivers);
-	copy_fcurves(&adt->drivers, &fromadt->drivers);
 }
 
 static int rebuild_pose_bone(bPose *pose, Bone *bone, bPoseChannel *parchan, int counter)
@@ -1644,8 +1634,10 @@
 	// printf("rebuild pose %s, %d bones\n", ob->id.name, counter);
 	
 	/* synchronize protected layers with proxy */
-	if(ob->proxy)
+	if(ob->proxy) {
+		object_copy_proxy_drivers(ob, ob->proxy);
 		pose_proxy_synchronize(ob, ob->proxy, arm->layer_protected);
+	}
 	
 	update_pose_constraint_flags(ob->pose); // for IK detection for example
 	

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2010-01-20 14:06:38 UTC (rev 26141)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2010-01-20 14:28:49 UTC (rev 26142)
@@ -1453,6 +1453,38 @@
 			
 }
 
+void object_copy_proxy_drivers(Object *ob, Object *target)
+{
+	if ((target->adt) && (target->adt->drivers.first)) {
+		FCurve *fcu;
+		
+		/* add new animdata block */
+		if(!ob->adt)
+			ob->adt= BKE_id_add_animdata(&ob->id);
+		
+		/* make a copy of all the drivers (for now), then correct any links that need fixing */
+		free_fcurves(&ob->adt->drivers);
+		copy_fcurves(&ob->adt->drivers, &target->adt->drivers);
+		
+		for (fcu= ob->adt->drivers.first; fcu; fcu= fcu->next) {
+			ChannelDriver *driver= fcu->driver;
+			DriverVar *dvar;
+			
+			for (dvar= driver->variables.first; dvar; dvar= dvar->next) {
+				/* all drivers */
+				DRIVER_TARGETS_LOOPER(dvar) 
+				{
+					if ((Object *)dtar->id == target)
+						dtar->id= (ID *)ob;
+					else
+						id_lib_extern((ID *)dtar->id);
+				}
+				DRIVER_TARGETS_LOOPER_END
+			}
+		}
+	}
+}
+
 /* proxy rule: lib_object->proxy_from == the one we borrow from, set temporally while object_update */
 /*             local_object->proxy == pointer to library object, saved in files and read */
 /*             local_object->proxy_group == pointer to group dupli-object, saved in files and read */
@@ -1489,33 +1521,8 @@
 	copy_m4_m4(ob->parentinv, target->parentinv);
 	
 	/* copy animdata stuff - drivers only for now... */
-	if ((target->adt) && (target->adt->drivers.first)) {
-		FCurve *fcu;
-		
-		/* add new animdata block */
-		ob->adt= BKE_id_add_animdata(&ob->id);
-		
-		/* make a copy of all the drivers (for now), then correct any links that need fixing */
-		copy_fcurves(&ob->adt->drivers, &target->adt->drivers);
-		
-		for (fcu= ob->adt->drivers.first; fcu; fcu= fcu->next) {
-			ChannelDriver *driver= fcu->driver;
-			DriverVar *dvar;
-			
-			for (dvar= driver->variables.first; dvar; dvar= dvar->next) {
-				/* all drivers */
-				DRIVER_TARGETS_LOOPER(dvar) 
-				{
-					if ((Object *)dtar->id == target)
-						dtar->id= (ID *)ob;
-					else
-						id_lib_extern((ID *)dtar->id);
-				}
-				DRIVER_TARGETS_LOOPER_END
-			}
-		}
-	}
-	
+	void object_proxy_copy_drivers(ob, target);
+
 	/* skip constraints? */
 	// FIXME: this is considered by many as a bug
 	





More information about the Bf-blender-cvs mailing list