[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 ¶ms) const override;
};
+class MultiFunction_AddFloat3s final : public MultiFunction {
+ public:
+ MultiFunction_AddFloat3s();
+ void call(ArrayRef<uint> mask_indices, Params ¶ms) 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 ¶ms)
}
}
+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 ¶ms) 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 ¶m
}
}
-} // 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