[Bf-blender-cvs] [29413c894b1] functions: class to simplify querying bparticle node tree
Jacques Lucke
noreply at git.blender.org
Wed Jul 3 19:14:03 CEST 2019
Commit: 29413c894b1c7858ec181bc1d7f33fe60c3642a3
Author: Jacques Lucke
Date: Wed Jul 3 15:51:39 2019 +0200
Branches: functions
https://developer.blender.org/rB29413c894b1c7858ec181bc1d7f33fe60c3642a3
class to simplify querying bparticle node tree
===================================================================
M source/blender/blenkernel/BKE_node_tree.hpp
M source/blender/blenkernel/intern/node_tree.cpp
M source/blender/blenlib/BLI_multimap.hpp
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 9f9fce36601..820e316631b 100644
--- a/source/blender/blenkernel/BKE_node_tree.hpp
+++ b/source/blender/blenkernel/BKE_node_tree.hpp
@@ -32,17 +32,17 @@ class NodeTreeQuery {
bNodeLink *source_link;
};
- const ArrayRef<SingleOriginLink> single_origin_links()
+ const ArrayRef<SingleOriginLink> single_origin_links() const
{
return m_single_origin_links;
}
- SmallVector<bNode *> nodes_with_idname(StringRef idname);
- SmallVector<bNode *> nodes_connected_to_socket(bNodeSocket *bsocket);
+ SmallVector<bNode *> nodes_with_idname(StringRef idname) const;
+ SmallVector<bNode *> nodes_connected_to_socket(bNodeSocket *bsocket) const;
private:
- bool is_reroute(bNode *bnode);
- bNodeSocket *try_find_single_origin(bNodeSocket *bsocket);
+ bool is_reroute(bNode *bnode) const;
+ bNodeSocket *try_find_single_origin(bNodeSocket *bsocket) const;
SmallVector<bNode *> m_nodes;
SmallMap<bNodeSocket *, bNode *> m_node_by_socket;
diff --git a/source/blender/blenkernel/intern/node_tree.cpp b/source/blender/blenkernel/intern/node_tree.cpp
index a2de8dc7db5..6d47f81263e 100644
--- a/source/blender/blenkernel/intern/node_tree.cpp
+++ b/source/blender/blenkernel/intern/node_tree.cpp
@@ -31,7 +31,7 @@ NodeTreeQuery::NodeTreeQuery(bNodeTree *btree) : m_nodes(btree->nodes, true)
}
}
-bNodeSocket *NodeTreeQuery::try_find_single_origin(bNodeSocket *bsocket)
+bNodeSocket *NodeTreeQuery::try_find_single_origin(bNodeSocket *bsocket) const
{
BLI_assert(bsocket->in_out == SOCK_IN);
if (m_direct_links.values_for_key(bsocket) == 1) {
@@ -49,12 +49,12 @@ bNodeSocket *NodeTreeQuery::try_find_single_origin(bNodeSocket *bsocket)
}
}
-bool NodeTreeQuery::is_reroute(bNode *bnode)
+bool NodeTreeQuery::is_reroute(bNode *bnode) const
{
return STREQ(bnode->idname, "NodeReroute");
}
-SmallVector<bNode *> NodeTreeQuery::nodes_with_idname(StringRef idname)
+SmallVector<bNode *> NodeTreeQuery::nodes_with_idname(StringRef idname) const
{
SmallVector<bNode *> result;
for (bNode *bnode : m_nodes) {
@@ -65,7 +65,7 @@ SmallVector<bNode *> NodeTreeQuery::nodes_with_idname(StringRef idname)
return result;
}
-SmallVector<bNode *> NodeTreeQuery::nodes_connected_to_socket(bNodeSocket *bsocket)
+SmallVector<bNode *> NodeTreeQuery::nodes_connected_to_socket(bNodeSocket *bsocket) const
{
SmallVector<bNode *> result;
for (bNodeSocket *origin : m_direct_links.lookup_default(bsocket)) {
diff --git a/source/blender/blenlib/BLI_multimap.hpp b/source/blender/blenlib/BLI_multimap.hpp
index 1e4e893fcc1..48a6d9dcd4f 100644
--- a/source/blender/blenlib/BLI_multimap.hpp
+++ b/source/blender/blenlib/BLI_multimap.hpp
@@ -100,7 +100,7 @@ template<typename K, typename V> class MultiMap {
return ArrayRef<V>(entry.ptr, entry.length);
}
- ArrayRef<V> lookup_default(const K &key, ArrayRef<V> default_return = ArrayRef<V>())
+ ArrayRef<V> lookup_default(const K &key, ArrayRef<V> default_return = ArrayRef<V>()) const
{
Entry *entry = m_map.lookup_ptr(key);
if (entry == nullptr) {
diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp
index 81b35107fe2..2cd2dcfce42 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -225,16 +225,39 @@ class ModifierStepDescription : public StepDescription {
}
};
+class BParticlesTreeQuery : public NodeTreeQuery {
+ private:
+ SmallVector<bNode *> m_particle_type_nodes;
+ SmallVector<bNode *> m_emitter_nodes;
+
+ public:
+ BParticlesTreeQuery(bNodeTree *btree) : NodeTreeQuery(btree)
+ {
+ m_particle_type_nodes = this->nodes_with_idname("bp_ParticleTypeNode");
+ m_emitter_nodes = this->nodes_with_idname("bp_MeshEmitterNode");
+ }
+
+ ArrayRef<bNode *> type_nodes() const
+ {
+ return m_particle_type_nodes;
+ }
+
+ ArrayRef<bNode *> emitter_nodes() const
+ {
+ return m_emitter_nodes;
+ }
+};
+
static ModifierStepDescription *step_description_from_node_tree(bNodeTree *btree)
{
ModifierStepDescription *step_description = new ModifierStepDescription();
- NodeTreeQuery btree_query(btree);
+ BParticlesTreeQuery btree_query(btree);
SmallMap<bNode *, uint> id_per_type_node;
- auto particle_type_nodes = btree_query.nodes_with_idname("bp_ParticleTypeNode");
- for (uint i = 0; i < particle_type_nodes.size(); i++) {
- bNode *particle_type_node = particle_type_nodes[i];
+ auto type_nodes = btree_query.type_nodes();
+ for (uint i = 0; i < type_nodes.size(); i++) {
+ bNode *particle_type_node = type_nodes[i];
ModifierParticleType *type = new ModifierParticleType();
type->m_integrator = new EulerIntegrator();
@@ -243,7 +266,7 @@ static ModifierStepDescription *step_description_from_node_tree(bNodeTree *btree
id_per_type_node.add_new(particle_type_node, i);
}
- auto emitter_nodes = btree_query.nodes_with_idname("bp_MeshEmitterNode");
+ auto emitter_nodes = btree_query.emitter_nodes();
for (bNode *emitter_node : emitter_nodes) {
bNodeSocket *emitter_output = (bNodeSocket *)emitter_node->outputs.first;
auto connected_nodes = btree_query.nodes_connected_to_socket(emitter_output);
More information about the Bf-blender-cvs
mailing list