[Bf-blender-cvs] [5f8bd0fa712] functions-experimental-refactor: make switch node work again

Jacques Lucke noreply at git.blender.org
Fri Nov 8 18:31:25 CET 2019


Commit: 5f8bd0fa71269f409d37b12f003006bff8182dbc
Author: Jacques Lucke
Date:   Fri Nov 8 18:21:26 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rB5f8bd0fa71269f409d37b12f003006bff8182dbc

make switch node work again

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

M	source/blender/functions/intern/multi_functions/mixed.cc
M	source/blender/functions/intern/multi_functions/mixed.h
M	source/blender/functions/intern/vtree_multi_function_network/builder.cc
M	source/blender/functions/intern/vtree_multi_function_network/builder.h
M	source/blender/functions/intern/vtree_multi_function_network/mappings.h
M	source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc
M	source/blender/functions/intern/vtree_multi_function_network/mappings_sockets.cc

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

diff --git a/source/blender/functions/intern/multi_functions/mixed.cc b/source/blender/functions/intern/multi_functions/mixed.cc
index 2ae08f85ffd..e8cc83a796a 100644
--- a/source/blender/functions/intern/multi_functions/mixed.cc
+++ b/source/blender/functions/intern/multi_functions/mixed.cc
@@ -292,6 +292,60 @@ void MF_ObjectWorldLocation::call(const MFMask &mask,
   }
 }
 
+MF_SwitchSingle::MF_SwitchSingle(const CPPType &type) : m_type(type)
+{
+  MFSignatureBuilder signature("Switch");
+  signature.readonly_single_input<bool>("Condition");
+  signature.readonly_single_input("True", m_type);
+  signature.readonly_single_input("False", m_type);
+  signature.single_output("Result", m_type);
+  this->set_signature(signature);
+}
+
+void MF_SwitchSingle::call(const MFMask &mask, MFParams &params, MFContext &UNUSED(context)) const
+{
+  VirtualListRef<bool> conditions = params.readonly_single_input<bool>(0, "Condition");
+  GenericVirtualListRef if_true = params.readonly_single_input(1, "True");
+  GenericVirtualListRef if_false = params.readonly_single_input(2, "False");
+  GenericMutableArrayRef results = params.single_output(3, "Result");
+
+  for (uint i : mask.indices()) {
+    if (conditions[i]) {
+      results.copy_in__uninitialized(i, if_true[i]);
+    }
+    else {
+      results.copy_in__uninitialized(i, if_false[i]);
+    }
+  }
+}
+
+MF_SwitchVector::MF_SwitchVector(const CPPType &type) : m_type(type)
+{
+  MFSignatureBuilder signature("Switch");
+  signature.readonly_single_input<bool>("Condition");
+  signature.readonly_vector_input("True", m_type);
+  signature.readonly_vector_input("False", m_type);
+  signature.vector_output("Result", m_type);
+  this->set_signature(signature);
+}
+
+void MF_SwitchVector::call(const MFMask &mask, MFParams &params, MFContext &UNUSED(context)) const
+{
+  VirtualListRef<bool> conditions = params.readonly_single_input<bool>(0, "Condition");
+  GenericVirtualListListRef if_true = params.readonly_vector_input(1, "True");
+  GenericVirtualListListRef if_false = params.readonly_vector_input(2, "False");
+  GenericVectorArray &results = params.vector_output(3, "Result");
+
+  for (uint i : mask.indices()) {
+    if (conditions[i]) {
+      results.extend_single__copy(i, if_true[i]);
+    }
+    else {
+      results.extend_single__copy(i, if_false[i]);
+    }
+  }
+}
+
 MF_TextLength::MF_TextLength()
 {
   MFSignatureBuilder signature("Text Length");
diff --git a/source/blender/functions/intern/multi_functions/mixed.h b/source/blender/functions/intern/multi_functions/mixed.h
index 6fad879459a..60f9585fa03 100644
--- a/source/blender/functions/intern/multi_functions/mixed.h
+++ b/source/blender/functions/intern/multi_functions/mixed.h
@@ -142,6 +142,24 @@ class MF_ContextCurrentFrame final : public MultiFunction {
   void call(const MFMask &mask, MFParams &params, MFContext &context) const override;
 };
 
+class MF_SwitchSingle final : public MultiFunction {
+ private:
+  const CPPType &m_type;
+
+ public:
+  MF_SwitchSingle(const CPPType &type);
+  void call(const MFMask &mask, MFParams &params, MFContext &context) const override;
+};
+
+class MF_SwitchVector final : public MultiFunction {
+ private:
+  const CPPType &m_type;
+
+ public:
+  MF_SwitchVector(const CPPType &type);
+  void call(const MFMask &mask, MFParams &params, MFContext &context) const override;
+};
+
 template<typename FromT, typename ToT, ToT (*Compute)(const FromT &)>
 class MF_Mappping final : public MultiFunction {
  public:
diff --git a/source/blender/functions/intern/vtree_multi_function_network/builder.cc b/source/blender/functions/intern/vtree_multi_function_network/builder.cc
index 9073adde12d..06c6c8d4b06 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/builder.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/builder.cc
@@ -129,6 +129,15 @@ const CPPType &VTreeMFNetworkBuilder::cpp_type_from_property(const VNode &vnode,
   return type;
 }
 
+MFDataType VTreeMFNetworkBuilder::data_type_from_property(const VNode &vnode,
+                                                          StringRefNull prop_name) const
+{
+  char *type_name = RNA_string_get_alloc(vnode.rna(), prop_name.data(), nullptr, 0);
+  MFDataType type = m_vtree_mappings.data_type_by_type_name.lookup(type_name);
+  MEM_freeN(type_name);
+  return type;
+}
+
 std::unique_ptr<VTreeMFNetwork> VTreeMFNetworkBuilder::build()
 {
   // m_builder->to_dot__clipboard();
diff --git a/source/blender/functions/intern/vtree_multi_function_network/builder.h b/source/blender/functions/intern/vtree_multi_function_network/builder.h
index c06e307b14b..7d614e80e23 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/builder.h
+++ b/source/blender/functions/intern/vtree_multi_function_network/builder.h
@@ -128,6 +128,7 @@ class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
   }
 
   const CPPType &cpp_type_from_property(const VNode &vnode, StringRefNull prop_name) const;
+  MFDataType data_type_from_property(const VNode &vnode, StringRefNull prop_name) const;
 
   std::unique_ptr<VTreeMFNetwork> build();
 };
diff --git a/source/blender/functions/intern/vtree_multi_function_network/mappings.h b/source/blender/functions/intern/vtree_multi_function_network/mappings.h
index 166e039b674..e883082602b 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/mappings.h
+++ b/source/blender/functions/intern/vtree_multi_function_network/mappings.h
@@ -25,6 +25,7 @@ using InsertImplicitConversionFunction = std::function<
 struct VTreeMultiFunctionMappings {
   StringMap<MFDataType> data_type_by_idname;
   StringMap<const CPPType *> cpp_type_by_type_name;
+  StringMap<MFDataType> data_type_by_type_name;
   Map<const CPPType *, std::string> type_name_from_cpp_type;
   StringMap<InsertVNodeFunction> vnode_inserters;
   StringMap<InsertUnlinkedInputFunction> input_inserters;
diff --git a/source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc b/source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc
index 85ea9c1d857..1eac704ce79 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc
@@ -145,6 +145,30 @@ static void INSERT_object_mesh_info(VTreeMFNetworkBuilder &builder, const VNode
   builder.add_function(fn, {0}, {1}, vnode);
 }
 
+static const MultiFunction &get_switch_function(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+{
+  MFDataType type = builder.data_type_from_property(vnode, "data_type");
+  switch (type.category()) {
+    case MFDataType::None: {
+      BLI_assert(false);
+      break;
+    }
+    case MFDataType::Single: {
+      return builder.construct_fn<FN::MF_SwitchSingle>(type.type());
+    }
+    case MFDataType::Vector: {
+      return builder.construct_fn<FN::MF_SwitchVector>(type.base_type());
+    }
+  }
+  return builder.construct_fn<FN::MF_SeparateColor>(); /* TODO: get rid of this case. */
+}
+
+static void INSERT_switch(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+{
+  const MultiFunction &fn = get_switch_function(builder, vnode);
+  builder.add_function(fn, {0, 1, 2}, {3}, vnode);
+}
+
 static void INSERT_text_length(VTreeMFNetworkBuilder &builder, const VNode &vnode)
 {
   const MultiFunction &fn = builder.construct_fn<FN::MF_TextLength>();
@@ -420,6 +444,7 @@ void add_vtree_node_mapping_info(VTreeMultiFunctionMappings &mappings)
   mappings.vnode_inserters.add_new("fn_SeparateColorNode", INSERT_separate_color);
   mappings.vnode_inserters.add_new("fn_CombineVectorNode", INSERT_combine_vector);
   mappings.vnode_inserters.add_new("fn_SeparateVectorNode", INSERT_separate_vector);
+  mappings.vnode_inserters.add_new("fn_SwitchNode", INSERT_switch);
   mappings.vnode_inserters.add_new("fn_ListLengthNode", INSERT_list_length);
   mappings.vnode_inserters.add_new("fn_PackListNode", INSERT_pack_list);
   mappings.vnode_inserters.add_new("fn_GetListElementNode", INSERT_get_list_element);
diff --git a/source/blender/functions/intern/vtree_multi_function_network/mappings_sockets.cc b/source/blender/functions/intern/vtree_multi_function_network/mappings_sockets.cc
index c88fe9170a7..b785eca4f2b 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/mappings_sockets.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/mappings_sockets.cc
@@ -135,6 +135,8 @@ static void add_basic_type(VTreeMultiFunctionMappings &mappings,
   mappings.cpp_type_by_type_name.add_new(base_name, &CPP_TYPE<T>());
   mappings.data_type_by_idname.add_new(base_idname, MFDataType::ForSingle<T>());
   mappings.data_type_by_idname.add_new(list_idname, MFDataType::ForVector<T>());
+  mappings.data_type_by_type_name.add_new(base_name, MFDataType::ForSingle<T>());
+  mappings.data_type_by_type_name.add_new(list_name, MFDataType::ForVector<T>());
   mappings.input_inserters.add_new(base_idname, base_inserter);
   mappings.input_inserters.add_new(list_idname, INSERT_empty_list_socket<T>);
   mappings.conversion_inserters.add_new({base_idname, list_idname}, INSERT_element_to_list<T>);



More information about the Bf-blender-cvs mailing list