[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26404] trunk/blender/source/blender/ blenkernel: deleting objects which were driver targets would crash blender.
Campbell Barton
ideasman42 at gmail.com
Fri Jan 29 22:16:21 CET 2010
Revision: 26404
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26404
Author: campbellbarton
Date: 2010-01-29 22:16:21 +0100 (Fri, 29 Jan 2010)
Log Message:
-----------
deleting objects which were driver targets would crash blender.
added a utility function BKE_animdata_main_cb
which loops over all AnimData's of all ID's
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_animsys.h
trunk/blender/source/blender/blenkernel/intern/anim_sys.c
trunk/blender/source/blender/blenkernel/intern/library.c
Modified: trunk/blender/source/blender/blenkernel/BKE_animsys.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_animsys.h 2010-01-29 19:38:56 UTC (rev 26403)
+++ trunk/blender/source/blender/blenkernel/BKE_animsys.h 2010-01-29 21:16:21 UTC (rev 26404)
@@ -94,6 +94,8 @@
/* Fix all the paths for the entire database... */
void BKE_all_animdata_fix_paths_rename(char *prefix, char *oldName, char *newName);
+void BKE_animdata_main_cb(struct Main *main, void (*func)(struct ID *, struct AnimData *, void *), void *user_data);
+
/* ************************************* */
// TODO: overrides, remapping, and path-finding api's
Modified: trunk/blender/source/blender/blenkernel/intern/anim_sys.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim_sys.c 2010-01-29 19:38:56 UTC (rev 26403)
+++ trunk/blender/source/blender/blenkernel/intern/anim_sys.c 2010-01-29 21:16:21 UTC (rev 26404)
@@ -422,10 +422,51 @@
MEM_freeN(newN);
}
+void BKE_animdata_main_cb(Main *main, void (*func)(ID *, AnimData *, void *), void *user_data)
+{
+ ID *id;
+
+#define ANIMDATA_IDS_CB(first) \
+ for (id= first; id; id= id->next) { \
+ AnimData *adt= BKE_animdata_from_id(id); \
+ if(adt) func(id, adt, user_data); \
+ }
+
+ ANIMDATA_IDS_CB(main->nodetree.first); /* nodes */
+ ANIMDATA_IDS_CB(main->tex.first); /* textures */
+ ANIMDATA_IDS_CB(main->lamp.first); /* lamps */
+ ANIMDATA_IDS_CB(main->mat.first); /* materials */
+ ANIMDATA_IDS_CB(main->camera.first); /* cameras */
+ ANIMDATA_IDS_CB(main->key.first); /* shapekeys */
+ ANIMDATA_IDS_CB(main->mball.first); /* metaballs */
+ ANIMDATA_IDS_CB(main->curve.first); /* curves */
+ ANIMDATA_IDS_CB(main->armature.first); /* armatures */
+ ANIMDATA_IDS_CB(main->mesh.first); /* meshes */
+ ANIMDATA_IDS_CB(main->particle.first); /* particles */
+ ANIMDATA_IDS_CB(main->object.first); /* objects */
+ ANIMDATA_IDS_CB(main->world.first); /* worlds */
+
+ /* scenes */
+ for (id= main->scene.first; id; id= id->next) {
+ AnimData *adt= BKE_animdata_from_id(id);
+ Scene *scene= (Scene *)id;
+
+ /* do compositing nodes first (since these aren't included in main tree) */
+ if (scene->nodetree) {
+ AnimData *adt2= BKE_animdata_from_id((ID *)scene->nodetree);
+ if(adt2) func(id, adt2, user_data);
+ }
+
+ /* now fix scene animation data as per normal */
+ if(adt) func((ID *)id, adt, user_data);
+ }
+}
+
/* Fix all RNA-Paths throughout the database (directly access the Global.main version)
* NOTE: it is assumed that the structure we're replacing is <prefix><["><name><"]>
* i.e. pose.bones["Bone"]
*/
+/* TODO: use BKE_animdata_main_cb for looping over all data */
void BKE_all_animdata_fix_paths_rename (char *prefix, char *oldName, char *newName)
{
Main *mainptr= G.main;
Modified: trunk/blender/source/blender/blenkernel/intern/library.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/library.c 2010-01-29 19:38:56 UTC (rev 26403)
+++ trunk/blender/source/blender/blenkernel/intern/library.c 2010-01-29 21:16:21 UTC (rev 26404)
@@ -698,6 +698,30 @@
free_windowmanager_cb= func;
}
+void animdata_dtar_clear_cb(ID *id, AnimData *adt, void *userdata)
+{
+ ChannelDriver *driver;
+ FCurve *fcu;
+
+ /* find the driver this belongs to and update it */
+ for (fcu=adt->drivers.first; fcu; fcu=fcu->next) {
+ driver= fcu->driver;
+
+ if (driver) {
+ DriverVar *dvar;
+ for (dvar= driver->variables.first; dvar; dvar= dvar->next) {
+ DriverTarget *dtar= &dvar->targets[0];
+ int tarIndex= 0;
+ for (; tarIndex < MAX_DRIVER_TARGETS; tarIndex++, dtar++) {
+ if(dtar->id == userdata)
+ dtar->id= NULL;
+ }
+ }
+ }
+ }
+}
+
+
/* used in headerbuttons.c image.c mesh.c screen.c sound.c and library.c */
void free_libblock(ListBase *lb, void *idv)
{
@@ -798,9 +822,13 @@
IDP_FreeProperty(id->properties);
MEM_freeN(id->properties);
}
+
BLI_remlink(lb, id);
+
+ /* this ID may be a driver target! */
+ BKE_animdata_main_cb(G.main, animdata_dtar_clear_cb, (void *)id);
+
MEM_freeN(id);
-
}
void free_libblock_us(ListBase *lb, void *idv) /* test users */
More information about the Bf-blender-cvs
mailing list