[Bf-blender-cvs] [53d345a8975] functions-experimental-refactor: add missing implicit conversions

Jacques Lucke noreply at git.blender.org
Thu Oct 31 14:12:55 CET 2019


Commit: 53d345a89758fbb1c6d5432d4d8fd4e6331497e3
Author: Jacques Lucke
Date:   Thu Oct 31 13:15:33 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rB53d345a89758fbb1c6d5432d4d8fd4e6331497e3

add missing implicit conversions

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

M	source/blender/blenkernel/BKE_multi_functions.h
M	source/blender/modifiers/intern/MOD_functiondeform_cxx.cc

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

diff --git a/source/blender/blenkernel/BKE_multi_functions.h b/source/blender/blenkernel/BKE_multi_functions.h
index e31b43b278f..b63476f2474 100644
--- a/source/blender/blenkernel/BKE_multi_functions.h
+++ b/source/blender/blenkernel/BKE_multi_functions.h
@@ -142,6 +142,58 @@ template<typename FromT, typename ToT> class MultiFunction_Convert : public Mult
   }
 };
 
+template<typename FromT, typename ToT> class MultiFunction_ConvertList : public MultiFunction {
+ public:
+  MultiFunction_ConvertList()
+  {
+    MFSignatureBuilder signature;
+    signature.readonly_vector_input<FromT>("Inputs");
+    signature.vector_output<ToT>("Outputs");
+    this->set_signature(signature);
+  }
+
+  void call(ArrayRef<uint> mask_indices,
+            MFParams &params,
+            MFContext &UNUSED(context)) const override
+  {
+    VirtualListListRef<FromT> inputs = params.readonly_vector_input<FromT>(0, "Inputs");
+    GenericVectorArray::MutableTypedRef<ToT> outputs = params.vector_output<ToT>(1, "Outputs");
+
+    for (uint index : mask_indices) {
+      VirtualListRef<FromT> input_list = inputs[index];
+
+      for (uint i = 0; i < input_list.size(); i++) {
+        const FromT &from_value = input_list[i];
+        ToT to_value = static_cast<ToT>(from_value);
+        outputs.append_single(index, to_value);
+      }
+    }
+  }
+};
+
+template<typename T> class MultiFunction_SingleElementList : public MultiFunction {
+ public:
+  MultiFunction_SingleElementList()
+  {
+    MFSignatureBuilder signature;
+    signature.readonly_single_input<T>("Input");
+    signature.vector_output<T>("Outputs");
+    this->set_signature(signature);
+  }
+
+  void call(ArrayRef<uint> mask_indices,
+            MFParams &params,
+            MFContext &UNUSED(context)) const override
+  {
+    VirtualListRef<T> inputs = params.readonly_single_input<T>(0, "Input");
+    GenericVectorArray::MutableTypedRef<T> outputs = params.vector_output<T>(1, "Outputs");
+
+    for (uint i : mask_indices) {
+      outputs.append_single(i, inputs[i]);
+    }
+  }
+};
+
 class MultiFunction_SimpleVectorize final : public MultiFunction {
  private:
   const MultiFunction &m_function;
diff --git a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
index c06b62bfec2..05a72ea5a6a 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
+++ b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
@@ -615,6 +615,26 @@ static std::pair<MFBuilderInputSocket *, MFBuilderOutputSocket *> INSERT_convert
   return {node.inputs()[0], node.outputs()[0]};
 }
 
+template<typename FromT, typename ToT>
+static std::pair<MFBuilderInputSocket *, MFBuilderOutputSocket *> INSERT_convert_list(
+    VTreeMFNetworkBuilder &builder, OwnedResources &resources)
+{
+  const MultiFunction &fn = allocate_resource<BKE::MultiFunction_ConvertList<FromT, ToT>>(
+      "convert list function", resources);
+  MFBuilderFunctionNode &node = builder.add_function(fn, {0}, {1});
+  return {node.inputs()[0], node.outputs()[0]};
+}
+
+template<typename T>
+static std::pair<MFBuilderInputSocket *, MFBuilderOutputSocket *> INSERT_element_to_list(
+    VTreeMFNetworkBuilder &builder, OwnedResources &resources)
+{
+  const MultiFunction &fn = allocate_resource<BKE::MultiFunction_SingleElementList<T>>(
+      "single element list function", resources);
+  MFBuilderFunctionNode &node = builder.add_function(fn, {0}, {1});
+  return {node.inputs()[0], node.outputs()[0]};
+}
+
 static Map<std::pair<std::string, std::string>, InsertImplicitConversionFunction>
 get_conversion_inserters()
 {
@@ -629,6 +649,25 @@ get_conversion_inserters()
   inserters.add_new({"fn_IntegerSocket", "fn_BooleanSocket"}, INSERT_convert<int, bool>);
   inserters.add_new({"fn_BooleanSocket", "fn_IntegerSocket"}, INSERT_convert<bool, int>);
 
+  inserters.add_new({"fn_IntegerListSocket", "fn_FloatListSocket"},
+                    INSERT_convert_list<int, float>);
+  inserters.add_new({"fn_FloatListSocket", "fn_IntegerListSocket"},
+                    INSERT_convert_list<float, int>);
+
+  inserters.add_new({"fn_FloatListSocket", "fn_BooleanListSocket"},
+                    INSERT_convert_list<float, bool>);
+  inserters.add_new({"fn_BooleanListSocket", "fn_FloatListSocket"},
+                    INSERT_convert_list<bool, float>);
+
+  inserters.add_new({"fn_IntegerListSocket", "fn_BooleanListSocket"},
+                    INSERT_convert_list<int, bool>);
+  inserters.add_new({"fn_BooleanListSocket", "fn_IntegerListSocket"},
+                    INSERT_convert_list<bool, int>);
+
+  inserters.add_new({"fn_IntegerSocket", "fn_IntegerListSocket"}, INSERT_element_to_list<int>);
+  inserters.add_new({"fn_FloatSocket", "fn_FloatListSocket"}, INSERT_element_to_list<float>);
+  inserters.add_new({"fn_BooleanSocket", "fn_BooleanListSocket"}, INSERT_element_to_list<bool>);
+
   return inserters;
 }



More information about the Bf-blender-cvs mailing list