fix for making local loosing references to node groups.
authorCampbell Barton <ideasman42@gmail.com>
Thu, 5 Jul 2012 12:50:50 +0000 (12:50 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 5 Jul 2012 12:50:50 +0000 (12:50 +0000)
node->id was left as an indirect link which wont get saved with the file.

source/blender/blenkernel/intern/node.c

index a5e081d122df3ad52b404f52bbacf47d70cc7774..33df8e4b5033087b6120ab100f2eec4d1189b8c5 100644 (file)
@@ -633,8 +633,12 @@ bNodeTree *ntreeAddTree(const char *name, int type, int nodetype)
  *     - this gets called when executing compositing updates (for threaded previews)
  *     - when the nodetree datablock needs to be copied (i.e. when users get copied)
  *     - for scene duplication use ntreeSwapID() after so we don't have stale pointers.
+ *
+ * do_make_extern: keep enabled for general use, only reason _not_ to enable is when
+ * copying for internal use (threads for eg), where you wont want it to modify the
+ * scene data.
  */
-bNodeTree *ntreeCopyTree(bNodeTree *ntree)
+static bNodeTree *ntreeCopyTree_internal(bNodeTree *ntree, const short do_make_extern)
 {
        bNodeTree *newtree;
        bNode *node /*, *nnode */ /* UNUSED */, *last;
@@ -664,6 +668,11 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree)
        
        last = ntree->nodes.last;
        for (node= ntree->nodes.first; node; node= node->next) {
+
+               if (do_make_extern) {
+                       id_lib_extern(node->id);
+               }
+
                node->new_node= NULL;
                /* nnode= */ nodeCopyNode(newtree, node);       /* sets node->new */
                
@@ -709,6 +718,11 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree)
        return newtree;
 }
 
+bNodeTree *ntreeCopyTree(bNodeTree *ntree)
+{
+       return ntreeCopyTree_internal(ntree, TRUE);
+}
+
 /* use when duplicating scenes */
 void ntreeSwitchID(bNodeTree *ntree, ID *id_from, ID *id_to)
 {
@@ -1131,7 +1145,7 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree)
        }
 
        /* node copy func */
-       ltree= ntreeCopyTree(ntree);
+       ltree = ntreeCopyTree_internal(ntree, FALSE);
 
        if (adt) {
                AnimData *ladt= BKE_animdata_from_id(&ltree->id);