[Bf-blender-cvs] [94d06d7094f] functions-experimental-refactor: initial network structure
Jacques Lucke
noreply at git.blender.org
Thu Oct 17 17:53:16 CEST 2019
Commit: 94d06d7094fd9d621ced835d1262eba182d58b21
Author: Jacques Lucke
Date: Thu Oct 17 15:08:00 2019 +0200
Branches: functions-experimental-refactor
https://developer.blender.org/rB94d06d7094fd9d621ced835d1262eba182d58b21
initial network structure
===================================================================
M source/blender/blenkernel/BKE_multi_function.h
M source/blender/blenkernel/BKE_multi_function_network.h
M source/blender/blenkernel/intern/multi_function_network.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_multi_function.h b/source/blender/blenkernel/BKE_multi_function.h
index bc53f14a7f1..4647f1b485a 100644
--- a/source/blender/blenkernel/BKE_multi_function.h
+++ b/source/blender/blenkernel/BKE_multi_function.h
@@ -484,14 +484,15 @@ class MultiFunction {
virtual void call(ArrayRef<uint> mask_indices, Params ¶ms, Context &context) const = 0;
- void set_signature(SignatureBuilder &signature_builder)
+ const Signature &signature() const
{
- m_signature = signature_builder.build();
+ return m_signature;
}
- const Signature &signature() const
+ protected:
+ void set_signature(SignatureBuilder &signature_builder)
{
- return m_signature;
+ m_signature = signature_builder.build();
}
private:
diff --git a/source/blender/blenkernel/BKE_multi_function_network.h b/source/blender/blenkernel/BKE_multi_function_network.h
index c58907915a4..bda3cf64c4e 100644
--- a/source/blender/blenkernel/BKE_multi_function_network.h
+++ b/source/blender/blenkernel/BKE_multi_function_network.h
@@ -11,65 +11,7 @@ using BLI::Optional;
namespace MultiFunctionNetwork {
-class Node;
-class FunctionNode;
-class PlaceholderNode;
-
-class Socket;
-class InputSocket;
-class OutputSocket;
-
-class Network;
-
-class Node {
- public:
- Network &network();
-
- ArrayRef<MultiFunctionDataType> input_types();
- ArrayRef<MultiFunctionDataType> output_types();
-
- bool is_function();
- bool is_placeholder();
-
- FunctionNode &as_function();
- PlaceholderNode &as_placeholder();
-};
-
-class FunctionNode : public Node {
- public:
- MultiFunction &function();
-};
-
-class PlaceholderNode : public Node {
-};
-
-class Socket {
- public:
- Node &node();
- MultiFunctionDataType &type();
-
- bool is_input();
- bool is_output();
-
- InputSocket &as_input();
- OutputSocket &as_output();
-};
-
-class InputSocket : public Socket {
- public:
- OutputSocket &origin();
-};
-
-class OutputSocket : public Socket {
- public:
- ArrayRef<InputSocket *> targets();
-};
-
-class Network {
- public:
-};
-
-/* Builder
+/* Network Builder
****************************************/
class BuilderNode;
@@ -80,19 +22,19 @@ class BuilderSocket;
class BuilderInputSocket;
class BuilderOutputSocket;
-class BuilderNetwork;
+class NetworkBuilder;
class BuilderNode {
protected:
- BuilderNetwork *m_network;
+ NetworkBuilder *m_network;
Vector<BuilderInputSocket *> m_inputs;
Vector<BuilderOutputSocket *> m_outputs;
bool m_is_placeholder;
- friend BuilderNetwork;
+ friend NetworkBuilder;
public:
- BuilderNetwork &network();
+ NetworkBuilder &network();
ArrayRef<BuilderInputSocket *> inputs();
ArrayRef<BuilderOutputSocket *> outputs();
@@ -110,7 +52,7 @@ class BuilderFunctionNode : public BuilderNode {
Vector<uint> m_input_param_indices;
Vector<uint> m_output_param_indices;
- friend BuilderNetwork;
+ friend NetworkBuilder;
public:
MultiFunction &function();
@@ -126,7 +68,7 @@ class BuilderSocket {
uint m_index;
MultiFunctionDataType m_type;
- friend BuilderNetwork;
+ friend NetworkBuilder;
public:
BuilderNode &node();
@@ -143,7 +85,7 @@ class BuilderInputSocket : public BuilderSocket {
private:
BuilderOutputSocket *m_origin;
- friend BuilderNetwork;
+ friend NetworkBuilder;
public:
BuilderOutputSocket *origin();
@@ -153,13 +95,13 @@ class BuilderOutputSocket : public BuilderSocket {
private:
Vector<BuilderInputSocket *> m_targets;
- friend BuilderNetwork;
+ friend NetworkBuilder;
public:
ArrayRef<BuilderInputSocket *> targets();
};
-class BuilderNetwork {
+class NetworkBuilder {
private:
Vector<std::unique_ptr<BuilderFunctionNode>> m_function_nodes;
Vector<std::unique_ptr<BuilderPlaceholderNode>> m_placeholder_nodes;
@@ -175,10 +117,105 @@ class BuilderNetwork {
void add_link(BuilderOutputSocket &from, BuilderInputSocket &to);
};
-/* BuilderNode Implementations
+/* Network
+ ******************************************/
+
+class Node;
+class FunctionNode;
+class PlaceholderNode;
+
+class Socket;
+class InputSocket;
+class OutputSocket;
+
+class Network;
+
+class Node {
+ private:
+ Network *m_network;
+ ArrayRef<InputSocket *> m_inputs;
+ ArrayRef<OutputSocket *> m_outputs;
+ bool m_is_placeholder;
+
+ friend Network;
+
+ public:
+ Network &network();
+
+ ArrayRef<InputSocket *> inputs();
+ ArrayRef<OutputSocket *> outputs();
+
+ bool is_function();
+ bool is_placeholder();
+
+ FunctionNode &as_function();
+ PlaceholderNode &as_placeholder();
+};
+
+class FunctionNode : public Node {
+ private:
+ MultiFunction *m_function;
+ ArrayRef<uint> m_input_param_indices;
+ ArrayRef<uint> m_output_param_indices;
+
+ friend Network;
+
+ public:
+ MultiFunction &function();
+};
+
+class PlaceholderNode : public Node {
+};
+
+class Socket {
+ private:
+ Node *m_node;
+ bool m_is_output;
+ uint m_index;
+ MultiFunctionDataType m_type;
+
+ friend Network;
+
+ public:
+ Node &node();
+ MultiFunctionDataType type();
+
+ bool is_input();
+ bool is_output();
+
+ InputSocket &as_input();
+ OutputSocket &as_output();
+};
+
+class InputSocket : public Socket {
+ private:
+ OutputSocket *m_origin;
+
+ friend Network;
+
+ public:
+ OutputSocket &origin();
+};
+
+class OutputSocket : public Socket {
+ private:
+ ArrayRef<InputSocket *> m_targets;
+
+ friend Network;
+
+ public:
+ ArrayRef<InputSocket *> targets();
+};
+
+class Network {
+ public:
+ Network(std::unique_ptr<NetworkBuilder> builder);
+};
+
+/* Builder Implementations
*******************************************/
-BuilderNetwork &BuilderNode::network()
+NetworkBuilder &BuilderNode::network()
{
return *m_network;
}
@@ -212,17 +249,11 @@ BuilderPlaceholderNode &BuilderNode::as_placeholder()
return *(BuilderPlaceholderNode *)this;
}
-/* BuilderFunctionNode Implementations
- *******************************************/
-
MultiFunction &BuilderFunctionNode::function()
{
return *m_function;
}
-/* BuilderSocket Implementations
- *******************************************/
-
BuilderNode &BuilderSocket::node()
{
return *m_node;
@@ -253,22 +284,98 @@ BuilderOutputSocket &BuilderSocket::as_output()
return *(BuilderOutputSocket *)this;
}
-/* BuilderInputSocket Implementations
- *******************************************/
-
BuilderOutputSocket *BuilderInputSocket::origin()
{
return m_origin;
}
-/* BuilderOutputSocket Implementations
- *******************************************/
-
ArrayRef<BuilderInputSocket *> BuilderOutputSocket::targets()
{
return m_targets;
}
+/* Network Implementations
+ **************************************/
+
+Network &Node::network()
+{
+ return *m_network;
+}
+
+ArrayRef<InputSocket *> Node::inputs()
+{
+ return m_inputs;
+}
+ArrayRef<OutputSocket *> Node::outputs()
+{
+ return m_outputs;
+}
+
+bool Node::is_function()
+{
+ return !m_is_placeholder;
+}
+bool Node::is_placeholder()
+{
+ return m_is_placeholder;
+}
+
+FunctionNode &Node::as_function()
+{
+ BLI_assert(this->is_function());
+ return *(FunctionNode *)this;
+}
+PlaceholderNode &Node::as_placeholder()
+{
+ BLI_assert(this->is_placeholder());
+ return *(PlaceholderNode *)this;
+}
+
+MultiFunction &FunctionNode::function()
+{
+ return *m_function;
+}
+
+Node &Socket::node()
+{
+ return *m_node;
+}
+
+MultiFunctionDataType Socket::type()
+{
+ return m_type;
+}
+
+bool Socket::is_input()
+{
+ return !m_is_output;
+}
+bool Socket::is_output()
+{
+ return m_is_output;
+}
+
+InputSocket &Socket::as_input()
+{
+ BLI_assert(this->is_input());
+ return *(InputSocket *)this;
+}
+OutputSocket &Socket::as_output()
+{
+ BLI_assert(this->is_output());
+ return *(OutputSocket *)this;
+}
+
+OutputSocket &InputSocket::origin()
+{
+ return *m_origin;
+}
+
+ArrayRef<InputSocket *> OutputSocket::targets()
+{
+ return m_targets;
+}
+
} // namespace MultiFunctionNetwork
} // namespace BKE
diff --git a/source/blender/blenkernel/intern/multi_function_network.cc b/source/blender/blenkernel/intern/multi_function_network.cc
index 89d80357c76..cd0dd90c26a 100644
--- a/source/blender/blenkernel/intern/multi_function_network.cc
+++ b/source/blender/blenkernel/intern/multi_function_network.cc
@@ -3,15 +3,20 @@
namespace BKE {
namespace MultiFunctionNetwork {
-/* BuilderNetwork
+/* Network Builder
**************************************/
-BuilderFunctionNode &BuilderNetwork::add_function(MultiFunction &function,
+BuilderFunctionNode &NetworkBuilder::add_function(MultiFunction &function,
ArrayRef<uint> input_param_indices,
ArrayRef<uint> output_param_indices)
{
+#ifdef DEBUG
BLI_assert(!input_param_indices.has_duplicates__linear_search());
BLI_assert(!output_param_indices.has_duplicates__linear_search());
+ for (uint i = 0; i < function.signature().param_types().size(); i++) {
+ BLI_assert(input_param_indices.contains(i) || output_param_indices.contains(i));
+ }
+#endif
auto node = BLI::make_unique<BuilderFunctionNode>();
@@ -52,7 +57,7 @@ BuilderFunctionNode &BuilderNetwork::add_function(MultiFunction &function,
return node_ref;
}
-BuilderPlaceholderNode &BuilderNetwork::add_placeholder(
+BuilderPlaceholderNode &NetworkBuilder::add_placeholder(
ArrayRef<MultiFunctionDataType> input_types, ArrayRef<MultiFunctionDataType> output_types)
{
auto node = BLI::make_unique<BuilderPlaceholderNode>();
@@ -84,7 +89,7 @@ BuilderPlaceholderNode &BuilderNetwork::add_placeholder(
return node_ref;
}
-void BuilderNetwork::add_link(BuilderOutputSocket &from, BuilderInputSocket &to)
+void NetworkBuilder::add_link(BuilderOutputSocket &from, BuilderInputSocket &to)
{
BLI_assert(to.origin() == nullptr);
BLI_assert(from.m_node->m_network == to.m_node->m_network);
@@ -92,5 +97,12 @@ void BuilderNetwork::add_link(BuilderOutputSocket &from, BuilderInputSocket &to)
to.m_origin = &from;
}
+/* Network
+ ********************************************/
+
+Network::Network(std::unique_ptr<NetworkBuilder> builder)
+{
+}
+
} // namespace MultiFunctionNetwork
} // namespace BKE
More information about the Bf-blender-cvs
mailing list