[Bf-blender-cvs] [2412efdf89e] functions: simplify mesh emitter more

Jacques Lucke noreply at git.blender.org
Mon Sep 2 12:32:06 CEST 2019


Commit: 2412efdf89eb8df57ccc625436cde0472b718aae
Author: Jacques Lucke
Date:   Mon Sep 2 11:33:20 2019 +0200
Branches: functions
https://developer.blender.org/rB2412efdf89eb8df57ccc625436cde0472b718aae

simplify mesh emitter more

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

M	source/blender/blenlib/BLI_math.hpp
M	source/blender/simulations/bparticles/emitters.cpp

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

diff --git a/source/blender/blenlib/BLI_math.hpp b/source/blender/blenlib/BLI_math.hpp
index 02fab2f2962..9139e7695f4 100644
--- a/source/blender/blenlib/BLI_math.hpp
+++ b/source/blender/blenlib/BLI_math.hpp
@@ -299,18 +299,42 @@ struct float4x4 {
     return this->inverted();
   }
 
-  float3 transform_position(float3 position)
+  float3 transform_position(float3 position) const
   {
     mul_m4_v3(values, position);
     return position;
   }
 
-  float3 transform_direction(float3 direction)
+  float3 transform_direction(float3 direction) const
   {
     mul_mat3_m4_v3(values, direction);
     return direction;
   }
 
+  static void transform_positions(ArrayRef<float4x4> matrices,
+                                  ArrayRef<float3> positions,
+                                  MutableArrayRef<float3> r_results)
+  {
+    uint amount = matrices.size();
+    BLI_assert(amount == positions.size());
+    BLI_assert(amount == r_results.size());
+    for (uint i = 0; i < amount; i++) {
+      r_results[i] = matrices[i].transform_position(positions[i]);
+    }
+  }
+
+  static void transform_directions(ArrayRef<float4x4> matrices,
+                                   ArrayRef<float3> directions,
+                                   MutableArrayRef<float3> r_results)
+  {
+    uint amount = matrices.size();
+    BLI_assert(amount == directions.size());
+    BLI_assert(amount == r_results.size());
+    for (uint i = 0; i < amount; i++) {
+      r_results[i] = matrices[i].transform_direction(directions[i]);
+    }
+  }
+
   static float4x4 interpolate(float4x4 a, float4x4 b, float t)
   {
     float result[4][4];
diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index 88274c7d0ed..de3ad32d366 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -295,35 +295,37 @@ void SurfaceEmitter::emit(EmitterInterface &interface)
   m_transform.interpolate(birth_moments, 0.0f, transforms_at_birth);
   m_transform.interpolate(birth_moments, -epsilon, transforms_before_birth);
 
+  TemporaryArray<float3> positions_at_birth(particles_to_emit);
+  float4x4::transform_positions(transforms_at_birth, local_positions, positions_at_birth);
+
+  TemporaryArray<float3> positions_before_birth(particles_to_emit);
+  float4x4::transform_positions(transforms_before_birth, local_positions, positions_before_birth);
+
+  TemporaryArray<float3> normals(particles_to_emit);
+  float4x4::transform_directions(transforms_at_birth, local_normals, normals);
+
   TemporaryArray<float> sizes(particles_to_emit);
   sizes.fill(m_size);
 
   TemporaryArray<float> birth_times(particles_to_emit);
   interface.time_span().interpolate(birth_moments, birth_times);
 
-  Vector<float3> positions;
-  Vector<float3> velocities;
+  TemporaryArray<float3> velocities(particles_to_emit);
 
   for (uint i = 0; i < particles_to_emit; i++) {
-    float3 pos = local_positions[i];
-    float3 normal = local_normals[i];
-
-    float4x4 &transform_at_birth = transforms_at_birth[i];
-    float4x4 &transform_before_birth = transforms_before_birth[i];
-
-    float3 point_at_birth = transform_at_birth.transform_position(pos);
-    float3 point_before_birth = transform_before_birth.transform_position(pos);
+    float3 point_at_birth = positions_at_birth[i];
+    float3 point_before_birth = positions_before_birth[i];
 
-    float3 normal_velocity = transform_at_birth.transform_direction(normal);
+    float3 normal_velocity = normals[i];
     float3 emitter_velocity = (point_at_birth - point_before_birth) / epsilon;
 
-    positions.append(point_at_birth);
-    velocities.append(normal_velocity * m_normal_velocity + emitter_velocity * m_emitter_velocity);
+    velocities[i] = normal_velocity * m_normal_velocity + emitter_velocity * m_emitter_velocity;
   }
 
   for (StringRef type_name : m_types_to_emit) {
-    auto new_particles = interface.particle_allocator().request(type_name, positions.size());
-    new_particles.set<float3>("Position", positions);
+    auto new_particles = interface.particle_allocator().request(type_name,
+                                                                positions_at_birth.size());
+    new_particles.set<float3>("Position", positions_at_birth);
     new_particles.set<float3>("Velocity", velocities);
     new_particles.set<float>("Size", sizes);
     new_particles.set<float>("Birth Time", birth_times);



More information about the Bf-blender-cvs mailing list