[Bf-blender-cvs] [36016e29605] functions: extract triangle sampling

Jacques Lucke noreply at git.blender.org
Mon Sep 2 12:31:58 CEST 2019


Commit: 36016e296058e3be66c0387c13aa934975225b5b
Author: Jacques Lucke
Date:   Mon Sep 2 11:02:24 2019 +0200
Branches: functions
https://developer.blender.org/rB36016e296058e3be66c0387c13aa934975225b5b

extract triangle sampling

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

M	source/blender/simulations/bparticles/emitters.cpp

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

diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index dffe08e88f5..c052972d110 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -219,6 +219,34 @@ static BLI_NOINLINE void compute_random_birth_moments(MutableArrayRef<float> r_b
   }
 }
 
+static BLI_NOINLINE void sample_looptris(Mesh *mesh,
+                                         ArrayRef<MLoopTri> triangles,
+                                         ArrayRef<uint> triangles_to_sample,
+                                         MutableArrayRef<float3> r_sampled_positions,
+                                         MutableArrayRef<float3> r_sampled_normals)
+{
+  BLI_assert(triangles_to_sample.size() == r_sampled_positions.size());
+
+  MLoop *loops = mesh->mloop;
+  MVert *verts = mesh->mvert;
+
+  for (uint i = 0; i < triangles_to_sample.size(); i++) {
+    uint triangle_index = triangles_to_sample[i];
+    const MLoopTri &triangle = triangles[triangle_index];
+
+    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 position = random_point_in_triangle(v1, v2, v3);
+    float3 normal;
+    normal_tri_v3(normal, v1, v2, v3);
+
+    r_sampled_positions[i] = position;
+    r_sampled_normals[i] = normal;
+  }
+}
+
 void SurfaceEmitter::emit(EmitterInterface &interface)
 {
   if (m_object == nullptr) {
@@ -237,49 +265,39 @@ void SurfaceEmitter::emit(EmitterInterface &interface)
 
   Mesh *mesh = (Mesh *)m_object->data;
 
-  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) {
+  ArrayRef<MLoopTri> triangles(BKE_mesh_runtime_looptri_ensure(mesh),
+                               BKE_mesh_runtime_looptri_len(mesh));
+  if (triangles.size() == 0) {
     return;
   }
 
-  TemporaryArray<uint> looptri_indices(particles_to_emit);
+  TemporaryArray<uint> triangles_to_sample(particles_to_emit);
   if (m_density_group.size() > 0) {
-    if (!sample_with_vertex_weights(particles_to_emit,
-                                    m_object,
-                                    mesh,
-                                    m_density_group,
-                                    BLI::ref_c_array(triangles, triangle_amount),
-                                    looptri_indices)) {
+    if (!sample_with_vertex_weights(
+            particles_to_emit, m_object, mesh, m_density_group, triangles, triangles_to_sample)) {
       return;
     }
   }
   else {
-    sample_randomly(
-        particles_to_emit, BLI::ref_c_array(triangles, triangle_amount), looptri_indices);
+    sample_randomly(particles_to_emit, triangles, triangles_to_sample);
   }
 
   TemporaryArray<float> birth_moments(particles_to_emit);
   compute_random_birth_moments(birth_moments);
 
+  TemporaryArray<float3> local_positions(particles_to_emit);
+  TemporaryArray<float3> local_normals(particles_to_emit);
+  sample_looptris(mesh, triangles, triangles_to_sample, local_positions, local_normals);
+
   Vector<float3> positions;
   Vector<float3> velocities;
   Vector<float> sizes;
   Vector<float> birth_times;
 
   for (uint i = 0; i < particles_to_emit; i++) {
-    MLoopTri triangle = triangles[looptri_indices[i]];
     float birth_moment = birth_moments[i];
-
-    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);
+    float3 pos = local_positions[i];
+    float3 normal = local_normals[i];
 
     float epsilon = 0.01f;
     float4x4 transform_at_birth = m_transform.interpolate(birth_moment);



More information about the Bf-blender-cvs mailing list