[Bf-blender-cvs] [d94d68afde0] functions: parse very simple bparticles node tree

Jacques Lucke noreply at git.blender.org
Tue Jul 2 16:12:02 CEST 2019


Commit: d94d68afde0620ef85bacd694373df915978e867
Author: Jacques Lucke
Date:   Tue Jul 2 16:09:56 2019 +0200
Branches: functions
https://developer.blender.org/rBd94d68afde0620ef85bacd694373df915978e867

parse very simple bparticles node tree

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

M	release/scripts/startup/nodes/bparticle_nodes/mesh_emitter.py
M	source/blender/blenkernel/BKE_node_tree.hpp
M	source/blender/blenkernel/intern/node_tree.cpp
M	source/blender/simulations/bparticles/c_wrapper.cpp
M	source/blender/simulations/bparticles/simulate.cpp

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

diff --git a/release/scripts/startup/nodes/bparticle_nodes/mesh_emitter.py b/release/scripts/startup/nodes/bparticle_nodes/mesh_emitter.py
index 467ddf948c7..374e38f1771 100644
--- a/release/scripts/startup/nodes/bparticle_nodes/mesh_emitter.py
+++ b/release/scripts/startup/nodes/bparticle_nodes/mesh_emitter.py
@@ -1,4 +1,5 @@
 import bpy
+from bpy.props import *
 from .. base import BParticlesNode
 from .. socket_builder import SocketBuilder
 
@@ -6,5 +7,13 @@ class MeshEmitterNode(bpy.types.Node, BParticlesNode):
     bl_idname = "bp_MeshEmitterNode"
     bl_label = "Mesh Emitter"
 
+    object: PointerProperty(
+        name="Object",
+        type=bpy.types.Object,
+    )
+
     def declaration(self, builder : SocketBuilder):
         builder.emitter_output("emitter", "Emitter")
+
+    def draw(self, layout):
+        layout.prop(self, "object", text="")
diff --git a/source/blender/blenkernel/BKE_node_tree.hpp b/source/blender/blenkernel/BKE_node_tree.hpp
index 16e03b028f6..32a66590cd6 100644
--- a/source/blender/blenkernel/BKE_node_tree.hpp
+++ b/source/blender/blenkernel/BKE_node_tree.hpp
@@ -38,6 +38,7 @@ class BNodeTreeLookup {
   }
 
   SmallVector<bNode *> nodes_with_idname(StringRef idname);
+  SmallVector<bNode *> nodes_connected_to_socket(bNodeSocket *bsocket);
 
  private:
   bool is_reroute(bNode *bnode);
@@ -45,7 +46,7 @@ class BNodeTreeLookup {
 
   SmallVector<bNode *> m_nodes;
   SmallMap<bNodeSocket *, bNode *> m_node_by_socket;
-  MultiMap<bNodeSocket *, bNodeSocket *> m_direct_origins;
+  MultiMap<bNodeSocket *, bNodeSocket *> m_direct_links;
   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 4980ed69190..0427b49f0ad 100644
--- a/source/blender/blenkernel/intern/node_tree.cpp
+++ b/source/blender/blenkernel/intern/node_tree.cpp
@@ -14,7 +14,8 @@ BNodeTreeLookup::BNodeTreeLookup(bNodeTree *btree) : m_nodes(btree->nodes, true)
   }
 
   for (bNodeLink *blink : bLinkList(&btree->links)) {
-    m_direct_origins.add(blink->tosock, blink->fromsock);
+    m_direct_links.add(blink->tosock, blink->fromsock);
+    m_direct_links.add(blink->fromsock, blink->tosock);
   }
 
   for (bNodeLink *blink : bLinkList(&btree->links)) {
@@ -33,8 +34,8 @@ BNodeTreeLookup::BNodeTreeLookup(bNodeTree *btree) : m_nodes(btree->nodes, true)
 bNodeSocket *BNodeTreeLookup::try_find_single_origin(bNodeSocket *bsocket)
 {
   BLI_assert(bsocket->in_out == SOCK_IN);
-  if (m_direct_origins.values_for_key(bsocket) == 1) {
-    bNodeSocket *origin = m_direct_origins.lookup(bsocket)[0];
+  if (m_direct_links.values_for_key(bsocket) == 1) {
+    bNodeSocket *origin = m_direct_links.lookup(bsocket)[0];
     bNode *origin_node = m_node_by_socket.lookup(origin);
     if (this->is_reroute(origin_node)) {
       return this->try_find_single_origin((bNodeSocket *)origin_node->inputs.first);
@@ -64,4 +65,14 @@ SmallVector<bNode *> BNodeTreeLookup::nodes_with_idname(StringRef idname)
   return result;
 }
 
+SmallVector<bNode *> BNodeTreeLookup::nodes_connected_to_socket(bNodeSocket *bsocket)
+{
+  SmallVector<bNode *> result;
+  for (bNodeSocket *origin : m_direct_links.lookup_default(bsocket)) {
+    bNode *bnode = m_node_by_socket.lookup(origin);
+    result.append(bnode);
+  }
+  return result;
+}
+
 }  // namespace BKE
diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp
index f7cae99927a..6bbd18be706 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -16,12 +16,16 @@
 #include "BKE_customdata.h"
 #include "BKE_node_tree.hpp"
 
+#include "DEG_depsgraph_query.h"
+
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_modifier_types.h"
 #include "DNA_object_types.h"
 #include "DNA_curve_types.h"
 
+#include "RNA_access.h"
+
 #define WRAPPERS(T1, T2) \
   inline T1 unwrap(T2 value) \
   { \
@@ -226,13 +230,38 @@ static ModifierStepDescription *step_description_from_node_tree(bNodeTree *btree
   ModifierStepDescription *step_description = new ModifierStepDescription();
   BNodeTreeLookup btree_lookup(btree);
 
+  SmallMap<bNode *, uint> id_per_type_node;
+
   auto particle_type_nodes = btree_lookup.nodes_with_idname("bp_ParticleTypeNode");
   for (uint i = 0; i < particle_type_nodes.size(); i++) {
+    bNode *particle_type_node = particle_type_nodes[i];
+
     ModifierParticleType *type = new ModifierParticleType();
+    type->m_integrator = new EulerIntegrator();
     step_description->m_types.add_new(i, type);
     step_description->m_particle_type_ids.append(i);
+    id_per_type_node.add_new(particle_type_node, i);
   }
 
+  auto emitter_nodes = btree_lookup.nodes_with_idname("bp_MeshEmitterNode");
+  for (bNode *emitter_node : emitter_nodes) {
+    bNodeSocket *emitter_output = (bNodeSocket *)emitter_node->outputs.first;
+    auto connected_nodes = btree_lookup.nodes_connected_to_socket(emitter_output);
+    for (bNode *connected_node : connected_nodes) {
+      uint type_id = id_per_type_node.lookup(connected_node);
+
+      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(
+          type_id, (Mesh *)object->data, object->obmat, object->obmat, 1.0f);
+      step_description->m_emitters.append(emitter);
+    }
+  }
   return step_description;
 }
 
@@ -247,7 +276,7 @@ void BParticles_simulate_modifier(NodeParticlesModifierData *npmd,
   }
 
   ModifierStepDescription *step_description = step_description_from_node_tree(
-      npmd->bparticles_tree);
+      (bNodeTree *)DEG_get_original_id((ID *)npmd->bparticles_tree));
   step_description->m_duration = 1.0f / 24.0f;
 
   ParticlesState &state = *unwrap(state_c);
diff --git a/source/blender/simulations/bparticles/simulate.cpp b/source/blender/simulations/bparticles/simulate.cpp
index a58294ec8c8..4c93198f411 100644
--- a/source/blender/simulations/bparticles/simulate.cpp
+++ b/source/blender/simulations/bparticles/simulate.cpp
@@ -592,11 +592,13 @@ BLI_NOINLINE static void simulate_blocks_from_birth_to_current_time(
       USE_THREADING);
 }
 
-BLI_NOINLINE static SmallVector<ParticlesBlock *> get_all_blocks(ParticlesState &state)
+BLI_NOINLINE static SmallVector<ParticlesBlock *> get_all_blocks(ParticlesState &state,
+                                                                 ArrayRef<uint> particle_type_ids)
 {
   SmallVector<ParticlesBlock *> blocks;
-  for (ParticlesContainer *container : state.particle_containers().values()) {
-    for (ParticlesBlock *block : container->active_blocks()) {
+  for (uint particle_type_id : particle_type_ids) {
+    ParticlesContainer &container = state.particle_container(particle_type_id);
+    for (ParticlesBlock *block : container.active_blocks()) {
       blocks.append(block);
     }
   }
@@ -619,9 +621,10 @@ BLI_NOINLINE static void delete_tagged_particles_and_reorder(ParticlesBlock &blo
   }
 }
 
-BLI_NOINLINE static void delete_tagged_particles(ParticlesState &state)
+BLI_NOINLINE static void delete_tagged_particles(ParticlesState &state,
+                                                 ArrayRef<uint> particle_type_ids)
 {
-  SmallVector<ParticlesBlock *> blocks = get_all_blocks(state);
+  SmallVector<ParticlesBlock *> blocks = get_all_blocks(state, particle_type_ids);
 
   BLI::Task::parallel_array_elements(
       ArrayRef<ParticlesBlock *>(blocks),
@@ -709,7 +712,8 @@ BLI_NOINLINE static void simulate_all_existing_blocks(ParticlesState &state,
                                                       BlockAllocators &block_allocators,
                                                       TimeSpan time_span)
 {
-  SmallVector<ParticlesBlock *> blocks = get_all_blocks(state);
+  SmallVector<ParticlesBlock *> blocks = get_all_blocks(state,
+                                                        step_description.particle_type_ids());
   simulate_blocks_for_time_span(block_allocators, blocks, step_description, time_span);
 }
 
@@ -754,7 +758,7 @@ void simulate_step(ParticlesState &state, StepDescription &step_description)
 
   emit_and_simulate_particles(state, step_description, time_span);
 
-  delete_tagged_particles(state);
+  delete_tagged_particles(state, step_description.particle_type_ids());
   compress_all_containers(state);
 }



More information about the Bf-blender-cvs mailing list