diff options
author | Campbell Barton <ideasman42@gmail.com> | 2010-01-30 00:16:21 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2010-01-30 00:16:21 +0300 |
commit | 3946ae56ac585121bcec8871393f0dae3a57a56b (patch) | |
tree | 82767e3ec1353e353009d1771789bd15c9e4b0ab /source/blender/blenkernel/intern/library.c | |
parent | 588d3661c858c0f7d095463469d6f2497c018d49 (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.c | 30 |
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 */ |