[Bf-blender-cvs] [aefdc1807a6] functions: cleanup emitters
Jacques Lucke
noreply at git.blender.org
Mon Jul 15 18:12:49 CEST 2019
Commit: aefdc1807a6788e2f542a8306d407defe996df90
Author: Jacques Lucke
Date: Mon Jul 15 16:43:27 2019 +0200
Branches: functions
https://developer.blender.org/rBaefdc1807a6788e2f542a8306d407defe996df90
cleanup emitters
===================================================================
M source/blender/simulations/bparticles/emitters.cpp
M source/blender/simulations/bparticles/emitters.hpp
M source/blender/simulations/bparticles/inserters.cpp
===================================================================
diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index 1166433c3e8..28a2b02c1c0 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -20,15 +20,20 @@ static float random_float()
void PointEmitter::emit(EmitterInterface &interface)
{
SmallVector<float3> new_positions(m_amount);
+ SmallVector<float> new_sizes(m_amount, 0.1f);
+ SmallVector<float> birth_times(m_amount);
for (uint i = 0; i < m_amount; i++) {
float t = i / (float)m_amount;
float3 point = m_point.interpolate(t);
new_positions[i] = point;
+ birth_times[i] = interface.time_span().interpolate(t);
}
auto target = interface.particle_allocator().request(m_particle_type_name, new_positions.size());
target.set_float3("Position", new_positions);
+ target.set_float("Size", new_sizes);
+ target.set_float("Birth Time", birth_times);
}
static float3 random_point_in_triangle(float3 a, float3 b, float3 c)
diff --git a/source/blender/simulations/bparticles/emitters.hpp b/source/blender/simulations/bparticles/emitters.hpp
index de3a50e0204..323e796e4c6 100644
--- a/source/blender/simulations/bparticles/emitters.hpp
+++ b/source/blender/simulations/bparticles/emitters.hpp
@@ -11,7 +11,8 @@ namespace BParticles {
using FN::SharedFunction;
using FN::TupleCallBody;
-struct SurfaceEmitter : public Emitter {
+class SurfaceEmitter : public Emitter {
+ private:
std::string m_particle_type_name;
std::unique_ptr<Action> m_action;
@@ -22,14 +23,41 @@ struct SurfaceEmitter : public Emitter {
float m_emitter_velocity;
float m_size;
+ public:
+ SurfaceEmitter(StringRef particle_type_name,
+ std::unique_ptr<Action> action,
+ Object *object,
+ InterpolatedFloat4x4 transform,
+ float rate,
+ float normal_velocity,
+ float emitter_velocity,
+ float size)
+ : m_particle_type_name(particle_type_name.to_std_string()),
+ m_action(std::move(action)),
+ m_object(object),
+ m_transform(transform),
+ m_rate(rate),
+ m_normal_velocity(normal_velocity),
+ m_emitter_velocity(emitter_velocity),
+ m_size(size)
+ {
+ }
+
void emit(EmitterInterface &interface) override;
};
struct PointEmitter : public Emitter {
+ private:
std::string m_particle_type_name;
InterpolatedFloat3 m_point;
uint m_amount;
+ public:
+ PointEmitter(StringRef particle_type_name, InterpolatedFloat3 point, uint amount)
+ : m_particle_type_name(particle_type_name.to_std_string()), m_point(point), m_amount(amount)
+ {
+ }
+
void emit(EmitterInterface &interface) override;
};
diff --git a/source/blender/simulations/bparticles/inserters.cpp b/source/blender/simulations/bparticles/inserters.cpp
index 17815679a01..b7d57fecc8a 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -237,20 +237,20 @@ 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 emitter = std::unique_ptr<SurfaceEmitter>(new SurfaceEmitter());
- emitter->m_action = build_action(ctx, {bSocketList(bnode->outputs).get(0), bnode});
- emitter->m_particle_type_name = particle_type_name.to_std_string();
-
- emitter->m_object = fn_out.get<Object *>(0);
- emitter->m_rate = fn_out.get<float>(1);
- emitter->m_normal_velocity = fn_out.get<float>(2);
- emitter->m_emitter_velocity = fn_out.get<float>(3);
- emitter->m_size = fn_out.get<float>(4);
-
- emitter->m_transform = ctx.world_state.get_interpolated_value(bnode->name,
- emitter->m_object->obmat);
-
- return emitter;
+ auto on_birth_action = build_action(ctx, {bSocketList(bnode->outputs).get(0), bnode});
+
+ Object *object = fn_out.get<Object *>(0);
+ InterpolatedFloat4x4 transform = ctx.world_state.get_interpolated_value(bnode->name,
+ object->obmat);
+
+ return std::unique_ptr<SurfaceEmitter>(new SurfaceEmitter(particle_type_name,
+ std::move(on_birth_action),
+ object,
+ transform,
+ fn_out.get<float>(1),
+ fn_out.get<float>(2),
+ fn_out.get<float>(3),
+ fn_out.get<float>(4)));
}
static std::unique_ptr<Emitter> BUILD_EMITTER_moving_point(BuildContext &ctx,
@@ -264,11 +264,8 @@ static std::unique_ptr<Emitter> BUILD_EMITTER_moving_point(BuildContext &ctx,
FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
body->call__setup_execution_context(fn_in, fn_out);
- auto emitter = std::unique_ptr<PointEmitter>(new PointEmitter());
- emitter->m_particle_type_name = particle_type_name.to_std_string();
- emitter->m_point = ctx.world_state.get_interpolated_value(bnode->name, fn_out.get<float3>(0));
- emitter->m_amount = 10;
- return emitter;
+ auto point = ctx.world_state.get_interpolated_value(bnode->name, fn_out.get<float3>(0));
+ return std::unique_ptr<PointEmitter>(new PointEmitter(particle_type_name, point, 10));
}
BLI_LAZY_INIT(StringMap<ForceFromNodeCallback>, get_force_builders)
More information about the Bf-blender-cvs
mailing list