diff options
author | Jacques Lucke <jacques@blender.org> | 2020-07-16 14:38:23 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2020-07-16 14:38:23 +0300 |
commit | 2ddb3dc617a5ad3dd5882cde8c088127bd57f916 (patch) | |
tree | bd6405fd9184a5f1437dbc9493a28507e6edc9ec /source/blender/blenkernel/intern | |
parent | 56aa5b0d8c6b66369f979e8bee4f1bd99454a99f (diff) |
Nodes: support default function for partially implemented nodes
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r-- | source/blender/blenkernel/intern/node_tree_multi_function.cc | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/source/blender/blenkernel/intern/node_tree_multi_function.cc b/source/blender/blenkernel/intern/node_tree_multi_function.cc index 4e505db9b9d..942f8e9a87a 100644 --- a/source/blender/blenkernel/intern/node_tree_multi_function.cc +++ b/source/blender/blenkernel/intern/node_tree_multi_function.cc @@ -31,6 +31,35 @@ static std::optional<fn::MFDataType> try_get_multi_function_data_type_of_socket( return bsocket->typeinfo->get_mf_data_type(); } +const fn::MultiFunction &NodeMFNetworkBuilder::get_default_fn(StringRef name) +{ + Vector<fn::MFDataType, 10> input_types; + Vector<fn::MFDataType, 10> output_types; + + for (const DInputSocket *dsocket : dnode_.inputs()) { + if (dsocket->is_available()) { + std::optional<fn::MFDataType> data_type = try_get_multi_function_data_type_of_socket( + dsocket->bsocket()); + if (data_type.has_value()) { + input_types.append(*data_type); + } + } + } + for (const DOutputSocket *dsocket : dnode_.outputs()) { + if (dsocket->is_available()) { + std::optional<fn::MFDataType> data_type = try_get_multi_function_data_type_of_socket( + dsocket->bsocket()); + if (data_type.has_value()) { + output_types.append(*data_type); + } + } + } + + const fn::MultiFunction &fn = this->construct_fn<fn::CustomMF_DefaultOutput>( + name, input_types, output_types); + return fn; +} + static void insert_dummy_node(CommonMFNetworkBuilderData &common, const DNode &dnode) { constexpr uint stack_capacity = 10; @@ -138,20 +167,21 @@ static fn::MFOutputSocket *try_find_origin(CommonMFNetworkBuilderData &common, } if (from_dsockets.size() == 1) { - if (is_multi_function_data_socket(from_dsockets[0]->bsocket())) { - return &common.network_map.lookup(*from_dsockets[0]); - } - else { + const DOutputSocket &from_dsocket = *from_dsockets[0]; + if (!from_dsocket.is_available()) { return nullptr; } + if (is_multi_function_data_socket(from_dsocket.bsocket())) { + return &common.network_map.lookup(from_dsocket); + } + return nullptr; } else { - if (is_multi_function_data_socket(from_group_inputs[0]->bsocket())) { - return &common.network_map.lookup(*from_group_inputs[0]); - } - else { - return nullptr; + const DGroupInput &from_group_input = *from_group_inputs[0]; + if (is_multi_function_data_socket(from_group_input.bsocket())) { + return &common.network_map.lookup(from_group_input); } + return nullptr; } } |