Mesh: Replace auto smooth with node group #108014

Merged
Hans Goudey merged 149 commits from HooglyBoogly/blender:refactor-mesh-corner-normals-lazy into main 2023-10-20 16:54:20 +02:00
4 changed files with 24 additions and 25 deletions
Showing only changes of commit 09ec47a973 - Show all commits

View File

@ -332,8 +332,9 @@ void mesh_render_data_update_normals(MeshRenderData *mr, const eMRDataType data_
}
if (((data_flag & MR_DATA_LOOP_NOR) &&
mr->me->normal_domain_all_info() == ATTR_DOMAIN_CORNER) ||
(data_flag & MR_DATA_TAN_LOOP_NOR)) {
mr->corner_normals = mr->me->corner_normals();
(data_flag & MR_DATA_TAN_LOOP_NOR))
{
mr->loop_normals = mr->me->corner_normals();
}
}
else {
@ -365,7 +366,7 @@ void mesh_render_data_update_normals(MeshRenderData *mr, const eMRDataType data_
nullptr,
clnors_offset,
false);
mr->corner_normals = mr->bm_loop_normals;
mr->loop_normals = mr->bm_loop_normals;
}
}
}

View File

@ -91,7 +91,7 @@ struct MeshRenderData {
const int *material_indices;
blender::Span<blender::float3> vert_normals;
blender::Span<blender::float3> poly_normals;
blender::Span<blender::float3> corner_normals;
blender::Span<blender::float3> loop_normals;
const bool *hide_vert;
const bool *hide_edge;
const bool *hide_poly;

View File

@ -41,9 +41,8 @@ static void extract_lnor_iter_poly_bm(const MeshRenderData *mr,
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
do {
const int l_index = BM_elem_index_get(l_iter);
if (!mr->corner_normals.is_empty()) {
(*(GPUPackedNormal **)data)[l_index] = GPU_normal_convert_i10_v3(
mr->corner_normals[l_index]);
if (!mr->loop_normals.is_empty()) {
(*(GPUPackedNormal **)data)[l_index] = GPU_normal_convert_i10_v3(mr->loop_normals[l_index]);
}
else {
if (BM_elem_flag_test(f, BM_ELEM_SMOOTH)) {
@ -65,8 +64,8 @@ static void extract_lnor_iter_poly_mesh(const MeshRenderData *mr, const int poly
for (const int ml_index : mr->polys[poly_index]) {
const int vert = mr->corner_verts[ml_index];
GPUPackedNormal *lnor_data = &(*(GPUPackedNormal **)data)[ml_index];
if (!mr->corner_normals.is_empty()) {
*lnor_data = GPU_normal_convert_i10_v3(mr->corner_normals[ml_index]);
if (!mr->loop_normals.is_empty()) {
*lnor_data = GPU_normal_convert_i10_v3(mr->loop_normals[ml_index]);
}
else if (mr->sharp_faces && mr->sharp_faces[poly_index]) {
*lnor_data = GPU_normal_convert_i10_v3(mr->poly_normals[poly_index]);
@ -164,8 +163,8 @@ static void extract_lnor_hq_iter_poly_bm(const MeshRenderData *mr,
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
do {
const int l_index = BM_elem_index_get(l_iter);
if (!mr->corner_normals.is_empty()) {
normal_float_to_short_v3(&(*(gpuHQNor **)data)[l_index].x, mr->corner_normals[l_index]);
if (!mr->loop_normals.is_empty()) {
normal_float_to_short_v3(&(*(gpuHQNor **)data)[l_index].x, mr->loop_normals[l_index]);
}
else {
if (BM_elem_flag_test(f, BM_ELEM_SMOOTH)) {
@ -187,8 +186,8 @@ static void extract_lnor_hq_iter_poly_mesh(const MeshRenderData *mr,
for (const int ml_index : mr->polys[poly_index]) {
const int vert = mr->corner_verts[ml_index];
gpuHQNor *lnor_data = &(*(gpuHQNor **)data)[ml_index];
if (!mr->corner_normals.is_empty()) {
normal_float_to_short_v3(&lnor_data->x, mr->corner_normals[ml_index]);
if (!mr->loop_normals.is_empty()) {
normal_float_to_short_v3(&lnor_data->x, mr->loop_normals[ml_index]);
}
else if (mr->sharp_faces && mr->sharp_faces[poly_index]) {
normal_float_to_short_v3(&lnor_data->x, mr->poly_normals[poly_index]);

View File

@ -102,17 +102,16 @@ static void extract_tan_init_common(const MeshRenderData *mr,
short tangent_mask = 0;
bool calc_active_tangent = false;
if (mr->extract_type == MR_EXTRACT_BMESH) {
BKE_editmesh_loop_tangent_calc(
mr->edit_bmesh,
calc_active_tangent,
r_tangent_names,
tan_len,
reinterpret_cast<const float(*)[3]>(mr->poly_normals.data()),
reinterpret_cast<const float(*)[3]>(mr->corner_normals.data()),
orco,
r_loop_data,
mr->loop_len,
&tangent_mask);
BKE_editmesh_loop_tangent_calc(mr->edit_bmesh,
calc_active_tangent,
r_tangent_names,
tan_len,
reinterpret_cast<const float(*)[3]>(mr->poly_normals.data()),
reinterpret_cast<const float(*)[3]>(mr->loop_normals.data()),
orco,
r_loop_data,
mr->loop_len,
&tangent_mask);
}
else {
BKE_mesh_calc_loop_tangent_ex(reinterpret_cast<const float(*)[3]>(mr->vert_positions.data()),
@ -128,7 +127,7 @@ static void extract_tan_init_common(const MeshRenderData *mr,
tan_len,
reinterpret_cast<const float(*)[3]>(mr->vert_normals.data()),
reinterpret_cast<const float(*)[3]>(mr->poly_normals.data()),
reinterpret_cast<const float(*)[3]>(mr->corner_normals.data()),
reinterpret_cast<const float(*)[3]>(mr->loop_normals.data()),
orco,
r_loop_data,
mr->corner_verts.size(),