From a46a52a691c80e61324c89dea47bebeeeb1fc37b Mon Sep 17 00:00:00 2001 From: Pratik Borhade Date: Tue, 26 Dec 2023 14:57:05 +0530 Subject: [PATCH 1/5] Fix #116435: Rotate Vector node on a link connects wrong sockets `sock_rotation` has higher priority (6) than the vector socket (4). Hence inserting node between vector-vector link joins thorugh "rotation" socket (`get_main_socket()` / `get_main_socket_priority()`). This can be fixed by making "vector" input socket as default for link. But this will break the link creation when node is inserted between rotation-rotation link. It seems rotation is converted to vectors so perhaps make sense to make "vector" as default socket for link. --- source/blender/nodes/function/nodes/node_fn_rotate_vector.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/nodes/function/nodes/node_fn_rotate_vector.cc b/source/blender/nodes/function/nodes/node_fn_rotate_vector.cc index 15d6b47f0fa..fb1060f5616 100644 --- a/source/blender/nodes/function/nodes/node_fn_rotate_vector.cc +++ b/source/blender/nodes/function/nodes/node_fn_rotate_vector.cc @@ -11,7 +11,7 @@ namespace blender::nodes::node_fn_rotate_vector_cc { static void node_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input("Vector"); + b.add_input("Vector").is_default_link_socket(); b.add_input("Rotation"); b.add_output("Vector"); }; -- 2.30.2 From e11d3073a902b5f375b7e1a4278be43ae9046d76 Mon Sep 17 00:00:00 2001 From: Pratik Borhade Date: Tue, 30 Jan 2024 17:20:45 +0530 Subject: [PATCH 2/5] Use sockets of old link for the new connection --- source/blender/editors/space_node/node_intern.hh | 5 ++++- .../editors/space_node/node_relationships.cc | 16 +++++++++++++--- .../editors/space_node/node_shader_preview.cc | 4 ++-- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/source/blender/editors/space_node/node_intern.hh b/source/blender/editors/space_node/node_intern.hh index 5c324ffbb61..83939dcc14b 100644 --- a/source/blender/editors/space_node/node_intern.hh +++ b/source/blender/editors/space_node/node_intern.hh @@ -312,7 +312,10 @@ void NODE_OT_group_edit(wmOperatorType *ot); void update_multi_input_indices_for_removed_links(bNode &node); bool all_links_muted(const bNodeSocket &socket); -bNodeSocket *get_main_socket(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out); +bNodeSocket *get_main_socket(bNodeTree &ntree, + bNode &node, + eNodeSocketInOut in_out, + bNodeLink *old_link); void NODE_OT_link(wmOperatorType *ot); void NODE_OT_link_make(wmOperatorType *ot); diff --git a/source/blender/editors/space_node/node_relationships.cc b/source/blender/editors/space_node/node_relationships.cc index af83bec6b6b..1191b58f594 100644 --- a/source/blender/editors/space_node/node_relationships.cc +++ b/source/blender/editors/space_node/node_relationships.cc @@ -2163,8 +2163,8 @@ void node_insert_on_link_flags(Main &bmain, SpaceNode &snode) old_link->flag &= ~NODE_LINKFLAG_HILITE; - bNodeSocket *best_input = get_main_socket(ntree, *node_to_insert, SOCK_IN); - bNodeSocket *best_output = get_main_socket(ntree, *node_to_insert, SOCK_OUT); + bNodeSocket *best_input = get_main_socket(ntree, *node_to_insert, SOCK_IN, old_link); + bNodeSocket *best_output = get_main_socket(ntree, *node_to_insert, SOCK_OUT, old_link); if (node_to_insert->type != NODE_REROUTE) { /* Ignore main sockets when the types don't match. */ @@ -2253,7 +2253,10 @@ static int get_main_socket_priority(const bNodeSocket *socket) } /** Get the "main" socket based on the node declaration or an heuristic. */ -bNodeSocket *get_main_socket(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) +bNodeSocket *get_main_socket(bNodeTree &ntree, + bNode &node, + eNodeSocketInOut in_out, + bNodeLink *old_link) { ListBase *sockets = (in_out == SOCK_IN) ? &node.inputs : &node.outputs; @@ -2269,6 +2272,13 @@ bNodeSocket *get_main_socket(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_ if (!socket->is_visible()) { continue; } + if (old_link != nullptr) { + eNodeSocketDatatype sock_type = static_cast( + (in_out == SOCK_IN) ? old_link->fromsock->type : old_link->tosock->type); + if (sock_type == socket->type) { + return socket; + } + } if (socket_decl.is_default_link_socket) { return socket; } diff --git a/source/blender/editors/space_node/node_shader_preview.cc b/source/blender/editors/space_node/node_shader_preview.cc index 4dad85296c5..f302ea98207 100644 --- a/source/blender/editors/space_node/node_shader_preview.cc +++ b/source/blender/editors/space_node/node_shader_preview.cc @@ -258,9 +258,9 @@ static Scene *preview_prepare_scene(const Main *bmain, */ static bNodeSocket *node_find_preview_socket(bNodeTree &ntree, bNode &node) { - bNodeSocket *socket = get_main_socket(ntree, node, SOCK_OUT); + bNodeSocket *socket = get_main_socket(ntree, node, SOCK_OUT, nullptr); if (socket == nullptr) { - socket = get_main_socket(ntree, node, SOCK_IN); + socket = get_main_socket(ntree, node, SOCK_IN, nullptr); if (socket != nullptr && socket->link == nullptr) { if (!ELEM(socket->type, SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA)) { /* We can not preview a socket with no link and no manual value. */ -- 2.30.2 From 023a53bf64c00dd770528937835e81df76a071e4 Mon Sep 17 00:00:00 2001 From: Pratik Borhade Date: Tue, 30 Jan 2024 17:22:48 +0530 Subject: [PATCH 3/5] Revert is_default_link_socket() --- source/blender/nodes/function/nodes/node_fn_rotate_vector.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/nodes/function/nodes/node_fn_rotate_vector.cc b/source/blender/nodes/function/nodes/node_fn_rotate_vector.cc index fb1060f5616..15d6b47f0fa 100644 --- a/source/blender/nodes/function/nodes/node_fn_rotate_vector.cc +++ b/source/blender/nodes/function/nodes/node_fn_rotate_vector.cc @@ -11,7 +11,7 @@ namespace blender::nodes::node_fn_rotate_vector_cc { static void node_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input("Vector").is_default_link_socket(); + b.add_input("Vector"); b.add_input("Rotation"); b.add_output("Vector"); }; -- 2.30.2 From 936cf9dd466784f8b5639fa5726043c4beb4d0df Mon Sep 17 00:00:00 2001 From: Pratik Borhade Date: Fri, 1 Mar 2024 16:06:52 +0530 Subject: [PATCH 4/5] Revert "Use sockets of old link for the new connection" This reverts commit 993bb0432c641458bf846e32f140212212304abd. --- source/blender/editors/space_node/node_intern.hh | 5 +---- .../editors/space_node/node_relationships.cc | 16 +++------------- .../editors/space_node/node_shader_preview.cc | 4 ++-- 3 files changed, 6 insertions(+), 19 deletions(-) diff --git a/source/blender/editors/space_node/node_intern.hh b/source/blender/editors/space_node/node_intern.hh index 83939dcc14b..5c324ffbb61 100644 --- a/source/blender/editors/space_node/node_intern.hh +++ b/source/blender/editors/space_node/node_intern.hh @@ -312,10 +312,7 @@ void NODE_OT_group_edit(wmOperatorType *ot); void update_multi_input_indices_for_removed_links(bNode &node); bool all_links_muted(const bNodeSocket &socket); -bNodeSocket *get_main_socket(bNodeTree &ntree, - bNode &node, - eNodeSocketInOut in_out, - bNodeLink *old_link); +bNodeSocket *get_main_socket(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out); void NODE_OT_link(wmOperatorType *ot); void NODE_OT_link_make(wmOperatorType *ot); diff --git a/source/blender/editors/space_node/node_relationships.cc b/source/blender/editors/space_node/node_relationships.cc index 1191b58f594..af83bec6b6b 100644 --- a/source/blender/editors/space_node/node_relationships.cc +++ b/source/blender/editors/space_node/node_relationships.cc @@ -2163,8 +2163,8 @@ void node_insert_on_link_flags(Main &bmain, SpaceNode &snode) old_link->flag &= ~NODE_LINKFLAG_HILITE; - bNodeSocket *best_input = get_main_socket(ntree, *node_to_insert, SOCK_IN, old_link); - bNodeSocket *best_output = get_main_socket(ntree, *node_to_insert, SOCK_OUT, old_link); + bNodeSocket *best_input = get_main_socket(ntree, *node_to_insert, SOCK_IN); + bNodeSocket *best_output = get_main_socket(ntree, *node_to_insert, SOCK_OUT); if (node_to_insert->type != NODE_REROUTE) { /* Ignore main sockets when the types don't match. */ @@ -2253,10 +2253,7 @@ static int get_main_socket_priority(const bNodeSocket *socket) } /** Get the "main" socket based on the node declaration or an heuristic. */ -bNodeSocket *get_main_socket(bNodeTree &ntree, - bNode &node, - eNodeSocketInOut in_out, - bNodeLink *old_link) +bNodeSocket *get_main_socket(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) { ListBase *sockets = (in_out == SOCK_IN) ? &node.inputs : &node.outputs; @@ -2272,13 +2269,6 @@ bNodeSocket *get_main_socket(bNodeTree &ntree, if (!socket->is_visible()) { continue; } - if (old_link != nullptr) { - eNodeSocketDatatype sock_type = static_cast( - (in_out == SOCK_IN) ? old_link->fromsock->type : old_link->tosock->type); - if (sock_type == socket->type) { - return socket; - } - } if (socket_decl.is_default_link_socket) { return socket; } diff --git a/source/blender/editors/space_node/node_shader_preview.cc b/source/blender/editors/space_node/node_shader_preview.cc index f302ea98207..4dad85296c5 100644 --- a/source/blender/editors/space_node/node_shader_preview.cc +++ b/source/blender/editors/space_node/node_shader_preview.cc @@ -258,9 +258,9 @@ static Scene *preview_prepare_scene(const Main *bmain, */ static bNodeSocket *node_find_preview_socket(bNodeTree &ntree, bNode &node) { - bNodeSocket *socket = get_main_socket(ntree, node, SOCK_OUT, nullptr); + bNodeSocket *socket = get_main_socket(ntree, node, SOCK_OUT); if (socket == nullptr) { - socket = get_main_socket(ntree, node, SOCK_IN, nullptr); + socket = get_main_socket(ntree, node, SOCK_IN); if (socket != nullptr && socket->link == nullptr) { if (!ELEM(socket->type, SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA)) { /* We can not preview a socket with no link and no manual value. */ -- 2.30.2 From be400677f5278c8d21dae04b818421bd4c2c4054 Mon Sep 17 00:00:00 2001 From: Pratik Borhade Date: Fri, 1 Mar 2024 16:09:23 +0530 Subject: [PATCH 5/5] Use is_default_link_socket() --- source/blender/nodes/function/nodes/node_fn_rotate_vector.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/nodes/function/nodes/node_fn_rotate_vector.cc b/source/blender/nodes/function/nodes/node_fn_rotate_vector.cc index 15d6b47f0fa..fb1060f5616 100644 --- a/source/blender/nodes/function/nodes/node_fn_rotate_vector.cc +++ b/source/blender/nodes/function/nodes/node_fn_rotate_vector.cc @@ -11,7 +11,7 @@ namespace blender::nodes::node_fn_rotate_vector_cc { static void node_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input("Vector"); + b.add_input("Vector").is_default_link_socket(); b.add_input("Rotation"); b.add_output("Vector"); }; -- 2.30.2