diff options
Diffstat (limited to 'source/blender/functions/intern/multi_function_network.cc')
-rw-r--r-- | source/blender/functions/intern/multi_function_network.cc | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/source/blender/functions/intern/multi_function_network.cc b/source/blender/functions/intern/multi_function_network.cc index 5df70d92a4e..11c9c065f51 100644 --- a/source/blender/functions/intern/multi_function_network.cc +++ b/source/blender/functions/intern/multi_function_network.cc @@ -15,6 +15,8 @@ */ #include "BLI_dot_export.hh" +#include "BLI_stack.hh" + #include "FN_multi_function_network.hh" namespace blender::fn { @@ -184,17 +186,18 @@ void MFNetwork::add_link(MFOutputSocket &from, MFInputSocket &to) MFOutputSocket &MFNetwork::add_input(StringRef name, MFDataType data_type) { - return this->add_dummy(name, {}, {data_type}, {}, {name}).output(0); + return this->add_dummy(name, {}, {data_type}, {}, {"Value"}).output(0); } MFInputSocket &MFNetwork::add_output(StringRef name, MFDataType data_type) { - return this->add_dummy(name, {data_type}, {}, {name}, {}).input(0); + return this->add_dummy(name, {data_type}, {}, {"Value"}, {}).input(0); } void MFNetwork::relink(MFOutputSocket &old_output, MFOutputSocket &new_output) { BLI_assert(&old_output != &new_output); + BLI_assert(old_output.data_type_ == new_output.data_type_); for (MFInputSocket *input : old_output.targets()) { input->origin_ = &new_output; } @@ -230,7 +233,43 @@ void MFNetwork::remove(MFNode &node) node_or_null_by_id_[node.id_] = nullptr; } -std::string MFNetwork::to_dot() const +void MFNetwork::remove(Span<MFNode *> nodes) +{ + for (MFNode *node : nodes) { + this->remove(*node); + } +} + +void MFNetwork::find_dependencies(Span<const MFInputSocket *> sockets, + VectorSet<const MFOutputSocket *> &r_dummy_sockets, + VectorSet<const MFInputSocket *> &r_unlinked_inputs) const +{ + Set<const MFNode *> visited_nodes; + Stack<const MFInputSocket *> sockets_to_check; + sockets_to_check.push_multiple(sockets); + + while (!sockets_to_check.is_empty()) { + const MFInputSocket &socket = *sockets_to_check.pop(); + const MFOutputSocket *origin_socket = socket.origin(); + if (origin_socket == nullptr) { + r_unlinked_inputs.add(&socket); + continue; + } + + const MFNode &origin_node = origin_socket->node(); + + if (origin_node.is_dummy()) { + r_dummy_sockets.add(origin_socket); + continue; + } + + if (visited_nodes.add(&origin_node)) { + sockets_to_check.push_multiple(origin_node.inputs()); + } + } +} + +std::string MFNetwork::to_dot(Span<const MFNode *> marked_nodes) const { dot::DirectedGraph digraph; digraph.set_rankdir(dot::Attr_rankdir::LeftToRight); @@ -256,6 +295,13 @@ std::string MFNetwork::to_dot() const dot_nodes.add_new(node, dot_node_ref); } + for (const MFDummyNode *node : dummy_nodes_) { + dot_nodes.lookup(node).node().set_background_color("#77EE77"); + } + for (const MFNode *node : marked_nodes) { + dot_nodes.lookup(node).node().set_background_color("#7777EE"); + } + for (const MFNode *to_node : all_nodes) { dot::NodeWithSocketsRef to_dot_node = dot_nodes.lookup(to_node); |