[Bf-blender-cvs] [9f1c6250563] functions: cleanup force node handling

Jacques Lucke noreply at git.blender.org
Thu Jul 11 17:15:33 CEST 2019


Commit: 9f1c6250563355d7eb73ce6cc27f3be267173032
Author: Jacques Lucke
Date:   Thu Jul 11 14:29:17 2019 +0200
Branches: functions
https://developer.blender.org/rB9f1c6250563355d7eb73ce6cc27f3be267173032

cleanup force node handling

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

M	source/blender/blenkernel/intern/node_tree.cpp
M	source/blender/simulations/bparticles/forces.cpp
M	source/blender/simulations/bparticles/forces.hpp
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/blenkernel/intern/node_tree.cpp b/source/blender/blenkernel/intern/node_tree.cpp
index 0c2d8462865..d9c369a9e05 100644
--- a/source/blender/blenkernel/intern/node_tree.cpp
+++ b/source/blender/blenkernel/intern/node_tree.cpp
@@ -48,7 +48,8 @@ void IndexedNodeTree::find_connected_sockets_left(bNodeSocket *bsocket,
                                                   SmallVector<SocketWithNode> &r_sockets) const
 {
   BLI_assert(bsocket->in_out == SOCK_IN);
-  for (SocketWithNode linked : m_direct_links.lookup_default(bsocket)) {
+  auto from_sockets = m_direct_links.lookup_default(bsocket);
+  for (SocketWithNode linked : from_sockets) {
     if (this->is_reroute(linked.node)) {
       this->find_connected_sockets_left((bNodeSocket *)linked.node->inputs.first, r_sockets);
     }
@@ -61,7 +62,8 @@ void IndexedNodeTree::find_connected_sockets_right(bNodeSocket *bsocket,
                                                    SmallVector<SocketWithNode> &r_sockets) const
 {
   BLI_assert(bsocket->in_out == SOCK_OUT);
-  for (SocketWithNode other : m_direct_links.lookup_default(bsocket)) {
+  auto to_sockets = m_direct_links.lookup_default(bsocket);
+  for (SocketWithNode other : to_sockets) {
     if (this->is_reroute(other.node)) {
       this->find_connected_sockets_right((bNodeSocket *)other.node->outputs.first, r_sockets);
     }
diff --git a/source/blender/simulations/bparticles/forces.cpp b/source/blender/simulations/bparticles/forces.cpp
index 013fb3c8134..d1ffcdd4785 100644
--- a/source/blender/simulations/bparticles/forces.cpp
+++ b/source/blender/simulations/bparticles/forces.cpp
@@ -69,14 +69,16 @@ class TurbulenceForce : public Force {
   }
 };
 
-Force *FORCE_gravity(SharedFunction &compute_acceleration_fn)
+std::unique_ptr<Force> FORCE_gravity(SharedFunction &compute_acceleration_fn)
 {
-  return new GravityForce(compute_acceleration_fn);
+  Force *force = new GravityForce(compute_acceleration_fn);
+  return std::unique_ptr<Force>(force);
 }
 
-Force *FORCE_turbulence(SharedFunction &compute_strength_fn)
+std::unique_ptr<Force> FORCE_turbulence(SharedFunction &compute_strength_fn)
 {
-  return new TurbulenceForce(compute_strength_fn);
+  Force *force = new TurbulenceForce(compute_strength_fn);
+  return std::unique_ptr<Force>(force);
 }
 
 }  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/forces.hpp b/source/blender/simulations/bparticles/forces.hpp
index 4ee25b7dad9..862eee7f025 100644
--- a/source/blender/simulations/bparticles/forces.hpp
+++ b/source/blender/simulations/bparticles/forces.hpp
@@ -11,7 +11,7 @@ class Force {
   virtual void add_force(ParticlesBlock &block, ArrayRef<float3> r_force) = 0;
 };
 
-Force *FORCE_gravity(SharedFunction &compute_acceleration_fn);
-Force *FORCE_turbulence(SharedFunction &compute_strength_fn);
+std::unique_ptr<Force> FORCE_gravity(SharedFunction &compute_acceleration_fn);
+std::unique_ptr<Force> FORCE_turbulence(SharedFunction &compute_strength_fn);
 
 }  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/inserters.cpp b/source/blender/simulations/bparticles/inserters.cpp
index bbd1a1bf315..cd07783a9cf 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -305,44 +305,6 @@ static void INSERT_EVENT_mesh_collision(ProcessNodeInterface &interface)
   }
 }
 
-static void INSERT_FORCE_gravity(ProcessNodeInterface &interface)
-{
-  for (SocketWithNode linked : interface.linked_with_output(0)) {
-    if (!is_particle_type_node(linked.node)) {
-      continue;
-    }
-
-    SharedFunction fn = create_function_for_data_inputs(
-        interface.bnode(), interface.indexed_tree(), interface.data_graph());
-
-    Force *force = FORCE_gravity(fn);
-
-    bNode *type_node = linked.node;
-    EulerIntegrator *integrator = reinterpret_cast<EulerIntegrator *>(
-        interface.step_description().m_types.lookup_ref(type_node->name)->m_integrator);
-    integrator->add_force(std::unique_ptr<Force>(force));
-  }
-}
-
-static void INSERT_FORCE_turbulence(ProcessNodeInterface &interface)
-{
-  for (SocketWithNode linked : interface.linked_with_output(0)) {
-    if (!is_particle_type_node(linked.node)) {
-      continue;
-    }
-
-    SharedFunction fn = create_function_for_data_inputs(
-        interface.bnode(), interface.indexed_tree(), interface.data_graph());
-
-    Force *force = FORCE_turbulence(fn);
-
-    bNode *type_node = linked.node;
-    EulerIntegrator *integrator = reinterpret_cast<EulerIntegrator *>(
-        interface.step_description().m_types.lookup_ref(type_node->name)->m_integrator);
-    integrator->add_force(std::unique_ptr<Force>(force));
-  }
-}
-
 BLI_LAZY_INIT(ProcessFunctionsMap, get_node_processors)
 {
   ProcessFunctionsMap processors;
@@ -350,9 +312,27 @@ BLI_LAZY_INIT(ProcessFunctionsMap, get_node_processors)
   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);
-  processors.add_new("bp_GravityForceNode", INSERT_FORCE_gravity);
-  processors.add_new("bp_TurbulenceForceNode", INSERT_FORCE_turbulence);
   return processors;
 }
 
+static std::unique_ptr<Force> BUILD_FORCE_gravity(BuildContext &ctx, bNode *bnode)
+{
+  SharedFunction fn = create_function_for_data_inputs(bnode, ctx.indexed_tree, ctx.data_graph);
+  return FORCE_gravity(fn);
+}
+
+static std::unique_ptr<Force> BUILD_FORCE_turbulence(BuildContext &ctx, bNode *bnode)
+{
+  SharedFunction fn = create_function_for_data_inputs(bnode, ctx.indexed_tree, ctx.data_graph);
+  return FORCE_turbulence(fn);
+}
+
+BLI_LAZY_INIT(ForceFromNodeCallbackMap, get_force_builders)
+{
+  ForceFromNodeCallbackMap map;
+  map.add_new("bp_GravityForceNode", BUILD_FORCE_gravity);
+  map.add_new("bp_TurbulenceForceNode", BUILD_FORCE_turbulence);
+  return map;
+}
+
 }  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/inserters.hpp b/source/blender/simulations/bparticles/inserters.hpp
index 083f6048b55..ab0cf98c85f 100644
--- a/source/blender/simulations/bparticles/inserters.hpp
+++ b/source/blender/simulations/bparticles/inserters.hpp
@@ -7,6 +7,7 @@
 
 #include "world_state.hpp"
 #include "step_description.hpp"
+#include "forces.hpp"
 
 namespace BParticles {
 
@@ -95,4 +96,16 @@ using ProcessFunctionsMap = SmallMap<std::string, ProcessNodeFunction>;
 
 ProcessFunctionsMap &get_node_processors();
 
+struct BuildContext {
+  IndexedNodeTree &indexed_tree;
+  BTreeDataGraph &data_graph;
+  ModifierStepDescription &step_description;
+};
+
+using ForceFromNodeCallback =
+    std::function<std::unique_ptr<Force>(BuildContext &ctx, bNode *bnode)>;
+using ForceFromNodeCallbackMap = SmallMap<std::string, ForceFromNodeCallback>;
+
+ForceFromNodeCallbackMap &get_force_builders();
+
 }  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/node_frontend.cpp b/source/blender/simulations/bparticles/node_frontend.cpp
index f4bd992a44a..822e66b40b6 100644
--- a/source/blender/simulations/bparticles/node_frontend.cpp
+++ b/source/blender/simulations/bparticles/node_frontend.cpp
@@ -4,12 +4,15 @@
 
 namespace BParticles {
 
+static bool is_particle_type_node(bNode *bnode)
+{
+  return STREQ(bnode->idname, "bp_ParticleTypeNode");
+}
+
 std::unique_ptr<StepDescription> step_description_from_node_tree(IndexedNodeTree &indexed_tree,
                                                                  WorldState &world_state,
                                                                  float time_step)
 {
-  auto node_processors = get_node_processors();
-
   ModifierStepDescription *step_description = new ModifierStepDescription();
 
   for (bNode *particle_type_node : indexed_tree.nodes_with_idname("bp_ParticleTypeNode")) {
@@ -23,6 +26,7 @@ std::unique_ptr<StepDescription> step_description_from_node_tree(IndexedNodeTree
 
   auto data_graph = FN::DataFlowNodes::generate_graph(indexed_tree).value();
 
+  auto node_processors = get_node_processors();
   for (auto item : node_processors.items()) {
     for (bNode *bnode : indexed_tree.nodes_with_idname(item.key)) {
       ProcessNodeInterface interface(
@@ -31,6 +35,22 @@ 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);
+
+          EulerIntegrator *integrator = reinterpret_cast<EulerIntegrator *>(
+              step_description->m_types.lookup_ref(linked.node->name)->m_integrator);
+          integrator->add_force(std::move(force));
+        }
+      }
+    }
+  }
+
   step_description->m_duration = time_step;
   return std::unique_ptr<StepDescription>(step_description);
 }



More information about the Bf-blender-cvs mailing list