[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