Commit: ef89ba2b34d0f655090678073cfa019b9f9baa1a Author: Hans Goudey Date: Thu Dec 29 15:40:18 2022 -0500 Branches: temp-nodes-group-declarations https://developer.blender.org/rBef89ba2b34d0f655090678073cfa019b9f9baa1a
Merge branch 'master' into temp-nodes-group-declarations =================================================================== =================================================================== diff --cc source/blender/nodes/NOD_node_declaration.hh index d549263f036,7753e8092d8..934e44ceed8 --- a/source/blender/nodes/NOD_node_declaration.hh +++ b/source/blender/nodes/NOD_node_declaration.hh @@@ -72,25 -72,24 +72,25 @@@ using ImplicitInputValueFn = std::funct */ class SocketDeclaration { public: - std::string name_; - std::string identifier_; - std::string description_; - + std::string name; + std::string identifier; + std::string description; /** Defined by whether the socket is part of the node's input or * output socket declaration list. Included here for convenience. */ - eNodeSocketInOut in_out_; - bool hide_label_ = false; - bool hide_value_ = false; - bool compact_ = false; - bool is_multi_input_ = false; - bool no_mute_links_ = false; - bool is_unavailable_ = false; - bool is_attribute_name_ = false; - bool is_default_link_socket_ = false; - - InputSocketFieldType input_field_type_ = InputSocketFieldType::None; - OutputFieldDependency output_field_dependency_; + eNodeSocketInOut in_out; + bool hide_label = false; + bool hide_value = false; + bool compact = false; + bool is_multi_input = false; + bool no_mute_links = false; + bool is_unavailable = false; + bool is_attribute_name = false; + bool is_default_link_socket = false; + + InputSocketFieldType input_field_type = InputSocketFieldType::None; + OutputFieldDependency output_field_dependency; ++ private: /** The priority of the input for determining the domain of the node. See * realtime_compositor::InputDescriptor for more information. */ int compositor_domain_priority_ = 0; @@@ -308,21 -297,12 +298,17 @@@ using SocketDeclarationPtr = std::uniqu class NodeDeclaration { public: - Vector<SocketDeclarationPtr> inputs_; - Vector<SocketDeclarationPtr> outputs_; + Vector<SocketDeclarationPtr> inputs; + Vector<SocketDeclarationPtr> outputs; + /** Leave the sockets in place, even if they don't match the declaration. Used for dynamic + * declarations when the information used to build the declaration is missing, but might become + * available again in the future. */ + bool skip_updating_sockets = false; + friend NodeDeclarationBuilder; - public: bool matches(const bNode &node) const; - - Span<SocketDeclarationPtr> inputs() const; - Span<SocketDeclarationPtr> outputs() const; Span<SocketDeclarationPtr> sockets(eNodeSocketInOut in_out) const; MEM_CXX_CLASS_ALLOC_FUNCS("NodeDeclaration") diff --cc source/blender/nodes/intern/node_common.cc index 286a28625cd,509921837cc..71ca2f0dab6 --- a/source/blender/nodes/intern/node_common.cc +++ b/source/blender/nodes/intern/node_common.cc @@@ -124,120 -120,122 +124,120 @@@ bool nodeGroupPoll(const bNodeTree *nod return true; } -static void add_new_socket_from_interface(bNodeTree &node_tree, - bNode &node, - const bNodeSocket &interface_socket, - const eNodeSocketInOut in_out) -{ - bNodeSocket *socket = nodeAddSocket(&node_tree, - &node, - in_out, - interface_socket.idname, - interface_socket.identifier, - interface_socket.name); - - if (interface_socket.typeinfo->interface_init_socket) { - interface_socket.typeinfo->interface_init_socket( - &node_tree, &interface_socket, &node, socket, "interface"); - } -} +namespace blender::nodes { -static void update_socket_to_match_interface(bNodeTree &node_tree, - bNode &node, - bNodeSocket &socket_to_update, - const bNodeSocket &interface_socket) +static SocketDeclarationPtr declaration_for_interface_socket(const bNodeSocket &io_socket) { - strcpy(socket_to_update.name, interface_socket.name); - - const int mask = SOCK_HIDE_VALUE; - socket_to_update.flag = (socket_to_update.flag & ~mask) | (interface_socket.flag & mask); - - /* Update socket type if necessary */ - if (socket_to_update.typeinfo != interface_socket.typeinfo) { - nodeModifySocketType(&node_tree, &node, &socket_to_update, interface_socket.idname); - } - - if (interface_socket.typeinfo->interface_verify_socket) { - interface_socket.typeinfo->interface_verify_socket( - &node_tree, &interface_socket, &node, &socket_to_update, "interface"); - } -} - -/** - * Used for group nodes and group input/output nodes to update the list of input or output sockets - * on a node to match the provided interface. Assumes that \a verify_lb is the node's matching - * input or output socket list, depending on whether the node is a group input/output or a group - * node. - */ -static void group_verify_socket_list(bNodeTree &node_tree, - bNode &node, - const ListBase &interface_sockets, - ListBase &verify_lb, - const eNodeSocketInOut in_out, - const bool ensure_extend_socket_exists) -{ - ListBase old_sockets = verify_lb; - Vector<bNodeSocket *> ordered_old_sockets = old_sockets; - BLI_listbase_clear(&verify_lb); - - LISTBASE_FOREACH (const bNodeSocket *, interface_socket, &interface_sockets) { - bNodeSocket *matching_socket = find_matching_socket(old_sockets, interface_socket->identifier); - if (matching_socket) { - /* If a socket with the same identifier exists in the previous socket list, update it - * with the correct name, type, etc. Then move it from the old list to the new one. */ - update_socket_to_match_interface(node_tree, node, *matching_socket, *interface_socket); - BLI_remlink(&old_sockets, matching_socket); - BLI_addtail(&verify_lb, matching_socket); + SocketDeclarationPtr dst; + switch (io_socket.type) { + case SOCK_FLOAT: { + const auto &value = *io_socket.default_value_typed<bNodeSocketValueFloat>(); + std::unique_ptr<decl::Float> decl = std::make_unique<decl::Float>(); + decl->subtype = PropertySubType(io_socket.typeinfo->subtype); + decl->default_value = value.value; + decl->soft_min_value = value.min; + decl->soft_max_value = value.max; + dst = std::move(decl); + break; } - else { - /* If there was no socket with the same identifier already, simply create a new socket - * based on the interface socket, which will already add it to the new list. */ - add_new_socket_from_interface(node_tree, node, *interface_socket, in_out); + case SOCK_VECTOR: { + const auto &value = *io_socket.default_value_typed<bNodeSocketValueVector>(); + std::unique_ptr<decl::Vector> decl = std::make_unique<decl::Vector>(); + decl->subtype = PropertySubType(io_socket.typeinfo->subtype); + decl->default_value = value.value; + decl->soft_min_value = value.min; + decl->soft_max_value = value.max; + dst = std::move(decl); + break; } - } - - if (ensure_extend_socket_exists) { - bNodeSocket *last_socket = static_cast<bNodeSocket *>(old_sockets.last); - if (last_socket != nullptr && STREQ(last_socket->identifier, "__extend__")) { - BLI_remlink(&old_sockets, last_socket); - BLI_addtail(&verify_lb, last_socket); + case SOCK_RGBA: { + const auto &value = *io_socket.default_value_typed<bNodeSocketValueRGBA>(); + std::unique_ptr<decl::Color> decl = std::make_unique<decl::Color>(); + decl->default_value = value.value; + dst = std::move(decl); + break; } - else { - nodeAddSocket(&node_tree, &node, in_out, "NodeSocketVirtual", "__extend__", ""); + case SOCK_SHADER: { + std::unique_ptr<decl::Shader> decl = std::make_unique<decl::Shader>(); + dst = std::move(decl); + break; } - } - - /* Remove leftover sockets that didn't match the node group's interface. */ - LISTBASE_FOREACH_MUTABLE (bNodeSocket *, unused_socket, &old_sockets) { - nodeRemoveSocket(&node_tree, &node, unused_socket); - } - - { - /* Check if new sockets match the old sockets. */ - int index; - LISTBASE_FOREACH_INDEX (bNodeSocket *, new_socket, &verify_lb, index) { - if (index < ordered_old_sockets.size()) { - if (ordered_old_sockets[index] != new_socket) { - BKE_ntree_update_tag_interface(&node_tree); - break; - } - } + case SOCK_BOOLEAN: { + const auto &value = *io_socket.default_value_typed<bNodeSocketValueBoolean>(); + std::unique_ptr<decl::Bool> decl = std::make_unique<decl::Bool>(); + decl->default_value = value.value; + dst = std::move(decl); + break; } + case SOCK_INT: { + const auto &value = *io_socket.default_value_typed<bNodeSocketValueInt>(); + std::unique_ptr<decl::Int> decl = std::make_unique<decl::Int>(); + decl->subtype = PropertySubType(io_socket.typeinfo->subtype); + decl->default_value = value.value; + decl->soft_min_value = value.min; + decl->soft_max_value = value.max; + dst = std::move(decl); + break; + } + case SOCK_STRING: { + const auto &value = *io_socket.default_value_typed<bNodeSocketValueString>(); + std::unique_ptr<decl::String> decl = std::make_unique<decl::String>(); + decl->default_value = value.value; + dst = std::move(decl); + break; + } + case SOCK_OBJECT: + dst = std::make_unique<decl::Object>(); + break; + case SOCK_IMAGE: + dst = std::make_unique<decl::Image>(); + break; + case SOCK_GEOMETRY: + dst = std::make_unique<decl::Geometry>(); + break; + case SOCK_COLLECTION: + dst = std::make_unique<decl::Collection>(); + break; + case SOCK_TEXTURE: + dst = std::make_unique<decl::T @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs