Mesh: Reduce custom normal calculation memory usage #107592

Merged
Hans Goudey merged 32 commits from HooglyBoogly/blender:corner-normals-refactor-storage into main 2023-05-10 14:41:16 +02:00
1 changed files with 33 additions and 32 deletions
Showing only changes of commit 6c3883a26c - Show all commits

View File

@ -1642,46 +1642,47 @@ static void mesh_normals_loop_custom_set(Span<float3> positions,
}
continue;
}
if (!done_loops[i]) {
continue;
}
const int space_index = lnors_spacearr.corner_space_indices[i];
if (done_loops[i]) {
/* Note we accumulate and average all custom normals in current smooth fan,
* to avoid getting different clnors data (tiny differences in plain custom normals can
* give rather huge differences in computed 2D factors). */
int loop_link = lnors_spacearr.corner_group_lists[i];
if (loop_link == -1) {
const int nidx = use_vertices ? corner_verts[i] : i;
/* Note we accumulate and average all custom normals in current smooth fan,
* to avoid getting different clnors data (tiny differences in plain custom normals can
* give rather huge differences in computed 2D factors). */
int loop_link = lnors_spacearr.corner_group_lists[i];
if (loop_link == -1) {
const int nidx = use_vertices ? corner_verts[i] : i;
float *nor = r_custom_loop_normals[nidx];
const int space_index = lnors_spacearr.corner_space_indices[i];
fan_space_custom_normal_to_data(
&lnors_spacearr.spaces[space_index], loop_normals[i], nor, r_clnors_data[i]);
done_loops[i].reset();
}
else {
int avg_nor_count = 0;
float3 avg_nor(0.0f);
while (loop_link != -1) {
const int lidx = loop_link;
const int nidx = use_vertices ? corner_verts[lidx] : lidx;
float *nor = r_custom_loop_normals[nidx];
const int space_index = lnors_spacearr.corner_space_indices[i];
fan_space_custom_normal_to_data(
&lnors_spacearr.spaces[space_index], loop_normals[i], nor, r_clnors_data[i]);
done_loops[i].reset();
avg_nor_count++;
add_v3_v3(avg_nor, nor);
loop_link = lnors_spacearr.corner_group_lists[loop_link];
done_loops[lidx].reset();
}
else {
int avg_nor_count = 0;
float3 avg_nor(0.0f);
while (loop_link != -1) {
const int lidx = loop_link;
const int nidx = use_vertices ? corner_verts[lidx] : lidx;
float *nor = r_custom_loop_normals[nidx];
avg_nor_count++;
add_v3_v3(avg_nor, nor);
mul_v3_fl(avg_nor, 1.0f / float(avg_nor_count));
short2 clnor_data_tmp;
fan_space_custom_normal_to_data(
&lnors_spacearr.spaces[space_index], loop_normals[i], avg_nor, clnor_data_tmp);
loop_link = lnors_spacearr.corner_group_lists[loop_link];
done_loops[lidx].reset();
}
mul_v3_fl(avg_nor, 1.0f / float(avg_nor_count));
short2 clnor_data_tmp;
fan_space_custom_normal_to_data(
&lnors_spacearr.spaces[space_index], loop_normals[i], avg_nor, clnor_data_tmp);
r_clnors_data.fill_indices(processed_corners.as_span(), clnor_data_tmp);
processed_corners.clear();
}
r_clnors_data.fill_indices(processed_corners.as_span(), clnor_data_tmp);
processed_corners.clear();
}
}
}