Refactor: Make CD_TYPE_AS_MASK into a function with typed argument

So that misuse of this will result in build errors instead of bugs
(this change found three places like that).
This commit is contained in:
Hans Goudey
2025-07-18 12:58:51 -04:00
parent 4008b2dcb5
commit 21f0dace48
7 changed files with 37 additions and 28 deletions

View File

@@ -88,7 +88,10 @@ enum eCDAllocType {
CD_CONSTRUCT = 5,
};
#define CD_TYPE_AS_MASK(_type) (eCustomDataMask)((eCustomDataMask)1 << (eCustomDataMask)(_type))
inline eCustomDataMask CD_TYPE_AS_MASK(eCustomDataType type)
{
return eCustomDataMask(1) << eCustomDataMask(type);
}
void customData_mask_layers__print(const CustomData_MeshMasks *mask);

View File

@@ -681,7 +681,7 @@ const CustomDataLayer *BKE_attribute_search(const AttributeOwner &owner,
for (int i = 0; i < customdata->totlayer; i++) {
CustomDataLayer *layer = &customdata->layers[i];
if ((CD_TYPE_AS_MASK(layer->type) & type_mask) && layer->name == name) {
if ((CD_TYPE_AS_MASK(eCustomDataType(layer->type)) & type_mask) && layer->name == name) {
return layer;
}
}
@@ -833,7 +833,7 @@ std::optional<blender::StringRefNull> BKE_attributes_active_name_get(AttributeOw
}
for (int i = 0; i < customdata->totlayer; i++) {
CustomDataLayer *layer = &customdata->layers[i];
if (CD_MASK_PROP_ALL & CD_TYPE_AS_MASK(layer->type)) {
if (CD_MASK_PROP_ALL & CD_TYPE_AS_MASK(eCustomDataType(layer->type))) {
if (index == active_index) {
if (blender::bke::allow_procedural_attribute_access(layer->name)) {
return layer->name;
@@ -932,7 +932,7 @@ CustomDataLayer *BKE_attribute_from_index(AttributeOwner &owner,
}
for (int i = 0; i < customdata->totlayer; i++) {
if (!(layer_mask & CD_TYPE_AS_MASK(customdata->layers[i].type)) ||
if (!(layer_mask & CD_TYPE_AS_MASK(eCustomDataType(customdata->layers[i].type))) ||
(customdata->layers[i].flag & CD_FLAG_TEMPORARY))
{
continue;
@@ -970,7 +970,7 @@ int BKE_attribute_to_index(const AttributeOwner &owner,
for (int i = 0; i < customdata->totlayer; i++) {
const CustomDataLayer *layer_iter = customdata->layers + i;
if (!(layer_mask & CD_TYPE_AS_MASK(layer_iter->type)) ||
if (!(layer_mask & CD_TYPE_AS_MASK(eCustomDataType(layer_iter->type))) ||
(layer_iter->flag & CD_FLAG_TEMPORARY))
{
continue;

View File

@@ -2247,35 +2247,35 @@ void customData_mask_layers__print(const CustomData_MeshMasks *mask)
{
printf("verts mask=0x%" PRIx64 ":\n", mask->vmask);
for (int i = 0; i < CD_NUMTYPES; i++) {
if (mask->vmask & CD_TYPE_AS_MASK(i)) {
if (mask->vmask & CD_TYPE_AS_MASK(eCustomDataType(i))) {
printf(" %s\n", layerType_getName(eCustomDataType(i)));
}
}
printf("edges mask=0x%" PRIx64 ":\n", mask->emask);
for (int i = 0; i < CD_NUMTYPES; i++) {
if (mask->emask & CD_TYPE_AS_MASK(i)) {
if (mask->emask & CD_TYPE_AS_MASK(eCustomDataType(i))) {
printf(" %s\n", layerType_getName(eCustomDataType(i)));
}
}
printf("faces mask=0x%" PRIx64 ":\n", mask->fmask);
for (int i = 0; i < CD_NUMTYPES; i++) {
if (mask->fmask & CD_TYPE_AS_MASK(i)) {
if (mask->fmask & CD_TYPE_AS_MASK(eCustomDataType(i))) {
printf(" %s\n", layerType_getName(eCustomDataType(i)));
}
}
printf("loops mask=0x%" PRIx64 ":\n", mask->lmask);
for (int i = 0; i < CD_NUMTYPES; i++) {
if (mask->lmask & CD_TYPE_AS_MASK(i)) {
if (mask->lmask & CD_TYPE_AS_MASK(eCustomDataType(i))) {
printf(" %s\n", layerType_getName(eCustomDataType(i)));
}
}
printf("polys mask=0x%" PRIx64 ":\n", mask->pmask);
for (int i = 0; i < CD_NUMTYPES; i++) {
if (mask->pmask & CD_TYPE_AS_MASK(i)) {
if (mask->pmask & CD_TYPE_AS_MASK(eCustomDataType(i))) {
printf(" %s\n", layerType_getName(eCustomDataType(i)));
}
}
@@ -2465,7 +2465,7 @@ CustomData CustomData_shallow_copy_remove_non_bmesh_attributes(const CustomData
if (BM_attribute_stored_in_bmesh_builtin(layer.name)) {
continue;
}
if (!(mask & CD_TYPE_AS_MASK(layer.type))) {
if (!(mask & CD_TYPE_AS_MASK(eCustomDataType(layer.type)))) {
continue;
}
dst_layers.append(layer);
@@ -3296,7 +3296,7 @@ int CustomData_number_of_layers_typemask(const CustomData *data, const eCustomDa
int number = 0;
for (int i = 0; i < data->totlayer; i++) {
if (mask & CD_TYPE_AS_MASK(data->layers[i].type)) {
if (mask & CD_TYPE_AS_MASK(eCustomDataType(data->layers[i].type))) {
number++;
}
}
@@ -3307,7 +3307,7 @@ int CustomData_number_of_layers_typemask(const CustomData *data, const eCustomDa
void CustomData_set_only_copy(const CustomData *data, const eCustomDataMask mask)
{
for (int i = 0; i < data->totlayer; i++) {
if (!(mask & CD_TYPE_AS_MASK(data->layers[i].type))) {
if (!(mask & CD_TYPE_AS_MASK(eCustomDataType(data->layers[i].type)))) {
data->layers[i].flag |= CD_FLAG_NOCOPY;
}
}
@@ -4333,7 +4333,9 @@ static bool cd_layer_find_dupe(CustomData *data,
CustomDataLayer *layer = &data->layers[i];
if (CD_TYPE_AS_MASK(type) & CD_MASK_PROP_ALL) {
if ((CD_TYPE_AS_MASK(layer->type) & CD_MASK_PROP_ALL) && layer->name == name) {
if ((CD_TYPE_AS_MASK(eCustomDataType(layer->type)) & CD_MASK_PROP_ALL) &&
layer->name == name)
{
return true;
}
}
@@ -4537,7 +4539,7 @@ void CustomData_external_reload(CustomData *data, ID * /*id*/, eCustomDataMask m
CustomDataLayer *layer = &data->layers[i];
const LayerTypeInfo *typeInfo = layerType_getInfo(eCustomDataType(layer->type));
if (!(mask & CD_TYPE_AS_MASK(layer->type))) {
if (!(mask & CD_TYPE_AS_MASK(eCustomDataType(layer->type)))) {
/* pass */
}
else if ((layer->flag & CD_FLAG_EXTERNAL) && (layer->flag & CD_FLAG_IN_MEMORY)) {
@@ -4564,7 +4566,7 @@ void CustomData_external_read(CustomData *data, ID *id, eCustomDataMask mask, co
layer = &data->layers[i];
const LayerTypeInfo *typeInfo = layerType_getInfo(eCustomDataType(layer->type));
if (!(mask & CD_TYPE_AS_MASK(layer->type))) {
if (!(mask & CD_TYPE_AS_MASK(eCustomDataType(layer->type)))) {
/* pass */
}
else if (layer->flag & CD_FLAG_IN_MEMORY) {
@@ -4595,7 +4597,7 @@ void CustomData_external_read(CustomData *data, ID *id, eCustomDataMask mask, co
layer = &data->layers[i];
const LayerTypeInfo *typeInfo = layerType_getInfo(eCustomDataType(layer->type));
if (!(mask & CD_TYPE_AS_MASK(layer->type))) {
if (!(mask & CD_TYPE_AS_MASK(eCustomDataType(layer->type)))) {
/* pass */
}
else if (layer->flag & CD_FLAG_IN_MEMORY) {
@@ -4641,7 +4643,7 @@ void CustomData_external_write(
CustomDataLayer *layer = &data->layers[i];
const LayerTypeInfo *typeInfo = layerType_getInfo(eCustomDataType(layer->type));
if (!(mask & CD_TYPE_AS_MASK(layer->type))) {
if (!(mask & CD_TYPE_AS_MASK(eCustomDataType(layer->type)))) {
/* pass */
}
else if ((layer->flag & CD_FLAG_EXTERNAL) && typeInfo->write) {
@@ -4776,7 +4778,7 @@ void CustomData_external_remove(CustomData *data,
if (layer->flag & CD_FLAG_EXTERNAL) {
if (!(layer->flag & CD_FLAG_IN_MEMORY)) {
CustomData_external_read(data, id, CD_TYPE_AS_MASK(layer->type), totelem);
CustomData_external_read(data, id, CD_TYPE_AS_MASK(eCustomDataType(layer->type)), totelem);
}
layer->flag &= ~CD_FLAG_EXTERNAL;

View File

@@ -968,7 +968,8 @@ static bool geometry_color_attribute_convert_poll(bContext *C)
return false;
}
if (!(ATTR_DOMAIN_AS_MASK(meta_data->domain) & ATTR_DOMAIN_MASK_COLOR) ||
!(CD_TYPE_AS_MASK(meta_data->data_type) & CD_MASK_COLOR_ALL))
!(CD_TYPE_AS_MASK(*bke::attr_type_to_custom_data_type(meta_data->data_type)) &
CD_MASK_COLOR_ALL))
{
return false;
}

View File

@@ -249,7 +249,7 @@ static bool dyntopo_supports_layer(const CustomDataLayer &layer)
if (layer.type == CD_PROP_FLOAT && STREQ(layer.name, ".sculpt_mask")) {
return true;
}
if (CD_TYPE_AS_MASK(layer.type) & CD_MASK_PROP_ALL) {
if (CD_TYPE_AS_MASK(eCustomDataType(layer.type)) & CD_MASK_PROP_ALL) {
return BM_attribute_stored_in_bmesh_builtin(layer.name);
}
return ELEM(layer.type, CD_ORIGINDEX);

View File

@@ -533,7 +533,7 @@ static void rna_Attribute_data_begin(CollectionPropertyIterator *iter, PointerRN
}
CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
if (!(CD_TYPE_AS_MASK(layer->type) & CD_MASK_PROP_ALL)) {
if (!(CD_TYPE_AS_MASK(eCustomDataType(layer->type)) & CD_MASK_PROP_ALL)) {
iter->valid = false;
}
@@ -726,7 +726,7 @@ static void rna_AttributeGroupID_remove(ID *id, ReportList *reports, PointerRNA
static bool rna_Attributes_layer_skip(CollectionPropertyIterator * /*iter*/, void *data)
{
CustomDataLayer *layer = (CustomDataLayer *)data;
return !(CD_TYPE_AS_MASK(layer->type) & CD_MASK_PROP_ALL);
return !(CD_TYPE_AS_MASK(eCustomDataType(layer->type)) & CD_MASK_PROP_ALL);
}
static bool rna_Attributes_noncolor_layer_skip(CollectionPropertyIterator *iter, void *data)
@@ -741,7 +741,8 @@ static bool rna_Attributes_noncolor_layer_skip(CollectionPropertyIterator *iter,
return true;
}
return !(CD_TYPE_AS_MASK(layer->type) & CD_MASK_COLOR_ALL) || (layer->flag & CD_FLAG_TEMPORARY);
return !(CD_TYPE_AS_MASK(eCustomDataType(layer->type)) & CD_MASK_COLOR_ALL) ||
(layer->flag & CD_FLAG_TEMPORARY);
}
/* Attributes are spread over multiple domains in separate CustomData, we use repeated
@@ -855,7 +856,9 @@ int rna_AttributeGroup_color_length(PointerRNA *ptr)
if (!(ATTR_DOMAIN_AS_MASK(attr.domain()) & ATTR_DOMAIN_MASK_COLOR)) {
return;
}
if (!(CD_TYPE_AS_MASK(attr.data_type()) & CD_MASK_COLOR_ALL)) {
if (!(CD_TYPE_AS_MASK(*bke::attr_type_to_custom_data_type(attr.data_type())) &
CD_MASK_COLOR_ALL))
{
return;
}
count++;

View File

@@ -114,7 +114,7 @@ static void rna_MeshVertexLayer_name_set(PointerRNA *ptr, const char *value)
{
CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
if (CD_TYPE_AS_MASK(layer->type) & CD_MASK_PROP_ALL) {
if (CD_TYPE_AS_MASK(eCustomDataType(layer->type)) & CD_MASK_PROP_ALL) {
AttributeOwner owner = AttributeOwner::from_id(ptr->owner_id);
BKE_attribute_rename(owner, layer->name, value, nullptr);
}
@@ -127,7 +127,7 @@ static void rna_MeshEdgeLayer_name_set(PointerRNA *ptr, const char *value)
{
CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
if (CD_TYPE_AS_MASK(layer->type) & CD_MASK_PROP_ALL) {
if (CD_TYPE_AS_MASK(eCustomDataType(layer->type)) & CD_MASK_PROP_ALL) {
AttributeOwner owner = AttributeOwner::from_id(ptr->owner_id);
BKE_attribute_rename(owner, layer->name, value, nullptr);
}
@@ -140,7 +140,7 @@ static void rna_MeshLoopLayer_name_set(PointerRNA *ptr, const char *value)
{
CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
if (CD_TYPE_AS_MASK(layer->type) & CD_MASK_PROP_ALL) {
if (CD_TYPE_AS_MASK(eCustomDataType(layer->type)) & CD_MASK_PROP_ALL) {
AttributeOwner owner = AttributeOwner::from_id(ptr->owner_id);
BKE_attribute_rename(owner, layer->name, value, nullptr);
}