[Bf-blender-cvs] [4cb0cb6a06b] functions: improve indexed node tree
Jacques Lucke
noreply at git.blender.org
Thu Jul 4 16:45:51 CEST 2019
Commit: 4cb0cb6a06bd0d3eef43f6ef2730167c93bf9ab9
Author: Jacques Lucke
Date: Thu Jul 4 10:54:17 2019 +0200
Branches: functions
https://developer.blender.org/rB4cb0cb6a06bd0d3eef43f6ef2730167c93bf9ab9
improve indexed node tree
===================================================================
M source/blender/blenkernel/BKE_node_tree.hpp
M source/blender/blenkernel/intern/node_tree.cpp
M source/blender/simulations/bparticles/c_wrapper.cpp
===================================================================
diff --git a/source/blender/blenkernel/BKE_node_tree.hpp b/source/blender/blenkernel/BKE_node_tree.hpp
index 60899b9ff6d..49f5408b003 100644
--- a/source/blender/blenkernel/BKE_node_tree.hpp
+++ b/source/blender/blenkernel/BKE_node_tree.hpp
@@ -22,6 +22,17 @@ using bNodeList = ListBaseWrapper<struct bNode *, true>;
using bLinkList = ListBaseWrapper<struct bNodeLink *, true>;
using bSocketList = ListBaseWrapper<struct bNodeSocket *, true>;
+struct SocketWithNode {
+ bNodeSocket *socket;
+ bNode *node;
+};
+
+struct SingleOriginLink {
+ bNodeSocket *from;
+ bNodeSocket *to;
+ bNodeLink *source_link;
+};
+
/**
* The DNA structure of a node tree is difficult to parse, since it does not support e.g. the
* following queries efficiently:
@@ -35,33 +46,24 @@ class IndexedNodeTree {
public:
IndexedNodeTree(bNodeTree *btree);
- struct SingleOriginLink {
- bNodeSocket *from;
- bNodeSocket *to;
- bNodeLink *source_link;
- };
-
- const ArrayRef<SingleOriginLink> single_origin_links() const
- {
- return m_single_origin_links;
- }
-
- SmallVector<bNode *> nodes_with_idname(StringRef idname) const;
- SmallVector<bNode *> nodes_connected_to_socket(bNodeSocket *bsocket) const;
+ ArrayRef<SingleOriginLink> single_origin_links() const;
+ ArrayRef<bNode *> nodes_with_idname(StringRef idname) const;
+ ArrayRef<SocketWithNode> linked(bNodeSocket *bsocket) const;
private:
bool is_reroute(bNode *bnode) const;
void find_connected_sockets_left(bNodeSocket *bsocket,
- SmallVector<bNodeSocket *> &r_sockets) const;
+ SmallVector<SocketWithNode> &r_sockets) const;
void find_connected_sockets_right(bNodeSocket *bsocket,
- SmallVector<bNodeSocket *> &r_sockets) const;
+ SmallVector<SocketWithNode> &r_sockets) const;
- SmallVector<bNode *> m_nodes;
- SmallVector<bNodeLink *> m_links;
+ SmallVector<bNode *> m_original_nodes;
+ SmallVector<bNodeLink *> m_original_links;
SmallMap<bNodeSocket *, bNode *> m_node_by_socket;
- SmallMultiMap<bNodeSocket *, bNodeSocket *> m_direct_links;
- SmallMultiMap<bNodeSocket *, bNodeSocket *> m_links_without_reroutes;
+ SmallMultiMap<bNodeSocket *, SocketWithNode> m_direct_links;
+ SmallMultiMap<bNodeSocket *, SocketWithNode> m_links;
+ SmallMultiMap<std::string, bNode *> m_nodes_by_idname;
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 243f20ff710..2e30e0e9402 100644
--- a/source/blender/blenkernel/intern/node_tree.cpp
+++ b/source/blender/blenkernel/intern/node_tree.cpp
@@ -4,9 +4,9 @@
namespace BKE {
IndexedNodeTree::IndexedNodeTree(bNodeTree *btree)
- : m_nodes(btree->nodes, true), m_links(btree->links, true)
+ : m_original_nodes(btree->nodes, true), m_original_links(btree->links, true)
{
- for (bNode *bnode : m_nodes) {
+ for (bNode *bnode : m_original_nodes) {
for (bNodeSocket *bsocket : bSocketList(&bnode->inputs)) {
m_node_by_socket.add(bsocket, bnode);
}
@@ -15,51 +15,52 @@ IndexedNodeTree::IndexedNodeTree(bNodeTree *btree)
}
}
- for (bNodeLink *blink : m_links) {
- m_direct_links.add(blink->tosock, blink->fromsock);
- m_direct_links.add(blink->fromsock, blink->tosock);
+ for (bNode *bnode : m_original_nodes) {
+ m_nodes_by_idname.add(bnode->idname, bnode);
}
- for (bNodeLink *blink : m_links) {
- if (!this->is_reroute(blink->fromnode) &&
- !m_links_without_reroutes.contains(blink->fromsock)) {
- SmallVector<bNodeSocket *> others;
- this->find_connected_sockets_right(blink->fromsock, others);
- m_links_without_reroutes.add_multiple_new(blink->fromsock, others);
+ for (bNodeLink *blink : m_original_links) {
+ m_direct_links.add(blink->tosock, {blink->fromsock, blink->fromnode});
+ m_direct_links.add(blink->fromsock, {blink->tosock, blink->tonode});
+ }
+
+ for (bNodeLink *blink : m_original_links) {
+ if (!this->is_reroute(blink->fromnode) && !m_links.contains(blink->fromsock)) {
+ SmallVector<SocketWithNode> connected;
+ this->find_connected_sockets_right(blink->fromsock, connected);
+ m_links.add_multiple_new(blink->fromsock, connected);
}
- if (!this->is_reroute(blink->tonode) && !m_links_without_reroutes.contains(blink->tosock)) {
- 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});
+ if (!this->is_reroute(blink->tonode) && !m_links.contains(blink->tosock)) {
+ SmallVector<SocketWithNode> connected;
+ this->find_connected_sockets_left(blink->tosock, connected);
+ m_links.add_multiple_new(blink->tosock, connected);
+ if (connected.size() == 1) {
+ m_single_origin_links.append(SingleOriginLink{connected[0].socket, blink->tosock, blink});
}
}
}
}
void IndexedNodeTree::find_connected_sockets_left(bNodeSocket *bsocket,
- SmallVector<bNodeSocket *> &r_sockets) const
+ SmallVector<SocketWithNode> &r_sockets) const
{
BLI_assert(bsocket->in_out == SOCK_IN);
- 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);
+ for (SocketWithNode linked : m_direct_links.lookup_default(bsocket)) {
+ if (this->is_reroute(linked.node)) {
+ this->find_connected_sockets_left((bNodeSocket *)linked.node->inputs.first, r_sockets);
}
else {
- r_sockets.append(other);
+ r_sockets.append(linked);
}
}
}
void IndexedNodeTree::find_connected_sockets_right(bNodeSocket *bsocket,
- SmallVector<bNodeSocket *> &r_sockets) const
+ SmallVector<SocketWithNode> &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);
+ for (SocketWithNode other : m_direct_links.lookup_default(bsocket)) {
+ if (this->is_reroute(other.node)) {
+ this->find_connected_sockets_right((bNodeSocket *)other.node->outputs.first, r_sockets);
}
else {
r_sockets.append(other);
@@ -72,25 +73,22 @@ bool IndexedNodeTree::is_reroute(bNode *bnode) const
return STREQ(bnode->idname, "NodeReroute");
}
-SmallVector<bNode *> IndexedNodeTree::nodes_with_idname(StringRef idname) const
+/* Queries
+ *******************************************************/
+
+ArrayRef<bNode *> IndexedNodeTree::nodes_with_idname(StringRef idname) const
{
- SmallVector<bNode *> result;
- for (bNode *bnode : m_nodes) {
- if (bnode->idname == idname) {
- result.append(bnode);
- }
- }
- return result;
+ return m_nodes_by_idname.lookup_default(idname.to_std_string());
}
-SmallVector<bNode *> IndexedNodeTree::nodes_connected_to_socket(bNodeSocket *bsocket) const
+ArrayRef<SocketWithNode> IndexedNodeTree::linked(bNodeSocket *bsocket) const
{
- SmallVector<bNode *> result;
- for (bNodeSocket *other : m_links_without_reroutes.lookup_default(bsocket)) {
- bNode *bnode = m_node_by_socket.lookup(other);
- result.append(bnode);
- }
- return result;
+ return m_links.lookup_default(bsocket);
+}
+
+ArrayRef<SingleOriginLink> IndexedNodeTree::single_origin_links() const
+{
+ return m_single_origin_links;
}
} // namespace BKE
diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp
index 3ff558edbf7..ef29a65011a 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -39,6 +39,7 @@
using namespace BParticles;
using BKE::IndexedNodeTree;
+using BKE::SocketWithNode;
using BLI::ArrayRef;
using BLI::float3;
using BLI::SmallVector;
@@ -228,8 +229,8 @@ class ModifierStepDescription : public StepDescription {
class IndexedBParticlesTree {
private:
IndexedNodeTree &m_indexed_tree;
- SmallVector<bNode *> m_particle_type_nodes;
- SmallVector<bNode *> m_emitter_nodes;
+ ArrayRef<bNode *> m_particle_type_nodes;
+ ArrayRef<bNode *> m_emitter_nodes;
public:
IndexedBParticlesTree(IndexedNodeTree &indexed_tree) : m_indexed_tree(indexed_tree)
@@ -271,8 +272,7 @@ static ModifierStepDescription *step_description_from_node_tree(bNodeTree *btree
auto emitter_nodes = bparticles_tree.emitter_nodes();
for (bNode *emitter_node : emitter_nodes) {
bNodeSocket *emitter_output = (bNodeSocket *)emitter_node->outputs.first;
- auto connected_nodes = indexed_tree.nodes_connected_to_socket(emitter_output);
- for (bNode *connected_node : connected_nodes) {
+ for (SocketWithNode linked : indexed_tree.linked(emitter_output)) {
PointerRNA rna;
RNA_pointer_create(&btree->id, &RNA_Node, emitter_node, &rna);
Object *object = (Object *)RNA_pointer_get(&rna, "object").id.data;
@@ -281,7 +281,7 @@ static ModifierStepDescription *step_description_from_node_tree(bNodeTree *btree
}
Emitter *emitter = EMITTER_mesh_surface(
- connected_node->name, (Mesh *)object->data, object->obmat, object->obmat, 1.0f);
+ linked.node->name, (Mesh *)object->data, object->obmat, object->obmat, 1.0f);
step_description->m_emitters.append(emitter);
}
}
More information about the Bf-blender-cvs
mailing list