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:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user