[Bf-blender-cvs] [d6fcecc4715] spreadsheet-active-node: cleanup
Jacques Lucke
noreply at git.blender.org
Thu Apr 1 13:55:19 CEST 2021
Commit: d6fcecc4715894d332026f3e25b22d8a5a45eb13
Author: Jacques Lucke
Date: Thu Apr 1 12:12:18 2021 +0200
Branches: spreadsheet-active-node
https://developer.blender.org/rBd6fcecc4715894d332026f3e25b22d8a5a45eb13
cleanup
===================================================================
M source/blender/nodes/NOD_node_tree_ref.hh
M source/blender/nodes/intern/node_tree_ref.cc
===================================================================
diff --git a/source/blender/nodes/NOD_node_tree_ref.hh b/source/blender/nodes/NOD_node_tree_ref.hh
index 6dc0457a812..1558efdd245 100644
--- a/source/blender/nodes/NOD_node_tree_ref.hh
+++ b/source/blender/nodes/NOD_node_tree_ref.hh
@@ -85,6 +85,8 @@ class SocketRef : NonCopyable, NonMovable {
/* These sockets are linked when reroutes, muted links and muted nodes have been taken into
* account. */
MutableSpan<const SocketRef *> logically_linked_sockets_;
+ /* These are the sockets that have been skipped when searching for logicaly linked sockets. That
+ * includes for example the input and output socket of an intermediate reroute node. */
MutableSpan<const SocketRef *> logically_linked_skipped_sockets_;
friend NodeTreeRef;
@@ -136,6 +138,7 @@ class InputSocketRef final : public SocketRef {
bool is_multi_input_socket() const;
void foreach_logical_origin(FunctionRef<void(const OutputSocketRef &)> callback,
+ FunctionRef<void(const SocketRef &)> skipped_callback,
bool only_follow_first_input_link = false) const;
};
diff --git a/source/blender/nodes/intern/node_tree_ref.cc b/source/blender/nodes/intern/node_tree_ref.cc
index 5ddccba6ad6..19d1f37e01c 100644
--- a/source/blender/nodes/intern/node_tree_ref.cc
+++ b/source/blender/nodes/intern/node_tree_ref.cc
@@ -172,8 +172,10 @@ void NodeTreeRef::create_linked_socket_caches()
/* Find logically linked sockets. */
Vector<const SocketRef *> logically_linked_sockets;
+ Vector<const SocketRef *> logically_linked_skipped_sockets;
socket->foreach_logical_origin(
- [&](const OutputSocketRef &origin) { logically_linked_sockets.append(&origin); }, {});
+ [&](const OutputSocketRef &origin) { logically_linked_sockets.append(&origin); },
+ [&](const SocketRef &socket) { logically_linked_skipped_sockets.append(&socket); });
if (logically_linked_sockets == directly_linked_sockets) {
socket->logically_linked_sockets_ = socket->directly_linked_sockets_;
}
@@ -181,6 +183,8 @@ void NodeTreeRef::create_linked_socket_caches()
socket->logically_linked_sockets_ = allocator_.construct_array_copy(
logically_linked_sockets.as_span());
}
+ socket->logically_linked_skipped_sockets_ = allocator_.construct_array_copy(
+ logically_linked_skipped_sockets.as_span());
}
for (OutputSocketRef *socket : output_sockets_) {
@@ -211,6 +215,7 @@ void NodeTreeRef::create_linked_socket_caches()
}
void InputSocketRef::foreach_logical_origin(FunctionRef<void(const OutputSocketRef &)> callback,
+ FunctionRef<void(const SocketRef &)> skipped_callback,
bool only_follow_first_input_link) const
{
Span<const LinkRef *> links_to_check = this->directly_linked_links();
@@ -224,12 +229,19 @@ void InputSocketRef::foreach_logical_origin(FunctionRef<void(const OutputSocketR
const OutputSocketRef &origin = link->from();
const NodeRef &origin_node = origin.node();
if (origin_node.is_reroute_node()) {
- origin_node.input(0).foreach_logical_origin(callback, false);
+ const InputSocketRef &reroute_input = origin_node.input(0);
+ const OutputSocketRef &reroute_output = origin_node.output(0);
+ skipped_callback.call_if_available(reroute_input);
+ skipped_callback.call_if_available(reroute_output);
+ reroute_input.foreach_logical_origin(callback, skipped_callback, false);
}
else if (origin_node.is_muted()) {
for (const InternalLinkRef *internal_link : origin_node.internal_links()) {
if (&internal_link->to() == &origin) {
- internal_link->from().foreach_logical_origin(callback, true);
+ const InputSocketRef &mute_input = internal_link->from();
+ skipped_callback.call_if_available(origin);
+ skipped_callback.call_if_available(mute_input);
+ mute_input.foreach_logical_origin(callback, skipped_callback, true);
break;
}
}
More information about the Bf-blender-cvs
mailing list