copy animdata and id-props when copying material node tree's to avoid double memory frees or node trees sharing animdata when they shouldnt.

This commit is contained in:
Campbell Barton
2010-02-15 08:50:04 +00:00
parent 12cd5617ea
commit 83fd3fbb43
3 changed files with 18 additions and 7 deletions

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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;
}