[Bf-blender-cvs] [3ca095f1eb8] functions: simplify vsocket to multi function mapping

Jacques Lucke noreply at git.blender.org
Thu Nov 21 15:19:50 CET 2019


Commit: 3ca095f1eb890533c6b550fb3aa0a742305dc802
Author: Jacques Lucke
Date:   Thu Nov 21 13:44:56 2019 +0100
Branches: functions
https://developer.blender.org/rB3ca095f1eb890533c6b550fb3aa0a742305dc802

simplify vsocket to multi function mapping

===================================================================

M	source/blender/functions/CMakeLists.txt
D	source/blender/functions/intern/vtree_multi_function/vtree_multi_function.h
M	source/blender/functions/intern/vtree_multi_function_network/builder.h
M	source/blender/functions/intern/vtree_multi_function_network/generate.cc
M	source/blender/functions/intern/vtree_multi_function_network/mappings.h
M	source/blender/functions/intern/vtree_multi_function_network/mappings_sockets.cc
M	source/blender/modifiers/intern/MOD_functiondeform_cxx.cc

===================================================================

diff --git a/source/blender/functions/CMakeLists.txt b/source/blender/functions/CMakeLists.txt
index 2d2cacf1cc4..5d83c907b38 100644
--- a/source/blender/functions/CMakeLists.txt
+++ b/source/blender/functions/CMakeLists.txt
@@ -25,8 +25,6 @@ set(SRC
   intern/multi_functions/lists.cc
   intern/multi_functions/mixed.cc
   intern/multi_functions/network.cc
-  intern/vtree_multi_function/mappings.cc
-  intern/vtree_multi_function/vnode_multi_function_wrapper_builder.cc
   intern/vtree_multi_function_network/builder.cc
   intern/vtree_multi_function_network/generate.cc
   intern/vtree_multi_function_network/mappings_nodes.cc
@@ -65,12 +63,6 @@ set(SRC
   intern/multi_functions/lists.h
   intern/multi_functions/mixed.h
   intern/multi_functions/network.h
-  intern/vtree_multi_function/mappings.h
-  intern/vtree_multi_function/vnode_multi_function_wrapper_builder.h
-  intern/vtree_multi_function/vnode_multi_function_wrapper.h
-  intern/vtree_multi_function/vsocket_multi_function_builder.h
-  intern/vtree_multi_function/vsocket_multi_function_data_types.h
-  intern/vtree_multi_function/vtree_multi_function.h
   intern/vtree_multi_function_network/builder.h
   intern/vtree_multi_function_network/mappings.h
   intern/cpp_types.h
diff --git a/source/blender/functions/intern/vtree_multi_function/vtree_multi_function.h b/source/blender/functions/intern/vtree_multi_function/vtree_multi_function.h
deleted file mode 100644
index 8cfe46147e2..00000000000
--- a/source/blender/functions/intern/vtree_multi_function/vtree_multi_function.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#pragma once
-
-#include "FN_multi_function.h"
-
-#include "vnode_multi_function_wrapper.h"
-#include "mappings.h"
-
-namespace FN {
-
-class VTreeMultiFunction final : public MultiFunction {
- private:
-  Vector<const VOutputSocket *> m_inputs;
-  Vector<const VInputSocket *> m_outputs;
-
- public:
-  VTreeMultiFunction(Vector<const VOutputSocket *> inputs, Vector<const VInputSocket *> outputs)
-      : m_inputs(std::move(inputs)), m_outputs(std::move(outputs))
-  {
-  }
-
-  void call(MFMask UNUSED(mask), MFParams UNUSED(params), MFContext UNUSED(context)) const override
-  {
-  }
-};
-
-}  // namespace FN
diff --git a/source/blender/functions/intern/vtree_multi_function_network/builder.h b/source/blender/functions/intern/vtree_multi_function_network/builder.h
index 260eb8e32d1..ce589b2812c 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/builder.h
+++ b/source/blender/functions/intern/vtree_multi_function_network/builder.h
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "FN_vtree_multi_function_network.h"
+#include "FN_multi_functions.h"
 
 #include "BLI_multi_map.h"
 
@@ -234,4 +235,55 @@ class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
   std::unique_ptr<VTreeMFNetwork> build();
 };
 
+class VSocketMFNetworkBuilder {
+ private:
+  VTreeMFNetworkBuilder &m_network_builder;
+  const VSocket &m_vsocket;
+  MFBuilderOutputSocket *m_socket_to_build = nullptr;
+
+ public:
+  VSocketMFNetworkBuilder(VTreeMFNetworkBuilder &network_builder, const VSocket &vsocket)
+      : m_network_builder(network_builder), m_vsocket(vsocket)
+  {
+  }
+
+  MFBuilderOutputSocket &built_socket()
+  {
+    BLI_assert(m_socket_to_build != nullptr);
+    return *m_socket_to_build;
+  }
+
+  const VSocket &vsocket() const
+  {
+    return m_vsocket;
+  }
+
+  PointerRNA *rna()
+  {
+    return m_vsocket.rna();
+  }
+
+  VTreeMFNetworkBuilder &network_builder()
+  {
+    return m_network_builder;
+  }
+
+  template<typename T> void set_constant_value(const T &value)
+  {
+    const MultiFunction &fn = m_network_builder.construct_fn<MF_ConstantValue<T>>(value);
+    this->set_generator_fn(fn);
+  }
+
+  void set_generator_fn(const MultiFunction &fn)
+  {
+    MFBuilderFunctionNode &node = m_network_builder.add_function(fn, {}, {0});
+    this->set_socket(node.output(0));
+  }
+
+  void set_socket(MFBuilderOutputSocket &socket)
+  {
+    m_socket_to_build = &socket;
+  }
+};
+
 }  // namespace FN
diff --git a/source/blender/functions/intern/vtree_multi_function_network/generate.cc b/source/blender/functions/intern/vtree_multi_function_network/generate.cc
index b92c01ca09a..9a8a34f5e21 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/generate.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/generate.cc
@@ -90,15 +90,17 @@ static bool insert_unlinked_inputs(VTreeMFNetworkBuilder &builder,
   }
 
   for (const VInputSocket *vsocket : unlinked_data_inputs) {
-    const InsertUnlinkedInputFunction *inserter = mappings.input_inserters.lookup_ptr(
+    const InsertVSocketFunction *inserter = mappings.vsocket_inserters.lookup_ptr(
         vsocket->idname());
 
     if (inserter == nullptr) {
       return false;
     }
-    MFBuilderOutputSocket &from_socket = (*inserter)(builder, *vsocket);
+
+    VSocketMFNetworkBuilder vsocket_builder{builder, *vsocket};
+    (*inserter)(vsocket_builder);
     for (MFBuilderInputSocket *to_socket : builder.lookup_socket(*vsocket)) {
-      builder.add_link(from_socket, *to_socket);
+      builder.add_link(vsocket_builder.built_socket(), *to_socket);
     }
   }
 
diff --git a/source/blender/functions/intern/vtree_multi_function_network/mappings.h b/source/blender/functions/intern/vtree_multi_function_network/mappings.h
index e883082602b..d4610448066 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/mappings.h
+++ b/source/blender/functions/intern/vtree_multi_function_network/mappings.h
@@ -14,11 +14,11 @@ using BLI::StringMap;
 
 struct VTreeMultiFunctionMappings;
 class VTreeMFNetworkBuilder;
+class VSocketMFNetworkBuilder;
 
 using InsertVNodeFunction =
     std::function<void(VTreeMFNetworkBuilder &builder, const VNode &vnode)>;
-using InsertUnlinkedInputFunction =
-    std::function<MFBuilderOutputSocket &(VTreeMFNetworkBuilder &builder, const VSocket &vsocket)>;
+using InsertVSocketFunction = std::function<void(VSocketMFNetworkBuilder &builder)>;
 using InsertImplicitConversionFunction = std::function<
     std::pair<MFBuilderInputSocket *, MFBuilderOutputSocket *>(VTreeMFNetworkBuilder &builder)>;
 
@@ -28,7 +28,7 @@ struct VTreeMultiFunctionMappings {
   StringMap<MFDataType> data_type_by_type_name;
   Map<const CPPType *, std::string> type_name_from_cpp_type;
   StringMap<InsertVNodeFunction> vnode_inserters;
-  StringMap<InsertUnlinkedInputFunction> input_inserters;
+  StringMap<InsertVSocketFunction> vsocket_inserters;
   Map<std::pair<std::string, std::string>, InsertImplicitConversionFunction> conversion_inserters;
 };
 
diff --git a/source/blender/functions/intern/vtree_multi_function_network/mappings_sockets.cc b/source/blender/functions/intern/vtree_multi_function_network/mappings_sockets.cc
index b785eca4f2b..0615f24580b 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/mappings_sockets.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/mappings_sockets.cc
@@ -10,87 +10,56 @@ namespace FN {
 /* Socket Inserters
  **********************************************************/
 
-static MFBuilderOutputSocket &INSERT_vector_socket(VTreeMFNetworkBuilder &builder,
-                                                   const VSocket &vsocket)
+static void INSERT_vector_socket(VSocketMFNetworkBuilder &builder)
 {
   BLI::float3 value;
-  RNA_float_get_array(vsocket.rna(), "value", value);
-
-  const MultiFunction &fn = builder.construct_fn<FN::MF_ConstantValue<BLI::float3>>(value);
-  MFBuilderFunctionNode &node = builder.add_function(fn, {}, {0});
-  return *node.outputs()[0];
+  RNA_float_get_array(builder.rna(), "value", value);
+  builder.set_constant_value(value);
 }
 
-static MFBuilderOutputSocket &INSERT_color_socket(VTreeMFNetworkBuilder &builder,
-                                                  const VSocket &vsocket)
+static void INSERT_color_socket(VSocketMFNetworkBuilder &builder)
 {
   BLI::rgba_f value;
-  RNA_float_get_array(vsocket.rna(), "value", value);
-
-  const MultiFunction &fn = builder.construct_fn<FN::MF_ConstantValue<BLI::rgba_f>>(value);
-  MFBuilderFunctionNode &node = builder.add_function(fn, {}, {0});
-  return *node.outputs()[0];
+  RNA_float_get_array(builder.rna(), "value", value);
+  builder.set_constant_value(value);
 }
 
-static MFBuilderOutputSocket &INSERT_float_socket(VTreeMFNetworkBuilder &builder,
-                                                  const VSocket &vsocket)
+static void INSERT_float_socket(VSocketMFNetworkBuilder &builder)
 {
-  float value = RNA_float_get(vsocket.rna(), "value");
-
-  const MultiFunction &fn = builder.construct_fn<FN::MF_ConstantValue<float>>(value);
-  MFBuilderFunctionNode &node = builder.add_function(fn, {}, {0});
-  return *node.outputs()[0];
+  float value = RNA_float_get(builder.rna(), "value");
+  builder.set_constant_value(value);
 }
 
-static MFBuilderOutputSocket &INSERT_bool_socket(VTreeMFNetworkBuilder &builder,
-                                                 const VSocket &vsocket)
+static void INSERT_bool_socket(VSocketMFNetworkBuilder &builder)
 {
-  bool value = RNA_boolean_get(vsocket.rna(), "value");
-
-  const MultiFunction &fn = builder.construct_fn<FN::MF_ConstantValue<bool>>(value);
-  MFBuilderFunctionNode &node = builder.add_function(fn, {}, {0});
-  return *node.outputs()[0];
+  bool value = RNA_boolean_get(builder.rna(), "value");
+  builder.set_constant_value(value);
 }
 
-static MFBuilderOutputSocket &INSERT_int_socket(VTreeMFNetworkBuilder &builder,
-                                                const VSocket &vsocket)
+static void INSERT_int_socket(VSocketMFNetworkBuilder &builder)
 {
-  int value = RNA_int_get(vsocket.rna(), "value");
-
-  const MultiFunction &fn = builder.construct_fn<FN::MF_ConstantValue<int>>(value);
-  MFBuilderFunctionNode &node = builder.add_function(fn, {}, {0});
-  return *node.outputs()[0];
+  int value = RNA_int_get(builder.rna(), "value");
+  builder.set_constant_value(value);
 }
 
-static MFBuilderOutputSocket &INSERT_object_socket(VTreeMFNetworkBuilder &builder,
-                                                   const VSocket &vsocket)
+static void INSERT_object_socket(VSocketMFNetworkBuilder &builder)
 {
- 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list