[Bf-blender-cvs] [419f0de8d36] functions: initialize emitter differently
Jacques Lucke
noreply at git.blender.org
Mon Jul 15 18:12:31 CEST 2019
Commit: 419f0de8d3637f59a8f89d29d0e74cc6b5c62648
Author: Jacques Lucke
Date: Mon Jul 15 15:11:36 2019 +0200
Branches: functions
https://developer.blender.org/rB419f0de8d3637f59a8f89d29d0e74cc6b5c62648
initialize emitter differently
===================================================================
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/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index fda8c39250d..7ade517a74b 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -48,136 +48,89 @@ class MovingPointEmitter : public Emitter {
}
};
-class SurfaceEmitter : public Emitter {
- private:
- std::string m_particle_type_name;
- SharedFunction m_compute_inputs_fn;
- TupleCallBody *m_compute_inputs_body;
- WorldState &m_world_state;
- std::unique_ptr<Action> m_action;
+static float3 random_point_in_triangle(float3 a, float3 b, float3 c)
+{
+ float3 dir1 = b - a;
+ float3 dir2 = c - a;
+ float rand1, rand2;
- public:
- SurfaceEmitter(StringRef particle_type_name,
- SharedFunction &compute_inputs,
- WorldState &world_state,
- std::unique_ptr<Action> action)
- : m_particle_type_name(particle_type_name.to_std_string()),
- m_compute_inputs_fn(compute_inputs),
- m_world_state(world_state),
- m_action(std::move(action))
- {
- m_compute_inputs_body = m_compute_inputs_fn->body<TupleCallBody>();
+ do {
+ rand1 = random_float();
+ rand2 = random_float();
+ } while (rand1 + rand2 > 1.0f);
+
+ return a + dir1 * rand1 + dir2 * rand2;
+}
+
+void SurfaceEmitter::emit(EmitterInterface &interface)
+{
+ if (m_object == nullptr) {
+ return;
+ }
+ if (m_object->type != OB_MESH) {
+ return;
}
- void emit(EmitterInterface &interface) override
- {
- FN_TUPLE_CALL_ALLOC_TUPLES(m_compute_inputs_body, fn_in, fn_out);
-
- FN::ExecutionStack stack;
- FN::ExecutionContext execution_context(stack);
-
- m_compute_inputs_body->call(fn_in, fn_out, execution_context);
- Object *object = fn_out.get<Object *>(0);
- float rate = std::max(0.0f, fn_out.get<float>(1));
- float normal_velocity_factor = fn_out.get<float>(2);
- float emitter_velocity_factor = fn_out.get<float>(3);
- float size = fn_out.get<float>(4);
-
- float particles_to_emit_f = rate * interface.time_span().duration();
- float fraction = particles_to_emit_f - std::floor(particles_to_emit_f);
- if ((rand() % 1000) / 1000.0f < fraction) {
- particles_to_emit_f = std::floor(particles_to_emit_f) + 1;
- }
- uint particles_to_emit = particles_to_emit_f;
+ float particles_to_emit_f = m_rate * interface.time_span().duration();
+ float fraction = particles_to_emit_f - std::floor(particles_to_emit_f);
+ if ((rand() % 1000) / 1000.0f < fraction) {
+ particles_to_emit_f = std::floor(particles_to_emit_f) + 1;
+ }
+ uint particles_to_emit = particles_to_emit_f;
- if (object == nullptr) {
- return;
- }
- if (object->type != OB_MESH) {
- return;
- }
+ Mesh *mesh = (Mesh *)m_object->data;
- Mesh *mesh = (Mesh *)object->data;
- float4x4 transform_start = m_world_state.update(object->id.name, object->obmat);
- float4x4 transform_end = object->obmat;
+ MLoop *loops = mesh->mloop;
+ MVert *verts = mesh->mvert;
+ const MLoopTri *triangles = BKE_mesh_runtime_looptri_ensure(mesh);
+ int triangle_amount = BKE_mesh_runtime_looptri_len(mesh);
+ if (triangle_amount == 0) {
+ return;
+ }
- MLoop *loops = mesh->mloop;
- MVert *verts = mesh->mvert;
- const MLoopTri *triangles = BKE_mesh_runtime_looptri_ensure(mesh);
- int triangle_amount = BKE_mesh_runtime_looptri_len(mesh);
- if (triangle_amount == 0) {
- return;
- }
+ SmallVector<float3> positions;
+ SmallVector<float3> velocities;
+ SmallVector<float> sizes;
+ SmallVector<float> birth_times;
- SmallVector<float3> positions;
- SmallVector<float3> velocities;
- SmallVector<float> sizes;
- SmallVector<float> birth_times;
-
- for (uint i = 0; i < particles_to_emit; i++) {
- MLoopTri triangle = triangles[rand() % triangle_amount];
- float birth_moment = random_float();
-
- float3 v1 = verts[loops[triangle.tri[0]].v].co;
- float3 v2 = verts[loops[triangle.tri[1]].v].co;
- float3 v3 = verts[loops[triangle.tri[2]].v].co;
- float3 pos = random_point_in_triangle(v1, v2, v3);
-
- float3 normal;
- normal_tri_v3(normal, v1, v2, v3);
-
- float epsilon = 0.01f;
- /* TODO: interpolate decomposed matrices */
- float4x4 transform_at_birth = float4x4::interpolate(
- transform_start, transform_end, birth_moment);
- float4x4 transform_before_birth = float4x4::interpolate(
- transform_start, transform_end, birth_moment - epsilon);
-
- float3 point_at_birth = transform_at_birth.transform_position(pos);
- float3 point_before_birth = transform_before_birth.transform_position(pos);
-
- float3 normal_velocity = transform_at_birth.transform_direction(normal);
- float3 emitter_velocity = (point_at_birth - point_before_birth) / epsilon;
-
- positions.append(point_at_birth);
- velocities.append(normal_velocity * normal_velocity_factor +
- emitter_velocity * emitter_velocity_factor);
- birth_times.append(interface.time_span().interpolate(birth_moment));
- sizes.append(size);
- }
+ for (uint i = 0; i < particles_to_emit; i++) {
+ MLoopTri triangle = triangles[rand() % triangle_amount];
+ float birth_moment = random_float();
- auto target = interface.particle_allocator().request(m_particle_type_name, positions.size());
- target.set_float3("Position", positions);
- target.set_float3("Velocity", velocities);
- target.set_float("Size", sizes);
- target.set_float("Birth Time", birth_times);
+ float3 v1 = verts[loops[triangle.tri[0]].v].co;
+ float3 v2 = verts[loops[triangle.tri[1]].v].co;
+ float3 v3 = verts[loops[triangle.tri[2]].v].co;
+ float3 pos = random_point_in_triangle(v1, v2, v3);
- ActionInterface::RunFromEmitter(m_action, target, interface);
- }
+ float3 normal;
+ normal_tri_v3(normal, v1, v2, v3);
- float3 random_point_in_triangle(float3 a, float3 b, float3 c)
- {
- float3 dir1 = b - a;
- float3 dir2 = c - a;
- float rand1, rand2;
+ float epsilon = 0.01f;
+ /* TODO: interpolate decomposed matrices */
+ float4x4 transform_at_birth = float4x4::interpolate(
+ m_transform_start, m_transform_end, birth_moment);
+ float4x4 transform_before_birth = float4x4::interpolate(
+ m_transform_start, m_transform_end, birth_moment - epsilon);
+
+ float3 point_at_birth = transform_at_birth.transform_position(pos);
+ float3 point_before_birth = transform_before_birth.transform_position(pos);
- do {
- rand1 = random_float();
- rand2 = random_float();
- } while (rand1 + rand2 > 1.0f);
+ float3 normal_velocity = transform_at_birth.transform_direction(normal);
+ float3 emitter_velocity = (point_at_birth - point_before_birth) / epsilon;
- return a + dir1 * rand1 + dir2 * rand2;
+ positions.append(point_at_birth);
+ velocities.append(normal_velocity + emitter_velocity);
+ birth_times.append(interface.time_span().interpolate(birth_moment));
+ sizes.append(0.1f);
}
-};
-std::unique_ptr<Emitter> EMITTER_mesh_surface(StringRef particle_type_name,
- SharedFunction &compute_inputs_fn,
- WorldState &world_state,
- std::unique_ptr<Action> action)
-{
- Emitter *emitter = new SurfaceEmitter(
- particle_type_name, compute_inputs_fn, world_state, std::move(action));
- return std::unique_ptr<Emitter>(emitter);
+ auto target = interface.particle_allocator().request(m_particle_type_name, positions.size());
+ target.set_float3("Position", positions);
+ target.set_float3("Velocity", velocities);
+ target.set_float("Size", sizes);
+ target.set_float("Birth Time", birth_times);
+
+ ActionInterface::RunFromEmitter(m_action, target, interface);
}
std::unique_ptr<Emitter> EMITTER_moving_point(StringRef particle_type_name,
diff --git a/source/blender/simulations/bparticles/emitters.hpp b/source/blender/simulations/bparticles/emitters.hpp
index 41817695ed9..f677f751d5c 100644
--- a/source/blender/simulations/bparticles/emitters.hpp
+++ b/source/blender/simulations/bparticles/emitters.hpp
@@ -11,6 +11,16 @@ namespace BParticles {
using FN::SharedFunction;
using FN::TupleCallBody;
+struct SurfaceEmitter : public Emitter {
+ std::string m_particle_type_name;
+ std::unique_ptr<Action> m_action;
+ Object *m_object;
+ float4x4 m_transform_start, m_transform_end;
+ float m_rate;
+
+ void emit(EmitterInterface &interface) override;
+};
+
std::unique_ptr<Emitter> EMITTER_mesh_surface(StringRef particle_type_name,
SharedFunction &compute_inputs_fn,
WorldState &world_state,
diff --git a/source/blender/simulations/bparticles/inserters.cpp b/source/blender/simulations/bparticles/inserters.cpp
index 4c4b3c9ae9f..1fa0878451e 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -227,9 +227,21 @@ static std::unique_ptr<Emitter> BUILD_EMITTER_mesh_surface(BuildContext &ctx,
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);
+
+ 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_transform_end = emitter->m_object->obmat;
+ emitter->m_transform_start = ctx.worl
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list