diff options
author | Jacques Lucke <jacques@blender.org> | 2020-07-16 17:29:05 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2020-07-16 17:43:42 +0300 |
commit | 76bf0508530fe05347269eac088a885a75967a30 (patch) | |
tree | fa3219877580df02810eef72c755cbad20517215 | |
parent | aa547ce88b9c4607e070f8b76341ae2076f28ec7 (diff) |
Particles: simplify adding new implicit conversions between sockets
-rw-r--r-- | source/blender/blenkernel/intern/node_tree_multi_function.cc | 65 |
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, |