Fix T65357: wrong facemap indices after applying a boolean modifier

Properly initialize custom data layers to default values when copying from
a mesh that does not have all the same layers.

Differential Revision: https://developer.blender.org/D5003
This commit is contained in:
Philipp Oeser 2019-06-17 19:05:41 +02:00 committed by Brecht Van Lommel
parent d2f7b93ba0
commit be52b25d39
Notes: blender-bot 2023-02-14 08:08:56 +01:00
Referenced by issue #65357,  after applying a boolean mod, faces are initialized with a facemap index of 0 instead of -1
1 changed files with 34 additions and 28 deletions

View File

@ -3452,6 +3452,34 @@ static void CustomData_bmesh_alloc_block(CustomData *data, void **block)
}
}
static void CustomData_bmesh_set_default_n(CustomData *data, void **block, int n)
{
const LayerTypeInfo *typeInfo;
int offset = data->layers[n].offset;
typeInfo = layerType_getInfo(data->layers[n].type);
if (typeInfo->set_default) {
typeInfo->set_default(POINTER_OFFSET(*block, offset), 1);
}
else {
memset(POINTER_OFFSET(*block, offset), 0, typeInfo->size);
}
}
void CustomData_bmesh_set_default(CustomData *data, void **block)
{
int i;
if (*block == NULL) {
CustomData_bmesh_alloc_block(data, block);
}
for (i = 0; i < data->totlayer; ++i) {
CustomData_bmesh_set_default_n(data, block, i);
}
}
void CustomData_bmesh_copy_data(const CustomData *source,
CustomData *dest,
void *src_block,
@ -3475,6 +3503,7 @@ void CustomData_bmesh_copy_data(const CustomData *source,
* (this should work because layers are ordered by type)
*/
while (dest_i < dest->totlayer && dest->layers[dest_i].type < source->layers[src_i].type) {
CustomData_bmesh_set_default_n(dest, dest_block, dest_i);
dest_i++;
}
@ -3505,6 +3534,11 @@ void CustomData_bmesh_copy_data(const CustomData *source,
dest_i++;
}
}
while (dest_i < dest->totlayer) {
CustomData_bmesh_set_default_n(dest, dest_block, dest_i);
dest_i++;
}
}
/* BMesh Custom Data Functions.
@ -3816,34 +3850,6 @@ void CustomData_bmesh_interp(CustomData *data,
}
}
static void CustomData_bmesh_set_default_n(CustomData *data, void **block, int n)
{
const LayerTypeInfo *typeInfo;
int offset = data->layers[n].offset;
typeInfo = layerType_getInfo(data->layers[n].type);
if (typeInfo->set_default) {
typeInfo->set_default(POINTER_OFFSET(*block, offset), 1);
}
else {
memset(POINTER_OFFSET(*block, offset), 0, typeInfo->size);
}
}
void CustomData_bmesh_set_default(CustomData *data, void **block)
{
int i;
if (*block == NULL) {
CustomData_bmesh_alloc_block(data, block);
}
for (i = 0; i < data->totlayer; ++i) {
CustomData_bmesh_set_default_n(data, block, i);
}
}
/**
* \param use_default_init: initializes data which can't be copied,
* typically you'll want to use this if the BM_xxx create function