From 7b2569933316ec9bec0988711607588f5f8f5a36 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 8 Mar 2024 20:55:43 -0500 Subject: [PATCH] Fix #119232: Crash on Generate Data Layers in DataTransfer modifier "r_map" is null for the generate layers operator (rather than the modifier evaluation). It should disable the creation of the "CD_NORMAL" layer too, like the crease, bevel weight, sharp edge, and uv seam attributes above. --- .../blenkernel/intern/data_transfer.cc | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/source/blender/blenkernel/intern/data_transfer.cc b/source/blender/blenkernel/intern/data_transfer.cc index 713e8106939..b339b75ec9b 100644 --- a/source/blender/blenkernel/intern/data_transfer.cc +++ b/source/blender/blenkernel/intern/data_transfer.cc @@ -1052,27 +1052,29 @@ static bool data_transfer_layersmapping_generate(ListBase *r_map, cddata_type = CD_PROP_FLOAT2; } else if (cddata_type == CD_FAKE_LNOR) { - /* 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( - CustomData_get_layer_for_write(&me_dst->corner_data, CD_NORMAL, me_dst->corners_num)); - if (!dst_data) { - dst_data = static_cast(CustomData_add_layer( - &me_dst->corner_data, CD_NORMAL, CD_SET_DEFAULT, me_dst->corners_num)); + if (r_map) { + /* 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( + CustomData_get_layer_for_write(&me_dst->corner_data, CD_NORMAL, me_dst->corners_num)); + if (!dst_data) { + dst_data = static_cast(CustomData_add_layer( + &me_dst->corner_data, CD_NORMAL, CD_SET_DEFAULT, me_dst->corners_num)); + } + if (mix_factor != 1.0f || mix_weights) { + 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(), + dst_data, + customdata_data_transfer_interp_normal_normals, + space_transform); } - if (mix_factor != 1.0f || mix_weights) { - 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(), - dst_data, - customdata_data_transfer_interp_normal_normals, - space_transform); return true; }