[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