[Bf-blender-cvs] [6c3afa78010] functions: create particle function for force inputs more centrally

Jacques Lucke noreply at git.blender.org
Thu Jul 25 15:10:33 CEST 2019


Commit: 6c3afa780109f7124ca79bbdd3e16e7802770ca3
Author: Jacques Lucke
Date:   Thu Jul 25 10:06:03 2019 +0200
Branches: functions
https://developer.blender.org/rB6c3afa780109f7124ca79bbdd3e16e7802770ca3

create particle function for force inputs more centrally

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

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 be37daadbc1..8326687b864 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -95,8 +95,8 @@ ValueOrError<SharedFunction> create_function__offset_handler_inputs(
   return create_function__action_inputs(offset_handler_vnode, data_graph);
 }
 
-static ValueOrError<SharedFunction> create_function__force_inputs(VirtualNode *force_vnode,
-                                                                  VTreeDataGraph &data_graph)
+ValueOrError<SharedFunction> create_function__force_inputs(VirtualNode *force_vnode,
+                                                           VTreeDataGraph &data_graph)
 {
   return create_function__action_inputs(force_vnode, data_graph);
 }
@@ -224,26 +224,18 @@ static std::unique_ptr<Action> build_action_for_trigger(BuildContext &ctx, Virtu
   return build_action(ctx, start, start);
 }
 
-static std::unique_ptr<Force> BUILD_FORCE_gravity(BuildContext &ctx, VirtualNode *vnode)
+static std::unique_ptr<Force> BUILD_FORCE_gravity(BuildContext &UNUSED(ctx),
+                                                  VirtualNode *UNUSED(vnode),
+                                                  ParticleFunction compute_inputs_fn)
 {
-  auto fn_or_error = create_function__force_inputs(vnode, ctx.data_graph);
-  if (fn_or_error.is_error()) {
-    return {};
-  }
-
-  SharedFunction fn = fn_or_error.extract_value();
-  return std::unique_ptr<Force>(new GravityForce(ParticleFunction(fn)));
+  return std::unique_ptr<Force>(new GravityForce(std::move(compute_inputs_fn)));
 }
 
-static std::unique_ptr<Force> BUILD_FORCE_turbulence(BuildContext &ctx, VirtualNode *vnode)
+static std::unique_ptr<Force> BUILD_FORCE_turbulence(BuildContext &UNUSED(ctx),
+                                                     VirtualNode *UNUSED(vnode),
+                                                     ParticleFunction compute_inputs_fn)
 {
-  auto fn_or_error = create_function__force_inputs(vnode, ctx.data_graph);
-  if (fn_or_error.is_error()) {
-    return {};
-  }
-
-  SharedFunction fn = fn_or_error.extract_value();
-  return std::unique_ptr<Force>(new TurbulenceForce(ParticleFunction(fn)));
+  return std::unique_ptr<Force>(new TurbulenceForce(std::move(compute_inputs_fn)));
 }
 
 static std::unique_ptr<Event> BUILD_EVENT_mesh_collision(BuildContext &ctx, VirtualNode *vnode)
diff --git a/source/blender/simulations/bparticles/inserters.hpp b/source/blender/simulations/bparticles/inserters.hpp
index a4c9d696337..cb56f3fae4a 100644
--- a/source/blender/simulations/bparticles/inserters.hpp
+++ b/source/blender/simulations/bparticles/inserters.hpp
@@ -39,8 +39,11 @@ struct BuildContext {
 ValueOrError<SharedFunction> create_function__offset_handler_inputs(
     VirtualNode *offset_handler_vnode, VTreeDataGraph &data_graph);
 
-using ForceFromNodeCallback =
-    std::function<std::unique_ptr<Force>(BuildContext &ctx, VirtualNode *vnode)>;
+ValueOrError<SharedFunction> create_function__force_inputs(VirtualNode *force_vnode,
+                                                           VTreeDataGraph &data_graph);
+
+using ForceFromNodeCallback = std::function<std::unique_ptr<Force>(
+    BuildContext &ctx, VirtualNode *vnode, ParticleFunction compute_inputs_fn)>;
 
 using EventFromNodeCallback =
     std::function<std::unique_ptr<Event>(BuildContext &ctx, VirtualNode *vnode)>;
diff --git a/source/blender/simulations/bparticles/node_frontend.cpp b/source/blender/simulations/bparticles/node_frontend.cpp
index 70c16ea8c0f..1b0564b279d 100644
--- a/source/blender/simulations/bparticles/node_frontend.cpp
+++ b/source/blender/simulations/bparticles/node_frontend.cpp
@@ -69,7 +69,13 @@ std::unique_ptr<StepDescription> step_description_from_node_tree(VirtualNodeTree
     for (VirtualNode *vnode : vtree.nodes_with_idname(item.key)) {
       for (VirtualSocket *linked : vnode->output(0)->links()) {
         if (is_particle_type_node(linked->vnode())) {
-          auto force = item.value(ctx, vnode);
+          auto fn_or_error = create_function__force_inputs(vnode, data_graph);
+          if (fn_or_error.is_error()) {
+            continue;
+          }
+
+          ParticleFunction fn(fn_or_error.extract_value());
+          auto force = item.value(ctx, vnode, std::move(fn));
           if (force) {
             forces.add(linked->vnode()->name(), force.release());
           }



More information about the Bf-blender-cvs mailing list