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:
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
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue