From 0a7308a0f1493a5b0d8ab7b764893f1772ab1008 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Tue, 8 Nov 2022 16:25:49 +0100 Subject: 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. --- source/blender/blenkernel/intern/customdata.cc | 20 +++++++++++++++----- 1 file 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)) { -- cgit v1.2.3