[Bf-blender-cvs] [353af1c51ae] functions-experimental-refactor: Support for implicit conversions, float math node and int type

Jacques Lucke noreply at git.blender.org
Tue Oct 29 16:54:43 CET 2019


Commit: 353af1c51ae1dd4c346cd87fc2deb5849f80d5b5
Author: Jacques Lucke
Date:   Tue Oct 29 13:32:22 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rB353af1c51ae1dd4c346cd87fc2deb5849f80d5b5

Support for implicit conversions, float math node and int type

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

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 c27b190b997..e3cd5b3f281 100644
--- a/source/blender/blenkernel/BKE_multi_functions.h
+++ b/source/blender/blenkernel/BKE_multi_functions.h
@@ -107,6 +107,30 @@ template<typename T> class MultiFunction_ConstantValue : public MultiFunction {
   }
 };
 
+template<typename FromT, typename ToT> class MultiFunction_Convert : public MultiFunction {
+ public:
+  MultiFunction_Convert()
+  {
+    MFSignatureBuilder signature;
+    signature.readonly_single_input<FromT>("Input");
+    signature.single_output<ToT>("Output");
+    this->set_signature(signature);
+  }
+
+  void call(ArrayRef<uint> mask_indices,
+            MFParams &params,
+            MFContext &UNUSED(context)) const override
+  {
+    VirtualListRef<FromT> inputs = params.readonly_single_input<FromT>(0, "Input");
+    MutableArrayRef<ToT> outputs = params.single_output<ToT>(1, "Output");
+
+    for (uint i : mask_indices) {
+      const FromT &from_value = inputs[i];
+      new (outputs.begin() + i) ToT(from_value);
+    }
+  }
+};
+
 };  // namespace BKE
 
 #endif /* __BKE_MULTI_FUNCTIONS_H__ */
diff --git a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
index 4eb941d2ed4..288cb24186d 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
+++ b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
@@ -40,6 +40,7 @@ using BLI::Array;
 using BLI::ArrayRef;
 using BLI::float3;
 using BLI::IndexRange;
+using BLI::Map;
 using BLI::OwnedResources;
 using BLI::StringMap;
 using BLI::StringRef;
@@ -60,6 +61,9 @@ static MFDataType get_type_by_socket(const VirtualSocket &vsocket)
   else if (idname == "fn_VectorSocket") {
     return MFDataType::ForSingle<float3>();
   }
+  else if (idname == "fn_IntegerSocket") {
+    return MFDataType::ForSingle<int32_t>();
+  }
   return MFDataType();
 }
 
@@ -317,6 +321,9 @@ using InsertVNodeFunction = std::function<void(
     VTreeMFNetworkBuilder &builder, OwnedResources &resources, const VirtualNode &vnode)>;
 using InsertUnlinkedInputFunction = std::function<MFBuilderOutputSocket &(
     VTreeMFNetworkBuilder &builder, OwnedResources &resources, const VirtualSocket &vsocket)>;
+using InsertImplicitConversionFunction =
+    std::function<std::pair<MFBuilderInputSocket *, MFBuilderOutputSocket *>(
+        VTreeMFNetworkBuilder &builder, OwnedResources &resources)>;
 
 static void INSERT_vector_math(VTreeMFNetworkBuilder &builder,
                                OwnedResources &resources,
@@ -327,6 +334,15 @@ static void INSERT_vector_math(VTreeMFNetworkBuilder &builder,
   resources.add(std::move(function), "vector math function");
 }
 
+static void INSERT_float_math(VTreeMFNetworkBuilder &builder,
+                              OwnedResources &resources,
+                              const VirtualNode &vnode)
+{
+  auto function = BLI::make_unique<BKE::MultiFunction_AddFloats>();
+  builder.add_function(*function, {0, 1}, {2}, vnode);
+  resources.add(std::move(function), "float math function");
+}
+
 static void INSERT_combine_vector(VTreeMFNetworkBuilder &builder,
                                   OwnedResources &resources,
                                   const VirtualNode &vnode)
@@ -348,6 +364,7 @@ static void INSERT_separate_vector(VTreeMFNetworkBuilder &builder,
 static StringMap<InsertVNodeFunction> get_node_inserters()
 {
   StringMap<InsertVNodeFunction> inserters;
+  inserters.add_new("fn_FloatMathNode", INSERT_float_math);
   inserters.add_new("fn_VectorMathNode", INSERT_vector_math);
   inserters.add_new("fn_CombineVectorNode", INSERT_combine_vector);
   inserters.add_new("fn_SeparateVectorNode", INSERT_separate_vector);
@@ -383,11 +400,44 @@ static MFBuilderOutputSocket &INSERT_float_socket(VTreeMFNetworkBuilder &builder
   return *node.outputs()[0];
 }
 
+static MFBuilderOutputSocket &INSERT_int_socket(VTreeMFNetworkBuilder &builder,
+                                                OwnedResources &resources,
+                                                const VirtualSocket &vsocket)
+{
+  PointerRNA rna = vsocket.rna();
+  int value = RNA_int_get(&rna, "value");
+
+  auto function = BLI::make_unique<BKE::MultiFunction_ConstantValue<int>>(value);
+  auto &node = builder.add_function(*function, {}, {0});
+
+  resources.add(std::move(function), "int input");
+  return *node.outputs()[0];
+}
+
 static StringMap<InsertUnlinkedInputFunction> get_unlinked_input_inserter()
 {
   StringMap<InsertUnlinkedInputFunction> inserters;
   inserters.add_new("fn_VectorSocket", INSERT_vector_socket);
   inserters.add_new("fn_FloatSocket", INSERT_float_socket);
+  inserters.add_new("fn_IntegerSocket", INSERT_int_socket);
+  return inserters;
+}
+
+template<typename FromT, typename ToT>
+static std::pair<MFBuilderInputSocket *, MFBuilderOutputSocket *> INSERT_convert(
+    VTreeMFNetworkBuilder &builder, OwnedResources &resources)
+{
+  auto function = BLI::make_unique<BKE::MultiFunction_Convert<FromT, ToT>>();
+  auto &node = builder.add_function(*function, {0}, {1});
+  resources.add(std::move(function), "converter function");
+  return {node.inputs()[0], node.outputs()[0]};
+}
+
+static Map<std::pair<std::string, std::string>, InsertImplicitConversionFunction>
+get_conversion_inserters()
+{
+  Map<std::pair<std::string, std::string>, InsertImplicitConversionFunction> inserters;
+  inserters.add_new({"fn_IntegerSocket", "fn_FloatSocket"}, INSERT_convert<int, float>);
   return inserters;
 }
 
@@ -412,8 +462,10 @@ static bool insert_nodes(VTreeMFNetworkBuilder &builder, OwnedResources &resourc
   return true;
 }
 
-static bool insert_links(VTreeMFNetworkBuilder &builder, OwnedResources &UNUSED(resources))
+static bool insert_links(VTreeMFNetworkBuilder &builder, OwnedResources &resources)
 {
+  auto conversion_inserters = get_conversion_inserters();
+
   for (const VirtualSocket *to_vsocket : builder.vtree().inputs_with_links()) {
     if (to_vsocket->links().size() > 1) {
       continue;
@@ -432,11 +484,19 @@ static bool insert_links(VTreeMFNetworkBuilder &builder, OwnedResources &UNUSED(
     auto &from_socket = builder.lookup_output_socket(*from_vsocket);
     auto &to_socket = builder.lookup_input_socket(*to_vsocket);
 
-    if (from_socket.type() != to_socket.type()) {
-      return false;
+    if (from_socket.type() == to_socket.type()) {
+      builder.add_link(from_socket, to_socket);
+    }
+    else {
+      InsertImplicitConversionFunction *inserter = conversion_inserters.lookup_ptr(
+          {from_vsocket->idname(), to_vsocket->idname()});
+      if (inserter == nullptr) {
+        return false;
+      }
+      auto new_sockets = (*inserter)(builder, resources);
+      builder.add_link(from_socket, *new_sockets.first);
+      builder.add_link(*new_sockets.second, to_socket);
     }
-
-    builder.add_link(from_socket, to_socket);
   }
 
   return true;
@@ -606,7 +666,8 @@ void MOD_functiondeform_do(FunctionDeformModifierData *fdmd, float (*vertexCos)[
 
   Vector<const MFOutputSocket *> function_inputs = {
       &vtree_network->lookup_socket(input_vnode.output(0)).as_output(),
-      &vtree_network->lookup_socket(input_vnode.output(1)).as_output()};
+      &vtree_network->lookup_socket(input_vnode.output(1)).as_output(),
+      &vtree_network->lookup_socket(input_vnode.output(2)).as_output()};
 
   Vector<const MFInputSocket *> function_outputs = {
       &vtree_network->lookup_socket(output_vnode.input(0)).as_input()};
@@ -617,6 +678,7 @@ void MOD_functiondeform_do(FunctionDeformModifierData *fdmd, float (*vertexCos)[
   params.start_new(function.signature(), numVerts);
   params.add_readonly_array_ref(ArrayRef<float3>((float3 *)vertexCos, numVerts));
   params.add_readonly_single_ref(&fdmd->control1);
+  params.add_readonly_single_ref(&fdmd->control2);
 
   TemporaryVector<float3> output_vectors(numVerts);
   params.add_mutable_array_ref<float3>(output_vectors);



More information about the Bf-blender-cvs mailing list