Fix: Link drag search missing field nodes from function nodes

When dragging from the inputs of function nodes, other function
nodes wouldn't connect, because their socket declaration field types
weren't set correctly. Instead, they relied on code properly checking
the *node* declaration's `is_function_node()` method. However,
that increases complexity and requires passing the node instead of
just the socket in more places. Instead, set the proper field types
in the socket declaration during building.

Differential Revision: https://developer.blender.org/D13600
This commit is contained in:
Hans Goudey 2021-12-18 13:31:06 -06:00
parent d15d512a68
commit b9861055ad
1 changed files with 8 additions and 1 deletions

View File

@ -288,10 +288,13 @@ class NodeDeclarationBuilder {
/**
* All inputs support fields, and all outputs are fields if any of the inputs is a field.
* Calling field status definitions on each socket is unnecessary.
* Calling field status definitions on each socket is unnecessary. Must be called before adding
* any sockets.
*/
void is_function_node(bool value = true)
{
BLI_assert_msg(declaration_.inputs().is_empty() && declaration_.outputs().is_empty(),
"is_function_node() must be called before any socket is created");
declaration_.is_function_node_ = value;
}
@ -476,6 +479,10 @@ inline typename DeclType::Builder &NodeDeclarationBuilder::add_socket(StringRef
socket_decl->name_ = name;
socket_decl->identifier_ = identifier.is_empty() ? name : identifier;
socket_decl->in_out_ = in_out;
if (declaration_.is_function_node()) {
socket_decl->input_field_type_ = InputSocketFieldType::IsSupported;
socket_decl->output_field_dependency_ = OutputFieldDependency::ForDependentField();
}
declarations.append(std::move(socket_decl));
Builder &socket_decl_builder_ref = *socket_decl_builder;
builders_.append(std::move(socket_decl_builder));