diff options
author | Campbell Barton <ideasman42@gmail.com> | 2010-02-15 11:50:04 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2010-02-15 11:50:04 +0300 |
commit | 83fd3fbb433c3899f92de2078dd6a9350722da8d (patch) | |
tree | 4e149346d7afb837fbda7f3b4ac79ce97f77d54c /source | |
parent | 12cd5617ea38039fcae77bdd6a8216b041fb0ce0 (diff) |
copy animdata and id-props when copying material node tree's to avoid double memory frees or node trees sharing animdata when they shouldnt.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_library.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/library.c | 18 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 6 |
3 files changed, 18 insertions, 7 deletions
diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h index 7c8a69b82d8..b859dbe6f51 100644 --- a/source/blender/blenkernel/BKE_library.h +++ b/source/blender/blenkernel/BKE_library.h @@ -42,6 +42,7 @@ struct bContext; void *alloc_libblock(struct ListBase *lb, short type, const char *name); void *copy_libblock(void *rt); +void copy_libblock_data(struct ID *id, const struct ID *id_from); void id_lib_extern(struct ID *id); void id_us_plus(struct ID *id); diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c index 33e59aa2ec5..3ea36450b80 100644 --- a/source/blender/blenkernel/intern/library.c +++ b/source/blender/blenkernel/intern/library.c @@ -653,7 +653,17 @@ static void id_copy_animdata(ID *id) } } -/* used everywhere in blenkernel and text.c */ +/* material nodes use this since they are not treated as libdata */ +void copy_libblock_data(ID *id, const ID *id_from) +{ + if (id_from->properties) + id->properties = IDP_CopyProperty(id_from->properties); + + /* the duplicate should get a copy of the animdata */ + id_copy_animdata(id); +} + +/* used everywhere in blenkernel */ void *copy_libblock(void *rt) { ID *idn, *id; @@ -679,10 +689,8 @@ void *copy_libblock(void *rt) id->newid= idn; idn->flag |= LIB_NEW; - if (id->properties) idn->properties = IDP_CopyProperty(id->properties); - - /* the duplicate should get a copy of the animdata */ - id_copy_animdata(idn); + + copy_libblock_data(idn, id); return idn; } diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 0f3dc4b1a5a..1601697bbdb 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -1105,10 +1105,12 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree, int internal_select) /* is ntree part of library? */ for(newtree=G.main->nodetree.first; newtree; newtree= newtree->id.next) if(newtree==ntree) break; - if(newtree) + if(newtree) { newtree= copy_libblock(ntree); - else + } else { newtree= MEM_dupallocN(ntree); + copy_libblock_data(&newtree->id, &ntree->id); /* copy animdata and ID props */ + } newtree->nodes.first= newtree->nodes.last= NULL; newtree->links.first= newtree->links.last= NULL; } |