diff options
author | Alexander Gavrilov <angavrilov@gmail.com> | 2020-08-04 11:57:09 +0300 |
---|---|---|
committer | Alexander Gavrilov <angavrilov@gmail.com> | 2020-08-04 11:57:09 +0300 |
commit | 15ad4f6f1f41825566d34423d7a9d96aecc5702a (patch) | |
tree | 3115c0c7bba969319635a57d666dad4818f0ab02 /source/blender/nodes | |
parent | f5eae902777617624f9c27c5df5800a34821ea58 (diff) | |
parent | 9306037ed3d14a7afce607738f83c8b9968d478d (diff) |
Merge branch 'blender-v2.90-release'
Diffstat (limited to 'source/blender/nodes')
-rw-r--r-- | source/blender/nodes/NOD_socket.h | 5 | ||||
-rw-r--r-- | source/blender/nodes/intern/node_common.c | 3 | ||||
-rw-r--r-- | source/blender/nodes/intern/node_socket.cc | 48 |
3 files changed, 56 insertions, 0 deletions
diff --git a/source/blender/nodes/NOD_socket.h b/source/blender/nodes/NOD_socket.h index ce6f0da4aee..212a3d35a24 100644 --- a/source/blender/nodes/NOD_socket.h +++ b/source/blender/nodes/NOD_socket.h @@ -48,6 +48,11 @@ void node_verify_socket_templates(struct bNodeTree *ntree, struct bNode *node); void node_socket_init_default_value(struct bNodeSocket *sock); void node_socket_copy_default_value(struct bNodeSocket *to, const struct bNodeSocket *from); +void node_socket_skip_reroutes(struct ListBase *links, + struct bNode *node, + struct bNodeSocket *socket, + struct bNode **r_node, + struct bNodeSocket **r_socket); void register_standard_node_socket_types(void); #ifdef __cplusplus diff --git a/source/blender/nodes/intern/node_common.c b/source/blender/nodes/intern/node_common.c index 996fb93eb76..439e41b963b 100644 --- a/source/blender/nodes/intern/node_common.c +++ b/source/blender/nodes/intern/node_common.c @@ -132,6 +132,9 @@ static bNodeSocket *group_verify_socket( if (sock) { strcpy(sock->name, iosock->name); + const int mask = SOCK_HIDE_VALUE; + sock->flag = (sock->flag & ~mask) | (iosock->flag & mask); + if (iosock->typeinfo->interface_verify_socket) { iosock->typeinfo->interface_verify_socket(ntree, iosock, gnode, sock, "interface"); } diff --git a/source/blender/nodes/intern/node_socket.cc b/source/blender/nodes/intern/node_socket.cc index 57c8d51975e..0dfae7424cb 100644 --- a/source/blender/nodes/intern/node_socket.cc +++ b/source/blender/nodes/intern/node_socket.cc @@ -356,6 +356,54 @@ void node_socket_copy_default_value(bNodeSocket *to, const bNodeSocket *from) to->flag |= (from->flag & SOCK_HIDE_VALUE); } +void node_socket_skip_reroutes( + ListBase *links, bNode *node, bNodeSocket *socket, bNode **r_node, bNodeSocket **r_socket) +{ + const int loop_limit = 100; /* Limit in case there is a connection cycle. */ + + if (socket->in_out == SOCK_IN) { + bNodeLink *first_link = (bNodeLink *)links->first; + + for (int i = 0; node->type == NODE_REROUTE && i < loop_limit; i++) { + bNodeLink *link = first_link; + + for (; link; link = link->next) { + if (link->fromnode == node && link->tonode != node) { + break; + } + } + + if (link) { + node = link->tonode; + socket = link->tosock; + } + else { + break; + } + } + } + else { + for (int i = 0; node->type == NODE_REROUTE && i < loop_limit; i++) { + bNodeSocket *input = (bNodeSocket *)node->inputs.first; + + if (input && input->link) { + node = input->link->fromnode; + socket = input->link->fromsock; + } + else { + break; + } + } + } + + if (r_node) { + *r_node = node; + } + if (r_socket) { + *r_socket = socket; + } +} + static void standard_node_socket_interface_init_socket(bNodeTree *UNUSED(ntree), bNodeSocket *stemp, bNode *UNUSED(node), |