[Bf-blender-cvs] [c44a8e5eded] functions: initial emitter inserter

Jacques Lucke noreply at git.blender.org
Thu Jul 4 16:45:53 CEST 2019


Commit: c44a8e5ededf3331a067827c33775861f64201fa
Author: Jacques Lucke
Date:   Thu Jul 4 11:17:21 2019 +0200
Branches: functions
https://developer.blender.org/rBc44a8e5ededf3331a067827c33775861f64201fa

initial emitter inserter

===================================================================

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 49f5408b003..0b7cc629d3e 100644
--- a/source/blender/blenkernel/BKE_node_tree.hpp
+++ b/source/blender/blenkernel/BKE_node_tree.hpp
@@ -46,6 +46,16 @@ class IndexedNodeTree {
  public:
   IndexedNodeTree(bNodeTree *btree);
 
+  bNodeTree *btree() const
+  {
+    return m_btree;
+  }
+
+  ID *btree_id() const
+  {
+    return &m_btree->id;
+  }
+
   ArrayRef<SingleOriginLink> single_origin_links() const;
   ArrayRef<bNode *> nodes_with_idname(StringRef idname) const;
   ArrayRef<SocketWithNode> linked(bNodeSocket *bsocket) const;
@@ -58,6 +68,7 @@ class IndexedNodeTree {
   void find_connected_sockets_right(bNodeSocket *bsocket,
                                     SmallVector<SocketWithNode> &r_sockets) const;
 
+  bNodeTree *m_btree;
   SmallVector<bNode *> m_original_nodes;
   SmallVector<bNodeLink *> m_original_links;
   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 2e30e0e9402..09b8b3a269b 100644
--- a/source/blender/blenkernel/intern/node_tree.cpp
+++ b/source/blender/blenkernel/intern/node_tree.cpp
@@ -4,7 +4,7 @@
 namespace BKE {
 
 IndexedNodeTree::IndexedNodeTree(bNodeTree *btree)
-    : m_original_nodes(btree->nodes, true), m_original_links(btree->links, true)
+    : m_btree(btree), m_original_nodes(btree->nodes, true), m_original_links(btree->links, true)
 {
   for (bNode *bnode : m_original_nodes) {
     for (bNodeSocket *bsocket : bSocketList(&bnode->inputs)) {
diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp
index ef29a65011a..29914a446e8 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -248,10 +248,58 @@ class IndexedBParticlesTree {
   {
     return m_emitter_nodes;
   }
+
+  const IndexedNodeTree &base() const
+  {
+    return m_indexed_tree;
+  }
+
+  bool is_particle_type_node(bNode *bnode) const
+  {
+    return STREQ(bnode->idname, "bp_ParticleTypeNode");
+  }
+
+  ID *btree_id() const
+  {
+    return m_indexed_tree.btree_id();
+  }
 };
 
+typedef std::function<void(
+    bNode *bnode, IndexedBParticlesTree &bparticles_tree, SmallVector<Emitter *> &r_emitters)>
+    EmitterInserter;
+
+static void INSERT_EMITTER_mesh_surface(bNode *emitter_node,
+                                        IndexedBParticlesTree &bparticles_tree,
+                                        SmallVector<Emitter *> &r_emitters)
+{
+  BLI_assert(STREQ(emitter_node->idname, "bp_MeshEmitterNode"));
+  bNodeSocket *emitter_output = (bNodeSocket *)emitter_node->outputs.first;
+  for (SocketWithNode linked : bparticles_tree.base().linked(emitter_output)) {
+    if (!bparticles_tree.is_particle_type_node(linked.node)) {
+      continue;
+    }
+
+    bNode *type_node = linked.node;
+
+    PointerRNA rna;
+    RNA_pointer_create(bparticles_tree.btree_id(), &RNA_Node, emitter_node, &rna);
+    Object *object = (Object *)RNA_pointer_get(&rna, "object").id.data;
+    if (object == nullptr) {
+      continue;
+    }
+
+    Emitter *emitter = EMITTER_mesh_surface(
+        type_node->name, (Mesh *)object->data, object->obmat, object->obmat, 1.0f);
+    r_emitters.append(emitter);
+  }
+}
+
 static ModifierStepDescription *step_description_from_node_tree(bNodeTree *btree)
 {
+  SmallMap<std::string, EmitterInserter> emitter_inserters;
+  emitter_inserters.add_new("bp_MeshEmitterNode", INSERT_EMITTER_mesh_surface);
+
   ModifierStepDescription *step_description = new ModifierStepDescription();
 
   IndexedNodeTree indexed_tree(btree);
@@ -269,22 +317,12 @@ static ModifierStepDescription *step_description_from_node_tree(bNodeTree *btree
     step_description->m_particle_type_names.append(type_name);
   }
 
-  auto emitter_nodes = bparticles_tree.emitter_nodes();
-  for (bNode *emitter_node : emitter_nodes) {
-    bNodeSocket *emitter_output = (bNodeSocket *)emitter_node->outputs.first;
-    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;
-      if (object == nullptr) {
-        continue;
-      }
-
-      Emitter *emitter = EMITTER_mesh_surface(
-          linked.node->name, (Mesh *)object->data, object->obmat, object->obmat, 1.0f);
-      step_description->m_emitters.append(emitter);
+  for (auto item : emitter_inserters.items()) {
+    for (bNode *emitter_node : indexed_tree.nodes_with_idname(item.key)) {
+      item.value(emitter_node, bparticles_tree, step_description->m_emitters);
     }
   }
+
   return step_description;
 }



More information about the Bf-blender-cvs mailing list