Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2010-01-30 00:16:21 +0300
committerCampbell Barton <ideasman42@gmail.com>2010-01-30 00:16:21 +0300
commit3946ae56ac585121bcec8871393f0dae3a57a56b (patch)
tree82767e3ec1353e353009d1771789bd15c9e4b0ab /source/blender/blenkernel/intern/library.c
parent588d3661c858c0f7d095463469d6f2497c018d49 (diff)
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
Diffstat (limited to 'source/blender/blenkernel/intern/library.c')
-rw-r--r--source/blender/blenkernel/intern/library.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 4b6257b8b18..8512b6315e1 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -698,6 +698,30 @@ void set_free_windowmanager_cb(void (*func)(bContext *C, wmWindowManager *) )
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 @@ void free_libblock(ListBase *lb, void *idv)
IDP_FreeProperty(id->properties);
MEM_freeN(id->properties);
}
+
BLI_remlink(lb, id);
- MEM_freeN(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 */