[Bf-blender-cvs] [d3210c25479] functions: deduplicate vertex weights input code

Jacques Lucke noreply at git.blender.org
Tue Sep 3 16:23:23 CEST 2019


Commit: d3210c254791ceb79f88451bd74fe59764c00c64
Author: Jacques Lucke
Date:   Tue Sep 3 16:17:22 2019 +0200
Branches: functions
https://developer.blender.org/rBd3210c254791ceb79f88451bd74fe59764c00c64

deduplicate vertex weights input code

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

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

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

diff --git a/source/blender/simulations/bparticles/particle_function_input_providers.cpp b/source/blender/simulations/bparticles/particle_function_input_providers.cpp
index 9d0e19852f0..aa5e904e921 100644
--- a/source/blender/simulations/bparticles/particle_function_input_providers.cpp
+++ b/source/blender/simulations/bparticles/particle_function_input_providers.cpp
@@ -135,109 +135,76 @@ Optional<ParticleFunctionInputArray> SurfaceImageInputProvider::get(
   return ParticleFunctionInputArray(ArrayRef<rgba_f>(colors), true);
 }
 
-Optional<ParticleFunctionInputArray> VertexWeightInputProvider::get(
-    InputProviderInterface &interface)
+static BLI_NOINLINE Optional<ParticleFunctionInputArray> compute_vertex_weights(
+    InputProviderInterface &interface,
+    StringRef group_name,
+    MeshSurfaceActionContext *surface_info,
+    ArrayRef<uint> surface_info_mapping)
 {
-  ActionContext *action_context = interface.action_context();
+  Object *object = surface_info->object();
+  Mesh *mesh = (Mesh *)object->data;
+  MDeformVert *vertex_weights = mesh->dvert;
 
-  if (dynamic_cast<MeshSurfaceActionContext *>(action_context)) {
-    auto *surface_info = dynamic_cast<MeshSurfaceActionContext *>(action_context);
+  int group_index = defgroup_name_index(object, group_name.data());
+  if (group_index == -1 || vertex_weights == nullptr) {
+    return {};
+  }
 
-    Object *object = surface_info->object();
-    Mesh *mesh = (Mesh *)object->data;
+  const MLoopTri *triangles = BKE_mesh_runtime_looptri_ensure(mesh);
 
-    MDeformVert *vertex_weights = mesh->dvert;
-    int group_index = defgroup_name_index(object, m_group_name.data());
-    if (group_index == -1 || vertex_weights == nullptr) {
-      return {};
-    }
+  float *weight_buffer = (float *)BLI_temporary_allocate(sizeof(float) *
+                                                         interface.attributes().size());
+  MutableArrayRef<float> weights(weight_buffer, interface.attributes().size());
 
-    ArrayRef<float3> local_positions = surface_info->local_positions();
-    const MLoopTri *triangles = BKE_mesh_runtime_looptri_ensure(mesh);
+  for (uint pindex : interface.pindices()) {
+    uint source_index = surface_info_mapping[pindex];
+    float3 local_position = surface_info->local_positions()[source_index];
+    uint triangle_index = surface_info->looptri_indices()[source_index];
+    const MLoopTri &triangle = triangles[triangle_index];
 
-    float *weight_buffer = (float *)BLI_temporary_allocate(sizeof(float) *
-                                                           interface.attributes().size());
-    MutableArrayRef<float> weights(weight_buffer, interface.attributes().size());
+    uint loop1 = triangle.tri[0];
+    uint loop2 = triangle.tri[1];
+    uint loop3 = triangle.tri[2];
 
-    for (uint pindex : interface.pindices()) {
-      float3 local_position = local_positions[pindex];
-      uint triangle_index = surface_info->looptri_indices()[pindex];
-      const MLoopTri &triangle = triangles[triangle_index];
+    uint vert1 = mesh->mloop[loop1].v;
+    uint vert2 = mesh->mloop[loop2].v;
+    uint vert3 = mesh->mloop[loop3].v;
 
-      uint loop1 = triangle.tri[0];
-      uint loop2 = triangle.tri[1];
-      uint loop3 = triangle.tri[2];
+    float3 v1 = mesh->mvert[vert1].co;
+    float3 v2 = mesh->mvert[vert2].co;
+    float3 v3 = mesh->mvert[vert3].co;
 
-      uint vert1 = mesh->mloop[loop1].v;
-      uint vert2 = mesh->mloop[loop2].v;
-      uint vert3 = mesh->mloop[loop3].v;
+    float3 bary_weights;
+    interp_weights_tri_v3(bary_weights, v1, v2, v3, local_position);
 
-      float3 v1 = mesh->mvert[vert1].co;
-      float3 v2 = mesh->mvert[vert2].co;
-      float3 v3 = mesh->mvert[vert3].co;
+    float3 corner_weights{defvert_find_weight(vertex_weights + vert1, group_index),
+                          defvert_find_weight(vertex_weights + vert2, group_index),
+                          defvert_find_weight(vertex_weights + vert3, group_index)};
 
-      float3 bary_weights;
-      interp_weights_tri_v3(bary_weights, v1, v2, v3, local_position);
+    float weight = float3::dot(bary_weights, corner_weights);
+    weights[pindex] = weight;
+  }
 
-      float3 corner_weights{defvert_find_weight(vertex_weights + vert1, group_index),
-                            defvert_find_weight(vertex_weights + vert2, group_index),
-                            defvert_find_weight(vertex_weights + vert3, group_index)};
+  return ParticleFunctionInputArray(ArrayRef<float>(weights), true);
+}
 
-      float weight = float3::dot(bary_weights, corner_weights);
-      weights[pindex] = weight;
-    }
+Optional<ParticleFunctionInputArray> VertexWeightInputProvider::get(
+    InputProviderInterface &interface)
+{
+  ActionContext *action_context = interface.action_context();
 
-    return ParticleFunctionInputArray(ArrayRef<float>(weights), true);
+  if (dynamic_cast<MeshSurfaceActionContext *>(action_context)) {
+    auto *surface_info = dynamic_cast<MeshSurfaceActionContext *>(action_context);
+    return compute_vertex_weights(interface,
+                                  m_group_name,
+                                  surface_info,
+                                  Range<uint>(0, interface.attributes().size()).as_array_ref());
   }
   else if (dynamic_cast<SourceParticleActionContext *>(action_context)) {
     auto *source_info = dynamic_cast<SourceParticleActionContext *>(action_context);
     auto *surface_info = dynamic_cast<MeshSurfaceActionContext *>(source_info->source_context());
-
-    Object *object = surface_info->object();
-    Mesh *mesh = (Mesh *)object->data;
-
-    MDeformVert *vertex_weights = mesh->dvert;
-    int group_index = defgroup_name_index(object, m_group_name.data());
-    if (group_index == -1 || vertex_weights == nullptr) {
-      return {};
-    }
-
-    const MLoopTri *triangles = BKE_mesh_runtime_looptri_ensure(mesh);
-
-    float *weight_buffer = (float *)BLI_temporary_allocate(sizeof(float) *
-                                                           interface.attributes().size());
-    MutableArrayRef<float> weights(weight_buffer, interface.attributes().size());
-
-    for (uint pindex : interface.pindices()) {
-      uint source_index = source_info->source_indices()[pindex];
-      float3 local_position = surface_info->local_positions()[source_index];
-      uint triangle_index = surface_info->looptri_indices()[source_index];
-      const MLoopTri &triangle = triangles[triangle_index];
-
-      uint loop1 = triangle.tri[0];
-      uint loop2 = triangle.tri[1];
-      uint loop3 = triangle.tri[2];
-
-      uint vert1 = mesh->mloop[loop1].v;
-      uint vert2 = mesh->mloop[loop2].v;
-      uint vert3 = mesh->mloop[loop3].v;
-
-      float3 v1 = mesh->mvert[vert1].co;
-      float3 v2 = mesh->mvert[vert2].co;
-      float3 v3 = mesh->mvert[vert3].co;
-
-      float3 bary_weights;
-      interp_weights_tri_v3(bary_weights, v1, v2, v3, local_position);
-
-      float3 corner_weights{defvert_find_weight(vertex_weights + vert1, group_index),
-                            defvert_find_weight(vertex_weights + vert2, group_index),
-                            defvert_find_weight(vertex_weights + vert3, group_index)};
-
-      float weight = float3::dot(bary_weights, corner_weights);
-      weights[pindex] = weight;
-    }
-
-    return ParticleFunctionInputArray(ArrayRef<float>(weights), true);
+    return compute_vertex_weights(
+        interface, m_group_name, surface_info, source_info->source_indices());
   }
   else {
     return {};



More information about the Bf-blender-cvs mailing list