Merge branch 'blender-v2.92-release'
This commit is contained in:
@@ -421,6 +421,7 @@ int CustomData_sizeof(int type);
|
|||||||
/* get the name of a layer type */
|
/* get the name of a layer type */
|
||||||
const char *CustomData_layertype_name(int type);
|
const char *CustomData_layertype_name(int type);
|
||||||
bool CustomData_layertype_is_singleton(int type);
|
bool CustomData_layertype_is_singleton(int type);
|
||||||
|
bool CustomData_layertype_is_dynamic(int type);
|
||||||
int CustomData_layertype_layers_max(const int type);
|
int CustomData_layertype_layers_max(const int type);
|
||||||
|
|
||||||
/* make sure the name of layer at index is unique */
|
/* make sure the name of layer at index is unique */
|
||||||
|
@@ -4272,6 +4272,18 @@ bool CustomData_layertype_is_singleton(int type)
|
|||||||
return typeInfo->defaultname == NULL;
|
return typeInfo->defaultname == NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Has dynamically allocated members.
|
||||||
|
* This is useful to know if operations such as #memcmp are
|
||||||
|
* valid when comparing data from two layers.
|
||||||
|
*/
|
||||||
|
bool CustomData_layertype_is_dynamic(int type)
|
||||||
|
{
|
||||||
|
const LayerTypeInfo *typeInfo = layerType_getInfo(type);
|
||||||
|
|
||||||
|
return (typeInfo->free != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \return Maximum number of layers of given \a type, -1 means 'no limit'.
|
* \return Maximum number of layers of given \a type, -1 means 'no limit'.
|
||||||
*/
|
*/
|
||||||
|
@@ -153,6 +153,23 @@ static void um_arraystore_cd_compact(struct CustomData *cdata,
|
|||||||
for (int layer_start = 0, layer_end; layer_start < cdata->totlayer; layer_start = layer_end) {
|
for (int layer_start = 0, layer_end; layer_start < cdata->totlayer; layer_start = layer_end) {
|
||||||
const CustomDataType type = cdata->layers[layer_start].type;
|
const CustomDataType type = cdata->layers[layer_start].type;
|
||||||
|
|
||||||
|
/* Perform a full copy on dynamic layers.
|
||||||
|
*
|
||||||
|
* Unfortunately we can't compare dynamic layer types as they contain allocated pointers,
|
||||||
|
* which burns CPU cycles looking for duplicate data that doesn't exist.
|
||||||
|
* The array data isn't comparable once copied from the mesh,
|
||||||
|
* this bottlenecks on high poly meshes, see T84114.
|
||||||
|
*
|
||||||
|
* Notes:
|
||||||
|
*
|
||||||
|
* - Ideally the data would be expanded into a format that could be de-duplicated effectively,
|
||||||
|
* this would require a flat representation of each dynamic custom-data layer.
|
||||||
|
*
|
||||||
|
* - The data in the layer could be kept as-is to save on the extra copy,
|
||||||
|
* it would complicate logic in this function.
|
||||||
|
*/
|
||||||
|
const bool layer_type_is_dynamic = CustomData_layertype_is_dynamic(type);
|
||||||
|
|
||||||
layer_end = layer_start + 1;
|
layer_end = layer_start + 1;
|
||||||
while ((layer_end < cdata->totlayer) && (type == cdata->layers[layer_end].type)) {
|
while ((layer_end < cdata->totlayer) && (type == cdata->layers[layer_end].type)) {
|
||||||
layer_end++;
|
layer_end++;
|
||||||
@@ -209,6 +226,11 @@ static void um_arraystore_cd_compact(struct CustomData *cdata,
|
|||||||
i < bcd_reference_current->states_len) ?
|
i < bcd_reference_current->states_len) ?
|
||||||
bcd_reference_current->states[i] :
|
bcd_reference_current->states[i] :
|
||||||
NULL;
|
NULL;
|
||||||
|
/* See comment on `layer_type_is_dynamic` above. */
|
||||||
|
if (layer_type_is_dynamic) {
|
||||||
|
state_reference = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
bcd->states[i] = BLI_array_store_state_add(
|
bcd->states[i] = BLI_array_store_state_add(
|
||||||
bs, layer->data, (size_t)data_len * stride, state_reference);
|
bs, layer->data, (size_t)data_len * stride, state_reference);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user