diff options
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/space_node/node_relationships.cc | 32 | ||||
-rw-r--r-- | source/blender/nodes/NOD_node_declaration.hh | 13 | ||||
-rw-r--r-- | source/blender/nodes/shader/nodes/node_shader_curves.cc | 2 |
3 files changed, 42 insertions, 5 deletions
diff --git a/source/blender/editors/space_node/node_relationships.cc b/source/blender/editors/space_node/node_relationships.cc index 76aad684b4c..55b547d3195 100644 --- a/source/blender/editors/space_node/node_relationships.cc +++ b/source/blender/editors/space_node/node_relationships.cc @@ -57,6 +57,7 @@ #include "BLT_translation.h" +#include "NOD_node_declaration.hh" #include "NOD_node_tree_ref.hh" #include "node_intern.h" /* own include */ @@ -2182,9 +2183,32 @@ static int get_main_socket_priority(const bNodeSocket *socket) return -1; } -/** Get the "main" socket of a socket list using a heuristic based on socket types. */ -static bNodeSocket *get_main_socket(ListBase *sockets) +/** Get the "main" socket based on the node declaration or an heuristic. */ +static bNodeSocket *get_main_socket(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out) { + using namespace blender; + using namespace blender::nodes; + + ListBase *sockets = (in_out == SOCK_IN) ? &node.inputs : &node.outputs; + + /* Try to get the main socket based on the socket declaration. */ + nodeDeclarationEnsure(&ntree, &node); + const NodeDeclaration *node_decl = node.declaration; + if (node_decl != nullptr) { + Span<SocketDeclarationPtr> socket_decls = (in_out == SOCK_IN) ? node_decl->inputs() : + node_decl->outputs(); + int index; + LISTBASE_FOREACH_INDEX (bNodeSocket *, socket, sockets, index) { + const SocketDeclaration &socket_decl = *socket_decls[index]; + if (nodeSocketIsHidden(socket)) { + continue; + } + if (socket_decl.is_default_link_socket()) { + return socket; + } + } + } + /* find priority range */ int maxpriority = -1; LISTBASE_FOREACH (bNodeSocket *, sock, sockets) { @@ -2561,8 +2585,8 @@ void ED_node_link_insert(Main *bmain, ScrArea *area) } if (link) { - bNodeSocket *best_input = get_main_socket(&select->inputs); - bNodeSocket *best_output = get_main_socket(&select->outputs); + bNodeSocket *best_input = get_main_socket(*snode->edittree, *select, SOCK_IN); + bNodeSocket *best_output = get_main_socket(*snode->edittree, *select, SOCK_OUT); if (best_input && best_output) { bNode *node = link->tonode; diff --git a/source/blender/nodes/NOD_node_declaration.hh b/source/blender/nodes/NOD_node_declaration.hh index 1481e69c00e..e9f2996bb30 100644 --- a/source/blender/nodes/NOD_node_declaration.hh +++ b/source/blender/nodes/NOD_node_declaration.hh @@ -89,6 +89,7 @@ class SocketDeclaration { bool is_multi_input_ = false; bool no_mute_links_ = false; bool is_attribute_name_ = false; + bool is_default_link_socket_ = false; InputSocketFieldType input_field_type_ = InputSocketFieldType::None; OutputFieldDependency output_field_dependency_; @@ -107,6 +108,7 @@ class SocketDeclaration { StringRefNull description() const; StringRefNull identifier() const; bool is_attribute_name() const; + bool is_default_link_socket() const; InputSocketFieldType input_field_type() const; const OutputFieldDependency &output_field_dependency() const; @@ -171,6 +173,12 @@ class SocketDeclarationBuilder : public BaseSocketDeclarationBuilder { return *(Self *)this; } + Self &is_default_link_socket(bool value = true) + { + decl_->is_default_link_socket_ = value; + return *(Self *)this; + } + /** The input socket allows passing in a field. */ Self &supports_field() { @@ -363,6 +371,11 @@ inline bool SocketDeclaration::is_attribute_name() const return is_attribute_name_; } +inline bool SocketDeclaration::is_default_link_socket() const +{ + return is_default_link_socket_; +} + inline InputSocketFieldType SocketDeclaration::input_field_type() const { return input_field_type_; diff --git a/source/blender/nodes/shader/nodes/node_shader_curves.cc b/source/blender/nodes/shader/nodes/node_shader_curves.cc index f8f0ee97eae..7ce5150bf85 100644 --- a/source/blender/nodes/shader/nodes/node_shader_curves.cc +++ b/source/blender/nodes/shader/nodes/node_shader_curves.cc @@ -357,7 +357,7 @@ static void sh_node_curve_float_declare(NodeDeclarationBuilder &b) .max(1.0f) .default_value(1.0f) .subtype(PROP_FACTOR); - b.add_input<decl::Float>(N_("Value")).default_value(1.0f); + b.add_input<decl::Float>(N_("Value")).default_value(1.0f).is_default_link_socket(); b.add_output<decl::Float>(N_("Value")); }; |