Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacques Lucke <jacques@blender.org>2020-07-16 17:29:05 +0300
committerJacques Lucke <jacques@blender.org>2020-07-16 17:43:42 +0300
commit76bf0508530fe05347269eac088a885a75967a30 (patch)
treefa3219877580df02810eef72c755cbad20517215
parentaa547ce88b9c4607e070f8b76341ae2076f28ec7 (diff)
Particles: simplify adding new implicit conversions between sockets
-rw-r--r--source/blender/blenkernel/intern/node_tree_multi_function.cc65
1 files changed, 35 insertions, 30 deletions
diff --git a/source/blender/blenkernel/intern/node_tree_multi_function.cc b/source/blender/blenkernel/intern/node_tree_multi_function.cc
index 942f8e9a87a..b4df44eec85 100644
--- a/source/blender/blenkernel/intern/node_tree_multi_function.cc
+++ b/source/blender/blenkernel/intern/node_tree_multi_function.cc
@@ -185,38 +185,43 @@ static fn::MFOutputSocket *try_find_origin(CommonMFNetworkBuilderData &common,
}
}
-static const fn::MultiFunction *try_get_conversion_function(fn::MFDataType from, fn::MFDataType to)
+using ImplicitConversionsMap =
+ Map<std::pair<fn::MFDataType, fn::MFDataType>, const fn::MultiFunction *>;
+
+template<typename From, typename To>
+static void add_implicit_conversion(ImplicitConversionsMap &map)
{
- if (from == fn::MFDataType::ForSingle<float>()) {
- if (to == fn::MFDataType::ForSingle<int32_t>()) {
- static fn::CustomMF_Convert<float, int32_t> function;
- return &function;
- }
- if (to == fn::MFDataType::ForSingle<float3>()) {
- static fn::CustomMF_Convert<float, float3> function;
- return &function;
- }
- }
- if (from == fn::MFDataType::ForSingle<float3>()) {
- if (to == fn::MFDataType::ForSingle<float>()) {
- static fn::CustomMF_SI_SO<float3, float> function{"Vector Length",
- [](float3 a) { return a.length(); }};
- return &function;
- }
- }
- if (from == fn::MFDataType::ForSingle<int32_t>()) {
- if (to == fn::MFDataType::ForSingle<float>()) {
- static fn::CustomMF_Convert<int32_t, float> function;
- return &function;
- }
- if (to == fn::MFDataType::ForSingle<float3>()) {
- static fn::CustomMF_SI_SO<int32_t, float3> function{
- "int32 to float3", [](int32_t a) { return float3((float)a); }};
- return &function;
- }
- }
+ static fn::CustomMF_Convert<From, To> function;
+ map.add({fn::MFDataType::ForSingle<From>(), fn::MFDataType::ForSingle<To>()}, &function);
+}
- return nullptr;
+template<typename From, typename To, typename ConversionF>
+static void add_implicit_conversion(ImplicitConversionsMap &map,
+ StringRef name,
+ ConversionF conversion)
+{
+ static fn::CustomMF_SI_SO<From, To> function{name, conversion};
+ map.add({fn::MFDataType::ForSingle<From>(), fn::MFDataType::ForSingle<To>()}, &function);
+}
+
+static ImplicitConversionsMap get_implicit_conversions()
+{
+ ImplicitConversionsMap conversions;
+ add_implicit_conversion<float, int32_t>(conversions);
+ add_implicit_conversion<float, float3>(conversions);
+ add_implicit_conversion<int32_t, float>(conversions);
+ add_implicit_conversion<float3, float>(
+ conversions, "Vector Length", [](float3 a) { return a.length(); });
+ add_implicit_conversion<int32_t, float3>(
+ conversions, "int32 to float3", [](int32_t a) { return float3((float)a); });
+ return conversions;
+}
+
+static const fn::MultiFunction *try_get_conversion_function(fn::MFDataType from, fn::MFDataType to)
+{
+ static const ImplicitConversionsMap conversions = get_implicit_conversions();
+ const fn::MultiFunction *function = conversions.lookup_default({from, to}, nullptr);
+ return function;
}
static fn::MFOutputSocket &insert_default_value_for_type(CommonMFNetworkBuilderData &common,