[Bf-blender-cvs] [9b3e1859eff] functions: simplify action builders

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


Commit: 9b3e1859eff9d0aa52719f22ac9223ac8f9a96c2
Author: Jacques Lucke
Date:   Thu Jul 25 14:20:36 2019 +0200
Branches: functions
https://developer.blender.org/rB9b3e1859eff9d0aa52719f22ac9223ac8f9a96c2

simplify action builders

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

M	source/blender/simulations/bparticles/actions.hpp
M	source/blender/simulations/bparticles/inserters.cpp

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

diff --git a/source/blender/simulations/bparticles/actions.hpp b/source/blender/simulations/bparticles/actions.hpp
index a06fad36193..088ca8e1498 100644
--- a/source/blender/simulations/bparticles/actions.hpp
+++ b/source/blender/simulations/bparticles/actions.hpp
@@ -19,8 +19,8 @@ class ChangeDirectionAction : public Action {
   std::unique_ptr<Action> m_post_action;
 
  public:
-  ChangeDirectionAction(ParticleFunction &compute_inputs, std::unique_ptr<Action> post_action)
-      : m_compute_inputs(compute_inputs), m_post_action(std::move(post_action))
+  ChangeDirectionAction(ParticleFunction compute_inputs, std::unique_ptr<Action> post_action)
+      : m_compute_inputs(std::move(compute_inputs)), m_post_action(std::move(post_action))
   {
   }
 
@@ -35,10 +35,10 @@ class ExplodeAction : public Action {
 
  public:
   ExplodeAction(StringRef new_particle_name,
-                ParticleFunction &compute_inputs,
+                ParticleFunction compute_inputs,
                 std::unique_ptr<Action> post_action)
       : m_new_particle_name(new_particle_name.to_std_string()),
-        m_compute_inputs(compute_inputs),
+        m_compute_inputs(std::move(compute_inputs)),
         m_post_action(std::move(post_action))
   {
   }
@@ -52,10 +52,10 @@ class ConditionAction : public Action {
   std::unique_ptr<Action> m_true_action, m_false_action;
 
  public:
-  ConditionAction(ParticleFunction &compute_inputs,
+  ConditionAction(ParticleFunction compute_inputs,
                   std::unique_ptr<Action> true_action,
                   std::unique_ptr<Action> false_action)
-      : m_compute_inputs(compute_inputs),
+      : m_compute_inputs(std::move(compute_inputs)),
         m_true_action(std::move(true_action)),
         m_false_action(std::move(false_action))
   {
diff --git a/source/blender/simulations/bparticles/inserters.cpp b/source/blender/simulations/bparticles/inserters.cpp
index bdbe7466728..b38237b75e6 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -110,46 +110,38 @@ ValueOrError<SharedFunction> create_function__event_inputs(VirtualNode *event_vn
 static std::unique_ptr<Action> build_action(BuildContext &ctx,
                                             VirtualSocket *start,
                                             VirtualSocket *trigger);
-using ActionFromNodeCallback = std::function<std::unique_ptr<Action>(
-    BuildContext &ctx, VirtualSocket *start, VirtualSocket *trigger)>;
+using ActionFromNodeCallback =
+    std::function<std::unique_ptr<Action>(BuildContext &ctx,
+                                          VirtualSocket *start,
+                                          VirtualSocket *trigger,
+                                          ParticleFunction compute_inputs_fn)>;
 
 static std::unique_ptr<Action> BUILD_ACTION_kill(BuildContext &UNUSED(ctx),
                                                  VirtualSocket *UNUSED(start),
-                                                 VirtualSocket *UNUSED(trigger))
+                                                 VirtualSocket *UNUSED(trigger),
+                                                 ParticleFunction UNUSED(compute_inputs_fn))
 {
   return std::unique_ptr<Action>(new KillAction());
 }
 
 static std::unique_ptr<Action> BUILD_ACTION_change_direction(BuildContext &ctx,
                                                              VirtualSocket *start,
-                                                             VirtualSocket *trigger)
+                                                             VirtualSocket *trigger,
+                                                             ParticleFunction compute_inputs_fn)
 {
   VirtualNode *vnode = start->vnode();
-  auto fn_or_error = create_function__action_inputs(vnode, ctx.data_graph);
-  if (fn_or_error.is_error()) {
-    return {};
-  }
-
-  SharedFunction fn = fn_or_error.extract_value();
-  ParticleFunction particle_fn(fn);
   auto post_action = build_action(ctx, vnode->output(0), trigger);
 
   return std::unique_ptr<ChangeDirectionAction>(
-      new ChangeDirectionAction(particle_fn, std::move(post_action)));
+      new ChangeDirectionAction(std::move(compute_inputs_fn), std::move(post_action)));
 }
 
 static std::unique_ptr<Action> BUILD_ACTION_explode(BuildContext &ctx,
                                                     VirtualSocket *start,
-                                                    VirtualSocket *trigger)
+                                                    VirtualSocket *trigger,
+                                                    ParticleFunction compute_inputs_fn)
 {
   VirtualNode *vnode = start->vnode();
-  auto fn_or_error = create_function__action_inputs(vnode, ctx.data_graph);
-  if (fn_or_error.is_error()) {
-    return {};
-  }
-
-  SharedFunction fn = fn_or_error.extract_value();
-  ParticleFunction particle_fn(fn);
 
   PointerRNA rna = vnode->rna();
   char name[65];
@@ -158,7 +150,8 @@ static std::unique_ptr<Action> BUILD_ACTION_explode(BuildContext &ctx,
   auto post_action = build_action(ctx, vnode->output(0), trigger);
 
   if (ctx.type_name_exists(name)) {
-    return std::unique_ptr<Action>(new ExplodeAction(name, particle_fn, std::move(post_action)));
+    return std::unique_ptr<Action>(
+        new ExplodeAction(name, std::move(compute_inputs_fn), std::move(post_action)));
   }
   else {
     return post_action;
@@ -167,22 +160,15 @@ static std::unique_ptr<Action> BUILD_ACTION_explode(BuildContext &ctx,
 
 static std::unique_ptr<Action> BUILD_ACTION_condition(BuildContext &ctx,
                                                       VirtualSocket *start,
-                                                      VirtualSocket *trigger)
+                                                      VirtualSocket *trigger,
+                                                      ParticleFunction compute_inputs_fn)
 {
   VirtualNode *vnode = start->vnode();
-  auto fn_or_error = create_function__action_inputs(vnode, ctx.data_graph);
-  if (fn_or_error.is_error()) {
-    return {};
-  }
-
-  SharedFunction fn = fn_or_error.extract_value();
-  ParticleFunction particle_fn(fn);
-
   auto true_action = build_action(ctx, vnode->output(0), trigger);
   auto false_action = build_action(ctx, vnode->output(1), trigger);
 
-  return std::unique_ptr<Action>(
-      new ConditionAction(particle_fn, std::move(true_action), std::move(false_action)));
+  return std::unique_ptr<Action>(new ConditionAction(
+      std::move(compute_inputs_fn), std::move(true_action), std::move(false_action)));
 }
 
 BLI_LAZY_INIT_STATIC(StringMap<ActionFromNodeCallback>, get_action_builders)
@@ -213,10 +199,17 @@ static std::unique_ptr<Action> build_action(BuildContext &ctx,
   }
 
   BLI_assert(start->is_input());
-  StringRef idname = start->vnode()->idname();
+  VirtualNode *vnode = start->vnode();
+
+  auto fn_or_error = create_function__action_inputs(vnode, ctx.data_graph);
+  if (fn_or_error.is_error()) {
+    return std::unique_ptr<Action>(new NoneAction());
+  }
 
+  StringRef idname = start->vnode()->idname();
   auto builders = get_action_builders();
-  return builders.lookup(idname)(ctx, start, trigger);
+  return builders.lookup(idname)(
+      ctx, start, trigger, ParticleFunction(fn_or_error.extract_value()));
 }
 
 static std::unique_ptr<Action> build_action_for_trigger(BuildContext &ctx, VirtualSocket *start)



More information about the Bf-blender-cvs mailing list