[Bf-blender-cvs] [25b3b122e67] functions: experiment with remembering last point emitter position
Jacques Lucke
noreply at git.blender.org
Mon Jul 15 18:12:29 CEST 2019
Commit: 25b3b122e67d1837d18cec98f66634542374f3c7
Author: Jacques Lucke
Date: Mon Jul 15 14:39:59 2019 +0200
Branches: functions
https://developer.blender.org/rB25b3b122e67d1837d18cec98f66634542374f3c7
experiment with remembering last point emitter position
===================================================================
M source/blender/simulations/bparticles/c_wrapper.cpp
M source/blender/simulations/bparticles/emitters.cpp
M source/blender/simulations/bparticles/emitters.hpp
M source/blender/simulations/bparticles/inserters.cpp
M source/blender/simulations/bparticles/world_state.hpp
===================================================================
diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp
index 4ce50f09f67..7f1e6a822a4 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -84,6 +84,7 @@ void BParticles_simulate_modifier(BParticlesModifierData *bpmd,
ParticlesState &particles_state = *unwrap(particles_state_c);
simulate_step(particles_state, *step_description);
+ world_state.current_step_is_over();
auto &containers = particles_state.particle_containers();
for (auto item : containers.items()) {
diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index 913ad73269f..fda8c39250d 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -17,33 +17,34 @@ static float random_float()
return (rand() % 4096) / 4096.0f;
}
-class PointEmitter : public Emitter {
+class MovingPointEmitter : public Emitter {
private:
std::string m_particle_type_name;
- SharedFunction m_compute_inputs_fn;
- TupleCallBody *m_compute_inputs_body;
+ float3 m_start, m_end;
+ uint m_amount;
public:
- PointEmitter(StringRef particle_type_name, SharedFunction &compute_inputs_fn)
+ MovingPointEmitter(StringRef particle_type_name, float3 start, float3 end, uint amount)
: m_particle_type_name(particle_type_name.to_std_string()),
- m_compute_inputs_fn(compute_inputs_fn)
+ m_start(start),
+ m_end(end),
+ m_amount(amount)
{
- m_compute_inputs_body = m_compute_inputs_fn->body<TupleCallBody>();
}
void emit(EmitterInterface &interface) override
{
- FN_TUPLE_CALL_ALLOC_TUPLES(m_compute_inputs_body, fn_in, fn_out);
+ SmallVector<float3> new_positions(m_amount);
- FN::ExecutionStack stack;
- FN::ExecutionContext execution_context(stack);
- m_compute_inputs_body->call(fn_in, fn_out, execution_context);
- float3 point = fn_out.get<float3>(0);
+ for (uint i = 0; i < m_amount; i++) {
+ float t = i / (float)m_amount;
+ float3 point = float3::interpolate(m_start, m_end, t);
+ new_positions[i] = point;
+ }
- auto target = interface.particle_allocator().request(m_particle_type_name, 1);
- target.set_float3("Position", {point});
- target.set_float3("Velocity", {float3{-1, -1, 0}});
- target.fill_float("Birth Time", interface.time_span().end());
+ auto target = interface.particle_allocator().request(m_particle_type_name,
+ new_positions.size());
+ target.set_float3("Position", new_positions);
}
};
@@ -169,13 +170,6 @@ class SurfaceEmitter : public Emitter {
}
};
-std::unique_ptr<Emitter> EMITTER_point(StringRef particle_type_name,
- SharedFunction &compute_inputs)
-{
- Emitter *emitter = new PointEmitter(particle_type_name, compute_inputs);
- return std::unique_ptr<Emitter>(emitter);
-}
-
std::unique_ptr<Emitter> EMITTER_mesh_surface(StringRef particle_type_name,
SharedFunction &compute_inputs_fn,
WorldState &world_state,
@@ -186,4 +180,12 @@ std::unique_ptr<Emitter> EMITTER_mesh_surface(StringRef particle_type_name,
return std::unique_ptr<Emitter>(emitter);
}
+std::unique_ptr<Emitter> EMITTER_moving_point(StringRef particle_type_name,
+ float3 start,
+ float3 end)
+{
+ Emitter *emitter = new MovingPointEmitter(particle_type_name, start, end, 10);
+ return std::unique_ptr<Emitter>(emitter);
+}
+
} // namespace BParticles
diff --git a/source/blender/simulations/bparticles/emitters.hpp b/source/blender/simulations/bparticles/emitters.hpp
index 64e86f32783..41817695ed9 100644
--- a/source/blender/simulations/bparticles/emitters.hpp
+++ b/source/blender/simulations/bparticles/emitters.hpp
@@ -11,12 +11,13 @@ namespace BParticles {
using FN::SharedFunction;
using FN::TupleCallBody;
-std::unique_ptr<Emitter> EMITTER_point(StringRef particle_type_name,
- SharedFunction &compute_inputs);
-
std::unique_ptr<Emitter> EMITTER_mesh_surface(StringRef particle_type_name,
SharedFunction &compute_inputs_fn,
WorldState &world_state,
std::unique_ptr<Action> action);
+std::unique_ptr<Emitter> EMITTER_moving_point(StringRef particle_type_name,
+ float3 start,
+ float3 end);
+
} // namespace BParticles
diff --git a/source/blender/simulations/bparticles/inserters.cpp b/source/blender/simulations/bparticles/inserters.cpp
index bf2d68d862c..4c4b3c9ae9f 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -222,22 +222,30 @@ static std::unique_ptr<Event> BUILD_EVENT_age_reached(BuildContext &ctx, bNode *
return EVENT_age_reached(bnode->name, fn, std::move(action));
}
-static std::unique_ptr<Emitter> BUILD_EMITTER_point(BuildContext &ctx,
- bNode *bnode,
- StringRef particle_type_name)
+static std::unique_ptr<Emitter> BUILD_EMITTER_mesh_surface(BuildContext &ctx,
+ bNode *bnode,
+ StringRef particle_type_name)
{
SharedFunction fn = create_function_for_data_inputs(bnode, ctx.indexed_tree, ctx.data_graph);
- return EMITTER_point(particle_type_name, fn);
+
+ auto action = build_action(ctx, {bSocketList(bnode->outputs).get(0), bnode});
+ return EMITTER_mesh_surface(particle_type_name, fn, ctx.world_state, std::move(action));
}
-static std::unique_ptr<Emitter> BUILD_EMITTER_mesh_surface(BuildContext &ctx,
+static std::unique_ptr<Emitter> BUILD_EMITTER_moving_point(BuildContext &ctx,
bNode *bnode,
StringRef particle_type_name)
{
SharedFunction fn = create_function_for_data_inputs(bnode, ctx.indexed_tree, ctx.data_graph);
+ BLI_assert(fn->input_amount() == 0);
- auto action = build_action(ctx, {bSocketList(bnode->outputs).get(0), bnode});
- return EMITTER_mesh_surface(particle_type_name, fn, ctx.world_state, std::move(action));
+ auto body = fn->body<TupleCallBody>();
+ FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
+ body->call__setup_execution_context(fn_in, fn_out);
+
+ float3 current_point = fn_out.get<float3>(0);
+ float3 last_point = ctx.world_state.get_last_and_store_current(bnode->name, current_point);
+ return EMITTER_moving_point(particle_type_name, last_point, current_point);
}
BLI_LAZY_INIT(StringMap<ForceFromNodeCallback>, get_force_builders)
@@ -259,7 +267,7 @@ BLI_LAZY_INIT(StringMap<EventFromNodeCallback>, get_event_builders)
BLI_LAZY_INIT(StringMap<EmitterFromNodeCallback>, get_emitter_builders)
{
StringMap<EmitterFromNodeCallback> map;
- map.add_new("bp_PointEmitterNode", BUILD_EMITTER_point);
+ map.add_new("bp_PointEmitterNode", BUILD_EMITTER_moving_point);
map.add_new("bp_MeshEmitterNode", BUILD_EMITTER_mesh_surface);
return map;
}
diff --git a/source/blender/simulations/bparticles/world_state.hpp b/source/blender/simulations/bparticles/world_state.hpp
index e88997f9a21..0de960eafa4 100644
--- a/source/blender/simulations/bparticles/world_state.hpp
+++ b/source/blender/simulations/bparticles/world_state.hpp
@@ -7,6 +7,7 @@
namespace BParticles {
+using BLI::float3;
using BLI::float4x4;
using BLI::SmallMap;
using BLI::StringMap;
@@ -15,8 +16,21 @@ using BLI::StringRef;
class WorldState {
private:
StringMap<float4x4> m_matrices;
+ StringMap<float3> m_last_positions;
+ StringMap<float3> m_current_positions;
public:
+ float3 get_last_and_store_current(StringRef id, float3 current)
+ {
+ m_current_positions.add_override(id, current);
+ return m_last_positions.lookup_default(id, current);
+ }
+
+ void current_step_is_over()
+ {
+ m_last_positions = StringMap<float3>(m_current_positions);
+ }
+
float4x4 update(StringRef id, float4x4 value)
{
std::string id_string = id.to_std_string();
More information about the Bf-blender-cvs
mailing list