[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