[Bf-blender-cvs] [712701a4ef3] functions: remember socket that triggered an action

Jacques Lucke noreply at git.blender.org
Wed Jul 24 19:11:39 CEST 2019


Commit: 712701a4ef31f70d6afe2c59d67e0817788aa2e3
Author: Jacques Lucke
Date:   Wed Jul 24 12:52:35 2019 +0200
Branches: functions
https://developer.blender.org/rB712701a4ef31f70d6afe2c59d67e0817788aa2e3

remember socket that triggered an action

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

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

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

diff --git a/source/blender/simulations/bparticles/inserters.cpp b/source/blender/simulations/bparticles/inserters.cpp
index 792ccce7ba5..2ad0e8c6664 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -138,18 +138,24 @@ static ValueOrError<SharedFunction> create_function__action_inputs(VirtualNode *
   return fn;
 }
 
-static std::unique_ptr<Action> build_action(BuildContext &ctx, VirtualSocket *start);
-using ActionFromNodeCallback =
-    std::function<std::unique_ptr<Action>(BuildContext &ctx, VirtualNode *vnode)>;
+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)>;
 
 static std::unique_ptr<Action> BUILD_ACTION_kill(BuildContext &UNUSED(ctx),
-                                                 VirtualNode *UNUSED(vnode))
+                                                 VirtualSocket *UNUSED(start),
+                                                 VirtualSocket *UNUSED(trigger))
 {
   return std::unique_ptr<Action>(new KillAction());
 }
 
-static std::unique_ptr<Action> BUILD_ACTION_change_direction(BuildContext &ctx, VirtualNode *vnode)
+static std::unique_ptr<Action> BUILD_ACTION_change_direction(BuildContext &ctx,
+                                                             VirtualSocket *start,
+                                                             VirtualSocket *trigger)
 {
+  VirtualNode *vnode = start->vnode();
   auto fn_or_error = create_function__action_inputs(vnode, ctx.data_graph);
   if (fn_or_error.is_error()) {
     return {};
@@ -157,14 +163,17 @@ static std::unique_ptr<Action> BUILD_ACTION_change_direction(BuildContext &ctx,
 
   SharedFunction fn = fn_or_error.extract_value();
   ParticleFunction particle_fn(fn);
-  auto post_action = build_action(ctx, vnode->output(0));
+  auto post_action = build_action(ctx, vnode->output(0), trigger);
 
   return std::unique_ptr<ChangeDirectionAction>(
       new ChangeDirectionAction(particle_fn, std::move(post_action)));
 }
 
-static std::unique_ptr<Action> BUILD_ACTION_explode(BuildContext &ctx, VirtualNode *vnode)
+static std::unique_ptr<Action> BUILD_ACTION_explode(BuildContext &ctx,
+                                                    VirtualSocket *start,
+                                                    VirtualSocket *trigger)
 {
+  VirtualNode *vnode = start->vnode();
   auto fn_or_error = create_function__action_inputs(vnode, ctx.data_graph);
   if (fn_or_error.is_error()) {
     return {};
@@ -177,7 +186,7 @@ static std::unique_ptr<Action> BUILD_ACTION_explode(BuildContext &ctx, VirtualNo
   char name[65];
   RNA_string_get(&rna, "particle_type_name", name);
 
-  auto post_action = build_action(ctx, vnode->output(0));
+  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)));
@@ -187,8 +196,11 @@ static std::unique_ptr<Action> BUILD_ACTION_explode(BuildContext &ctx, VirtualNo
   }
 }
 
-static std::unique_ptr<Action> BUILD_ACTION_condition(BuildContext &ctx, VirtualNode *vnode)
+static std::unique_ptr<Action> BUILD_ACTION_condition(BuildContext &ctx,
+                                                      VirtualSocket *start,
+                                                      VirtualSocket *trigger)
 {
+  VirtualNode *vnode = start->vnode();
   auto fn_or_error = create_function__action_inputs(vnode, ctx.data_graph);
   if (fn_or_error.is_error()) {
     return {};
@@ -197,8 +209,8 @@ static std::unique_ptr<Action> BUILD_ACTION_condition(BuildContext &ctx, Virtual
   SharedFunction fn = fn_or_error.extract_value();
   ParticleFunction particle_fn(fn);
 
-  auto true_action = build_action(ctx, vnode->output(0));
-  auto false_action = build_action(ctx, vnode->output(1));
+  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)));
@@ -214,7 +226,9 @@ BLI_LAZY_INIT_STATIC(StringMap<ActionFromNodeCallback>, get_action_builders)
   return map;
 }
 
-static std::unique_ptr<Action> build_action(BuildContext &ctx, VirtualSocket *start)
+static std::unique_ptr<Action> build_action(BuildContext &ctx,
+                                            VirtualSocket *start,
+                                            VirtualSocket *trigger)
 {
   if (start->is_output()) {
     ArrayRef<VirtualSocket *> linked = start->links();
@@ -222,7 +236,7 @@ static std::unique_ptr<Action> build_action(BuildContext &ctx, VirtualSocket *st
       return std::unique_ptr<Action>(new NoneAction());
     }
     else if (linked.size() == 1) {
-      return build_action(ctx, linked[0]);
+      return build_action(ctx, linked[0], trigger);
     }
     else {
       return nullptr;
@@ -230,11 +244,15 @@ static std::unique_ptr<Action> build_action(BuildContext &ctx, VirtualSocket *st
   }
 
   BLI_assert(start->is_input());
-  VirtualNode *vnode = start->vnode();
-  StringRef idname = vnode->bnode()->idname;
+  StringRef idname = start->vnode()->idname();
 
   auto builders = get_action_builders();
-  return builders.lookup(idname)(ctx, vnode);
+  return builders.lookup(idname)(ctx, start, trigger);
+}
+
+static std::unique_ptr<Action> build_action_for_trigger(BuildContext &ctx, VirtualSocket *start)
+{
+  return build_action(ctx, start, start);
 }
 
 static std::unique_ptr<Force> BUILD_FORCE_gravity(BuildContext &ctx, VirtualNode *vnode)
@@ -267,7 +285,7 @@ static std::unique_ptr<Event> BUILD_EVENT_mesh_collision(BuildContext &ctx, Virt
     return {};
   }
 
-  auto action = build_action(ctx, vnode->output(0));
+  auto action = build_action_for_trigger(ctx, vnode->output(0));
   return std::unique_ptr<Event>(new MeshCollisionEvent(vnode->name(), object, std::move(action)));
 }
 
@@ -279,7 +297,7 @@ static std::unique_ptr<Event> BUILD_EVENT_age_reached(BuildContext &ctx, Virtual
   }
 
   SharedFunction fn = fn_or_error.extract_value();
-  auto action = build_action(ctx, vnode->output(0));
+  auto action = build_action_for_trigger(ctx, vnode->output(0));
   return std::unique_ptr<Event>(new AgeReachedEvent(vnode->name(), fn, std::move(action)));
 }
 
@@ -291,7 +309,7 @@ static std::unique_ptr<Event> BUILD_EVENT_close_by_points(BuildContext &ctx, Vir
   }
 
   SharedFunction fn = fn_or_error.extract_value();
-  auto action = build_action(ctx, vnode->output(0));
+  auto action = build_action_for_trigger(ctx, vnode->output(0));
 
   TupleCallBody *body = fn->body<TupleCallBody>();
   FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
@@ -324,7 +342,7 @@ static std::unique_ptr<Emitter> BUILD_EMITTER_mesh_surface(BuildContext &ctx,
   FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
   body->call__setup_execution_context(fn_in, fn_out);
 
-  auto on_birth_action = build_action(ctx, vnode->output(0));
+  auto on_birth_action = build_action_for_trigger(ctx, vnode->output(0));
 
   Object *object = body->get_output<Object *>(fn_out, 0, "Object");
   if (object == nullptr) {



More information about the Bf-blender-cvs mailing list