[Bf-blender-cvs] [77d8f118efb] functions: avoid stepping when the emitter is moving quickly

Jacques Lucke noreply at git.blender.org
Mon Jul 1 17:47:25 CEST 2019


Commit: 77d8f118efb3eb3418bbf21fcf42846fd86fc930
Author: Jacques Lucke
Date:   Mon Jul 1 17:29:14 2019 +0200
Branches: functions
https://developer.blender.org/rB77d8f118efb3eb3418bbf21fcf42846fd86fc930

avoid stepping when the emitter is moving quickly

===================================================================

M	source/blender/blenlib/BLI_math.hpp
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/simulations/bparticles/c_wrapper.cpp
M	source/blender/simulations/bparticles/core.cpp
M	source/blender/simulations/bparticles/core.hpp
M	source/blender/simulations/bparticles/emitters.cpp
M	source/blender/simulations/bparticles/emitters.hpp

===================================================================

diff --git a/source/blender/blenlib/BLI_math.hpp b/source/blender/blenlib/BLI_math.hpp
index 47e0d88cd03..5eab8c94cbe 100644
--- a/source/blender/blenlib/BLI_math.hpp
+++ b/source/blender/blenlib/BLI_math.hpp
@@ -129,11 +129,11 @@ struct float3 {
 };
 
 struct float4x4 {
-  float v[4][4];
+  float values[4][4];
 
   float4x4(float *matrix)
   {
-    memcpy(v, matrix, sizeof(float) * 16);
+    memcpy(values, matrix, sizeof(float) * 16);
   }
 
   float4x4(float matrix[4][4]) : float4x4((float *)matrix)
@@ -148,7 +148,7 @@ struct float4x4 {
   float4x4 inverted() const
   {
     float result[4][4];
-    invert_m4_m4(result, (float(*)[4])this);
+    invert_m4_m4(result, values);
     return result;
   }
 
@@ -159,15 +159,22 @@ struct float4x4 {
 
   float3 transform_position(float3 position)
   {
-    mul_m4_v3((float(*)[4])this, position);
+    mul_m4_v3(values, position);
     return position;
   }
 
   float3 transform_direction(float3 direction)
   {
-    mul_mat3_m4_v3((float(*)[4])this, direction);
+    mul_mat3_m4_v3(values, direction);
     return direction;
   }
+
+  static float4x4 interpolate(float4x4 a, float4x4 b, float t)
+  {
+    float result[4][4];
+    interp_m4_m4m4(result, a.values, b.values, t);
+    return result;
+  }
 };
 
 }  // namespace BLI
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 84a52a3fdf1..a0a06feea49 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1969,6 +1969,7 @@ typedef struct NodeParticlesModifierData {
   float control1, control2;
   struct Object *emitter_object;
   struct Object *collision_object;
+  float last_emitter_transforms[4][4];
 } NodeParticlesModifierData;
 
 #endif /* __DNA_MODIFIER_TYPES_H__ */
diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp
index 3d517e6b416..0ff9c7f5412 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -234,8 +234,12 @@ void BParticles_simulate_modifier(NodeParticlesModifierData *npmd,
   type0->m_integrator->m_forces.append(FORCE_directional({0, 0, -2}));
 
   if (npmd->emitter_object) {
-    description.m_emitters.append(EMITTER_mesh_surface(
-        0, (Mesh *)npmd->emitter_object->data, npmd->emitter_object->obmat, npmd->control1));
+    description.m_emitters.append(EMITTER_mesh_surface(0,
+                                                       (Mesh *)npmd->emitter_object->data,
+                                                       npmd->last_emitter_transforms,
+                                                       npmd->emitter_object->obmat,
+                                                       npmd->control1));
+    copy_m4_m4(npmd->last_emitter_transforms, npmd->emitter_object->obmat);
   }
   BVHTreeFromMesh treedata = {0};
   if (npmd->collision_object) {
diff --git a/source/blender/simulations/bparticles/core.cpp b/source/blender/simulations/bparticles/core.cpp
index c80d6ddc76f..f5831ee5372 100644
--- a/source/blender/simulations/bparticles/core.cpp
+++ b/source/blender/simulations/bparticles/core.cpp
@@ -304,6 +304,16 @@ void TimeSpanEmitTarget::set_randomized_birth_moments()
   this->set_float("Birth Time", birth_times);
 }
 
+void TimeSpanEmitTarget::set_birth_moments(ArrayRef<float> time_factors)
+{
+  BLI_assert(time_factors.size() == m_size);
+  SmallVector<float> birth_times(time_factors.size());
+  for (uint i = 0; i < m_size; i++) {
+    birth_times[i] = m_time_span.interpolate(time_factors[i]);
+  }
+  this->set_float("Birth Time", birth_times);
+}
+
 /* EventFilterInterface
  *****************************************/
 
diff --git a/source/blender/simulations/bparticles/core.hpp b/source/blender/simulations/bparticles/core.hpp
index e7f909e215c..9e1a6932b3b 100644
--- a/source/blender/simulations/bparticles/core.hpp
+++ b/source/blender/simulations/bparticles/core.hpp
@@ -349,6 +349,11 @@ class TimeSpanEmitTarget : public EmitTargetBase {
    * Randomize the birth times within a time span.
    */
   void set_randomized_birth_moments();
+
+  /**
+   * Set custom bith moments. All values should be in [0, 1].
+   */
+  void set_birth_moments(ArrayRef<float> time_factors);
 };
 
 /**
diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index 938cc554a97..a275092c430 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -33,14 +33,20 @@ class SurfaceEmitter : public Emitter {
  private:
   uint m_particle_type_id;
   Mesh *m_mesh;
-  float4x4 m_transform;
+  float4x4 m_transform_start;
+  float4x4 m_transform_end;
   float m_normal_velocity;
 
  public:
-  SurfaceEmitter(uint particle_type_id, Mesh *mesh, float4x4 transform, float normal_velocity)
+  SurfaceEmitter(uint particle_type_id,
+                 Mesh *mesh,
+                 float4x4 transform_start,
+                 float4x4 transform_end,
+                 float normal_velocity)
       : m_particle_type_id(particle_type_id),
         m_mesh(mesh),
-        m_transform(transform),
+        m_transform_start(transform_start),
+        m_transform_end(transform_end),
         m_normal_velocity(normal_velocity)
   {
   }
@@ -54,26 +60,31 @@ class SurfaceEmitter : public Emitter {
 
     SmallVector<float3> positions;
     SmallVector<float3> velocities;
+    SmallVector<float> birth_moments;
 
     for (int i = 0; i < triangle_amount; i++) {
       MLoopTri triangle = triangles[i];
+      float birth_moment = (rand() % 1000) / 1000.0f;
 
       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 = (v1 + v2 + v3) / 3.0f;
 
       float3 normal;
       normal_tri_v3(normal, v1, v2, v3);
 
-      float3 pos = (v1 + v2 + v3) / 3.0f;
-      positions.append(m_transform.transform_position(pos));
-      velocities.append(m_transform.transform_direction(normal * m_normal_velocity));
+      float4x4 transform = float4x4::interpolate(m_transform_start, m_transform_end, birth_moment);
+
+      positions.append(transform.transform_position(pos));
+      velocities.append(transform.transform_direction(normal * m_normal_velocity));
+      birth_moments.append(birth_moment);
     }
 
     auto &target = interface.request(m_particle_type_id, positions.size());
     target.set_float3("Position", positions);
     target.set_float3("Velocity", velocities);
-    target.set_randomized_birth_moments();
+    target.set_birth_moments(birth_moments);
   }
 };
 
@@ -134,10 +145,12 @@ Emitter *EMITTER_point(float3 point)
 
 Emitter *EMITTER_mesh_surface(uint particle_type_id,
                               Mesh *mesh,
-                              const float4x4 &transform,
+                              const float4x4 &transform_start,
+                              const float4x4 &transform_end,
                               float normal_velocity)
 {
-  return new SurfaceEmitter(particle_type_id, mesh, transform, normal_velocity);
+  return new SurfaceEmitter(
+      particle_type_id, mesh, transform_start, transform_end, normal_velocity);
 }
 
 Emitter *EMITTER_path(Path *path, float4x4 transform)
diff --git a/source/blender/simulations/bparticles/emitters.hpp b/source/blender/simulations/bparticles/emitters.hpp
index d219bd7f064..79e82621444 100644
--- a/source/blender/simulations/bparticles/emitters.hpp
+++ b/source/blender/simulations/bparticles/emitters.hpp
@@ -12,7 +12,8 @@ using BLI::float4x4;
 Emitter *EMITTER_point(float3 point);
 Emitter *EMITTER_mesh_surface(uint particle_type_id,
                               struct Mesh *mesh,
-                              const float4x4 &transform,
+                              const float4x4 &transform_start,
+                              const float4x4 &transform_end,
                               float normal_velocity);
 Emitter *EMITTER_path(struct Path *path, float4x4 transform);
 Emitter *EMITTER_emit_at_start();



More information about the Bf-blender-cvs mailing list