[Bf-blender-cvs] [76bf0508530] master: Particles: simplify adding new implicit conversions between sockets

Jacques Lucke noreply at git.blender.org
Thu Jul 16 16:43:51 CEST 2020


Commit: 76bf0508530fe05347269eac088a885a75967a30
Author: Jacques Lucke
Date:   Thu Jul 16 16:29:05 2020 +0200
Branches: master
https://developer.blender.org/rB76bf0508530fe05347269eac088a885a75967a30

Particles: simplify adding new implicit conversions between sockets

===================================================================

M	source/blender/blenkernel/intern/node_tree_multi_function.cc

===================================================================

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,



More information about the Bf-blender-cvs mailing list