[Bf-blender-cvs] [db0ee0fe367] functions-experimental-refactor: further improve MultiFunction API

Jacques Lucke noreply at git.blender.org
Thu Oct 31 14:13:02 CET 2019


Commit: db0ee0fe367269e0970aceccae281026ca606711
Author: Jacques Lucke
Date:   Thu Oct 31 13:51:05 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rBdb0ee0fe367269e0970aceccae281026ca606711

further improve MultiFunction API

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

M	source/blender/blenkernel/BKE_multi_function.h
M	source/blender/blenkernel/intern/multi_functions.cc
M	source/blender/modifiers/intern/MOD_functiondeform_cxx.cc

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

diff --git a/source/blender/blenkernel/BKE_multi_function.h b/source/blender/blenkernel/BKE_multi_function.h
index fd07e74a44b..42b38594928 100644
--- a/source/blender/blenkernel/BKE_multi_function.h
+++ b/source/blender/blenkernel/BKE_multi_function.h
@@ -471,6 +471,40 @@ class MFParams {
   const MFSignature *m_signature = nullptr;
 };
 
+class MultiFunction {
+ public:
+  virtual ~MultiFunction()
+  {
+  }
+  virtual void call(ArrayRef<uint> mask_indices, MFParams &params, MFContext &context) const = 0;
+
+  IndexRange param_indices() const
+  {
+    return IndexRange(m_signature.m_param_types.size());
+  }
+
+  MFParamType param_type(uint index) const
+  {
+    return m_signature.m_param_types[index];
+  }
+
+  StringRefNull param_name(uint index) const
+  {
+    return m_signature.m_param_names[index];
+  }
+
+ protected:
+  void set_signature(MFSignatureBuilder &signature_builder)
+  {
+    m_signature = signature_builder.build();
+  }
+
+ private:
+  MFSignature m_signature;
+
+  friend class MFParamsBuilder;
+};
+
 class MFParamsBuilder {
  private:
   Vector<GenericVirtualListRef> m_virtual_list_refs;
@@ -483,17 +517,9 @@ class MFParamsBuilder {
   MFParams m_params;
 
  public:
-  MFParamsBuilder() = default;
-
-  void start_new(const MFSignature &signature, uint min_array_size)
+  MFParamsBuilder(const MultiFunction &function, uint min_array_size)
+      : m_signature(&function.m_signature), m_min_array_size(min_array_size)
   {
-    m_signature = &signature;
-    m_min_array_size = min_array_size;
-
-    m_virtual_list_refs.clear();
-    m_mutable_array_refs.clear();
-    m_virtual_list_list_refs.clear();
-    m_vector_arrays.clear();
   }
 
   template<typename T> void add_readonly_single_input(ArrayRef<T> array)
@@ -556,43 +582,6 @@ class MFParamsBuilder {
   }
 };
 
-class MultiFunction {
- public:
-  virtual ~MultiFunction()
-  {
-  }
-  virtual void call(ArrayRef<uint> mask_indices, MFParams &params, MFContext &context) const = 0;
-
-  const MFSignature &signature() const
-  {
-    return m_signature;
-  }
-
-  IndexRange param_indices() const
-  {
-    return IndexRange(m_signature.m_param_types.size());
-  }
-
-  MFParamType param_type(uint index) const
-  {
-    return m_signature.m_param_types[index];
-  }
-
-  StringRefNull param_name(uint index) const
-  {
-    return m_signature.m_param_names[index];
-  }
-
- protected:
-  void set_signature(MFSignatureBuilder &signature_builder)
-  {
-    m_signature = signature_builder.build();
-  }
-
- private:
-  MFSignature m_signature;
-};
-
 };  // namespace BKE
 
 #endif /* __BKE_MULTI_FUNCTION_H__ */
diff --git a/source/blender/blenkernel/intern/multi_functions.cc b/source/blender/blenkernel/intern/multi_functions.cc
index 6dbb2c64825..2afd1ee50fd 100644
--- a/source/blender/blenkernel/intern/multi_functions.cc
+++ b/source/blender/blenkernel/intern/multi_functions.cc
@@ -382,8 +382,7 @@ void MultiFunction_SimpleVectorize::call(ArrayRef<uint> mask_indices,
 
   for (uint index : mask_indices) {
     uint length = vectorization_lengths[index];
-    MFParamsBuilder params_builder;
-    params_builder.start_new(m_function.signature(), length);
+    MFParamsBuilder params_builder(m_function, length);
 
     for (uint param_index : m_function.param_indices()) {
       MFParamType param_type = m_function.param_type(param_index);
diff --git a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
index 1e620c8c998..408f0dd6c87 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
+++ b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
@@ -1011,14 +1011,14 @@ class MultiFunction_FunctionTree : public BKE::MultiFunction {
   {
     uint array_size = mask_indices.last() + 1;
 
-    MFParamsBuilder params_builder;
-    params_builder.start_new(function_node.function().signature(), array_size);
+    const MultiFunction &function = function_node.function();
+    MFParamsBuilder params_builder(function, array_size);
 
     Vector<std::pair<const MFOutputSocket *, GenericMutableArrayRef>> single_outputs_to_forward;
     Vector<std::pair<const MFOutputSocket *, GenericVectorArray *>> vector_outputs_to_forward;
 
-    for (uint param_index : function_node.function().param_indices()) {
-      MFParamType param_type = function_node.function().param_type(param_index);
+    for (uint param_index : function.param_indices()) {
+      MFParamType param_type = function.param_type(param_index);
       switch (param_type.category()) {
         case MFParamType::None: {
           BLI_assert(false);
@@ -1072,7 +1072,6 @@ class MultiFunction_FunctionTree : public BKE::MultiFunction {
     }
 
     MFParams &params = params_builder.build();
-    const MultiFunction &function = function_node.function();
     function.call(mask_indices, params, global_context);
 
     for (auto single_forward_info : single_outputs_to_forward) {
@@ -1198,8 +1197,7 @@ void MOD_functiondeform_do(FunctionDeformModifierData *fdmd, float (*vertexCos)[
 
   MultiFunction_FunctionTree function{function_inputs, function_outputs};
 
-  MFParamsBuilder params;
-  params.start_new(function.signature(), numVerts);
+  MFParamsBuilder params(function, numVerts);
   params.add_readonly_single_input(ArrayRef<float3>((float3 *)vertexCos, numVerts));
   params.add_readonly_single_input(&fdmd->control1);
   params.add_readonly_single_input(&fdmd->control2);



More information about the Bf-blender-cvs mailing list