diff options
Diffstat (limited to 'source/blender/blenkernel/intern/data_transfer.c')
-rw-r--r-- | source/blender/blenkernel/intern/data_transfer.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/source/blender/blenkernel/intern/data_transfer.c b/source/blender/blenkernel/intern/data_transfer.c index e3d2f63ced9..70942b45d2b 100644 --- a/source/blender/blenkernel/intern/data_transfer.c +++ b/source/blender/blenkernel/intern/data_transfer.c @@ -501,12 +501,15 @@ static bool data_transfer_layersmapping_cdlayers_multisrc_to_dst( idx_src++; if (idx_dst < idx_src) { - if (!use_create) { - return true; + if (use_create) { + /* Create as much data layers as necessary! */ + for (; idx_dst < idx_src; idx_dst++) { + CustomData_add_layer(cd_dst, cddata_type, CD_CALLOC, NULL, num_elem_dst); + } } - /* Create as much data layers as necessary! */ - for (; idx_dst < idx_src; idx_dst++) { - CustomData_add_layer(cd_dst, cddata_type, CD_CALLOC, NULL, num_elem_dst); + else { + /* Otherwise, just try to map what we can with existing dst data layers. */ + idx_src = idx_dst; } } else if (use_delete && idx_dst > idx_src) { @@ -551,14 +554,14 @@ static bool data_transfer_layersmapping_cdlayers_multisrc_to_dst( data_src = CustomData_get_layer_n(cd_src, cddata_type, idx_src); if ((idx_dst = CustomData_get_named_layer(cd_dst, cddata_type, name)) == -1) { - if (!use_create) { - if (r_map) { - BLI_freelistN(r_map); - } - return true; + if (use_create) { + CustomData_add_layer_named(cd_dst, cddata_type, CD_CALLOC, NULL, num_elem_dst, name); + idx_dst = CustomData_get_named_layer(cd_dst, cddata_type, name); + } + else { + /* If we are not allowed to create missing dst data layers, just skip matching src one. */ + continue; } - CustomData_add_layer_named(cd_dst, cddata_type, CD_CALLOC, NULL, num_elem_dst, name); - idx_dst = CustomData_get_named_layer(cd_dst, cddata_type, name); } else if (data_dst_to_delete) { data_dst_to_delete[idx_dst] = false; |