[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