[Bf-blender-cvs] [32e435bbc33] functions: simplify event inserters
Jacques Lucke
noreply at git.blender.org
Thu Jul 11 17:15:36 CEST 2019
Commit: 32e435bbc3320438a459aeda74294eb00212c668
Author: Jacques Lucke
Date: Thu Jul 11 14:44:01 2019 +0200
Branches: functions
https://developer.blender.org/rB32e435bbc3320438a459aeda74294eb00212c668
simplify event inserters
===================================================================
M source/blender/simulations/bparticles/inserters.cpp
M source/blender/simulations/bparticles/inserters.hpp
M source/blender/simulations/bparticles/node_frontend.cpp
===================================================================
diff --git a/source/blender/simulations/bparticles/inserters.cpp b/source/blender/simulations/bparticles/inserters.cpp
index cd07783a9cf..4fb6f834dba 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -256,62 +256,11 @@ static void INSERT_EMITTER_point(ProcessNodeInterface &interface)
}
}
-static void INSERT_EVENT_age_reached(ProcessNodeInterface &interface)
-{
- FN::SharedFunction fn = create_function_for_data_inputs(
- interface.bnode(), interface.indexed_tree(), interface.data_graph());
-
- for (SocketWithNode linked : interface.linked_with_input(0)) {
- if (!is_particle_type_node(linked.node)) {
- continue;
- }
-
- auto action = build_action({interface.outputs().get(0), interface.bnode()},
- interface.indexed_tree(),
- interface.data_graph(),
- interface.step_description());
- auto event = EVENT_age_reached(interface.bnode()->name, fn, std::move(action));
-
- bNode *type_node = linked.node;
- interface.step_description()
- .m_types.lookup_ref(type_node->name)
- ->m_events.append(event.release());
- }
-}
-
-static void INSERT_EVENT_mesh_collision(ProcessNodeInterface &interface)
-{
- for (SocketWithNode linked : interface.linked_with_input(0)) {
- if (!is_particle_type_node(linked.node)) {
- continue;
- }
-
- PointerRNA rna = interface.node_rna();
- Object *object = (Object *)RNA_pointer_get(&rna, "object").id.data;
- if (object == nullptr || object->type != OB_MESH) {
- continue;
- }
-
- auto action = build_action({interface.outputs().get(0), interface.bnode()},
- interface.indexed_tree(),
- interface.data_graph(),
- interface.step_description());
- auto event = EVENT_mesh_collision(interface.bnode()->name, object, std::move(action));
-
- bNode *type_node = linked.node;
- interface.step_description()
- .m_types.lookup_ref(type_node->name)
- ->m_events.append(event.release());
- }
-}
-
BLI_LAZY_INIT(ProcessFunctionsMap, get_node_processors)
{
ProcessFunctionsMap processors;
processors.add_new("bp_MeshEmitterNode", INSERT_EMITTER_mesh_surface);
processors.add_new("bp_PointEmitterNode", INSERT_EMITTER_point);
- processors.add_new("bp_AgeReachedEventNode", INSERT_EVENT_age_reached);
- processors.add_new("bp_MeshCollisionEventNode", INSERT_EVENT_mesh_collision);
return processors;
}
@@ -335,4 +284,38 @@ BLI_LAZY_INIT(ForceFromNodeCallbackMap, get_force_builders)
return map;
}
+static std::unique_ptr<Event> Build_EVENT_mesh_collision(BuildContext &ctx, bNode *bnode)
+{
+ PointerRNA rna = ctx.indexed_tree.get_rna(bnode);
+ Object *object = (Object *)RNA_pointer_get(&rna, "object").id.data;
+ if (object == nullptr || object->type != OB_MESH) {
+ return {};
+ }
+
+ auto action = build_action({bSocketList(bnode->outputs).get(0), bnode},
+ ctx.indexed_tree,
+ ctx.data_graph,
+ ctx.step_description);
+ return EVENT_mesh_collision(bnode->name, object, std::move(action));
+}
+
+static std::unique_ptr<Event> BUILD_EVENT_age_reached(BuildContext &ctx, bNode *bnode)
+{
+ FN::SharedFunction fn = create_function_for_data_inputs(bnode, ctx.indexed_tree, ctx.data_graph);
+
+ auto action = build_action({bSocketList(bnode->outputs).get(0), bnode},
+ ctx.indexed_tree,
+ ctx.data_graph,
+ ctx.step_description);
+ return EVENT_age_reached(bnode->name, fn, std::move(action));
+}
+
+BLI_LAZY_INIT(EventFromNodeCallbackMap, get_event_builders)
+{
+ EventFromNodeCallbackMap map;
+ map.add_new("bp_MeshCollisionEventNode", Build_EVENT_mesh_collision);
+ map.add_new("bp_AgeReachedEventNode", BUILD_EVENT_age_reached);
+ return map;
+}
+
} // namespace BParticles
diff --git a/source/blender/simulations/bparticles/inserters.hpp b/source/blender/simulations/bparticles/inserters.hpp
index ab0cf98c85f..c1eefa79a9c 100644
--- a/source/blender/simulations/bparticles/inserters.hpp
+++ b/source/blender/simulations/bparticles/inserters.hpp
@@ -108,4 +108,10 @@ using ForceFromNodeCallbackMap = SmallMap<std::string, ForceFromNodeCallback>;
ForceFromNodeCallbackMap &get_force_builders();
+using EventFromNodeCallback =
+ std::function<std::unique_ptr<Event>(BuildContext &ctx, bNode *bnode)>;
+using EventFromNodeCallbackMap = SmallMap<std::string, EventFromNodeCallback>;
+
+EventFromNodeCallbackMap &get_event_builders();
+
} // namespace BParticles
diff --git a/source/blender/simulations/bparticles/node_frontend.cpp b/source/blender/simulations/bparticles/node_frontend.cpp
index 822e66b40b6..fd665eb9774 100644
--- a/source/blender/simulations/bparticles/node_frontend.cpp
+++ b/source/blender/simulations/bparticles/node_frontend.cpp
@@ -36,16 +36,33 @@ std::unique_ptr<StepDescription> step_description_from_node_tree(IndexedNodeTree
}
BuildContext ctx = {indexed_tree, data_graph, *step_description};
+
for (auto item : get_force_builders().items()) {
for (bNode *bnode : indexed_tree.nodes_with_idname(item.key)) {
bNodeSocket *force_output = bSocketList(bnode->outputs).get(0);
for (SocketWithNode linked : indexed_tree.linked(force_output)) {
if (is_particle_type_node(linked.node)) {
auto force = item.value(ctx, bnode);
+ if (force) {
+ EulerIntegrator *integrator = reinterpret_cast<EulerIntegrator *>(
+ step_description->m_types.lookup_ref(linked.node->name)->m_integrator);
+ integrator->add_force(std::move(force));
+ }
+ }
+ }
+ }
+ }
- EulerIntegrator *integrator = reinterpret_cast<EulerIntegrator *>(
- step_description->m_types.lookup_ref(linked.node->name)->m_integrator);
- integrator->add_force(std::move(force));
+ for (auto item : get_event_builders().items()) {
+ for (bNode *bnode : indexed_tree.nodes_with_idname(item.key)) {
+ bNodeSocket *event_input = bSocketList(bnode->inputs).get(0);
+ for (SocketWithNode linked : indexed_tree.linked(event_input)) {
+ if (is_particle_type_node(linked.node)) {
+ auto event = item.value(ctx, bnode);
+ if (event) {
+ step_description->m_types.lookup_ref(linked.node->name)
+ ->m_events.append(event.release());
+ }
}
}
}
More information about the Bf-blender-cvs
mailing list