[Bf-blender-cvs] [0627a6b2d59] functions-experimental-refactor: cleanup
Jacques Lucke
noreply at git.blender.org
Tue Oct 15 15:56:38 CEST 2019
Commit: 0627a6b2d59714cf29c1c8fa2528a733a40ff7e0
Author: Jacques Lucke
Date: Thu Oct 10 09:23:58 2019 +0200
Branches: functions-experimental-refactor
https://developer.blender.org/rB0627a6b2d59714cf29c1c8fa2528a733a40ff7e0
cleanup
===================================================================
M source/blender/blenkernel/BKE_node_functions.h
M source/blender/blenkernel/intern/node_functions.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_node_functions.h b/source/blender/blenkernel/BKE_node_functions.h
index 41bfd713e0f..4b57f3a94ae 100644
--- a/source/blender/blenkernel/BKE_node_functions.h
+++ b/source/blender/blenkernel/BKE_node_functions.h
@@ -8,17 +8,6 @@
namespace BKE {
-using BLI::Optional;
-
-struct FunctionForNode {
- CPPFunction *function;
- bool is_newly_allocated;
-};
-
-Optional<FunctionForNode> get_vnode_array_function(VirtualNode *vnode);
-
-void init_vnode_array_functions();
-
}; // namespace BKE
#endif /* __BKE_NODE_FUNCTIONS_H__ */
diff --git a/source/blender/blenkernel/intern/node_functions.cc b/source/blender/blenkernel/intern/node_functions.cc
index d79d894ebd7..3a22b52633b 100644
--- a/source/blender/blenkernel/intern/node_functions.cc
+++ b/source/blender/blenkernel/intern/node_functions.cc
@@ -4,31 +4,72 @@
#include "BLI_math_cxx.h"
#include "BLI_lazy_init_cxx.h"
#include "BLI_string_map.h"
+#include "BLI_array_or_single_ref.h"
namespace BKE {
+using BLI::ArrayOrSingleRef;
using BLI::float3;
-using BLI::StringMap;
-using CreateFunctionCB = std::unique_ptr<CPPFunction> (*)(VirtualNode *vnode);
-BLI_LAZY_INIT_STATIC_VAR(StringMap<std::unique_ptr<CPPFunction>>, get_cached_functions)
-BLI_LAZY_INIT_STATIC_VAR(StringMap<CreateFunctionCB>, get_function_builders)
+class MultiFunction {
+ private:
+ Vector<CPPType *> m_single_input_types;
+ Vector<CPPType *> m_single_output_types;
+ Vector<std::string> m_single_input_names;
+ Vector<std::string> m_single_output_names;
-class ArrayRefFunction_AddFloats : public CPPFunction {
- void signature(SignatureBuilderCPP &signature) override
+ public:
+ class Signature {
+ private:
+ MultiFunction &m_function;
+
+ Signature(MultiFunction &function) : m_function(function)
+ {
+ }
+
+ friend MultiFunction;
+
+ public:
+ template<typename T> void single_input(StringRef name)
+ {
+ m_function.m_single_input_names.append(name);
+ m_function.m_single_input_types.append(&GET_TYPE<T>());
+ }
+
+ template<typename T> void single_output(StringRef name)
+ {
+ m_function.m_single_output_names.append(name);
+ m_function.m_single_output_types.append(&GET_TYPE<T>());
+ }
+ };
+
+ class Inputs {
+ public:
+ template<typename T> ArrayOrSingleRef<T> get(uint index, StringRef name);
+ };
+
+ class Outputs {
+ public:
+ template<typename T> MutableArrayRef<T> get(uint index, StringRef name);
+ };
+
+ virtual void signature(Signature &signature) const = 0;
+ virtual void call(ArrayRef<uint> indices, Inputs &inputs, Outputs &outputs) const = 0;
+};
+
+class MultiFunction_AddFloats : public MultiFunction {
+ void signature(Signature &signature) const override
{
- signature.add_input("Indices", GET_TYPE_array_ref<uint>());
- signature.add_input("A", GET_TYPE_array_ref<float>());
- signature.add_input("B", GET_TYPE_array_ref<float>());
- signature.add_input("Result", GET_TYPE_mutable_array_ref<float>());
+ signature.single_input<float>("A");
+ signature.single_input<float>("B");
+ signature.single_output<float>("Result");
}
- void call(TupleRef &fn_in, TupleRef &UNUSED(fn_out)) const override
+ void call(ArrayRef<uint> indices, Inputs &inputs, Outputs &outputs) const override
{
- auto indices = fn_in.get<GenericArrayRef>(0).get_ref<uint>();
- auto a = fn_in.get<GenericArrayRef>(1).get_ref<float>();
- auto b = fn_in.get<GenericArrayRef>(2).get_ref<float>();
- auto result = fn_in.get<GenericMutableArrayRef>(3).get_ref<float>();
+ auto a = inputs.get<float>(0, "A");
+ auto b = inputs.get<float>(1, "B");
+ auto result = outputs.get<float>(0, "Result");
for (uint i : indices) {
result[i] = a[i] + b[i];
@@ -36,44 +77,24 @@ class ArrayRefFunction_AddFloats : public CPPFunction {
}
};
-class ArrayRefFunction_VectorDistance : public CPPFunction {
- void signature(SignatureBuilderCPP &signature) override
+class MultiFunction_VectorDistance : public MultiFunction {
+ void signature(Signature &signature) const override
{
- signature.add_input("Indices", GET_TYPE_array_ref<uint>());
- signature.add_input("A", GET_TYPE_array_ref<float3>());
- signature.add_input("B", GET_TYPE_array_ref<float3>());
- signature.add_input("Result", GET_TYPE_mutable_array_ref<float>());
+ signature.single_input<float3>("A");
+ signature.single_input<float3>("A");
+ signature.single_output<float>("Distances");
}
- void call(TupleRef &fn_in, TupleRef &UNUSED(fn_out)) const override
+ void call(ArrayRef<uint> indices, Inputs &inputs, Outputs &outputs) const override
{
- auto indices = fn_in.get<GenericArrayRef>(0).get_ref<uint>();
- auto a = fn_in.get<GenericArrayRef>(1).get_ref<float3>();
- auto b = fn_in.get<GenericArrayRef>(2).get_ref<float3>();
- auto result = fn_in.get<GenericMutableArrayRef>(3).get_ref<float>();
+ auto a = inputs.get<float3>(0, "A");
+ auto b = inputs.get<float3>(1, "B");
+ auto distances = outputs.get<float>(0, "Distances");
for (uint i : indices) {
- result[i] = float3::distance(a[i], b[i]);
+ distances[i] = float3::distance(a[i], b[i]);
}
}
};
-void init_vnode_array_functions()
-{
- auto &cached_functions = get_cached_functions();
- auto &callbacks = get_function_builders();
-}
-
-Optional<FunctionForNode> get_vnode_array_function(VirtualNode *vnode)
-{
- {
- auto &cached_functions = get_cached_functions();
- std::unique_ptr<CPPFunction> *function = cached_functions.lookup_ptr(vnode->idname());
- if (function != nullptr) {
- return FunctionForNode{(*function).get(), false};
- }
- }
- return {};
-}
-
} // namespace BKE
\ No newline at end of file
More information about the Bf-blender-cvs
mailing list