[Bf-blender-cvs] [f777ac8a529] functions: use new function creation method for action and offset handlers

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


Commit: f777ac8a5298501e86942662edfdd7260a2ed674
Author: Jacques Lucke
Date:   Wed Jul 24 12:36:13 2019 +0200
Branches: functions
https://developer.blender.org/rBf777ac8a5298501e86942662edfdd7260a2ed674

use new function creation method for action and offset handlers

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

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

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

diff --git a/source/blender/simulations/bparticles/inserters.cpp b/source/blender/simulations/bparticles/inserters.cpp
index 4aee2a77ea6..792ccce7ba5 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -25,58 +25,6 @@ using FN::FunctionGraph;
 using FN::SharedFunction;
 using FN::SharedType;
 
-static Vector<DFGraphSocket> insert_function_inputs(FN::FunctionBuilder &fn_builder,
-                                                    VTreeDataGraph &data_graph,
-                                                    ArrayRef<VirtualSocket *> output_vsockets)
-{
-  auto dependencies = data_graph.find_placeholder_dependencies(output_vsockets);
-
-  auto &graph = data_graph.graph();
-
-  for (uint i = 0; i < dependencies.size(); i++) {
-    VirtualSocket *vsocket = dependencies.vsockets[i];
-    DFGraphSocket socket = dependencies.sockets[i];
-    VirtualNode *vnode = vsocket->vnode();
-    BLI_assert(vsocket->is_output());
-
-    SharedType &type = graph->type_of_output(socket);
-    std::string name_prefix;
-    if (STREQ(vnode->idname(), "bp_ParticleInfoNode")) {
-      name_prefix = "Attribute: ";
-    }
-    else if (STREQ(vnode->idname(), "bp_MeshCollisionEventNode")) {
-      name_prefix = "Event: ";
-    }
-    else {
-      BLI_assert(false);
-    }
-    fn_builder.add_input(name_prefix + vsocket->name(), type);
-  }
-
-  return dependencies.sockets;
-}
-
-static SharedFunction create_function(VTreeDataGraph &data_graph,
-                                      ArrayRef<VirtualSocket *> output_vsockets,
-                                      StringRef name)
-{
-  FN::FunctionBuilder fn_builder;
-  auto inputs = insert_function_inputs(fn_builder, data_graph, output_vsockets);
-
-  Vector<FN::DFGraphSocket> outputs;
-  for (VirtualSocket *vsocket : output_vsockets) {
-    FN::DFGraphSocket socket = data_graph.lookup_socket(vsocket);
-    fn_builder.add_output(vsocket->bsocket()->name, data_graph.graph()->type_of_socket(socket));
-    outputs.append(socket);
-  }
-
-  FN::FunctionGraph function_graph(data_graph.graph(), inputs, outputs);
-  SharedFunction fn = fn_builder.build(name);
-  FN::fgraph_add_DependenciesBody(fn, function_graph);
-  FN::fgraph_add_TupleCallBody(fn, function_graph);
-  return fn;
-}
-
 static Vector<DFGraphSocket> find_input_data_sockets(VirtualNode *vnode,
                                                      VTreeDataGraph &data_graph)
 {
@@ -90,18 +38,6 @@ static Vector<DFGraphSocket> find_input_data_sockets(VirtualNode *vnode,
   return inputs;
 }
 
-static SharedFunction create_function_for_data_inputs(VirtualNode *vnode,
-                                                      VTreeDataGraph &data_graph)
-{
-  Vector<VirtualSocket *> bsockets_to_compute;
-  for (VirtualSocket *vsocket : vnode->inputs()) {
-    if (data_graph.uses_socket(vsocket)) {
-      bsockets_to_compute.append(vsocket);
-    }
-  }
-  return create_function(data_graph, bsockets_to_compute, vnode->name());
-}
-
 static ValueOrError<SharedFunction> create_function__emitter_inputs(VirtualNode *emitter_vnode,
                                                                     VTreeDataGraph &data_graph)
 {
@@ -150,6 +86,58 @@ static ValueOrError<SharedFunction> create_function__event_inputs(VirtualNode *e
   return fn;
 }
 
+static ValueOrError<SharedFunction> create_function__offset_handler_inputs(
+    VirtualNode *offset_handler_vnode, VTreeDataGraph &data_graph)
+{
+  Vector<DFGraphSocket> sockets_to_compute = find_input_data_sockets(offset_handler_vnode,
+                                                                     data_graph);
+  auto dependencies = data_graph.find_placeholder_dependencies(sockets_to_compute);
+
+  if (dependencies.size() > 0) {
+    return BLI_ERROR_CREATE("Offset handler inputs cannot have dependencies currently.");
+  }
+
+  FunctionGraph fgraph(data_graph.graph(), {}, sockets_to_compute);
+  SharedFunction fn = fgraph.new_function(offset_handler_vnode->name());
+  FN::fgraph_add_TupleCallBody(fn, fgraph);
+  return fn;
+}
+
+static ValueOrError<SharedFunction> create_function__action_inputs(VirtualNode *action_vnode,
+                                                                   VTreeDataGraph &data_graph)
+{
+  Vector<DFGraphSocket> sockets_to_compute = find_input_data_sockets(action_vnode, data_graph);
+  auto dependencies = data_graph.find_placeholder_dependencies(sockets_to_compute);
+
+  FunctionBuilder fn_builder;
+  fn_builder.add_outputs(data_graph.graph(), sockets_to_compute);
+
+  for (uint i = 0; i < dependencies.size(); i++) {
+    VirtualSocket *vsocket = dependencies.vsockets[i];
+    DFGraphSocket socket = dependencies.sockets[i];
+    VirtualNode *vnode = vsocket->vnode();
+
+    SharedType &type = data_graph.graph()->type_of_output(socket);
+    std::string name_prefix;
+    if (STREQ(vnode->idname(), "bp_ParticleInfoNode")) {
+      name_prefix = "Attribute: ";
+    }
+    else if (STREQ(vnode->idname(), "bp_MeshCollisionEventNode")) {
+      name_prefix = "Event: ";
+    }
+    else {
+      BLI_assert(false);
+    }
+    fn_builder.add_input(name_prefix + vsocket->name(), type);
+  }
+
+  SharedFunction fn = fn_builder.build(action_vnode->name());
+
+  FunctionGraph fgraph(data_graph.graph(), dependencies.sockets, sockets_to_compute);
+  FN::fgraph_add_TupleCallBody(fn, fgraph);
+  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)>;
@@ -162,7 +150,12 @@ static std::unique_ptr<Action> BUILD_ACTION_kill(BuildContext &UNUSED(ctx),
 
 static std::unique_ptr<Action> BUILD_ACTION_change_direction(BuildContext &ctx, VirtualNode *vnode)
 {
-  SharedFunction fn = create_function_for_data_inputs(vnode, ctx.data_graph);
+  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));
 
@@ -172,7 +165,12 @@ static std::unique_ptr<Action> BUILD_ACTION_change_direction(BuildContext &ctx,
 
 static std::unique_ptr<Action> BUILD_ACTION_explode(BuildContext &ctx, VirtualNode *vnode)
 {
-  SharedFunction fn = create_function_for_data_inputs(vnode, ctx.data_graph);
+  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();
@@ -191,7 +189,12 @@ static std::unique_ptr<Action> BUILD_ACTION_explode(BuildContext &ctx, VirtualNo
 
 static std::unique_ptr<Action> BUILD_ACTION_condition(BuildContext &ctx, VirtualNode *vnode)
 {
-  SharedFunction fn = create_function_for_data_inputs(vnode, ctx.data_graph);
+  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));
@@ -450,8 +453,12 @@ static std::unique_ptr<Emitter> BUILD_EMITTER_initial_grid(BuildContext &ctx,
                                                            VirtualNode *vnode,
                                                            StringRef particle_type_name)
 {
-  SharedFunction fn = create_function_for_data_inputs(vnode, ctx.data_graph);
+  auto fn_or_error = create_function__emitter_inputs(vnode, ctx.data_graph);
+  if (fn_or_error.is_error()) {
+    return {};
+  }
 
+  SharedFunction fn = fn_or_error.extract_value();
   TupleCallBody *body = fn->body<TupleCallBody>();
   FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
   body->call__setup_execution_context(fn_in, fn_out);
@@ -472,7 +479,12 @@ static std::unique_ptr<OffsetHandler> BUILD_OFFSET_HANDLER_trails(BuildContext &
   char name[65];
   RNA_string_get(&rna, "particle_type_name", name);
 
-  SharedFunction fn = create_function_for_data_inputs(vnode, ctx.data_graph);
+  auto fn_or_error = create_function__offset_handler_inputs(vnode, ctx.data_graph);
+  if (fn_or_error.is_error()) {
+    return {};
+  }
+
+  SharedFunction fn = fn_or_error.extract_value();
   TupleCallBody *body = fn->body<TupleCallBody>();
   FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
   body->call__setup_execution_context(fn_in, fn_out);



More information about the Bf-blender-cvs mailing list