[Bf-blender-cvs] [63a9949c278] functions: compute particle functions more centrally for events
Jacques Lucke
noreply at git.blender.org
Thu Jul 25 15:10:35 CEST 2019
Commit: 63a9949c278a8e681c240ab77988af49730f8ff4
Author: Jacques Lucke
Date: Thu Jul 25 10:18:22 2019 +0200
Branches: functions
https://developer.blender.org/rB63a9949c278a8e681c240ab77988af49730f8ff4
compute particle functions more centrally for events
===================================================================
M source/blender/simulations/bparticles/inserters.cpp
M source/blender/simulations/bparticles/inserters.hpp
M source/blender/simulations/bparticles/node_frontend.cpp
M source/blender/simulations/bparticles/particle_function.hpp
===================================================================
diff --git a/source/blender/simulations/bparticles/inserters.cpp b/source/blender/simulations/bparticles/inserters.cpp
index 8326687b864..bdbe7466728 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -101,8 +101,8 @@ ValueOrError<SharedFunction> create_function__force_inputs(VirtualNode *force_vn
return create_function__action_inputs(force_vnode, data_graph);
}
-static ValueOrError<SharedFunction> create_function__event_inputs(VirtualNode *event_vnode,
- VTreeDataGraph &data_graph)
+ValueOrError<SharedFunction> create_function__event_inputs(VirtualNode *event_vnode,
+ VTreeDataGraph &data_graph)
{
return create_function__action_inputs(event_vnode, data_graph);
}
@@ -238,7 +238,8 @@ static std::unique_ptr<Force> BUILD_FORCE_turbulence(BuildContext &UNUSED(ctx),
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)
+static std::unique_ptr<Event> BUILD_EVENT_mesh_collision(
+ BuildContext &ctx, VirtualNode *vnode, ParticleFunction UNUSED(compute_inputs_fn))
{
PointerRNA rna = vnode->rna();
Object *object = (Object *)RNA_pointer_get(&rna, "object").id.data;
@@ -250,29 +251,27 @@ static std::unique_ptr<Event> BUILD_EVENT_mesh_collision(BuildContext &ctx, Virt
return std::unique_ptr<Event>(new MeshCollisionEvent(vnode->name(), object, std::move(action)));
}
-static std::unique_ptr<Event> BUILD_EVENT_age_reached(BuildContext &ctx, VirtualNode *vnode)
+static std::unique_ptr<Event> BUILD_EVENT_age_reached(BuildContext &ctx,
+ VirtualNode *vnode,
+ ParticleFunction compute_inputs_fn)
{
- auto fn_or_error = create_function__event_inputs(vnode, ctx.data_graph);
- if (fn_or_error.is_error()) {
- return {};
- }
-
- SharedFunction fn = fn_or_error.extract_value();
auto action = build_action_for_trigger(ctx, vnode->output(0));
return std::unique_ptr<Event>(
- new AgeReachedEvent(vnode->name(), ParticleFunction(fn), std::move(action)));
+ new AgeReachedEvent(vnode->name(), std::move(compute_inputs_fn), std::move(action)));
}
-static std::unique_ptr<Event> BUILD_EVENT_close_by_points(BuildContext &ctx, VirtualNode *vnode)
+static std::unique_ptr<Event> BUILD_EVENT_close_by_points(BuildContext &ctx,
+ VirtualNode *vnode,
+ ParticleFunction compute_inputs)
{
- auto fn_or_error = create_function__event_inputs(vnode, ctx.data_graph);
- if (fn_or_error.is_error()) {
+ if (compute_inputs.depends_on_particle()) {
return {};
}
- SharedFunction fn = fn_or_error.extract_value();
auto action = build_action_for_trigger(ctx, vnode->output(0));
+ SharedFunction &fn = compute_inputs.function();
+ BLI_assert(fn->input_amount() == 0);
TupleCallBody &body = fn->body<TupleCallBody>();
FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
body.call__setup_execution_context(fn_in, fn_out);
diff --git a/source/blender/simulations/bparticles/inserters.hpp b/source/blender/simulations/bparticles/inserters.hpp
index cb56f3fae4a..7148e0578b5 100644
--- a/source/blender/simulations/bparticles/inserters.hpp
+++ b/source/blender/simulations/bparticles/inserters.hpp
@@ -42,11 +42,14 @@ ValueOrError<SharedFunction> create_function__offset_handler_inputs(
ValueOrError<SharedFunction> create_function__force_inputs(VirtualNode *force_vnode,
VTreeDataGraph &data_graph);
+ValueOrError<SharedFunction> create_function__event_inputs(VirtualNode *event_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)>;
+using EventFromNodeCallback = std::function<std::unique_ptr<Event>(
+ BuildContext &ctx, VirtualNode *vnode, ParticleFunction compute_inputs_fn)>;
using EmitterFromNodeCallback = std::function<std::unique_ptr<Emitter>(
BuildContext &ctx, VirtualNode *vnode, StringRef particle_type_name)>;
diff --git a/source/blender/simulations/bparticles/node_frontend.cpp b/source/blender/simulations/bparticles/node_frontend.cpp
index 1b0564b279d..871c6d2c1eb 100644
--- a/source/blender/simulations/bparticles/node_frontend.cpp
+++ b/source/blender/simulations/bparticles/node_frontend.cpp
@@ -110,7 +110,14 @@ std::unique_ptr<StepDescription> step_description_from_node_tree(VirtualNodeTree
for (VirtualNode *vnode : vtree.nodes_with_idname(item.key)) {
for (VirtualSocket *linked : vnode->input(0)->links()) {
if (is_particle_type_node(linked->vnode())) {
- auto event = item.value(ctx, vnode);
+ auto fn_or_error = create_function__event_inputs(vnode, data_graph);
+ if (fn_or_error.is_error()) {
+ continue;
+ }
+
+ ParticleFunction fn(fn_or_error.extract_value());
+
+ auto event = item.value(ctx, vnode, std::move(fn));
if (event) {
events.add(linked->vnode()->name(), event.release());
}
diff --git a/source/blender/simulations/bparticles/particle_function.hpp b/source/blender/simulations/bparticles/particle_function.hpp
index f6c1166c9c6..203e1dce93e 100644
--- a/source/blender/simulations/bparticles/particle_function.hpp
+++ b/source/blender/simulations/bparticles/particle_function.hpp
@@ -70,6 +70,16 @@ class ParticleFunction {
BLI_assert(m_body != nullptr);
}
+ bool depends_on_particle()
+ {
+ return m_fn->input_amount() > 0;
+ }
+
+ SharedFunction &function()
+ {
+ return m_fn;
+ }
+
std::unique_ptr<ParticleFunctionResult> compute(ActionInterface &interface);
std::unique_ptr<ParticleFunctionResult> compute(OffsetHandlerInterface &interface);
std::unique_ptr<ParticleFunctionResult> compute(ForceInterface &interface);
More information about the Bf-blender-cvs
mailing list