diff options
author | Jacques Lucke <jacques@blender.org> | 2022-11-08 18:25:49 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2022-11-08 18:26:42 +0300 |
commit | 0a7308a0f1493a5b0d8ab7b764893f1772ab1008 (patch) | |
tree | 237e5c2b1a5bc3557d0c13b31104a2231c68f02d /source | |
parent | c3391d537b11c27b469369073414ca57fee1aca6 (diff) |
Fix: improve CD_ASSIGN handling when adding custom data layer
Previously, the code would incorrectly free the passed in custom data
layer even when `CD_ASSIGN` was not used. Now the function actually
supports assigning the data to the layer. This only fixes the case for
custom data layer types that only support a single layer like `CD_MEDGE`.
Informally reviewed by Hans Goudey.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/customdata.cc | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc index e4405abdde8..01017466764 100644 --- a/source/blender/blenkernel/intern/customdata.cc +++ b/source/blender/blenkernel/intern/customdata.cc @@ -2799,11 +2799,6 @@ static CustomDataLayer *customData_add_layer__internal(CustomData *data, const LayerTypeInfo *typeInfo = layerType_getInfo(type); int flag = 0; - if (!typeInfo->defaultname && CustomData_has_layer(data, type)) { - MEM_SAFE_FREE(layerdata); - return &data->layers[CustomData_get_layer_index(data, type)]; - } - void *newlayerdata = nullptr; switch (alloctype) { case CD_SET_DEFAULT: @@ -2856,6 +2851,21 @@ static CustomDataLayer *customData_add_layer__internal(CustomData *data, break; } + /* Some layer types only support a single layer. */ + const bool reuse_existing_layer = !typeInfo->defaultname && CustomData_has_layer(data, type); + if (reuse_existing_layer) { + CustomDataLayer &layer = data->layers[CustomData_get_layer_index(data, type)]; + if (layer.data != nullptr) { + if (typeInfo->free) { + typeInfo->free(layer.data, totelem, typeInfo->size); + } + MEM_SAFE_FREE(layer.data); + } + layer.data = newlayerdata; + layer.flag = flag; + return &layer; + } + int index = data->totlayer; if (index >= data->maxlayer) { if (!customData_resize(data, CUSTOMDATA_GROW)) { |