[Bf-blender-cvs] [ae8332f7c67] functions-experimental-refactor: introduce MFMask

Jacques Lucke noreply at git.blender.org
Fri Nov 1 14:38:32 CET 2019


Commit: ae8332f7c670810e14e1dbea7352b4b9fc2a169d
Author: Jacques Lucke
Date:   Fri Nov 1 14:17:09 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rBae8332f7c670810e14e1dbea7352b4b9fc2a169d

introduce MFMask

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

M	source/blender/blenkernel/BKE_multi_function.h
M	source/blender/blenkernel/BKE_multi_functions.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 19f75a42476..cfe8fe8a9fd 100644
--- a/source/blender/blenkernel/BKE_multi_function.h
+++ b/source/blender/blenkernel/BKE_multi_function.h
@@ -182,6 +182,31 @@ struct MFParamType {
   const CPPType *m_base_type = nullptr;
 };
 
+class MFMask {
+ private:
+  ArrayRef<uint> m_indices;
+
+ public:
+  MFMask(ArrayRef<uint> indices) : m_indices(indices)
+  {
+  }
+
+  uint indices_amount() const
+  {
+    return m_indices.size();
+  }
+
+  uint min_array_size() const
+  {
+    return (m_indices.size() == 0) ? 0 : m_indices.last() + 1;
+  }
+
+  ArrayRef<uint> indices() const
+  {
+    return m_indices;
+  }
+};
+
 class MFContext {
 };
 
@@ -485,7 +510,7 @@ class MultiFunction {
   virtual ~MultiFunction()
   {
   }
-  virtual void call(ArrayRef<uint> mask_indices, MFParams &params, MFContext &context) const = 0;
+  virtual void call(const MFMask &mask, MFParams &params, MFContext &context) const = 0;
 
   IndexRange param_indices() const
   {
diff --git a/source/blender/blenkernel/BKE_multi_functions.h b/source/blender/blenkernel/BKE_multi_functions.h
index 7c132fddeb4..1805535d969 100644
--- a/source/blender/blenkernel/BKE_multi_functions.h
+++ b/source/blender/blenkernel/BKE_multi_functions.h
@@ -8,55 +8,55 @@ namespace BKE {
 class MultiFunction_AddFloats final : public MultiFunction {
  public:
   MultiFunction_AddFloats();
-  void call(ArrayRef<uint> mask_indices, MFParams &params, MFContext &context) const override;
+  void call(const MFMask &mask, MFParams &params, MFContext &context) const override;
 };
 
 class MultiFunction_AddFloat3s final : public MultiFunction {
  public:
   MultiFunction_AddFloat3s();
-  void call(ArrayRef<uint> mask_indices, MFParams &params, MFContext &context) const override;
+  void call(const MFMask &mask, MFParams &params, MFContext &context) const override;
 };
 
 class MultiFunction_CombineVector final : public MultiFunction {
  public:
   MultiFunction_CombineVector();
-  void call(ArrayRef<uint> mask_indices, MFParams &params, MFContext &context) const override;
+  void call(const MFMask &mask, MFParams &params, MFContext &context) const override;
 };
 
 class MultiFunction_SeparateVector final : public MultiFunction {
  public:
   MultiFunction_SeparateVector();
-  void call(ArrayRef<uint> mask_indices, MFParams &params, MFContext &context) const override;
+  void call(const MFMask &mask, MFParams &params, MFContext &context) const override;
 };
 
 class MultiFunction_VectorDistance final : public MultiFunction {
  public:
   MultiFunction_VectorDistance();
-  void call(ArrayRef<uint> mask_indices, MFParams &params, MFContext &context) const override;
+  void call(const MFMask &mask, MFParams &params, MFContext &context) const override;
 };
 
 class MultiFunction_FloatArraySum final : public MultiFunction {
  public:
   MultiFunction_FloatArraySum();
-  void call(ArrayRef<uint> mask_indices, MFParams &params, MFContext &context) const override;
+  void call(const MFMask &mask, MFParams &params, MFContext &context) const override;
 };
 
 class MultiFunction_FloatRange final : public MultiFunction {
  public:
   MultiFunction_FloatRange();
-  void call(ArrayRef<uint> mask_indices, MFParams &params, MFContext &context) const override;
+  void call(const MFMask &mask, MFParams &params, MFContext &context) const override;
 };
 
 class MultiFunction_ObjectWorldLocation final : public MultiFunction {
  public:
   MultiFunction_ObjectWorldLocation();
-  void call(ArrayRef<uint> mask_indices, MFParams &params, MFContext &context) const override;
+  void call(const MFMask &mask, MFParams &params, MFContext &context) const override;
 };
 
 class MultiFunction_TextLength final : public MultiFunction {
  public:
   MultiFunction_TextLength();
-  void call(ArrayRef<uint> mask_indices, MFParams &params, MFContext &context) const override;
+  void call(const MFMask &mask, MFParams &params, MFContext &context) const override;
 };
 
 class MultiFunction_GetListElement final : public MultiFunction {
@@ -65,7 +65,7 @@ class MultiFunction_GetListElement final : public MultiFunction {
 
  public:
   MultiFunction_GetListElement(const CPPType &base_type);
-  void call(ArrayRef<uint> mask_indices, MFParams &params, MFContext &context) const override;
+  void call(const MFMask &mask, MFParams &params, MFContext &context) const override;
 };
 
 class MultiFunction_ListLength final : public MultiFunction {
@@ -74,7 +74,7 @@ class MultiFunction_ListLength final : public MultiFunction {
 
  public:
   MultiFunction_ListLength(const CPPType &base_type);
-  void call(ArrayRef<uint> mask_indices, MFParams &params, MFContext &context) const override;
+  void call(const MFMask &mask, MFParams &params, MFContext &context) const override;
 };
 
 class MultiFunction_PackList final : public MultiFunction {
@@ -84,7 +84,7 @@ class MultiFunction_PackList final : public MultiFunction {
 
  public:
   MultiFunction_PackList(const CPPType &base_type, ArrayRef<bool> input_list_status);
-  void call(ArrayRef<uint> mask_indices, MFParams &params, MFContext &context) const override;
+  void call(const MFMask &mask, MFParams &params, MFContext &context) const override;
 
  private:
   bool input_is_list(uint index) const;
@@ -102,13 +102,11 @@ template<typename T> class MultiFunction_ConstantValue : public MultiFunction {
     this->set_signature(signature);
   }
 
-  void call(ArrayRef<uint> mask_indices,
-            MFParams &params,
-            MFContext &UNUSED(context)) const override
+  void call(const MFMask &mask, MFParams &params, MFContext &UNUSED(context)) const override
   {
     MutableArrayRef<T> output = params.single_output<T>(0, "Output");
 
-    for (uint i : mask_indices) {
+    for (uint i : mask.indices()) {
       new (output.begin() + i) T(m_value);
     }
   }
@@ -123,7 +121,7 @@ template<typename T> class MultiFunction_EmptyList : public MultiFunction {
     this->set_signature(signature);
   }
 
-  void call(ArrayRef<uint> UNUSED(mask_indices),
+  void call(const MFMask &UNUSED(mask),
             MFParams &UNUSED(params),
             MFContext &UNUSED(context)) const override
   {
@@ -140,14 +138,12 @@ template<typename FromT, typename ToT> class MultiFunction_Convert : public Mult
     this->set_signature(signature);
   }
 
-  void call(ArrayRef<uint> mask_indices,
-            MFParams &params,
-            MFContext &UNUSED(context)) const override
+  void call(const MFMask &mask, MFParams &params, MFContext &UNUSED(context)) const override
   {
     VirtualListRef<FromT> inputs = params.readonly_single_input<FromT>(0, "Input");
     MutableArrayRef<ToT> outputs = params.single_output<ToT>(1, "Output");
 
-    for (uint i : mask_indices) {
+    for (uint i : mask.indices()) {
       const FromT &from_value = inputs[i];
       new (outputs.begin() + i) ToT(from_value);
     }
@@ -165,14 +161,12 @@ template<typename FromT, typename ToT> class MultiFunction_ConvertList : public
     this->set_signature(signature);
   }
 
-  void call(ArrayRef<uint> mask_indices,
-            MFParams &params,
-            MFContext &UNUSED(context)) const override
+  void call(const MFMask &mask, MFParams &params, MFContext &UNUSED(context)) const override
   {
     VirtualListListRef<FromT> inputs = params.readonly_vector_input<FromT>(0, "Inputs");
     GenericVectorArray::MutableTypedRef<ToT> outputs = params.vector_output<ToT>(1, "Outputs");
 
-    for (uint index : mask_indices) {
+    for (uint index : mask.indices()) {
       VirtualListRef<FromT> input_list = inputs[index];
 
       for (uint i = 0; i < input_list.size(); i++) {
@@ -194,14 +188,12 @@ template<typename T> class MultiFunction_SingleElementList : public MultiFunctio
     this->set_signature(signature);
   }
 
-  void call(ArrayRef<uint> mask_indices,
-            MFParams &params,
-            MFContext &UNUSED(context)) const override
+  void call(const MFMask &mask, MFParams &params, MFContext &UNUSED(context)) const override
   {
     VirtualListRef<T> inputs = params.readonly_single_input<T>(0, "Input");
     GenericVectorArray::MutableTypedRef<T> outputs = params.vector_output<T>(1, "Outputs");
 
-    for (uint i : mask_indices) {
+    for (uint i : mask.indices()) {
       outputs.append_single(i, inputs[i]);
     }
   }
@@ -216,7 +208,7 @@ class MultiFunction_SimpleVectorize final : public MultiFunction {
 
  public:
   MultiFunction_SimpleVectorize(const MultiFunction &function, ArrayRef<bool> input_is_vectorized);
-  void call(ArrayRef<uint> mask_indices, MFParams &params, MFContext &context) const override;
+  void call(const MFMask &mask, MFParams &params, MFContext &context) const override;
 };
 
 };  // namespace BKE
diff --git a/source/blender/blenkernel/intern/multi_functions.cc b/source/blender/blenkernel/intern/multi_functions.cc
index 64c2d6d6621..a576dab0ca4 100644
--- a/source/blender/blenkernel/intern/multi_functions.cc
+++ b/source/blender/blenkernel/intern/multi_functions.cc
@@ -21,7 +21,7 @@ MultiFunction_AddFloats::MultiFunction_AddFloats()
   this->set_signature(signature);
 }
 
-void MultiFunction_AddFloats::call(ArrayRef<uint> mask_indices,
+void MultiFunction_AddFloats::call(const MFMask &mask,
                                    MFParams &params,
                                    MFContext &UNUSED(context)) const
 {
@@ -29,7 +29,7 @@ void MultiFunction_AddFloats::call(ArrayRef<uint> mask_indices,
   auto b = params.readonly_single_input<float>(1, "B");
   auto result = params.single_output<float>(2, "Result");
 
-  for (uint i : mask_indices) {
+  for (uint i : mask.indices()) {
     result[i] = a[i] + b[i];
   }
 }
@@ -43,7 +43,7 @@ MultiFunction_AddFloat3s::MultiFunction_AddFloat3s()
   this->set_signature(signature);
 }
 
-void MultiFunction_AddFloat3s::call(ArrayRef<uint> mask_indices,
+void MultiFunction_AddFloat3s::call(const MFMask &mask,
                                     MFParams &params,
                                     MFContext &UNUSED(context)) const
 {
@@ -51,7 +51,7 @@ void MultiFunction_AddFloat3s::call(ArrayRef<uint> mask_indices,
   auto b = params.readonly_single_input<float3>(1, "B");
   auto result = 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list