Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/nodes/intern/node_tree_ref.cc')
-rw-r--r--source/blender/nodes/intern/node_tree_ref.cc90
1 files changed, 56 insertions, 34 deletions
diff --git a/source/blender/nodes/intern/node_tree_ref.cc b/source/blender/nodes/intern/node_tree_ref.cc
index e627a7f4497..d9ae594a860 100644
--- a/source/blender/nodes/intern/node_tree_ref.cc
+++ b/source/blender/nodes/intern/node_tree_ref.cc
@@ -163,7 +163,7 @@ void NodeTreeRef::create_linked_socket_caches()
{
for (InputSocketRef *socket : input_sockets_) {
/* Find directly linked socket based on incident links. */
- Vector<SocketRef *> directly_linked_sockets;
+ Vector<const SocketRef *> directly_linked_sockets;
for (LinkRef *link : socket->directly_linked_links_) {
directly_linked_sockets.append(link->from_);
}
@@ -171,9 +171,11 @@ void NodeTreeRef::create_linked_socket_caches()
directly_linked_sockets.as_span());
/* Find logically linked sockets. */
- Vector<SocketRef *> logically_linked_sockets;
- this->foreach_logical_origin(
- *socket, [&](OutputSocketRef &origin) { logically_linked_sockets.append(&origin); });
+ 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 SocketRef &socket) { logically_linked_skipped_sockets.append(&socket); });
if (logically_linked_sockets == directly_linked_sockets) {
socket->logically_linked_sockets_ = socket->directly_linked_sockets_;
}
@@ -181,11 +183,13 @@ 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_) {
/* Find directly linked socket based on incident links. */
- Vector<SocketRef *> directly_linked_sockets;
+ Vector<const SocketRef *> directly_linked_sockets;
for (LinkRef *link : socket->directly_linked_links_) {
directly_linked_sockets.append(link->to_);
}
@@ -193,9 +197,11 @@ void NodeTreeRef::create_linked_socket_caches()
directly_linked_sockets.as_span());
/* Find logically linked sockets. */
- Vector<SocketRef *> logically_linked_sockets;
- this->foreach_logical_target(
- *socket, [&](InputSocketRef &target) { logically_linked_sockets.append(&target); });
+ Vector<const SocketRef *> logically_linked_sockets;
+ Vector<const SocketRef *> logically_linked_skipped_sockets;
+ socket->foreach_logical_target(
+ [&](const InputSocketRef &target) { logically_linked_sockets.append(&target); },
+ [&](const SocketRef &socket) { logically_linked_skipped_sockets.append(&socket); });
if (logically_linked_sockets == directly_linked_sockets) {
socket->logically_linked_sockets_ = socket->directly_linked_sockets_;
}
@@ -203,61 +209,77 @@ 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());
}
}
-void NodeTreeRef::foreach_logical_origin(InputSocketRef &socket,
- FunctionRef<void(OutputSocketRef &)> callback,
- bool only_follow_first_input_link)
+void InputSocketRef::foreach_logical_origin(FunctionRef<void(const OutputSocketRef &)> origin_fn,
+ FunctionRef<void(const SocketRef &)> skipped_fn,
+ bool only_follow_first_input_link) const
{
- Span<LinkRef *> links_to_check = socket.directly_linked_links_;
+ Span<const LinkRef *> links_to_check = this->directly_linked_links();
if (only_follow_first_input_link) {
links_to_check = links_to_check.take_front(1);
}
- for (LinkRef *link : links_to_check) {
+ for (const LinkRef *link : links_to_check) {
if (link->is_muted()) {
continue;
}
- OutputSocketRef *origin = link->from_;
- NodeRef *origin_node = origin->node_;
- if (origin_node->is_reroute_node()) {
- this->foreach_logical_origin(*origin_node->inputs_[0], callback, false);
+ const OutputSocketRef &origin = link->from();
+ const NodeRef &origin_node = origin.node();
+ if (origin_node.is_reroute_node()) {
+ const InputSocketRef &reroute_input = origin_node.input(0);
+ const OutputSocketRef &reroute_output = origin_node.output(0);
+ skipped_fn.call_safe(reroute_input);
+ skipped_fn.call_safe(reroute_output);
+ reroute_input.foreach_logical_origin(origin_fn, skipped_fn, false);
}
- else if (origin_node->is_muted()) {
- for (InternalLinkRef *internal_link : origin_node->internal_links_) {
- if (internal_link->to_ == origin) {
- this->foreach_logical_origin(*internal_link->from_, callback, true);
+ else if (origin_node.is_muted()) {
+ for (const InternalLinkRef *internal_link : origin_node.internal_links()) {
+ if (&internal_link->to() == &origin) {
+ const InputSocketRef &mute_input = internal_link->from();
+ skipped_fn.call_safe(origin);
+ skipped_fn.call_safe(mute_input);
+ mute_input.foreach_logical_origin(origin_fn, skipped_fn, true);
break;
}
}
}
else {
- callback(*origin);
+ origin_fn(origin);
}
}
}
-void NodeTreeRef::foreach_logical_target(OutputSocketRef &socket,
- FunctionRef<void(InputSocketRef &)> callback)
+void OutputSocketRef::foreach_logical_target(FunctionRef<void(const InputSocketRef &)> target_fn,
+ FunctionRef<void(const SocketRef &)> skipped_fn) const
{
- for (LinkRef *link : socket.directly_linked_links_) {
+ for (const LinkRef *link : this->directly_linked_links()) {
if (link->is_muted()) {
continue;
}
- InputSocketRef *target = link->to_;
- NodeRef *target_node = target->node_;
- if (target_node->is_reroute_node()) {
- this->foreach_logical_target(*target_node->outputs_[0], callback);
+ const InputSocketRef &target = link->to();
+ const NodeRef &target_node = target.node();
+ if (target_node.is_reroute_node()) {
+ const OutputSocketRef &reroute_output = target_node.output(0);
+ skipped_fn.call_safe(target);
+ skipped_fn.call_safe(reroute_output);
+ reroute_output.foreach_logical_target(target_fn, skipped_fn);
}
- else if (target_node->is_muted()) {
- for (InternalLinkRef *internal_link : target_node->internal_links_) {
- if (internal_link->from_ == target) {
- this->foreach_logical_target(*internal_link->to_, callback);
+ else if (target_node.is_muted()) {
+ skipped_fn.call_safe(target);
+ for (const InternalLinkRef *internal_link : target_node.internal_links()) {
+ if (&internal_link->from() == &target) {
+ const OutputSocketRef &mute_output = internal_link->to();
+ skipped_fn.call_safe(target);
+ skipped_fn.call_safe(mute_output);
+ mute_output.foreach_logical_target(target_fn, skipped_fn);
}
}
}
else {
- callback(*target);
+ target_fn(target);
}
}
}