[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