[Bf-blender-cvs] [74e7816a220] functions-experimental-refactor: move node inserters to separate file
Jacques Lucke
noreply at git.blender.org
Sat Nov 2 13:45:28 CET 2019
Commit: 74e7816a22018054e47a5876f850c3c577b55d03
Author: Jacques Lucke
Date: Sat Nov 2 13:45:22 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rB74e7816a22018054e47a5876f850c3c577b55d03
move node inserters to separate file
===================================================================
M source/blender/functions2/CMakeLists.txt
M source/blender/functions2/intern/vtree_multi_function_network/generate.cc
M source/blender/functions2/intern/vtree_multi_function_network/mappings.cc
M source/blender/functions2/intern/vtree_multi_function_network/mappings.h
A source/blender/functions2/intern/vtree_multi_function_network/mappings_nodes.cc
A source/blender/functions2/intern/vtree_multi_function_network/mappings_sockets.cc
===================================================================
diff --git a/source/blender/functions2/CMakeLists.txt b/source/blender/functions2/CMakeLists.txt
index b9ce480fc88..0e7630be401 100644
--- a/source/blender/functions2/CMakeLists.txt
+++ b/source/blender/functions2/CMakeLists.txt
@@ -26,6 +26,8 @@ set(SRC
intern/multi_functions/mixed.cc
intern/multi_functions/network.cc
intern/vtree_multi_function_network/generate.cc
+ intern/vtree_multi_function_network/mappings_nodes.cc
+ intern/vtree_multi_function_network/mappings_sockets.cc
intern/vtree_multi_function_network/mappings.cc
intern/cpp_type.cc
intern/cpp_types.cc
diff --git a/source/blender/functions2/intern/vtree_multi_function_network/generate.cc b/source/blender/functions2/intern/vtree_multi_function_network/generate.cc
index ce13f341333..2750c2dc0cd 100644
--- a/source/blender/functions2/intern/vtree_multi_function_network/generate.cc
+++ b/source/blender/functions2/intern/vtree_multi_function_network/generate.cc
@@ -9,241 +9,18 @@
namespace FN {
-using BLI::float3;
-using BLI::StringMap;
-
-static const CPPType &get_cpp_type_by_name(StringRef name)
-{
- if (name == "Float") {
- return FN::GET_TYPE<float>();
- }
- else if (name == "Vector") {
- return FN::GET_TYPE<float3>();
- }
- else if (name == "Integer") {
- return FN::GET_TYPE<int32_t>();
- }
- else if (name == "Boolean") {
- return FN::GET_TYPE<bool>();
- }
- else if (name == "Object") {
- return FN::GET_TYPE<Object *>();
- }
- else if (name == "Text") {
- return FN::GET_TYPE<std::string>();
- }
-
- BLI_assert(false);
- return FN::GET_TYPE<float>();
-}
-
-using InsertVNodeFunction = std::function<void(
- VTreeMFNetworkBuilder &builder, OwnedResources &resources, const VNode &vnode)>;
-using InsertUnlinkedInputFunction = std::function<MFBuilderOutputSocket &(
- VTreeMFNetworkBuilder &builder, OwnedResources &resources, const VSocket &vsocket)>;
-using InsertImplicitConversionFunction =
- std::function<std::pair<MFBuilderInputSocket *, MFBuilderOutputSocket *>(
- VTreeMFNetworkBuilder &builder, OwnedResources &resources)>;
-
-template<typename T, typename... Args>
-T &allocate_resource(const char *name, OwnedResources &resources, Args &&... args)
-{
- std::unique_ptr<T> value = BLI::make_unique<T>(std::forward<Args>(args)...);
- T &value_ref = *value;
- resources.add(std::move(value), name);
- return value_ref;
-}
-
-static void INSERT_vector_math(VTreeMFNetworkBuilder &builder,
- OwnedResources &resources,
- const VNode &vnode)
-{
- const MultiFunction &fn = allocate_resource<FN::MF_AddFloat3s>("vector math function",
- resources);
- builder.add_function(fn, {0, 1}, {2}, vnode);
-}
-
-static const MultiFunction &get_vectorized_function(
- const MultiFunction &base_function,
- OwnedResources &resources,
- 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 allocate_resource<FN::MF_SimpleVectorize>(
- "vectorized function", resources, base_function, input_is_vectorized);
- }
- else {
- return base_function;
- }
-}
-
-static void INSERT_float_math(VTreeMFNetworkBuilder &builder,
- OwnedResources &resources,
- const VNode &vnode)
-{
- const MultiFunction &base_fn = allocate_resource<FN::MF_AddFloats>("float math function",
- resources);
- const MultiFunction &fn = get_vectorized_function(
- base_fn, resources, vnode.rna(), {"use_list__a", "use_list__b"});
-
- builder.add_function(fn, {0, 1}, {2}, vnode);
-}
-
-static void INSERT_combine_vector(VTreeMFNetworkBuilder &builder,
- OwnedResources &resources,
- const VNode &vnode)
-{
- const MultiFunction &base_fn = allocate_resource<FN::MF_CombineVector>("combine vector function",
- resources);
- const MultiFunction &fn = get_vectorized_function(
- base_fn, resources, vnode.rna(), {"use_list__x", "use_list__y", "use_list__z"});
- builder.add_function(fn, {0, 1, 2}, {3}, vnode);
-}
-
-static void INSERT_separate_vector(VTreeMFNetworkBuilder &builder,
- OwnedResources &resources,
- const VNode &vnode)
-{
- const MultiFunction &base_fn = allocate_resource<FN::MF_SeparateVector>(
- "separate vector function", resources);
- const MultiFunction &fn = get_vectorized_function(
- base_fn, resources, vnode.rna(), {"use_list__vector"});
- builder.add_function(fn, {0}, {1, 2, 3}, vnode);
-}
-
-static void INSERT_list_length(VTreeMFNetworkBuilder &builder,
- OwnedResources &resources,
- const VNode &vnode)
-{
- char *type_name = RNA_string_get_alloc(vnode.rna(), "active_type", nullptr, 0);
- const CPPType &type = get_cpp_type_by_name(type_name);
- MEM_freeN(type_name);
-
- const MultiFunction &fn = allocate_resource<FN::MF_ListLength>(
- "list length function", resources, type);
- builder.add_function(fn, {0}, {1}, vnode);
-}
-
-static void INSERT_get_list_element(VTreeMFNetworkBuilder &builder,
- OwnedResources &resources,
- const VNode &vnode)
-{
- char *type_name = RNA_string_get_alloc(vnode.rna(), "active_type", nullptr, 0);
- const CPPType &type = get_cpp_type_by_name(type_name);
- MEM_freeN(type_name);
-
- const MultiFunction &fn = allocate_resource<FN::MF_GetListElement>(
- "get list element function", resources, type);
- builder.add_function(fn, {0, 1, 2}, {3}, vnode);
-}
-
-static MFBuilderOutputSocket &build_pack_list_node(VTreeMFNetworkBuilder &builder,
- OwnedResources &resources,
- const VNode &vnode,
- const CPPType &base_type,
- const char *prop_name,
- uint start_index)
-{
- Vector<bool> input_is_list;
- RNA_BEGIN (vnode.rna(), itemptr, prop_name) {
- int state = RNA_enum_get(&itemptr, "state");
- if (state == 0) {
- /* single value case */
- input_is_list.append(false);
- }
- else if (state == 1) {
- /* list case */
- input_is_list.append(true);
- }
- else {
- BLI_assert(false);
- }
- }
- RNA_END;
-
- uint input_amount = input_is_list.size();
- uint output_param_index = (input_amount > 0 && input_is_list[0]) ? 0 : input_amount;
-
- const MultiFunction &fn = allocate_resource<FN::MF_PackList>(
- "pack list function", resources, base_type, input_is_list);
- MFBuilderFunctionNode &node = builder.add_function(
- fn, IndexRange(input_amount).as_array_ref(), {output_param_index});
-
- for (uint i = 0; i < input_amount; i++) {
- builder.map_sockets(vnode.input(start_index + i), *node.inputs()[i]);
- }
-
- return *node.outputs()[0];
-}
-
-static void INSERT_pack_list(VTreeMFNetworkBuilder &builder,
- OwnedResources &resources,
- const VNode &vnode)
-{
- char *type_name = RNA_string_get_alloc(vnode.rna(), "active_type", nullptr, 0);
- const CPPType &type = get_cpp_type_by_name(type_name);
- MEM_freeN(type_name);
-
- MFBuilderOutputSocket &packed_list_socket = build_pack_list_node(
- builder, resources, vnode, type, "variadic", 0);
- builder.map_sockets(vnode.output(0), packed_list_socket);
-}
-
-static void INSERT_object_location(VTreeMFNetworkBuilder &builder,
- OwnedResources &resources,
- const VNode &vnode)
-{
- const MultiFunction &fn = allocate_resource<FN::MF_ObjectWorldLocation>(
- "object location function", resources);
- builder.add_function(fn, {0}, {1}, vnode);
-}
-
-static void INSERT_text_length(VTreeMFNetworkBuilder &builder,
- OwnedResources &resources,
- const VNode &vnode)
-{
- const MultiFunction &fn = allocate_resource<FN::MF_TextLength>("text length function",
- resources);
- builder.add_function(fn, {0}, {1}, vnode);
-}
-
-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);
- inserters.add_new("fn_ListLengthNode", INSERT_list_length);
- inserters.add_new("fn_PackListNode", INSERT_pack_list);
- inserters.add_new("fn_GetListElementNode", INSERT_get_list_element);
- inserters.add_new("fn_ObjectTransformsNode", INSERT_object_location);
- inserters.add_new("fn_TextLengthNode", INSERT_text_length);
- return inserters;
-}
-
-static bool insert_nodes(VTreeMFNetworkBuilder &builder, OwnedResources &resources)
+static bool insert_nodes(VTreeMFNetworkBuilder &builder,
+ OwnedResources &resources,
+ const VTreeMultiFunctionMappings &mappings)
{
const VirtualNodeTree &vtree = builder.vtree();
- auto inserters = get_node_inserters();
for (const VNode *vnode : vtree.nodes()) {
StringRef idname = vnode->idname();
- InsertVNodeFunction *inserter = inserters.lookup_ptr(idname);
+ const InsertVNodeFunction *inserter = mappings.vnode_inserters.lookup_ptr(idname);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list