diff options
-rw-r--r-- | release/scripts/ui/space_node.py | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_node.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 12 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_edit.c | 94 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_header.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_intern.h | 2 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_ops.c | 3 |
7 files changed, 95 insertions, 20 deletions
diff --git a/release/scripts/ui/space_node.py b/release/scripts/ui/space_node.py index 9cf0a0c5ef3..3dc26f49a6f 100644 --- a/release/scripts/ui/space_node.py +++ b/release/scripts/ui/space_node.py @@ -120,6 +120,7 @@ class NODE_MT_node(bpy.types.Menu): layout.separator() layout.operator("node.link_make") + layout.operator("node.link_make", text="Make and Replace Links").replace=True layout.separator() layout.operator("node.group_edit") diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 3ed9ab8778e..8da732af2dd 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -174,6 +174,7 @@ struct bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node, int inte 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); +void nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock); struct bNode *nodeFindNodebyName(struct bNodeTree *ntree, const char *name); int nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex); diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 84ef4fb6d1c..b02225bd429 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -1063,6 +1063,18 @@ void nodeRemLink(bNodeTree *ntree, bNodeLink *link) MEM_freeN(link); } +void nodeRemSocketLinks(bNodeTree *ntree, bNodeSocket *sock) +{ + bNodeLink *link, *next; + + for(link= ntree->links.first; link; link= next) { + next= link->next; + if(link->fromsock==sock || link->tosock==sock) { + nodeRemLink(ntree, link); + } + } +} + bNodeTree *ntreeAddTree(int type) { diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index f177e1a2622..f2b3ed29067 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -1353,7 +1353,33 @@ static int node_socket_hilights(SpaceNode *snode, int in_out) /* ****************** Add *********************** */ -void snode_autoconnect(SpaceNode *snode, bNode *node_to, int flag) +static bNodeSocket *get_next_outputsocket(bNodeSocket *sock, bNodeSocket **sockfrom, int totsock) +{ + int a; + + /* first try to find a sockets with matching name */ + for (a=0; a<totsock; a++) { + if(sockfrom[a]) { + if(sock->type==sockfrom[a]->type) { + if (strcmp(sockfrom[a]->name, sock->name)==0) + return sockfrom[a]; + } + } + } + + /* otherwise settle for the first available socket of the right type */ + for (a=0; a<totsock; a++) { + if(sockfrom[a]) { + if(sock->type==sockfrom[a]->type) { + return sockfrom[a]; + } + } + } + + return NULL; +} + +void snode_autoconnect(SpaceNode *snode, bNode *node_to, int flag, int replace) { bNodeSocket *sock, *sockfrom[8]; bNode *node, *nodefrom[8]; @@ -1361,14 +1387,14 @@ void snode_autoconnect(SpaceNode *snode, bNode *node_to, int flag) if(node_to==NULL || node_to->inputs.first==NULL) return; - - /* no inputs for node allowed (code it) */ - /* connect first 1 socket type now */ - for(sock= node_to->inputs.first; sock; sock= sock->next) + /* connect first 1 socket type or first available socket now */ + for(sock= node_to->inputs.first; sock; sock= sock->next) { + if (!replace && nodeCountSocketLinks(snode->edittree, sock)) + continue; if(socktype<sock->type) socktype= sock->type; - + } /* find potential sockets, max 8 should work */ for(node= snode->edittree->nodes.first; node; node= node->next) { @@ -1389,17 +1415,27 @@ void snode_autoconnect(SpaceNode *snode, bNode *node_to, int flag) /* now just get matching socket types and create links */ for(sock= node_to->inputs.first; sock; sock= sock->next) { - int a; + bNodeSocket *sock_from; + bNode *node_from; - for(a=0; a<totsock; a++) { - if(sockfrom[a]) { - if(sock->type==sockfrom[a]->type && sock->type==socktype) { - nodeAddLink(snode->edittree, nodefrom[a], sockfrom[a], node_to, sock); - sockfrom[a]= NULL; - break; - } - } + if (sock->type != socktype) + continue; + + /* find a potential output socket and associated node */ + sock_from = get_next_outputsocket(sock, sockfrom, totsock); + if (!sock_from) + continue; + nodeFindNode(snode->edittree, sock_from, &node_from, NULL); + + /* then connect up the links */ + if (replace) { + nodeRemSocketLinks(snode->edittree, sock); + nodeAddLink(snode->edittree, node_from, sock_from, node_to, sock); + } else { + if (nodeCountSocketLinks(snode->edittree, sock)==0) + nodeAddLink(snode->edittree, node_from, sock_from, node_to, sock); } + sock_from = NULL; } ntreeSolveOrder(snode->edittree); @@ -1749,11 +1785,33 @@ static int node_make_link_exec(bContext *C, wmOperator *op) bNodeLink *link; bNodeSocket *outsock= snode->edittree->selout; bNodeSocket *insock= snode->edittree->selin; + int replace = RNA_boolean_get(op->ptr, "replace"); if (!insock || !outsock) { - BKE_report(op->reports, RPT_ERROR, "No input or output socket(s) selected"); - return OPERATOR_CANCELLED; + bNode *node; + + /* no socket selection, join nodes themselves, guessing connections */ + tonode = nodeGetActive(snode->edittree); + + if (!tonode) { + BKE_report(op->reports, RPT_ERROR, "No active node"); + return OPERATOR_CANCELLED; + } + + /* store selection in temp test flag */ + for(node= snode->edittree->nodes.first; node; node= node->next) { + if(node->flag & NODE_SELECT) node->flag |= NODE_TEST; + else node->flag &= ~NODE_TEST; + } + + snode_autoconnect(snode, tonode, NODE_TEST, replace); + node_tree_verify_groups(snode->nodetree); + snode_handle_recalc(C, snode); + + return OPERATOR_FINISHED; } + + if (nodeFindLink(snode->edittree, outsock, insock)) { BKE_report(op->reports, RPT_ERROR, "There is already a link between these sockets"); return OPERATOR_CANCELLED; @@ -1789,6 +1847,8 @@ void NODE_OT_link_make(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_boolean(ot->srna, "replace", 0, "Replace", "Replace socket connections with the new links"); } /* ********************** Cut Link operator ***************** */ diff --git a/source/blender/editors/space_node/node_header.c b/source/blender/editors/space_node/node_header.c index 4cedbe3f666..6426856dfdd 100644 --- a/source/blender/editors/space_node/node_header.c +++ b/source/blender/editors/space_node/node_header.c @@ -79,7 +79,7 @@ static void do_node_add(bContext *C, void *arg, int event) node= node_add_node(snode, CTX_data_scene(C), event, snode->mx, snode->my); /* uses test flag */ - snode_autoconnect(snode, node, NODE_TEST); + snode_autoconnect(snode, node, NODE_TEST, 0); snode_handle_recalc(C, snode); } diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index 84729dd18ec..ff88b4fde77 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -81,7 +81,7 @@ void node_deselectall(SpaceNode *snode); void snode_composite_job(const struct bContext *C, ScrArea *sa); bNode *node_tree_get_editgroup(bNodeTree *ntree); void node_tree_verify_groups(bNodeTree *nodetree); -void snode_autoconnect(SpaceNode *snode, bNode *node_to, int flag); +void snode_autoconnect(SpaceNode *snode, bNode *node_to, int flag, int replace); int node_has_hidden_sockets(bNode *node); void NODE_OT_duplicate(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c index 534ca0aa99c..1bb38e9aad4 100644 --- a/source/blender/editors/space_node/node_ops.c +++ b/source/blender/editors/space_node/node_ops.c @@ -115,8 +115,9 @@ void node_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "NODE_OT_resize", LEFTMOUSE, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NODE_OT_visibility_toggle", LEFTMOUSE, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "NODE_OT_links_cut", RIGHTMOUSE, KM_PRESS, KM_ALT, 0); + WM_keymap_add_item(keymap, "NODE_OT_links_cut", LEFTMOUSE, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "NODE_OT_link_make", FKEY, KM_PRESS, 0, 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "NODE_OT_link_make", FKEY, KM_PRESS, KM_CTRL, 0)->ptr, "replace", 1); WM_keymap_add_menu(keymap, "NODE_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "NODE_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0); |