[Bf-blender-cvs] [0cc550108a9] functions-experimental-refactor: new add vectors multi function

Jacques Lucke noreply at git.blender.org
Tue Oct 15 15:57:38 CEST 2019


Commit: 0cc550108a9669a64ae89b7522fa425e04e2c642
Author: Jacques Lucke
Date:   Tue Oct 15 12:32:05 2019 +0200
Branches: functions-experimental-refactor
https://developer.blender.org/rB0cc550108a9669a64ae89b7522fa425e04e2c642

new add vectors multi function

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

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 8a5f971184d..24a9578362a 100644
--- a/source/blender/blenkernel/BKE_multi_function.h
+++ b/source/blender/blenkernel/BKE_multi_function.h
@@ -282,15 +282,17 @@ class MultiFunction {
     Vector<GenericVectorArrayOrSingleRef> m_vector_array_or_single_refs;
     Vector<GenericVectorArray *> m_vector_arrays;
     const Signature *m_signature = nullptr;
+    uint m_min_array_size;
 
     Params m_params;
 
    public:
     ParamsBuilder() = default;
 
-    void start_new(const Signature &signature)
+    void start_new(const Signature &signature, uint min_array_size)
     {
       m_signature = &signature;
+      m_min_array_size = min_array_size;
 
       m_array_or_single_refs.clear();
       m_mutable_array_refs.clear();
@@ -300,11 +302,19 @@ class MultiFunction {
 
     template<typename T> void add_readonly_array_ref(ArrayRef<T> array)
     {
+      BLI_assert(array.size() >= m_min_array_size);
       m_array_or_single_refs.append(GenericArrayOrSingleRef::FromArray<T>(array));
     }
 
+    template<typename T> void add_readonly_single_ref(const T *value)
+    {
+      m_array_or_single_refs.append(
+          GenericArrayOrSingleRef::FromSingle(GET_TYPE<T>(), (void *)value, m_min_array_size));
+    }
+
     template<typename T> void add_mutable_array_ref(ArrayRef<T> array)
     {
+      BLI_assert(array.size() >= m_min_array_size);
       m_mutable_array_refs.append(GenericMutableArrayRef(array));
     }
 
diff --git a/source/blender/blenkernel/BKE_multi_functions.h b/source/blender/blenkernel/BKE_multi_functions.h
index 98334a727f9..bf61e8cb3e5 100644
--- a/source/blender/blenkernel/BKE_multi_functions.h
+++ b/source/blender/blenkernel/BKE_multi_functions.h
@@ -11,6 +11,12 @@ class MultiFunction_AddFloats final : public MultiFunction {
   void call(ArrayRef<uint> mask_indices, Params &params) const override;
 };
 
+class MultiFunction_AddFloat3s final : public MultiFunction {
+ public:
+  MultiFunction_AddFloat3s();
+  void call(ArrayRef<uint> mask_indices, Params &params) const override;
+};
+
 class MultiFunction_VectorDistance final : public MultiFunction {
  public:
   MultiFunction_VectorDistance();
diff --git a/source/blender/blenkernel/intern/multi_functions.cc b/source/blender/blenkernel/intern/multi_functions.cc
index 856cd533a83..82d5892f80a 100644
--- a/source/blender/blenkernel/intern/multi_functions.cc
+++ b/source/blender/blenkernel/intern/multi_functions.cc
@@ -32,6 +32,26 @@ void MultiFunction_AddFloats::call(ArrayRef<uint> mask_indices, Params &params)
   }
 }
 
+MultiFunction_AddFloat3s::MultiFunction_AddFloat3s()
+{
+  SignatureBuilder signature;
+  signature.readonly_single_input<float3>("A");
+  signature.readonly_single_input<float3>("B");
+  signature.single_output<float3>("Result");
+  this->set_signature(signature);
+}
+
+void MultiFunction_AddFloat3s::call(ArrayRef<uint> mask_indices, Params &params) const
+{
+  auto a = params.readonly_single_input<float3>(0, "A");
+  auto b = params.readonly_single_input<float3>(1, "B");
+  auto result = params.single_output<float3>(2, "Result");
+
+  for (uint i : mask_indices) {
+    result[i] = a[i] + b[i];
+  }
+}
+
 MultiFunction_VectorDistance::MultiFunction_VectorDistance()
 {
   SignatureBuilder signature;
@@ -185,4 +205,4 @@ void MultiFunction_CombineLists::call(ArrayRef<uint> mask_indices, Params &param
   }
 }
 
-}  // namespace BKE
\ No newline at end of file
+}  // namespace BKE
diff --git a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
index db8c50e3e01..9faea130606 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
+++ b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
@@ -3,11 +3,16 @@
 #include "BKE_virtual_node_tree_cxx.h"
 #include "BKE_multi_functions.h"
 
+#include "BLI_math_cxx.h"
+
 using BKE::VirtualLink;
 using BKE::VirtualNode;
 using BKE::VirtualNodeTree;
 using BKE::VirtualSocket;
 using BLI::ArrayRef;
+using BLI::float3;
+using BLI::IndexRange;
+using BLI::TemporaryVector;
 using BLI::Vector;
 
 extern "C" {
@@ -24,25 +29,17 @@ void MOD_functiondeform_do(FunctionDeformModifierData *fdmd, float (*vertexCos)[
   vtree.add_all_of_tree(fdmd->function_tree);
   vtree.freeze_and_index();
 
-  VirtualNode *output_node = vtree.nodes_with_idname("fn_FunctionOutputNode")[0];
-
-  for (uint i = 0; i < numVerts; i++) {
-    vertexCos[i][2] += 3;
-  }
-
-  BKE::MultiFunction_AddFloats function;
-
-  std::array<float, 4> values_a = {1, 2, 3, 4};
-  std::array<float, 4> values_b = {2, 6, 34, 1};
-  std::array<float, 4> result;
-
+  BKE::MultiFunction_AddFloat3s function;
   BKE::MultiFunction::ParamsBuilder params;
-  params.start_new(function.signature());
-  params.add_readonly_array_ref<float>(values_a);
-  params.add_readonly_array_ref<float>(values_b);
-  params.add_mutable_array_ref<float>(result);
+  params.start_new(function.signature(), numVerts);
+  params.add_readonly_array_ref(ArrayRef<float3>((float3 *)vertexCos, numVerts));
+  float3 offset = {fdmd->control1, 2, 0};
+  params.add_readonly_single_ref(&offset);
+
+  TemporaryVector<float3> output_vectors(numVerts);
+  params.add_mutable_array_ref<float3>(output_vectors);
 
-  function.call({0, 1, 2, 3}, params.build());
+  function.call(IndexRange(numVerts).as_array_ref(), params.build());
 
-  std::cout << result[0] << ", " << result[1] << ", " << result[2] << ", " << result[3] << "\n";
+  memcpy(vertexCos, output_vectors.begin(), output_vectors.size() * sizeof(float3));
 }



More information about the Bf-blender-cvs mailing list