[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 ¶ms, 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 ¶ms, 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