[Bf-blender-cvs] [47e7a8966ef] functions: cleanup nodes mapping

Jacques Lucke noreply at git.blender.org
Thu Nov 21 15:20:05 CET 2019


Commit: 47e7a8966ef6514c8cf49994df3929131d398f18
Author: Jacques Lucke
Date:   Thu Nov 21 15:10:26 2019 +0100
Branches: functions
https://developer.blender.org/rB47e7a8966ef6514c8cf49994df3929131d398f18

cleanup nodes mapping

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

M	source/blender/functions/intern/vtree_multi_function_network/builder.cc
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_nodes.cc

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

diff --git a/source/blender/functions/intern/vtree_multi_function_network/builder.cc b/source/blender/functions/intern/vtree_multi_function_network/builder.cc
index 2423fc38527..bf7360112bd 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/builder.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/builder.cc
@@ -73,8 +73,11 @@ void VTreeMFNetworkBuilder::map_data_sockets(const VNode &vnode, MFBuilderNode &
 
 void VTreeMFNetworkBuilder::assert_vnode_is_mapped_correctly(const VNode &vnode) const
 {
+  UNUSED_VARS_NDEBUG(vnode);
+#ifdef DEBUG
   this->assert_data_sockets_are_mapped_correctly(vnode.inputs().cast<const VSocket *>());
   this->assert_data_sockets_are_mapped_correctly(vnode.outputs().cast<const VSocket *>());
+#endif
 }
 
 void VTreeMFNetworkBuilder::assert_data_sockets_are_mapped_correctly(
@@ -141,6 +144,54 @@ MFDataType VTreeMFNetworkBuilder::data_type_from_property(const VNode &vnode,
   return type;
 }
 
+Vector<bool> VNodeMFNetworkBuilder::get_list_base_variadic_states(StringRefNull prop_name)
+{
+  Vector<bool> states;
+  RNA_BEGIN (m_vnode.rna(), itemptr, prop_name.data()) {
+    int state = RNA_enum_get(&itemptr, "state");
+    if (state == 0) {
+      /* single value case */
+      states.append(false);
+    }
+    else if (state == 1) {
+      /* list case */
+      states.append(true);
+    }
+    else {
+      BLI_assert(false);
+    }
+  }
+  RNA_END;
+  return states;
+}
+
+void VNodeMFNetworkBuilder::set_matching_fn(const MultiFunction &fn)
+{
+  MFBuilderFunctionNode &node = m_network_builder.add_function(fn);
+  m_network_builder.map_data_sockets(m_vnode, node);
+}
+
+const MultiFunction &VNodeMFNetworkBuilder::get_vectorized_function(
+    const MultiFunction &base_function, ArrayRef<const char *> is_vectorized_prop_names)
+{
+  Vector<bool> input_is_vectorized;
+  for (const char *prop_name : is_vectorized_prop_names) {
+    char state[5];
+    RNA_string_get(m_vnode.rna(), prop_name, state);
+    BLI_assert(STREQ(state, "BASE") || STREQ(state, "LIST"));
+
+    bool is_vectorized = STREQ(state, "LIST");
+    input_is_vectorized.append(is_vectorized);
+  }
+
+  if (input_is_vectorized.contains(true)) {
+    return this->construct_fn<MF_SimpleVectorize>(base_function, input_is_vectorized);
+  }
+  else {
+    return base_function;
+  }
+}
+
 std::unique_ptr<VTreeMFNetwork> VTreeMFNetworkBuilder::build()
 {
   m_builder->to_dot__clipboard();
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 29f3ba2459e..80f995db326 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/builder.h
+++ b/source/blender/functions/intern/vtree_multi_function_network/builder.h
@@ -281,4 +281,69 @@ class VSocketMFNetworkBuilder {
   }
 };
 
+class VNodeMFNetworkBuilder {
+ private:
+  VTreeMFNetworkBuilder &m_network_builder;
+  const VNode &m_vnode;
+
+ public:
+  VNodeMFNetworkBuilder(VTreeMFNetworkBuilder &network_builder, const VNode &vnode)
+      : m_network_builder(network_builder), m_vnode(vnode)
+  {
+  }
+
+  VTreeMFNetworkBuilder &network_builder()
+  {
+    return m_network_builder;
+  }
+
+  const VNode &vnode() const
+  {
+    return m_vnode;
+  }
+
+  PointerRNA *rna()
+  {
+    return m_vnode.rna();
+  }
+
+  const CPPType &cpp_type_from_property(StringRefNull prop_name)
+  {
+    return m_network_builder.cpp_type_from_property(m_vnode, prop_name);
+  }
+
+  MFDataType data_type_from_property(StringRefNull prop_name)
+  {
+    return m_network_builder.data_type_from_property(m_vnode, prop_name);
+  }
+
+  Vector<bool> get_list_base_variadic_states(StringRefNull prop_name);
+
+  template<typename T, typename... Args> T &construct_fn(Args &&... args)
+  {
+    return m_network_builder.construct_fn<T>(std::forward<Args>(args)...);
+  }
+
+  template<typename T, typename... Args>
+  void set_vectorized_constructed_matching_fn(ArrayRef<const char *> is_vectorized_prop_names,
+                                              Args &&... args)
+  {
+    const MultiFunction &base_fn = this->construct_fn<T>(std::forward<Args>(args)...);
+    const MultiFunction &fn = this->get_vectorized_function(base_fn, is_vectorized_prop_names);
+    this->set_matching_fn(fn);
+  }
+
+  template<typename T, typename... Args> void set_constructed_matching_fn(Args &&... args)
+  {
+    const MultiFunction &fn = this->construct_fn<T>(std::forward<Args>(args)...);
+    this->set_matching_fn(fn);
+  }
+
+  void set_matching_fn(const MultiFunction &fn);
+
+ private:
+  const MultiFunction &get_vectorized_function(const MultiFunction &base_function,
+                                               ArrayRef<const char *> is_vectorized_prop_names);
+};
+
 }  // 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 ce8e113240f..26629f30abb 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/generate.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/generate.cc
@@ -20,10 +20,10 @@ static bool insert_nodes(VTreeMFNetworkBuilder &builder,
     const InsertVNodeFunction *inserter = mappings.vnode_inserters.lookup_ptr(idname);
 
     if (inserter != nullptr) {
-      (*inserter)(builder, *vnode);
-#ifdef DEBUG
+      VNodeMFNetworkBuilder vnode_builder{builder, *vnode};
+
+      (*inserter)(vnode_builder);
       builder.assert_vnode_is_mapped_correctly(*vnode);
-#endif
     }
     else if (builder.has_data_sockets(*vnode)) {
       builder.add_dummy(*vnode);
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 d4610448066..2c338be447a 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/mappings.h
+++ b/source/blender/functions/intern/vtree_multi_function_network/mappings.h
@@ -14,10 +14,10 @@ using BLI::StringMap;
 
 struct VTreeMultiFunctionMappings;
 class VTreeMFNetworkBuilder;
+class VNodeMFNetworkBuilder;
 class VSocketMFNetworkBuilder;
 
-using InsertVNodeFunction =
-    std::function<void(VTreeMFNetworkBuilder &builder, const VNode &vnode)>;
+using InsertVNodeFunction = std::function<void(VNodeMFNetworkBuilder &builder)>;
 using InsertVSocketFunction = std::function<void(VSocketMFNetworkBuilder &builder)>;
 using InsertImplicitConversionFunction = std::function<
     std::pair<MFBuilderInputSocket *, MFBuilderOutputSocket *>(VTreeMFNetworkBuilder &builder)>;
diff --git a/source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc b/source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc
index 6dcfd5bc56f..8eea45ea479 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc
@@ -9,502 +9,345 @@
 namespace FN {
 
 using BLI::float3;
-
-static const MultiFunction &get_vectorized_function(
-    VTreeMFNetworkBuilder &builder,
-    const MultiFunction &base_function,
-    PointerRNA *rna,
-    ArrayRef<const char *> is_vectorized_prop_names)
-{
-  Vector<bool> input_is_vectorized;
-  for (const char *prop_name : is_vectorized_prop_names) {
-    char state[5];
-    RNA_string_get(rna, prop_name, state);
-    BLI_assert(STREQ(state, "BASE") || STREQ(state, "LIST"));
-
-    bool is_vectorized = STREQ(state, "LIST");
-    input_is_vectorized.append(is_vectorized);
-  }
-
-  if (input_is_vectorized.contains(true)) {
-    return builder.construct_fn<FN::MF_SimpleVectorize>(base_function, input_is_vectorized);
-  }
-  else {
-    return base_function;
-  }
-}
-
-static void INSERT_combine_color(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+static void INSERT_combine_color(VNodeMFNetworkBuilder &builder)
 {
-  const MultiFunction &base_fn = builder.construct_fn<FN::MF_CombineColor>();
-  const MultiFunction &fn = get_vectorized_function(
-      builder,
-      base_fn,
-      vnode.rna(),
+  builder.set_vectorized_constructed_matching_fn<MF_CombineColor>(
       {"use_list__red", "use_list__green", "use_list__blue", "use_list__alpha"});
-  builder.add_function(fn, vnode);
-}
-
-static void INSERT_separate_color(VTreeMFNetworkBuilder &builder, const VNode &vnode)
-{
-  const MultiFunction &base_fn = builder.construct_fn<FN::MF_SeparateColor>();
-  const MultiFunction &fn = get_vectorized_function(
-      builder, base_fn, vnode.rna(), {"use_list__color"});
-  builder.add_function(fn, vnode);
-}
-
-static void INSERT_combine_vector(VTreeMFNetworkBuilder &builder, const VNode &vnode)
-{
-  const MultiFunction &base_fn = builder.construct_fn<FN::MF_CombineVector>();
-  const MultiFunction &fn = get_vectorized_function(
-      builder, base_fn, vnode.rna(), {"use_list__x", "use_list__y", "use_list__z"});
-  builder.add_function(fn, vnode);
 }
 
-static void INSERT_separate_vector(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+static void INSERT_separate_color(VNodeMFNetworkBuilder &builder)
 {
-  const MultiFunction &base_fn = builder.construct_fn<FN::MF_SeparateVector>();
-  const MultiFunction &fn = get_vectorized_function(
-      builder, base_fn, vnode.rna(), {"use_list__vector"});
-  builder.add_function(fn, vnode);
+  builder.set_vectorized_constructed_matching_fn<MF_SeparateColor>({"use_list__color"});
 }
 
-static void INSERT_list_length(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+static void INSERT_combine_vector(VNodeMFNetworkBuilder &builder)
 {
-  const CPPType &type = builder.cpp_type_from_property(vnode, "active_type");
-  const MultiFunction &fn = builder.construct_fn<FN::MF_ListLength>(type);
-  builder.add_function(fn, vnode);
+  builder.set_vectorized_constructed_matching_fn<MF_CombineVector>(
+      {"use_list__x", "use_list__y", "use_list__z"});
 }
 
-static void INSERT_get_list_element(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+static void INSERT_separate_vector(VNodeMFNetworkBuilder &builder)
 {
-  const CPPType &type = builder.cpp_type_from_property(vnode, "active_type");
-  const MultiFunction &f

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list