[Bf-blender-cvs] [db0ee0fe367] functions-experimental-refactor: further improve MultiFunction API
Jacques Lucke
noreply at git.blender.org
Thu Oct 31 14:13:02 CET 2019
Commit: db0ee0fe367269e0970aceccae281026ca606711
Author: Jacques Lucke
Date: Thu Oct 31 13:51:05 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rBdb0ee0fe367269e0970aceccae281026ca606711
further improve MultiFunction API
===================================================================
M source/blender/blenkernel/BKE_multi_function.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 fd07e74a44b..42b38594928 100644
--- a/source/blender/blenkernel/BKE_multi_function.h
+++ b/source/blender/blenkernel/BKE_multi_function.h
@@ -471,6 +471,40 @@ class MFParams {
const MFSignature *m_signature = nullptr;
};
+class MultiFunction {
+ public:
+ virtual ~MultiFunction()
+ {
+ }
+ virtual void call(ArrayRef<uint> mask_indices, MFParams ¶ms, MFContext &context) const = 0;
+
+ IndexRange param_indices() const
+ {
+ return IndexRange(m_signature.m_param_types.size());
+ }
+
+ MFParamType param_type(uint index) const
+ {
+ return m_signature.m_param_types[index];
+ }
+
+ StringRefNull param_name(uint index) const
+ {
+ return m_signature.m_param_names[index];
+ }
+
+ protected:
+ void set_signature(MFSignatureBuilder &signature_builder)
+ {
+ m_signature = signature_builder.build();
+ }
+
+ private:
+ MFSignature m_signature;
+
+ friend class MFParamsBuilder;
+};
+
class MFParamsBuilder {
private:
Vector<GenericVirtualListRef> m_virtual_list_refs;
@@ -483,17 +517,9 @@ class MFParamsBuilder {
MFParams m_params;
public:
- MFParamsBuilder() = default;
-
- void start_new(const MFSignature &signature, uint min_array_size)
+ MFParamsBuilder(const MultiFunction &function, uint min_array_size)
+ : m_signature(&function.m_signature), m_min_array_size(min_array_size)
{
- m_signature = &signature;
- m_min_array_size = min_array_size;
-
- m_virtual_list_refs.clear();
- m_mutable_array_refs.clear();
- m_virtual_list_list_refs.clear();
- m_vector_arrays.clear();
}
template<typename T> void add_readonly_single_input(ArrayRef<T> array)
@@ -556,43 +582,6 @@ class MFParamsBuilder {
}
};
-class MultiFunction {
- public:
- virtual ~MultiFunction()
- {
- }
- virtual void call(ArrayRef<uint> mask_indices, MFParams ¶ms, MFContext &context) const = 0;
-
- const MFSignature &signature() const
- {
- return m_signature;
- }
-
- IndexRange param_indices() const
- {
- return IndexRange(m_signature.m_param_types.size());
- }
-
- MFParamType param_type(uint index) const
- {
- return m_signature.m_param_types[index];
- }
-
- StringRefNull param_name(uint index) const
- {
- return m_signature.m_param_names[index];
- }
-
- protected:
- void set_signature(MFSignatureBuilder &signature_builder)
- {
- m_signature = signature_builder.build();
- }
-
- private:
- MFSignature m_signature;
-};
-
}; // namespace BKE
#endif /* __BKE_MULTI_FUNCTION_H__ */
diff --git a/source/blender/blenkernel/intern/multi_functions.cc b/source/blender/blenkernel/intern/multi_functions.cc
index 6dbb2c64825..2afd1ee50fd 100644
--- a/source/blender/blenkernel/intern/multi_functions.cc
+++ b/source/blender/blenkernel/intern/multi_functions.cc
@@ -382,8 +382,7 @@ void MultiFunction_SimpleVectorize::call(ArrayRef<uint> mask_indices,
for (uint index : mask_indices) {
uint length = vectorization_lengths[index];
- MFParamsBuilder params_builder;
- params_builder.start_new(m_function.signature(), length);
+ MFParamsBuilder params_builder(m_function, length);
for (uint param_index : m_function.param_indices()) {
MFParamType param_type = m_function.param_type(param_index);
diff --git a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
index 1e620c8c998..408f0dd6c87 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
+++ b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
@@ -1011,14 +1011,14 @@ class MultiFunction_FunctionTree : public BKE::MultiFunction {
{
uint array_size = mask_indices.last() + 1;
- MFParamsBuilder params_builder;
- params_builder.start_new(function_node.function().signature(), array_size);
+ const MultiFunction &function = function_node.function();
+ MFParamsBuilder params_builder(function, array_size);
Vector<std::pair<const MFOutputSocket *, GenericMutableArrayRef>> single_outputs_to_forward;
Vector<std::pair<const MFOutputSocket *, GenericVectorArray *>> vector_outputs_to_forward;
- for (uint param_index : function_node.function().param_indices()) {
- MFParamType param_type = function_node.function().param_type(param_index);
+ for (uint param_index : function.param_indices()) {
+ MFParamType param_type = function.param_type(param_index);
switch (param_type.category()) {
case MFParamType::None: {
BLI_assert(false);
@@ -1072,7 +1072,6 @@ class MultiFunction_FunctionTree : public BKE::MultiFunction {
}
MFParams ¶ms = params_builder.build();
- const MultiFunction &function = function_node.function();
function.call(mask_indices, params, global_context);
for (auto single_forward_info : single_outputs_to_forward) {
@@ -1198,8 +1197,7 @@ void MOD_functiondeform_do(FunctionDeformModifierData *fdmd, float (*vertexCos)[
MultiFunction_FunctionTree function{function_inputs, function_outputs};
- MFParamsBuilder params;
- params.start_new(function.signature(), numVerts);
+ MFParamsBuilder params(function, numVerts);
params.add_readonly_single_input(ArrayRef<float3>((float3 *)vertexCos, numVerts));
params.add_readonly_single_input(&fdmd->control1);
params.add_readonly_single_input(&fdmd->control2);
More information about the Bf-blender-cvs
mailing list