Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2019-02-08 12:12:31 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2019-02-08 12:16:00 +0300
commit0e3475b00d44bc0220cee84d28daacaa6735f62f (patch)
treea73e783765addd0cec17ccf810902ec94e0aad71 /source/blender/blenkernel/intern/data_transfer.c
parent351b24ac142d8f3b8f067b004e055018399eb469 (diff)
Fix T61255: Mesh Data Transfer: Do not abort when destination has not all source data layers.
Originally, when transferring all source data layers to destination meshes, code would abort in case destination did not have all needed layers, and creating them was not allowed. Now, it will instead transfer data to layers that exists, merely skipping source ones for which it cannot find a matching destination.
Diffstat (limited to 'source/blender/blenkernel/intern/data_transfer.c')
-rw-r--r--source/blender/blenkernel/intern/data_transfer.c27
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;