Fix #116069: Incorrect data transfer custom normals behavior

Mistake in 89e3ba4e25 and 451c054d9b. Though I'm not
exactly sure why, it looks like the result layer needs to be filled with
"default" values before the transfer.
This commit is contained in:
Hans Goudey 2023-12-21 14:52:07 -05:00
parent 48b0a504b4
commit 78c3253553
1 changed files with 18 additions and 12 deletions

View File

@ -863,6 +863,7 @@ static bool data_transfer_layersmapping_generate(ListBase *r_map,
const int tolayers,
SpaceTransform *space_transform)
{
using namespace blender;
const CustomData *cd_src;
CustomData *cd_dst;
@ -1051,20 +1052,25 @@ static bool data_transfer_layersmapping_generate(ListBase *r_map,
cddata_type = CD_PROP_FLOAT2;
}
else if (cddata_type == CD_FAKE_LNOR) {
if (!CustomData_get_layer(&me_dst->corner_data, CD_PROP_FLOAT)) {
CustomData_add_layer(&me_dst->corner_data, CD_NORMAL, CD_SET_DEFAULT, me_dst->corners_num);
/* Use #CD_NORMAL as a temporary storage for custom normals in 3D vector form.
* A post-process step will convert this layer to #CD_CUSTOMLOOPNORMAL. */
float3 *dst_data = static_cast<float3 *>(
CustomData_get_layer_for_write(&me_dst->corner_data, CD_NORMAL, me_dst->corners_num));
if (!dst_data) {
dst_data = static_cast<float3 *>(CustomData_add_layer(
&me_dst->corner_data, CD_NORMAL, CD_SET_DEFAULT, me_dst->corners_num));
}
MutableSpan(dst_data, me_dst->corners_num).copy_from(me_dst->corner_normals());
/* Post-process will convert it back to CD_CUSTOMLOOPNORMAL. */
data_transfer_layersmapping_add_item_cd(
r_map,
CD_NORMAL,
mix_mode,
mix_factor,
mix_weights,
me_src->corner_normals().data(),
CustomData_get_layer_for_write(&me_dst->corner_data, CD_NORMAL, me_dst->corners_num),
customdata_data_transfer_interp_normal_normals,
space_transform);
data_transfer_layersmapping_add_item_cd(r_map,
CD_NORMAL,
mix_mode,
mix_factor,
mix_weights,
me_src->corner_normals().data(),
dst_data,
customdata_data_transfer_interp_normal_normals,
space_transform);
return true;
}