[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