Fix #109583: Avoid non-threadsafe writing to custom normals data #110478
@ -156,9 +156,9 @@ void normals_calc_loop(Span<float3> vert_positions,
|
|||||||
Span<float3> face_normals,
|
Span<float3> face_normals,
|
||||||
const bool *sharp_edges,
|
const bool *sharp_edges,
|
||||||
const bool *sharp_faces,
|
const bool *sharp_faces,
|
||||||
|
const short2 *clnors_data,
|
||||||
bool use_split_normals,
|
bool use_split_normals,
|
||||||
float split_angle,
|
float split_angle,
|
||||||
const short2 *clnors_data,
|
|
||||||
CornerNormalSpaceArray *r_lnors_spacearr,
|
CornerNormalSpaceArray *r_lnors_spacearr,
|
||||||
MutableSpan<float3> r_loop_normals);
|
MutableSpan<float3> r_loop_normals);
|
||||||
|
|
||||||
|
@ -398,9 +398,9 @@ static void data_transfer_dtdata_type_preprocess(const Mesh *me_src,
|
|||||||
me_dst->face_normals(),
|
me_dst->face_normals(),
|
||||||
sharp_edges,
|
sharp_edges,
|
||||||
sharp_faces,
|
sharp_faces,
|
||||||
|
custom_nors_dst,
|
||||||
use_split_nors_dst,
|
use_split_nors_dst,
|
||||||
split_angle_dst,
|
split_angle_dst,
|
||||||
custom_nors_dst,
|
|
||||||
nullptr,
|
nullptr,
|
||||||
{loop_nors_dst, me_dst->totloop});
|
{loop_nors_dst, me_dst->totloop});
|
||||||
}
|
}
|
||||||
|
@ -2298,9 +2298,9 @@ void BKE_keyblock_mesh_calc_normals(const KeyBlock *kb,
|
|||||||
{reinterpret_cast<blender::float3 *>(face_normals), faces.size()},
|
{reinterpret_cast<blender::float3 *>(face_normals), faces.size()},
|
||||||
sharp_edges,
|
sharp_edges,
|
||||||
sharp_faces,
|
sharp_faces,
|
||||||
|
clnors,
|
||||||
(mesh->flag & ME_AUTOSMOOTH) != 0,
|
(mesh->flag & ME_AUTOSMOOTH) != 0,
|
||||||
mesh->smoothresh,
|
mesh->smoothresh,
|
||||||
clnors,
|
|
||||||
nullptr,
|
nullptr,
|
||||||
{reinterpret_cast<blender::float3 *>(r_loop_normals), corner_verts.size()});
|
{reinterpret_cast<blender::float3 *>(r_loop_normals), corner_verts.size()});
|
||||||
}
|
}
|
||||||
|
@ -1807,9 +1807,9 @@ void BKE_mesh_calc_normals_split_ex(Mesh *mesh,
|
|||||||
mesh->face_normals(),
|
mesh->face_normals(),
|
||||||
sharp_edges,
|
sharp_edges,
|
||||||
sharp_faces,
|
sharp_faces,
|
||||||
|
clnors,
|
||||||
use_split_normals,
|
use_split_normals,
|
||||||
split_angle,
|
split_angle,
|
||||||
clnors,
|
|
||||||
nullptr,
|
nullptr,
|
||||||
{reinterpret_cast<float3 *>(r_corner_normals), mesh->totloop});
|
{reinterpret_cast<float3 *>(r_corner_normals), mesh->totloop});
|
||||||
}
|
}
|
||||||
|
@ -417,9 +417,9 @@ Mesh *BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(MirrorModifierData *mmd,
|
|||||||
result->face_normals(),
|
result->face_normals(),
|
||||||
sharp_edges,
|
sharp_edges,
|
||||||
sharp_faces,
|
sharp_faces,
|
||||||
|
clnors,
|
||||||
true,
|
true,
|
||||||
result->smoothresh,
|
result->smoothresh,
|
||||||
clnors,
|
|
||||||
&lnors_spacearr,
|
&lnors_spacearr,
|
||||||
loop_normals);
|
loop_normals);
|
||||||
|
|
||||||
|
@ -1003,7 +1003,6 @@ static void split_loop_nor_fan_do(LoopSplitTaskDataCommon *common_data,
|
|||||||
lnors_spacearr->corners_by_space[space_index] = processed_corners.as_span();
|
lnors_spacearr->corners_by_space[space_index] = processed_corners.as_span();
|
||||||
}
|
}
|
||||||
if (!clnors_data.is_empty()) {
|
if (!clnors_data.is_empty()) {
|
||||||
/* Accumulate all clnors. */
|
|
||||||
clnors_avg += int2(clnors_data[mlfan_vert_index]);
|
clnors_avg += int2(clnors_data[mlfan_vert_index]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1216,9 +1215,9 @@ void normals_calc_loop(const Span<float3> vert_positions,
|
|||||||
const Span<float3> face_normals,
|
const Span<float3> face_normals,
|
||||||
const bool *sharp_edges,
|
const bool *sharp_edges,
|
||||||
const bool *sharp_faces,
|
const bool *sharp_faces,
|
||||||
|
const short2 *clnors_data,
|
||||||
bool use_split_normals,
|
bool use_split_normals,
|
||||||
float split_angle,
|
float split_angle,
|
||||||
const short2 *clnors_data,
|
|
||||||
CornerNormalSpaceArray *r_lnors_spacearr,
|
CornerNormalSpaceArray *r_lnors_spacearr,
|
||||||
MutableSpan<float3> r_loop_normals)
|
MutableSpan<float3> r_loop_normals)
|
||||||
{
|
{
|
||||||
@ -1402,9 +1401,9 @@ static void mesh_normals_loop_custom_set(Span<float3> positions,
|
|||||||
face_normals,
|
face_normals,
|
||||||
sharp_edges.data(),
|
sharp_edges.data(),
|
||||||
sharp_faces,
|
sharp_faces,
|
||||||
|
r_clnors_data.data(),
|
||||||
use_split_normals,
|
use_split_normals,
|
||||||
split_angle,
|
split_angle,
|
||||||
r_clnors_data.data(),
|
|
||||||
&lnors_spacearr,
|
&lnors_spacearr,
|
||||||
loop_normals);
|
loop_normals);
|
||||||
|
|
||||||
@ -1524,9 +1523,9 @@ static void mesh_normals_loop_custom_set(Span<float3> positions,
|
|||||||
face_normals,
|
face_normals,
|
||||||
sharp_edges.data(),
|
sharp_edges.data(),
|
||||||
sharp_faces,
|
sharp_faces,
|
||||||
|
r_clnors_data.data(),
|
||||||
use_split_normals,
|
use_split_normals,
|
||||||
split_angle,
|
split_angle,
|
||||||
r_clnors_data.data(),
|
|
||||||
&lnors_spacearr,
|
&lnors_spacearr,
|
||||||
loop_normals);
|
loop_normals);
|
||||||
}
|
}
|
||||||
|
@ -1343,7 +1343,7 @@ void BKE_mesh_remap_calc_loops_from_mesh(const int mode,
|
|||||||
face_normals_dst = mesh_dst->face_normals();
|
face_normals_dst = mesh_dst->face_normals();
|
||||||
}
|
}
|
||||||
if (need_lnors_dst) {
|
if (need_lnors_dst) {
|
||||||
const blender::short2 *clnors = static_cast<const blender::short2 *>(
|
const blender::short2 *custom_nors_dst = static_cast<const blender::short2 *>(
|
||||||
CustomData_get_layer(ldata_dst, CD_CUSTOMLOOPNORMAL));
|
CustomData_get_layer(ldata_dst, CD_CUSTOMLOOPNORMAL));
|
||||||
|
|
||||||
/* Cache loop normals into a temporary custom data layer. */
|
/* Cache loop normals into a temporary custom data layer. */
|
||||||
@ -1372,9 +1372,9 @@ void BKE_mesh_remap_calc_loops_from_mesh(const int mode,
|
|||||||
mesh_dst->face_normals(),
|
mesh_dst->face_normals(),
|
||||||
sharp_edges,
|
sharp_edges,
|
||||||
sharp_faces,
|
sharp_faces,
|
||||||
|
custom_nors_dst,
|
||||||
use_split_nors_dst,
|
use_split_nors_dst,
|
||||||
split_angle_dst,
|
split_angle_dst,
|
||||||
custom_nors_dst,
|
|
||||||
nullptr,
|
nullptr,
|
||||||
{loop_normals_dst, numloops_dst});
|
{loop_normals_dst, numloops_dst});
|
||||||
}
|
}
|
||||||
|
@ -351,9 +351,9 @@ void mesh_render_data_update_normals(MeshRenderData *mr, const eMRDataType data_
|
|||||||
mr->face_normals,
|
mr->face_normals,
|
||||||
sharp_edges,
|
sharp_edges,
|
||||||
mr->sharp_faces,
|
mr->sharp_faces,
|
||||||
|
clnors,
|
||||||
is_auto_smooth,
|
is_auto_smooth,
|
||||||
split_angle,
|
split_angle,
|
||||||
clnors,
|
|
||||||
nullptr,
|
nullptr,
|
||||||
mr->loop_normals);
|
mr->loop_normals);
|
||||||
}
|
}
|
||||||
|
@ -553,9 +553,9 @@ static Mesh *normalEditModifier_do(NormalEditModifierData *enmd,
|
|||||||
result->face_normals(),
|
result->face_normals(),
|
||||||
sharp_edges.span.data(),
|
sharp_edges.span.data(),
|
||||||
sharp_faces,
|
sharp_faces,
|
||||||
|
clnors,
|
||||||
true,
|
true,
|
||||||
result->smoothresh,
|
result->smoothresh,
|
||||||
clnors,
|
|
||||||
nullptr,
|
nullptr,
|
||||||
loop_normals);
|
loop_normals);
|
||||||
}
|
}
|
||||||
|
@ -231,9 +231,9 @@ static void apply_weights_vertex_normal(WeightedNormalModifierData *wnmd,
|
|||||||
wn_data->face_normals,
|
wn_data->face_normals,
|
||||||
wn_data->sharp_edges.data(),
|
wn_data->sharp_edges.data(),
|
||||||
wn_data->sharp_faces,
|
wn_data->sharp_faces,
|
||||||
|
has_clnors ? clnors.data() : nullptr,
|
||||||
true,
|
true,
|
||||||
split_angle,
|
split_angle,
|
||||||
has_clnors ? clnors.data() : nullptr,
|
|
||||||
&lnors_spacearr,
|
&lnors_spacearr,
|
||||||
loop_normals);
|
loop_normals);
|
||||||
|
|
||||||
@ -362,9 +362,9 @@ static void apply_weights_vertex_normal(WeightedNormalModifierData *wnmd,
|
|||||||
face_normals,
|
face_normals,
|
||||||
wn_data->sharp_edges.data(),
|
wn_data->sharp_edges.data(),
|
||||||
wn_data->sharp_faces,
|
wn_data->sharp_faces,
|
||||||
|
has_clnors ? clnors.data() : nullptr,
|
||||||
true,
|
true,
|
||||||
split_angle,
|
split_angle,
|
||||||
has_clnors ? clnors.data() : nullptr,
|
|
||||||
nullptr,
|
nullptr,
|
||||||
loop_normals);
|
loop_normals);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user