[Bf-blender-cvs] [a080464e310] functions: extract function vectorizer to separate file
Jacques Lucke
noreply at git.blender.org
Wed Dec 11 15:28:09 CET 2019
Commit: a080464e310aecf5d0ca7294a1b3e9d0b4b1023d
Author: Jacques Lucke
Date: Wed Dec 11 15:03:19 2019 +0100
Branches: functions
https://developer.blender.org/rBa080464e310aecf5d0ca7294a1b3e9d0b4b1023d
extract function vectorizer to separate file
===================================================================
M source/blender/functions/CMakeLists.txt
M source/blender/functions/FN_multi_functions.h
M source/blender/functions/intern/multi_functions/mixed.cc
M source/blender/functions/intern/multi_functions/mixed.h
A source/blender/functions/intern/multi_functions/vectorize.cc
A source/blender/functions/intern/multi_functions/vectorize.h
===================================================================
diff --git a/source/blender/functions/CMakeLists.txt b/source/blender/functions/CMakeLists.txt
index fae3e2d9d28..f1e6f2a3d79 100644
--- a/source/blender/functions/CMakeLists.txt
+++ b/source/blender/functions/CMakeLists.txt
@@ -28,6 +28,7 @@ set(SRC
intern/multi_functions/network.cc
intern/multi_functions/particles.cc
intern/multi_functions/surface_hook.cc
+ intern/multi_functions/vectorize.cc
intern/inlined_tree_multi_function_network/builder.cc
intern/inlined_tree_multi_function_network/generate.cc
intern/inlined_tree_multi_function_network/mappings_nodes.cc
@@ -72,6 +73,7 @@ set(SRC
intern/multi_functions/particles.h
intern/multi_functions/surface_hook.h
intern/multi_functions/util.h
+ intern/multi_functions/vectorize.h
intern/inlined_tree_multi_function_network/builder.h
intern/inlined_tree_multi_function_network/mappings.h
intern/cpp_types.h
diff --git a/source/blender/functions/FN_multi_functions.h b/source/blender/functions/FN_multi_functions.h
index 1cfad25dafa..674205e91f8 100644
--- a/source/blender/functions/FN_multi_functions.h
+++ b/source/blender/functions/FN_multi_functions.h
@@ -7,5 +7,6 @@
#include "intern/multi_functions/network.h"
#include "intern/multi_functions/particles.h"
#include "intern/multi_functions/surface_hook.h"
+#include "intern/multi_functions/vectorize.h"
#endif /* __FN_MULTI_FUNCTIONS_H__ */
diff --git a/source/blender/functions/intern/multi_functions/mixed.cc b/source/blender/functions/intern/multi_functions/mixed.cc
index c658d9395af..f1b845d9eb8 100644
--- a/source/blender/functions/intern/multi_functions/mixed.cc
+++ b/source/blender/functions/intern/multi_functions/mixed.cc
@@ -327,122 +327,6 @@ void MF_TextLength::call(MFMask mask, MFParams params, MFContext UNUSED(context)
}
}
-MF_SimpleVectorize::MF_SimpleVectorize(const MultiFunction &function,
- ArrayRef<bool> input_is_vectorized)
- : m_function(function), m_input_is_vectorized(input_is_vectorized)
-{
- BLI_assert(input_is_vectorized.contains(true));
-
- MFSignatureBuilder signature(function.name() + " (Vectorized)");
-
- bool found_output_param = false;
- UNUSED_VARS_NDEBUG(found_output_param);
- for (uint param_index : function.param_indices()) {
- MFParamType param_type = function.param_type(param_index);
- StringRef param_name = function.param_name(param_index);
- switch (param_type.type()) {
- case MFParamType::VectorInput:
- case MFParamType::VectorOutput:
- case MFParamType::MutableVector:
- case MFParamType::MutableSingle: {
- BLI_assert(false);
- break;
- }
- case MFParamType::SingleInput: {
- BLI_assert(!found_output_param);
- if (input_is_vectorized[param_index]) {
- signature.vector_input(param_name + " (List)",
- param_type.data_type().single__cpp_type());
- m_vectorized_inputs.append(param_index);
- }
- else {
- signature.single_input(param_name, param_type.data_type().single__cpp_type());
- }
- break;
- }
- case MFParamType::SingleOutput: {
- signature.vector_output(param_name + " (List)", param_type.data_type().single__cpp_type());
- m_output_indices.append(param_index);
- found_output_param = true;
- break;
- }
- }
- }
- this->set_signature(signature);
-}
-
-void MF_SimpleVectorize::call(MFMask mask, MFParams params, MFContext context) const
-{
- 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);
-
- for (uint param_index : m_vectorized_inputs) {
- GenericVirtualListListRef values = params.readonly_vector_input(param_index,
- this->param_name(param_index));
- for (uint i : mask.indices()) {
- if (vectorization_lengths[i] != 0) {
- vectorization_lengths[i] = std::max<int>(vectorization_lengths[i], values[i].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);
- }
-
- for (uint index : mask.indices()) {
- uint length = vectorization_lengths[index];
- MFParamsBuilder params_builder(m_function, length);
-
- for (uint param_index : m_function.param_indices()) {
- MFParamType param_type = m_function.param_type(param_index);
- switch (param_type.type()) {
- case MFParamType::VectorInput:
- case MFParamType::VectorOutput:
- case MFParamType::MutableVector:
- case MFParamType::MutableSingle: {
- BLI_assert(false);
- break;
- }
- case MFParamType::SingleInput: {
- if (m_input_is_vectorized[param_index]) {
- GenericVirtualListListRef input_list_list = params.readonly_vector_input(
- param_index, this->param_name(param_index));
- GenericVirtualListRef repeated_input = input_list_list.repeated_sublist(index, length);
- params_builder.add_readonly_single_input(repeated_input);
- }
- else {
- GenericVirtualListRef input_list = params.readonly_single_input(
- param_index, this->param_name(param_index));
- GenericVirtualListRef repeated_input = input_list.repeated_element(index, length);
- params_builder.add_readonly_single_input(repeated_input);
- }
- break;
- }
- case MFParamType::SingleOutput: {
- GenericVectorArray &output_array_list = params.vector_output(
- param_index, this->param_name(param_index));
- GenericMutableArrayRef output_array = output_array_list.allocate_single(index, length);
- params_builder.add_single_output(output_array);
- break;
- }
- }
- }
-
- /* TODO: Call with updated context. */
- ArrayRef<uint> sub_mask_indices = IndexRange(length).as_array_ref();
- m_function.call(sub_mask_indices, params_builder, context);
- }
-}
-
MF_ContextVertexPosition::MF_ContextVertexPosition()
{
MFSignatureBuilder signature("Vertex Position");
diff --git a/source/blender/functions/intern/multi_functions/mixed.h b/source/blender/functions/intern/multi_functions/mixed.h
index c2850231190..f53c54d5632 100644
--- a/source/blender/functions/intern/multi_functions/mixed.h
+++ b/source/blender/functions/intern/multi_functions/mixed.h
@@ -66,18 +66,6 @@ class MF_RandomFloat final : public MultiFunction {
void call(MFMask mask, MFParams parms, MFContext context) const override;
};
-class MF_SimpleVectorize final : public MultiFunction {
- private:
- const MultiFunction &m_function;
- Vector<bool> m_input_is_vectorized;
- Vector<uint> m_vectorized_inputs;
- Vector<uint> m_output_indices;
-
- public:
- MF_SimpleVectorize(const MultiFunction &function, ArrayRef<bool> input_is_vectorized);
- void call(MFMask mask, MFParams params, MFContext context) const override;
-};
-
class MF_ContextVertexPosition final : public MultiFunction {
public:
MF_ContextVertexPosition();
diff --git a/source/blender/functions/intern/multi_functions/vectorize.cc b/source/blender/functions/intern/multi_functions/vectorize.cc
new file mode 100644
index 00000000000..128d628a622
--- /dev/null
+++ b/source/blender/functions/intern/multi_functions/vectorize.cc
@@ -0,0 +1,121 @@
+#include "vectorize.h"
+
+namespace FN {
+
+MF_SimpleVectorize::MF_SimpleVectorize(const MultiFunction &function,
+ ArrayRef<bool> input_is_vectorized)
+ : m_function(function), m_input_is_vectorized(input_is_vectorized)
+{
+ BLI_assert(input_is_vectorized.contains(true));
+
+ MFSignatureBuilder signature(function.name() + " (Vectorized)");
+
+ bool found_output_param = false;
+ UNUSED_VARS_NDEBUG(found_output_param);
+ for (uint param_index : function.param_indices()) {
+ MFParamType param_type = function.param_type(param_index);
+ StringRef param_name = function.param_name(param_index);
+ switch (param_type.type()) {
+ case MFParamType::VectorInput:
+ case MFParamType::VectorOutput:
+ case MFParamType::MutableVector:
+ case MFParamType::MutableSingle: {
+ BLI_assert(false);
+ break;
+ }
+ case MFParamType::SingleInput: {
+ BLI_assert(!found_output_param);
+ if (input_is_vectorized[param_index]) {
+ signature.vector_input(param_name + " (List)",
+ param_type.data_type().single__cpp_type());
+ m_vectorized_inputs.append(param_index);
+ }
+ else {
+ signature.single_input(param_name, param_type.data_type().single__cpp_type());
+ }
+ break;
+ }
+ case MFParamType::SingleOutput: {
+ signature.vector_output(param_name + " (List)", param_type.data_type().single__cpp_type());
+ m_output_indices.append(param_index);
+ found_output_param = true;
+ break;
+ }
+ }
+ }
+ this->set_signature(signature);
+}
+
+void MF_SimpleVectorize::call(MFMask mask, MFParams params, MFContext context) const
+{
+ 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);
+
+ for (uint param_index : m_vectorized_inputs) {
+ GenericVirtualListListRef values = params.readonly_vector_input(param_index,
+ this->param_name(param_index));
+ for (uint i : mask.indices()) {
+ if (vectorization_lengths[i] != 0) {
+ vectorization_lengths[i] = std::max<int>(vectorization_lengths[i], values[i].size());
+ }
+ }
+ }
+
+ Vector<GenericVectorArray *> output_vector_arrays;
+ for (uint param_index : m_output_indices) {
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list