diff options
author | Jacques Lucke <mail@jlucke.com> | 2019-12-11 17:20:21 +0300 |
---|---|---|
committer | Jacques Lucke <mail@jlucke.com> | 2019-12-11 17:20:21 +0300 |
commit | 3a1aec54a7d41d2569d65d9fe8baf825696a3095 (patch) | |
tree | 5ff1d02c299625442442ef448567f7de368c6ec0 /source | |
parent | 2a25a0bd60f9de25868bc0fdc797fdbd7708a131 (diff) |
cleanup
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/functions/FN_generic_virtual_list_list_ref.h | 13 | ||||
-rw-r--r-- | source/blender/functions/intern/multi_functions/vectorize.cc | 37 |
2 files changed, 34 insertions, 16 deletions
diff --git a/source/blender/functions/FN_generic_virtual_list_list_ref.h b/source/blender/functions/FN_generic_virtual_list_list_ref.h index 358b40ed780..a5dd0433bf4 100644 --- a/source/blender/functions/FN_generic_virtual_list_list_ref.h +++ b/source/blender/functions/FN_generic_virtual_list_list_ref.h @@ -76,6 +76,19 @@ class GenericVirtualListListRef { return m_virtual_list_size; } + uint sublist_size(uint index) const + { + BLI_assert(index < m_virtual_list_size); + switch (m_category) { + case Category::SingleArray: + return m_data.single_array.real_array_size; + case Category::FullArrayList: + return m_data.full_array_list.real_array_sizes[index]; + } + BLI_assert(false); + return 0; + } + const CPPType &type() const { return *m_type; diff --git a/source/blender/functions/intern/multi_functions/vectorize.cc b/source/blender/functions/intern/multi_functions/vectorize.cc index 1a8f107b47e..9aba5a0f66a 100644 --- a/source/blender/functions/intern/multi_functions/vectorize.cc +++ b/source/blender/functions/intern/multi_functions/vectorize.cc @@ -1,7 +1,11 @@ #include "vectorize.h" +#include "BLI_array_cxx.h" + namespace FN { +using BLI::Array; + MF_SimpleVectorize::MF_SimpleVectorize(const MultiFunction &function, ArrayRef<bool> input_is_vectorized) : m_function(function), m_input_is_vectorized(input_is_vectorized) @@ -48,32 +52,33 @@ MF_SimpleVectorize::MF_SimpleVectorize(const MultiFunction &function, this->set_signature(signature); } -void MF_SimpleVectorize::call(MFMask mask, MFParams params, MFContext context) const +static void get_vectorization_lengths(MFMask mask, + MFParams params, + ArrayRef<uint> vectorized_param_indices, + MutableArrayRef<int> r_lengths) { - 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); + r_lengths.fill_indices(mask.indices(), -1); - for (uint param_index : m_vectorized_inputs) { + for (uint param_index : vectorized_param_indices) { GenericVirtualListListRef values = params.readonly_vector_input(param_index); for (uint i : mask.indices()) { - if (vectorization_lengths[i] != 0) { - vectorization_lengths[i] = std::max<int>(vectorization_lengths[i], values[i].size()); + if (r_lengths[i] != 0) { + uint sublist_size = values.sublist_size(i); + r_lengths[i] = std::max<int>(r_lengths[i], sublist_size); } } } +} - Vector<GenericVectorArray *> output_vector_arrays; - for (uint param_index : m_output_indices) { - GenericVectorArray *vector_array = ¶ms.vector_output(param_index, - this->param_name(param_index)); - output_vector_arrays.append(vector_array); +void MF_SimpleVectorize::call(MFMask mask, MFParams params, MFContext context) const +{ + if (mask.indices_amount() == 0) { + return; } + Array<int> vectorization_lengths(mask.min_array_size()); + get_vectorization_lengths(mask, params, m_vectorized_inputs, vectorization_lengths); + for (uint index : mask.indices()) { uint length = vectorization_lengths[index]; MFParamsBuilder params_builder(m_function, length); |