[Bf-blender-cvs] [47e7a8966ef] functions: cleanup nodes mapping
Jacques Lucke
noreply at git.blender.org
Thu Nov 21 15:20:05 CET 2019
Commit: 47e7a8966ef6514c8cf49994df3929131d398f18
Author: Jacques Lucke
Date: Thu Nov 21 15:10:26 2019 +0100
Branches: functions
https://developer.blender.org/rB47e7a8966ef6514c8cf49994df3929131d398f18
cleanup nodes mapping
===================================================================
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/generate.cc
M source/blender/functions/intern/vtree_multi_function_network/mappings.h
M source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc
===================================================================
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 2423fc38527..bf7360112bd 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/builder.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/builder.cc
@@ -73,8 +73,11 @@ void VTreeMFNetworkBuilder::map_data_sockets(const VNode &vnode, MFBuilderNode &
void VTreeMFNetworkBuilder::assert_vnode_is_mapped_correctly(const VNode &vnode) const
{
+ UNUSED_VARS_NDEBUG(vnode);
+#ifdef DEBUG
this->assert_data_sockets_are_mapped_correctly(vnode.inputs().cast<const VSocket *>());
this->assert_data_sockets_are_mapped_correctly(vnode.outputs().cast<const VSocket *>());
+#endif
}
void VTreeMFNetworkBuilder::assert_data_sockets_are_mapped_correctly(
@@ -141,6 +144,54 @@ MFDataType VTreeMFNetworkBuilder::data_type_from_property(const VNode &vnode,
return type;
}
+Vector<bool> VNodeMFNetworkBuilder::get_list_base_variadic_states(StringRefNull prop_name)
+{
+ Vector<bool> states;
+ RNA_BEGIN (m_vnode.rna(), itemptr, prop_name.data()) {
+ int state = RNA_enum_get(&itemptr, "state");
+ if (state == 0) {
+ /* single value case */
+ states.append(false);
+ }
+ else if (state == 1) {
+ /* list case */
+ states.append(true);
+ }
+ else {
+ BLI_assert(false);
+ }
+ }
+ RNA_END;
+ return states;
+}
+
+void VNodeMFNetworkBuilder::set_matching_fn(const MultiFunction &fn)
+{
+ MFBuilderFunctionNode &node = m_network_builder.add_function(fn);
+ m_network_builder.map_data_sockets(m_vnode, node);
+}
+
+const MultiFunction &VNodeMFNetworkBuilder::get_vectorized_function(
+ const MultiFunction &base_function, ArrayRef<const char *> is_vectorized_prop_names)
+{
+ Vector<bool> input_is_vectorized;
+ for (const char *prop_name : is_vectorized_prop_names) {
+ char state[5];
+ RNA_string_get(m_vnode.rna(), prop_name, state);
+ BLI_assert(STREQ(state, "BASE") || STREQ(state, "LIST"));
+
+ bool is_vectorized = STREQ(state, "LIST");
+ input_is_vectorized.append(is_vectorized);
+ }
+
+ if (input_is_vectorized.contains(true)) {
+ return this->construct_fn<MF_SimpleVectorize>(base_function, input_is_vectorized);
+ }
+ else {
+ return base_function;
+ }
+}
+
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 29f3ba2459e..80f995db326 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/builder.h
+++ b/source/blender/functions/intern/vtree_multi_function_network/builder.h
@@ -281,4 +281,69 @@ class VSocketMFNetworkBuilder {
}
};
+class VNodeMFNetworkBuilder {
+ private:
+ VTreeMFNetworkBuilder &m_network_builder;
+ const VNode &m_vnode;
+
+ public:
+ VNodeMFNetworkBuilder(VTreeMFNetworkBuilder &network_builder, const VNode &vnode)
+ : m_network_builder(network_builder), m_vnode(vnode)
+ {
+ }
+
+ VTreeMFNetworkBuilder &network_builder()
+ {
+ return m_network_builder;
+ }
+
+ const VNode &vnode() const
+ {
+ return m_vnode;
+ }
+
+ PointerRNA *rna()
+ {
+ return m_vnode.rna();
+ }
+
+ const CPPType &cpp_type_from_property(StringRefNull prop_name)
+ {
+ return m_network_builder.cpp_type_from_property(m_vnode, prop_name);
+ }
+
+ MFDataType data_type_from_property(StringRefNull prop_name)
+ {
+ return m_network_builder.data_type_from_property(m_vnode, prop_name);
+ }
+
+ Vector<bool> get_list_base_variadic_states(StringRefNull prop_name);
+
+ template<typename T, typename... Args> T &construct_fn(Args &&... args)
+ {
+ return m_network_builder.construct_fn<T>(std::forward<Args>(args)...);
+ }
+
+ template<typename T, typename... Args>
+ void set_vectorized_constructed_matching_fn(ArrayRef<const char *> is_vectorized_prop_names,
+ Args &&... args)
+ {
+ const MultiFunction &base_fn = this->construct_fn<T>(std::forward<Args>(args)...);
+ const MultiFunction &fn = this->get_vectorized_function(base_fn, is_vectorized_prop_names);
+ this->set_matching_fn(fn);
+ }
+
+ template<typename T, typename... Args> void set_constructed_matching_fn(Args &&... args)
+ {
+ const MultiFunction &fn = this->construct_fn<T>(std::forward<Args>(args)...);
+ this->set_matching_fn(fn);
+ }
+
+ void set_matching_fn(const MultiFunction &fn);
+
+ private:
+ const MultiFunction &get_vectorized_function(const MultiFunction &base_function,
+ ArrayRef<const char *> is_vectorized_prop_names);
+};
+
} // namespace FN
diff --git a/source/blender/functions/intern/vtree_multi_function_network/generate.cc b/source/blender/functions/intern/vtree_multi_function_network/generate.cc
index ce8e113240f..26629f30abb 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/generate.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/generate.cc
@@ -20,10 +20,10 @@ static bool insert_nodes(VTreeMFNetworkBuilder &builder,
const InsertVNodeFunction *inserter = mappings.vnode_inserters.lookup_ptr(idname);
if (inserter != nullptr) {
- (*inserter)(builder, *vnode);
-#ifdef DEBUG
+ VNodeMFNetworkBuilder vnode_builder{builder, *vnode};
+
+ (*inserter)(vnode_builder);
builder.assert_vnode_is_mapped_correctly(*vnode);
-#endif
}
else if (builder.has_data_sockets(*vnode)) {
builder.add_dummy(*vnode);
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 d4610448066..2c338be447a 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/mappings.h
+++ b/source/blender/functions/intern/vtree_multi_function_network/mappings.h
@@ -14,10 +14,10 @@ using BLI::StringMap;
struct VTreeMultiFunctionMappings;
class VTreeMFNetworkBuilder;
+class VNodeMFNetworkBuilder;
class VSocketMFNetworkBuilder;
-using InsertVNodeFunction =
- std::function<void(VTreeMFNetworkBuilder &builder, const VNode &vnode)>;
+using InsertVNodeFunction = std::function<void(VNodeMFNetworkBuilder &builder)>;
using InsertVSocketFunction = std::function<void(VSocketMFNetworkBuilder &builder)>;
using InsertImplicitConversionFunction = std::function<
std::pair<MFBuilderInputSocket *, MFBuilderOutputSocket *>(VTreeMFNetworkBuilder &builder)>;
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 6dcfd5bc56f..8eea45ea479 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
@@ -9,502 +9,345 @@
namespace FN {
using BLI::float3;
-
-static const MultiFunction &get_vectorized_function(
- VTreeMFNetworkBuilder &builder,
- const MultiFunction &base_function,
- PointerRNA *rna,
- ArrayRef<const char *> is_vectorized_prop_names)
-{
- Vector<bool> input_is_vectorized;
- for (const char *prop_name : is_vectorized_prop_names) {
- char state[5];
- RNA_string_get(rna, prop_name, state);
- BLI_assert(STREQ(state, "BASE") || STREQ(state, "LIST"));
-
- bool is_vectorized = STREQ(state, "LIST");
- input_is_vectorized.append(is_vectorized);
- }
-
- if (input_is_vectorized.contains(true)) {
- return builder.construct_fn<FN::MF_SimpleVectorize>(base_function, input_is_vectorized);
- }
- else {
- return base_function;
- }
-}
-
-static void INSERT_combine_color(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+static void INSERT_combine_color(VNodeMFNetworkBuilder &builder)
{
- const MultiFunction &base_fn = builder.construct_fn<FN::MF_CombineColor>();
- const MultiFunction &fn = get_vectorized_function(
- builder,
- base_fn,
- vnode.rna(),
+ builder.set_vectorized_constructed_matching_fn<MF_CombineColor>(
{"use_list__red", "use_list__green", "use_list__blue", "use_list__alpha"});
- builder.add_function(fn, vnode);
-}
-
-static void INSERT_separate_color(VTreeMFNetworkBuilder &builder, const VNode &vnode)
-{
- const MultiFunction &base_fn = builder.construct_fn<FN::MF_SeparateColor>();
- const MultiFunction &fn = get_vectorized_function(
- builder, base_fn, vnode.rna(), {"use_list__color"});
- builder.add_function(fn, vnode);
-}
-
-static void INSERT_combine_vector(VTreeMFNetworkBuilder &builder, const VNode &vnode)
-{
- const MultiFunction &base_fn = builder.construct_fn<FN::MF_CombineVector>();
- const MultiFunction &fn = get_vectorized_function(
- builder, base_fn, vnode.rna(), {"use_list__x", "use_list__y", "use_list__z"});
- builder.add_function(fn, vnode);
}
-static void INSERT_separate_vector(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+static void INSERT_separate_color(VNodeMFNetworkBuilder &builder)
{
- const MultiFunction &base_fn = builder.construct_fn<FN::MF_SeparateVector>();
- const MultiFunction &fn = get_vectorized_function(
- builder, base_fn, vnode.rna(), {"use_list__vector"});
- builder.add_function(fn, vnode);
+ builder.set_vectorized_constructed_matching_fn<MF_SeparateColor>({"use_list__color"});
}
-static void INSERT_list_length(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+static void INSERT_combine_vector(VNodeMFNetworkBuilder &builder)
{
- const CPPType &type = builder.cpp_type_from_property(vnode, "active_type");
- const MultiFunction &fn = builder.construct_fn<FN::MF_ListLength>(type);
- builder.add_function(fn, vnode);
+ builder.set_vectorized_constructed_matching_fn<MF_CombineVector>(
+ {"use_list__x", "use_list__y", "use_list__z"});
}
-static void INSERT_get_list_element(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+static void INSERT_separate_vector(VNodeMFNetworkBuilder &builder)
{
- const CPPType &type = builder.cpp_type_from_property(vnode, "active_type");
- const MultiFunction &f
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list