[Bf-blender-cvs] [d9277bf1c42] functions: support storing multiple connected sockets per socket
Jacques Lucke
noreply at git.blender.org
Wed Jul 3 19:14:12 CEST 2019
Commit: d9277bf1c4234eabcdd59ed8cab6a3feaeb29f49
Author: Jacques Lucke
Date: Wed Jul 3 16:35:36 2019 +0200
Branches: functions
https://developer.blender.org/rBd9277bf1c4234eabcdd59ed8cab6a3feaeb29f49
support storing multiple connected sockets per socket
===================================================================
M source/blender/blenkernel/BKE_node_tree.hpp
M source/blender/blenkernel/intern/node_tree.cpp
===================================================================
diff --git a/source/blender/blenkernel/BKE_node_tree.hpp b/source/blender/blenkernel/BKE_node_tree.hpp
index 9268cd957c1..4f9432ff076 100644
--- a/source/blender/blenkernel/BKE_node_tree.hpp
+++ b/source/blender/blenkernel/BKE_node_tree.hpp
@@ -42,12 +42,17 @@ class NodeTreeQuery {
private:
bool is_reroute(bNode *bnode) const;
- bNodeSocket *try_find_single_origin(bNodeSocket *bsocket) const;
+
+ void find_connected_sockets_left(bNodeSocket *bsocket,
+ SmallVector<bNodeSocket *> &r_sockets) const;
+ void find_connected_sockets_right(bNodeSocket *bsocket,
+ SmallVector<bNodeSocket *> &r_sockets) const;
SmallVector<bNode *> m_nodes;
SmallVector<bNodeLink *> m_links;
SmallMap<bNodeSocket *, bNode *> m_node_by_socket;
MultiMap<bNodeSocket *, bNodeSocket *> m_direct_links;
+ MultiMap<bNodeSocket *, bNodeSocket *> m_links_without_reroutes;
SmallVector<SingleOriginLink> m_single_origin_links;
};
diff --git a/source/blender/blenkernel/intern/node_tree.cpp b/source/blender/blenkernel/intern/node_tree.cpp
index 9ce2d7f6539..dd24d0b6f5e 100644
--- a/source/blender/blenkernel/intern/node_tree.cpp
+++ b/source/blender/blenkernel/intern/node_tree.cpp
@@ -1,4 +1,5 @@
#include "BKE_node_tree.hpp"
+#include "BLI_timeit.hpp"
namespace BKE {
@@ -20,33 +21,48 @@ NodeTreeQuery::NodeTreeQuery(bNodeTree *btree)
}
for (bNodeLink *blink : m_links) {
- bNodeSocket *target = blink->tosock;
- bNode *target_node = blink->tonode;
- if (this->is_reroute(target_node)) {
- continue;
+ if (!this->is_reroute(blink->fromnode)) {
+ SmallVector<bNodeSocket *> others;
+ this->find_connected_sockets_right(blink->fromsock, others);
+ m_links_without_reroutes.add_multiple_new(blink->fromsock, others);
}
- bNodeSocket *origin = this->try_find_single_origin(target);
- if (origin != nullptr) {
- m_single_origin_links.append(SingleOriginLink{origin, target, blink});
+ if (!this->is_reroute(blink->tonode)) {
+ SmallVector<bNodeSocket *> others;
+ this->find_connected_sockets_left(blink->tosock, others);
+ m_links_without_reroutes.add_multiple_new(blink->tosock, others);
+ if (others.size() == 1) {
+ m_single_origin_links.append(SingleOriginLink{others[0], blink->tosock, blink});
+ }
}
}
}
-bNodeSocket *NodeTreeQuery::try_find_single_origin(bNodeSocket *bsocket) const
+void NodeTreeQuery::find_connected_sockets_left(bNodeSocket *bsocket,
+ SmallVector<bNodeSocket *> &r_sockets) const
{
BLI_assert(bsocket->in_out == SOCK_IN);
- if (m_direct_links.values_for_key(bsocket) == 1) {
- bNodeSocket *origin = m_direct_links.lookup(bsocket)[0];
- bNode *origin_node = m_node_by_socket.lookup(origin);
- if (this->is_reroute(origin_node)) {
- return this->try_find_single_origin((bNodeSocket *)origin_node->inputs.first);
+ for (bNodeSocket *other : m_direct_links.lookup_default(bsocket)) {
+ bNode *other_node = m_node_by_socket.lookup(other);
+ if (this->is_reroute(other_node)) {
+ this->find_connected_sockets_left((bNodeSocket *)other_node->inputs.first, r_sockets);
}
else {
- return origin;
+ r_sockets.append(other);
}
}
- else {
- return nullptr;
+}
+void NodeTreeQuery::find_connected_sockets_right(bNodeSocket *bsocket,
+ SmallVector<bNodeSocket *> &r_sockets) const
+{
+ BLI_assert(bsocket->in_out == SOCK_OUT);
+ for (bNodeSocket *other : m_direct_links.lookup_default(bsocket)) {
+ bNode *other_node = m_node_by_socket.lookup(other);
+ if (this->is_reroute(other_node)) {
+ this->find_connected_sockets_right((bNodeSocket *)other_node->outputs.first, r_sockets);
+ }
+ else {
+ r_sockets.append(other);
+ }
}
}
@@ -69,8 +85,8 @@ SmallVector<bNode *> NodeTreeQuery::nodes_with_idname(StringRef idname) const
SmallVector<bNode *> NodeTreeQuery::nodes_connected_to_socket(bNodeSocket *bsocket) const
{
SmallVector<bNode *> result;
- for (bNodeSocket *origin : m_direct_links.lookup_default(bsocket)) {
- bNode *bnode = m_node_by_socket.lookup(origin);
+ for (bNodeSocket *other : m_links_without_reroutes.lookup_default(bsocket)) {
+ bNode *bnode = m_node_by_socket.lookup(other);
result.append(bnode);
}
return result;
More information about the Bf-blender-cvs
mailing list