diff options
author | Lukas Toenne <lukas.toenne@googlemail.com> | 2012-06-01 16:38:03 +0400 |
---|---|---|
committer | Lukas Toenne <lukas.toenne@googlemail.com> | 2012-06-01 16:38:03 +0400 |
commit | 17935168c07937f9b1d1db1874a9f7ba5d3ae540 (patch) | |
tree | f3240b63a6eb251254435878727091fe923002e7 /source/blender/nodes/intern/node_common.c | |
parent | 5fbeda7efd62e251dac2af881de9fe042f30a7a7 (diff) |
Reroute nodes, by Jeroen Bakker (patch #28443).
By holding shift and "cutting" a node link a new reroute helper node can be inserted. This consists of a single socket that can be used to insert additional connection points into a link. This can be used to keep a connection point in the tree when deleting a node, or to control the path of long connections for layout cleanup.
Diffstat (limited to 'source/blender/nodes/intern/node_common.c')
-rw-r--r-- | source/blender/nodes/intern/node_common.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/source/blender/nodes/intern/node_common.c b/source/blender/nodes/intern/node_common.c index 48ffed80e41..9f458678ae0 100644 --- a/source/blender/nodes/intern/node_common.c +++ b/source/blender/nodes/intern/node_common.c @@ -835,3 +835,52 @@ void register_node_type_frame(bNodeTreeType *ttype) ntype->needs_free = 1; nodeRegisterType(ttype, ntype); } + + +/* **************** REROUTE ******************** */ + +static bNodeSocketTemplate node_reroute_in[]= { + { SOCK_RGBA, 1, "Input", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; +static bNodeSocketTemplate node_reroute_out[]= { + { SOCK_RGBA, 0, "Output", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +/* simple, only a single input and output here */ +ListBase node_reroute_internal_connect(bNodeTree *ntree, bNode *node) +{ + bNodeLink *link; + ListBase ret; + + ret.first = ret.last = NULL; + + /* Security check! */ + if(!ntree) + return ret; + + link = MEM_callocN(sizeof(bNodeLink), "internal node link"); + link->fromnode = node; + link->fromsock = node->inputs.first; + link->tonode = node; + link->tosock = node->outputs.first; + /* internal link is always valid */ + link->flag |= NODE_LINK_VALID; + BLI_addtail(&ret, link); + + return ret; +} + +void register_node_type_reroute(bNodeTreeType *ttype) +{ + /* frame type is used for all tree types, needs dynamic allocation */ + bNodeType *ntype= MEM_callocN(sizeof(bNodeType), "frame node type"); + + node_type_base(ttype, ntype, NODE_REROUTE, "Reroute", NODE_CLASS_LAYOUT, 0); + node_type_socket_templates(ntype, node_reroute_in, node_reroute_out); + node_type_internal_connect(ntype, node_reroute_internal_connect); + + ntype->needs_free = 1; + nodeRegisterType(ttype, ntype); +} |