[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