[Bf-blender-cvs] [d0dd083cbb2] functions-experimental-refactor: multi function with constant output

Jacques Lucke noreply at git.blender.org
Fri Oct 18 15:08:43 CEST 2019


Commit: d0dd083cbb2d79335772a087047cf9f19ae2affe
Author: Jacques Lucke
Date:   Fri Oct 18 15:08:20 2019 +0200
Branches: functions-experimental-refactor
https://developer.blender.org/rBd0dd083cbb2d79335772a087047cf9f19ae2affe

multi function with constant output

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

M	source/blender/blenkernel/BKE_multi_functions.h
M	source/blender/blenlib/BLI_array_ref.h
M	source/blender/modifiers/intern/MOD_functiondeform_cxx.cc

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

diff --git a/source/blender/blenkernel/BKE_multi_functions.h b/source/blender/blenkernel/BKE_multi_functions.h
index 102143e1d38..3c5567e4631 100644
--- a/source/blender/blenkernel/BKE_multi_functions.h
+++ b/source/blender/blenkernel/BKE_multi_functions.h
@@ -83,6 +83,28 @@ class MultiFunction_CombineLists final : public MultiFunction {
   void call(ArrayRef<uint> mask_indices, Params &params, Context &context) const override;
 };
 
+template<typename T> class MultiFunction_ConstantValue : public MultiFunction {
+ private:
+  T m_value;
+
+ public:
+  MultiFunction_ConstantValue(T value) : m_value(std::move(value))
+  {
+    SignatureBuilder signature;
+    signature.single_output<T>("Output");
+    this->set_signature(signature);
+  }
+
+  void call(ArrayRef<uint> mask_indices, Params &params, Context &UNUSED(context)) const override
+  {
+    MutableArrayRef<T> output = params.single_output<T>(0, "Output");
+
+    for (uint i : mask_indices) {
+      new (output.begin() + i) T(m_value);
+    }
+  }
+};
+
 };  // namespace BKE
 
 #endif /* __BKE_MULTI_FUNCTIONS_H__ */
diff --git a/source/blender/blenlib/BLI_array_ref.h b/source/blender/blenlib/BLI_array_ref.h
index 9159e0c8275..29e523875a0 100644
--- a/source/blender/blenlib/BLI_array_ref.h
+++ b/source/blender/blenlib/BLI_array_ref.h
@@ -256,7 +256,7 @@ template<typename T> class ArrayRef {
      * changed. */
     BLI_assert(m_size < 1000);
 
-    for (uint i = 0; i < m_size - 1; i++) {
+    for (uint i = 0; i < m_size; i++) {
       const T &value = m_start[i];
       for (uint j = i + 1; j < m_size; j++) {
         if (value == m_start[j]) {
diff --git a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
index ff99f255aed..5dfe5bdbe05 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
+++ b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
@@ -214,11 +214,15 @@ void MOD_functiondeform_do(FunctionDeformModifierData *fdmd, float (*vertexCos)[
   BKE::MultiFunction_AddFloat3s add_function;
   auto &add_node = network_builder->add_function(add_function, {0, 1}, {2});
 
+  BKE::MultiFunction_ConstantValue<float3> vector_value{
+      {fdmd->control1, fdmd->control1, fdmd->control1}};
+  auto &value_node = network_builder->add_function(vector_value, {}, {0});
+
   uint input_node_id = input_node.id();
   uint output_node_id = output_node.id();
 
   network_builder->add_link(*input_node.outputs()[0], *add_node.inputs()[0]);
-  network_builder->add_link(*input_node.outputs()[0], *add_node.inputs()[1]);
+  network_builder->add_link(*value_node.outputs()[0], *add_node.inputs()[1]);
   network_builder->add_link(*add_node.outputs()[0], *output_node.inputs()[0]);
 
   BKE::MultiFunctionNetwork::Network network(std::move(network_builder));



More information about the Bf-blender-cvs mailing list