[Bf-blender-cvs] [608c4d40a13] temp-socket-decl-refactor: cleanup
Jacques Lucke
noreply at git.blender.org
Wed Sep 15 14:33:46 CEST 2021
Commit: 608c4d40a132a70ea83a407375e17a599b92e4e1
Author: Jacques Lucke
Date: Wed Sep 15 14:33:10 2021 +0200
Branches: temp-socket-decl-refactor
https://developer.blender.org/rB608c4d40a132a70ea83a407375e17a599b92e4e1
cleanup
===================================================================
M source/blender/nodes/NOD_node_declaration.hh
===================================================================
diff --git a/source/blender/nodes/NOD_node_declaration.hh b/source/blender/nodes/NOD_node_declaration.hh
index eb647851fb3..8ca2b411a38 100644
--- a/source/blender/nodes/NOD_node_declaration.hh
+++ b/source/blender/nodes/NOD_node_declaration.hh
@@ -27,6 +27,9 @@ namespace blender::nodes {
class NodeDeclarationBuilder;
+/**
+ * Describes a single input or output socket. This is subclassed for different socket types.
+ */
class SocketDeclaration {
protected:
std::string name_;
@@ -45,11 +48,12 @@ class SocketDeclaration {
virtual bool matches(const bNodeSocket &socket) const = 0;
virtual bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const;
- void set_common_flags(bNodeSocket &socket) const;
- bool matches_common_data(const bNodeSocket &socket) const;
-
StringRefNull name() const;
StringRefNull identifier() const;
+
+ protected:
+ void set_common_flags(bNodeSocket &socket) const;
+ bool matches_common_data(const bNodeSocket &socket) const;
};
class BaseSocketDeclarationBuilder {
@@ -57,6 +61,11 @@ class BaseSocketDeclarationBuilder {
virtual ~BaseSocketDeclarationBuilder() = default;
};
+/**
+ * Wraps a #SocketDeclaration and provides methods to set it up correctly.
+ * This is separate from #SocketDeclaration, because it allows separating the API used by nodes to
+ * declare themselves from how the declaration is stored internally.
+ */
template<typename SocketDecl>
class SocketDeclarationBuilder : public BaseSocketDeclarationBuilder {
protected:
@@ -117,6 +126,12 @@ class NodeDeclarationBuilder {
typename DeclType::Builder &add_input(StringRef name, StringRef identifier = "");
template<typename DeclType>
typename DeclType::Builder &add_output(StringRef name, StringRef identifier = "");
+
+ private:
+ template<typename DeclType>
+ typename DeclType::Builder &add_socket(StringRef name,
+ StringRef identifier,
+ Vector<SocketDeclarationPtr> &r_decls);
};
/* --------------------------------------------------------------------
@@ -146,22 +161,19 @@ template<typename DeclType>
inline typename DeclType::Builder &NodeDeclarationBuilder::add_input(StringRef name,
StringRef identifier)
{
- static_assert(std::is_base_of_v<SocketDeclaration, DeclType>);
- using Builder = typename DeclType::Builder;
- std::unique_ptr<DeclType> socket_decl = std::make_unique<DeclType>();
- std::unique_ptr<Builder> socket_decl_builder = std::make_unique<Builder>();
- socket_decl_builder->decl_ = &*socket_decl;
- socket_decl->name_ = name;
- socket_decl->identifier_ = identifier.is_empty() ? name : identifier;
- declaration_.inputs_.append(std::move(socket_decl));
- Builder &socket_decl_builder_ref = *socket_decl_builder;
- builders_.append(std::move(socket_decl_builder));
- return socket_decl_builder_ref;
+ return this->add_socket<DeclType>(name, identifier, declaration_.inputs_);
}
template<typename DeclType>
inline typename DeclType::Builder &NodeDeclarationBuilder::add_output(StringRef name,
StringRef identifier)
+{
+ return this->add_socket<DeclType>(name, identifier, declaration_.outputs_);
+}
+
+template<typename DeclType>
+inline typename DeclType::Builder &NodeDeclarationBuilder::add_socket(
+ StringRef name, StringRef identifier, Vector<SocketDeclarationPtr> &r_decls)
{
static_assert(std::is_base_of_v<SocketDeclaration, DeclType>);
using Builder = typename DeclType::Builder;
@@ -170,7 +182,7 @@ inline typename DeclType::Builder &NodeDeclarationBuilder::add_output(StringRef
socket_decl_builder->decl_ = &*socket_decl;
socket_decl->name_ = name;
socket_decl->identifier_ = identifier.is_empty() ? name : identifier;
- declaration_.outputs_.append(std::move(socket_decl));
+ r_decls.append(std::move(socket_decl));
Builder &socket_decl_builder_ref = *socket_decl_builder;
builders_.append(std::move(socket_decl_builder));
return socket_decl_builder_ref;
More information about the Bf-blender-cvs
mailing list