copy animdata and id-props when copying material node tree's to avoid double memory...
authorCampbell Barton <ideasman42@gmail.com>
Mon, 15 Feb 2010 08:50:04 +0000 (08:50 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 15 Feb 2010 08:50:04 +0000 (08:50 +0000)
source/blender/blenkernel/BKE_library.h
source/blender/blenkernel/intern/library.c
source/blender/blenkernel/intern/node.c

index 7c8a69b82d8a966684832665cf7d725971905a3a..b859dbe6f51875db3345dcdea213fbf6b186c59f 100644 (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);
index 33e59aa2ec52036d734b9e5b1f256436cf18d70e..3ea36450b803768e859fca0fe5557426c43d6533 100644 (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;
 }
index 0f3dc4b1a5a54f51cb4e0858675f5f88e6cb2f8e..1601697bbdb6ee4d037ac79e31d2ede28062958e 100644 (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;
        }