[Bf-blender-cvs] [a080464e310] functions: extract function vectorizer to separate file

Jacques Lucke noreply at git.blender.org
Wed Dec 11 15:28:09 CET 2019


Commit: a080464e310aecf5d0ca7294a1b3e9d0b4b1023d
Author: Jacques Lucke
Date:   Wed Dec 11 15:03:19 2019 +0100
Branches: functions
https://developer.blender.org/rBa080464e310aecf5d0ca7294a1b3e9d0b4b1023d

extract function vectorizer to separate file

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

M	source/blender/functions/CMakeLists.txt
M	source/blender/functions/FN_multi_functions.h
M	source/blender/functions/intern/multi_functions/mixed.cc
M	source/blender/functions/intern/multi_functions/mixed.h
A	source/blender/functions/intern/multi_functions/vectorize.cc
A	source/blender/functions/intern/multi_functions/vectorize.h

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

diff --git a/source/blender/functions/CMakeLists.txt b/source/blender/functions/CMakeLists.txt
index fae3e2d9d28..f1e6f2a3d79 100644
--- a/source/blender/functions/CMakeLists.txt
+++ b/source/blender/functions/CMakeLists.txt
@@ -28,6 +28,7 @@ set(SRC
   intern/multi_functions/network.cc
   intern/multi_functions/particles.cc
   intern/multi_functions/surface_hook.cc
+  intern/multi_functions/vectorize.cc
   intern/inlined_tree_multi_function_network/builder.cc
   intern/inlined_tree_multi_function_network/generate.cc
   intern/inlined_tree_multi_function_network/mappings_nodes.cc
@@ -72,6 +73,7 @@ set(SRC
   intern/multi_functions/particles.h
   intern/multi_functions/surface_hook.h
   intern/multi_functions/util.h
+  intern/multi_functions/vectorize.h
   intern/inlined_tree_multi_function_network/builder.h
   intern/inlined_tree_multi_function_network/mappings.h
   intern/cpp_types.h
diff --git a/source/blender/functions/FN_multi_functions.h b/source/blender/functions/FN_multi_functions.h
index 1cfad25dafa..674205e91f8 100644
--- a/source/blender/functions/FN_multi_functions.h
+++ b/source/blender/functions/FN_multi_functions.h
@@ -7,5 +7,6 @@
 #include "intern/multi_functions/network.h"
 #include "intern/multi_functions/particles.h"
 #include "intern/multi_functions/surface_hook.h"
+#include "intern/multi_functions/vectorize.h"
 
 #endif /* __FN_MULTI_FUNCTIONS_H__ */
diff --git a/source/blender/functions/intern/multi_functions/mixed.cc b/source/blender/functions/intern/multi_functions/mixed.cc
index c658d9395af..f1b845d9eb8 100644
--- a/source/blender/functions/intern/multi_functions/mixed.cc
+++ b/source/blender/functions/intern/multi_functions/mixed.cc
@@ -327,122 +327,6 @@ void MF_TextLength::call(MFMask mask, MFParams params, MFContext UNUSED(context)
   }
 }
 
-MF_SimpleVectorize::MF_SimpleVectorize(const MultiFunction &function,
-                                       ArrayRef<bool> input_is_vectorized)
-    : m_function(function), m_input_is_vectorized(input_is_vectorized)
-{
-  BLI_assert(input_is_vectorized.contains(true));
-
-  MFSignatureBuilder signature(function.name() + " (Vectorized)");
-
-  bool found_output_param = false;
-  UNUSED_VARS_NDEBUG(found_output_param);
-  for (uint param_index : function.param_indices()) {
-    MFParamType param_type = function.param_type(param_index);
-    StringRef param_name = function.param_name(param_index);
-    switch (param_type.type()) {
-      case MFParamType::VectorInput:
-      case MFParamType::VectorOutput:
-      case MFParamType::MutableVector:
-      case MFParamType::MutableSingle: {
-        BLI_assert(false);
-        break;
-      }
-      case MFParamType::SingleInput: {
-        BLI_assert(!found_output_param);
-        if (input_is_vectorized[param_index]) {
-          signature.vector_input(param_name + " (List)",
-                                 param_type.data_type().single__cpp_type());
-          m_vectorized_inputs.append(param_index);
-        }
-        else {
-          signature.single_input(param_name, param_type.data_type().single__cpp_type());
-        }
-        break;
-      }
-      case MFParamType::SingleOutput: {
-        signature.vector_output(param_name + " (List)", param_type.data_type().single__cpp_type());
-        m_output_indices.append(param_index);
-        found_output_param = true;
-        break;
-      }
-    }
-  }
-  this->set_signature(signature);
-}
-
-void MF_SimpleVectorize::call(MFMask mask, MFParams params, MFContext context) const
-{
-  if (mask.indices_amount() == 0) {
-    return;
-  }
-  uint array_size = mask.min_array_size();
-
-  Vector<int> vectorization_lengths(array_size);
-  vectorization_lengths.fill_indices(mask.indices(), -1);
-
-  for (uint param_index : m_vectorized_inputs) {
-    GenericVirtualListListRef values = params.readonly_vector_input(param_index,
-                                                                    this->param_name(param_index));
-    for (uint i : mask.indices()) {
-      if (vectorization_lengths[i] != 0) {
-        vectorization_lengths[i] = std::max<int>(vectorization_lengths[i], values[i].size());
-      }
-    }
-  }
-
-  Vector<GenericVectorArray *> output_vector_arrays;
-  for (uint param_index : m_output_indices) {
-    GenericVectorArray *vector_array = &params.vector_output(param_index,
-                                                             this->param_name(param_index));
-    output_vector_arrays.append(vector_array);
-  }
-
-  for (uint index : mask.indices()) {
-    uint length = vectorization_lengths[index];
-    MFParamsBuilder params_builder(m_function, length);
-
-    for (uint param_index : m_function.param_indices()) {
-      MFParamType param_type = m_function.param_type(param_index);
-      switch (param_type.type()) {
-        case MFParamType::VectorInput:
-        case MFParamType::VectorOutput:
-        case MFParamType::MutableVector:
-        case MFParamType::MutableSingle: {
-          BLI_assert(false);
-          break;
-        }
-        case MFParamType::SingleInput: {
-          if (m_input_is_vectorized[param_index]) {
-            GenericVirtualListListRef input_list_list = params.readonly_vector_input(
-                param_index, this->param_name(param_index));
-            GenericVirtualListRef repeated_input = input_list_list.repeated_sublist(index, length);
-            params_builder.add_readonly_single_input(repeated_input);
-          }
-          else {
-            GenericVirtualListRef input_list = params.readonly_single_input(
-                param_index, this->param_name(param_index));
-            GenericVirtualListRef repeated_input = input_list.repeated_element(index, length);
-            params_builder.add_readonly_single_input(repeated_input);
-          }
-          break;
-        }
-        case MFParamType::SingleOutput: {
-          GenericVectorArray &output_array_list = params.vector_output(
-              param_index, this->param_name(param_index));
-          GenericMutableArrayRef output_array = output_array_list.allocate_single(index, length);
-          params_builder.add_single_output(output_array);
-          break;
-        }
-      }
-    }
-
-    /* TODO: Call with updated context. */
-    ArrayRef<uint> sub_mask_indices = IndexRange(length).as_array_ref();
-    m_function.call(sub_mask_indices, params_builder, context);
-  }
-}
-
 MF_ContextVertexPosition::MF_ContextVertexPosition()
 {
   MFSignatureBuilder signature("Vertex Position");
diff --git a/source/blender/functions/intern/multi_functions/mixed.h b/source/blender/functions/intern/multi_functions/mixed.h
index c2850231190..f53c54d5632 100644
--- a/source/blender/functions/intern/multi_functions/mixed.h
+++ b/source/blender/functions/intern/multi_functions/mixed.h
@@ -66,18 +66,6 @@ class MF_RandomFloat final : public MultiFunction {
   void call(MFMask mask, MFParams parms, MFContext context) const override;
 };
 
-class MF_SimpleVectorize final : public MultiFunction {
- private:
-  const MultiFunction &m_function;
-  Vector<bool> m_input_is_vectorized;
-  Vector<uint> m_vectorized_inputs;
-  Vector<uint> m_output_indices;
-
- public:
-  MF_SimpleVectorize(const MultiFunction &function, ArrayRef<bool> input_is_vectorized);
-  void call(MFMask mask, MFParams params, MFContext context) const override;
-};
-
 class MF_ContextVertexPosition final : public MultiFunction {
  public:
   MF_ContextVertexPosition();
diff --git a/source/blender/functions/intern/multi_functions/vectorize.cc b/source/blender/functions/intern/multi_functions/vectorize.cc
new file mode 100644
index 00000000000..128d628a622
--- /dev/null
+++ b/source/blender/functions/intern/multi_functions/vectorize.cc
@@ -0,0 +1,121 @@
+#include "vectorize.h"
+
+namespace FN {
+
+MF_SimpleVectorize::MF_SimpleVectorize(const MultiFunction &function,
+                                       ArrayRef<bool> input_is_vectorized)
+    : m_function(function), m_input_is_vectorized(input_is_vectorized)
+{
+  BLI_assert(input_is_vectorized.contains(true));
+
+  MFSignatureBuilder signature(function.name() + " (Vectorized)");
+
+  bool found_output_param = false;
+  UNUSED_VARS_NDEBUG(found_output_param);
+  for (uint param_index : function.param_indices()) {
+    MFParamType param_type = function.param_type(param_index);
+    StringRef param_name = function.param_name(param_index);
+    switch (param_type.type()) {
+      case MFParamType::VectorInput:
+      case MFParamType::VectorOutput:
+      case MFParamType::MutableVector:
+      case MFParamType::MutableSingle: {
+        BLI_assert(false);
+        break;
+      }
+      case MFParamType::SingleInput: {
+        BLI_assert(!found_output_param);
+        if (input_is_vectorized[param_index]) {
+          signature.vector_input(param_name + " (List)",
+                                 param_type.data_type().single__cpp_type());
+          m_vectorized_inputs.append(param_index);
+        }
+        else {
+          signature.single_input(param_name, param_type.data_type().single__cpp_type());
+        }
+        break;
+      }
+      case MFParamType::SingleOutput: {
+        signature.vector_output(param_name + " (List)", param_type.data_type().single__cpp_type());
+        m_output_indices.append(param_index);
+        found_output_param = true;
+        break;
+      }
+    }
+  }
+  this->set_signature(signature);
+}
+
+void MF_SimpleVectorize::call(MFMask mask, MFParams params, MFContext context) const
+{
+  if (mask.indices_amount() == 0) {
+    return;
+  }
+  uint array_size = mask.min_array_size();
+
+  Vector<int> vectorization_lengths(array_size);
+  vectorization_lengths.fill_indices(mask.indices(), -1);
+
+  for (uint param_index : m_vectorized_inputs) {
+    GenericVirtualListListRef values = params.readonly_vector_input(param_index,
+                                                                    this->param_name(param_index));
+    for (uint i : mask.indices()) {
+      if (vectorization_lengths[i] != 0) {
+        vectorization_lengths[i] = std::max<int>(vectorization_lengths[i], values[i].size());
+      }
+    }
+  }
+
+  Vector<GenericVectorArray *> output_vector_arrays;
+  for (uint param_index : m_output_indices) {
+    

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list