[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 &params, 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