[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 ¶ms, 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 ¶ms, 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 ¶ms, 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 ¶ms, 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 ¶ms, 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