diff options
-rw-r--r-- | source/blender/blenkernel/BKE_node.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 38 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_node_types.h | 2 | ||||
-rw-r--r-- | source/blender/src/drawnode.c | 14 |
4 files changed, 46 insertions, 12 deletions
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 6f6d7fa7850..2bb0c6eff7f 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -153,7 +153,7 @@ void nodeUpdateType(struct bNodeTree *ntree, struct bNode* node, struct bNodeT void nodeMakeDynamicType(struct bNode *node); int nodeDynamicUnlinkText(struct ID *txtid); void nodeFreeNode(struct bNodeTree *ntree, struct bNode *node); -struct bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node); +struct bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node, int internal); struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock); void nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link); @@ -179,6 +179,8 @@ int nodeGroupUnGroup(struct bNodeTree *ntree, struct bNode *gnode); void nodeVerifyGroup(struct bNodeTree *ngroup); void nodeGroupSocketUseFlags(struct bNodeTree *ngroup); +void nodeCopyGroup(struct bNode *gnode); + /* ************** COMMON NODES *************** */ #define NODE_GROUP 2 diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index e888338bc9b..179e5b0ba94 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -801,6 +801,23 @@ int nodeGroupUnGroup(bNodeTree *ntree, bNode *gnode) return 1; } +void nodeCopyGroup(bNode *gnode) +{ + bNodeSocket *sock; + + gnode->id->us--; + gnode->id= (ID *)ntreeCopyTree((bNodeTree *)gnode->id, 0); + + /* new_sock was set in nodeCopyNode */ + for(sock=gnode->inputs.first; sock; sock=sock->next) + if(sock->tosock) + sock->tosock= sock->tosock->new_sock; + + for(sock=gnode->outputs.first; sock; sock=sock->next) + if(sock->tosock) + sock->tosock= sock->tosock->new_sock; +} + /* ************** Add stuff ********** */ void nodeAddSockets(bNode *node, bNodeType *ntype) { @@ -901,23 +918,30 @@ void nodeUpdateType(bNodeTree *ntree, bNode* node, bNodeType *ntype) /* keep socket listorder identical, for copying links */ /* ntree is the target tree */ -bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node) +bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node, int internal) { bNode *nnode= MEM_callocN(sizeof(bNode), "dupli node"); - bNodeSocket *sock; + bNodeSocket *sock, *oldsock; *nnode= *node; BLI_addtail(&ntree->nodes, nnode); duplicatelist(&nnode->inputs, &node->inputs); - for(sock= nnode->inputs.first; sock; sock= sock->next) - sock->own_index= 0; + oldsock= node->inputs.first; + for(sock= nnode->inputs.first; sock; sock= sock->next, oldsock= oldsock->next) { + oldsock->new_sock= sock; + if(internal) + sock->own_index= 0; + } duplicatelist(&nnode->outputs, &node->outputs); - for(sock= nnode->outputs.first; sock; sock= sock->next) { - sock->own_index= 0; + oldsock= node->outputs.first; + for(sock= nnode->outputs.first; sock; sock= sock->next, oldsock= oldsock->next) { + if(internal) + sock->own_index= 0; sock->stack_index= 0; sock->ns.data= NULL; + oldsock->new_sock= sock; } if(nnode->id) @@ -995,7 +1019,7 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree, int internal_select) node->new_node= NULL; if(internal_select==0 || (node->flag & NODE_SELECT)) { - nnode= nodeCopyNode(newtree, node); /* sets node->new */ + nnode= nodeCopyNode(newtree, node, internal_select); /* sets node->new */ if(internal_select) { node->flag &= ~NODE_SELECT; nnode->flag |= NODE_SELECT; diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 0e2805c88b7..ecf86175999 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -58,7 +58,7 @@ typedef struct bNodeStack { #define NS_OSA_VALUES 2 typedef struct bNodeSocket { - struct bNodeSocket *next, *prev; + struct bNodeSocket *next, *prev, *new_sock; char name[32]; bNodeStack ns; /* custom data for inputs, only UI writes in this */ diff --git a/source/blender/src/drawnode.c b/source/blender/src/drawnode.c index 503a3ab3e7c..b15f81e77ae 100644 --- a/source/blender/src/drawnode.c +++ b/source/blender/src/drawnode.c @@ -247,6 +247,14 @@ static void node_but_title_cb(void *node_v, void *but_v) allqueue(REDRAWNODE, 0); } +static void node_group_alone_cb(void *node_v, void *unused_v) +{ + bNode *node= node_v; + + nodeCopyGroup(node); + + allqueue(REDRAWNODE, 0); +} /* ****************** BUTTON CALLBACKS FOR ALL TREES ***************** */ @@ -272,7 +280,7 @@ static int node_buts_group(uiBlock *block, bNodeTree *ntree, bNode *node, rctf * bt= uiDefBut(block, BUT, B_NOP, str1, butr->xmax-19, butr->ymin, 19, 19, NULL, 0, 0, 0, 0, "Displays number of users."); - //uiButSetFunc(bt, node_mat_alone_cb, node, NULL); + uiButSetFunc(bt, node_group_alone_cb, node, NULL); } uiBlockEndAlign(block); @@ -3104,7 +3112,7 @@ static void node_draw_group_links(SpaceNode *snode, bNode *gnode) bNodeSocket *sock; glEnable(GL_BLEND); - glEnable( GL_LINE_SMOOTH ); + glEnable(GL_LINE_SMOOTH); fakelink.tonode= fakelink.fromnode= gnode; @@ -3129,7 +3137,7 @@ static void node_draw_group_links(SpaceNode *snode, bNode *gnode) } glDisable(GL_BLEND); - glDisable( GL_LINE_SMOOTH ); + glDisable(GL_LINE_SMOOTH); } /* groups are, on creation, centered around 0,0 */ |