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
        


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to