Fix T65612: Ungroup in Node Editor Crashes
authorSergey Sharybin <sergey.vfx@gmail.com>
Fri, 7 Jun 2019 15:45:31 +0000 (17:45 +0200)
committerSergey Sharybin <sergey.vfx@gmail.com>
Fri, 7 Jun 2019 15:45:58 +0000 (17:45 +0200)
source/blender/blenkernel/BKE_node.h
source/blender/blenkernel/intern/node.c
source/blender/editors/space_node/node_group.c

index fb6096c..8a107aa 100644 (file)
@@ -554,6 +554,9 @@ struct bNode *BKE_node_copy_ex(struct bNodeTree *ntree,
 struct bNode *BKE_node_copy_store_new_pointers(struct bNodeTree *ntree,
                                                struct bNode *node_src,
                                                const int flag);
+struct bNodeTree *ntreeCopyTree_ex_new_pointers(const struct bNodeTree *ntree,
+                                                struct Main *bmain,
+                                                const bool do_id_user);
 
 struct bNodeLink *nodeAddLink(struct bNodeTree *ntree,
                               struct bNode *fromnode,
index e1f7a34..62357b7 100644 (file)
@@ -1099,9 +1099,8 @@ bNode *BKE_node_copy_ex(bNodeTree *ntree, const bNode *node_src, const int flag)
   return node_dst;
 }
 
-bNode *BKE_node_copy_store_new_pointers(bNodeTree *ntree, bNode *node_src, const int flag)
+static void node_set_new_pointers(bNode *node_src, bNode *new_node)
 {
-  bNode *new_node = BKE_node_copy_ex(ntree, node_src, flag);
   /* Store mapping to the node itself. */
   node_src->new_node = new_node;
   /* Store mapping to inputs. */
@@ -1120,9 +1119,30 @@ bNode *BKE_node_copy_store_new_pointers(bNodeTree *ntree, bNode *node_src, const
     new_output_sock = new_output_sock->next;
     output_sock_src = output_sock_src->next;
   }
+}
+
+bNode *BKE_node_copy_store_new_pointers(bNodeTree *ntree, bNode *node_src, const int flag)
+{
+  bNode *new_node = BKE_node_copy_ex(ntree, node_src, flag);
+  node_set_new_pointers(node_src, new_node);
   return new_node;
 }
 
+bNodeTree *ntreeCopyTree_ex_new_pointers(const bNodeTree *ntree,
+                                         Main *bmain,
+                                         const bool do_id_user)
+{
+  bNodeTree *new_ntree = ntreeCopyTree_ex(ntree, bmain, do_id_user);
+  bNode *new_node = new_ntree->nodes.first;
+  bNode *node_src = ntree->nodes.first;
+  while (new_node != NULL) {
+    node_set_new_pointers(node_src, new_node);
+    new_node = new_node->next;
+    node_src = node_src->next;
+  }
+  return new_ntree;
+}
+
 /* also used via rna api, so we check for proper input output direction */
 bNodeLink *nodeAddLink(
     bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, bNode *tonode, bNodeSocket *tosock)
index a0729a1..3fd03ba 100644 (file)
@@ -197,7 +197,7 @@ static int node_group_ungroup(Main *bmain, bNodeTree *ntree, bNode *gnode)
    * - ngroup (i.e. the source NodeTree) is left unscathed
    * - temp copy. don't change ID usercount
    */
-  wgroup = ntreeCopyTree_ex(ngroup, bmain, false);
+  wgroup = ntreeCopyTree_ex_new_pointers(ngroup, bmain, false);
 
   /* Add the nodes into the ntree */
   for (node = wgroup->nodes.first; node; node = nextnode) {