From 21f0dace481dd4b5695fc42cb465b9ea7a7e512b Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 18 Jul 2025 12:58:51 -0400 Subject: [PATCH] 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). --- source/blender/blenkernel/BKE_customdata.hh | 5 +++- source/blender/blenkernel/intern/attribute.cc | 8 ++--- .../blender/blenkernel/intern/customdata.cc | 30 ++++++++++--------- .../editors/geometry/geometry_attributes.cc | 3 +- .../editors/sculpt_paint/sculpt_dyntopo.cc | 2 +- .../blender/makesrna/intern/rna_attribute.cc | 11 ++++--- source/blender/makesrna/intern/rna_mesh.cc | 6 ++-- 7 files changed, 37 insertions(+), 28 deletions(-) diff --git a/source/blender/blenkernel/BKE_customdata.hh b/source/blender/blenkernel/BKE_customdata.hh index f08b1799c86..9d239686f8e 100644 --- a/source/blender/blenkernel/BKE_customdata.hh +++ b/source/blender/blenkernel/BKE_customdata.hh @@ -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); diff --git a/source/blender/blenkernel/intern/attribute.cc b/source/blender/blenkernel/intern/attribute.cc index 297abd580e6..565be56c84d 100644 --- a/source/blender/blenkernel/intern/attribute.cc +++ b/source/blender/blenkernel/intern/attribute.cc @@ -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 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; diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc index 73425430dc8..b3ed418036b 100644 --- a/source/blender/blenkernel/intern/customdata.cc +++ b/source/blender/blenkernel/intern/customdata.cc @@ -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; diff --git a/source/blender/editors/geometry/geometry_attributes.cc b/source/blender/editors/geometry/geometry_attributes.cc index 897b536af82..5a6f39f5ce3 100644 --- a/source/blender/editors/geometry/geometry_attributes.cc +++ b/source/blender/editors/geometry/geometry_attributes.cc @@ -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; } diff --git a/source/blender/editors/sculpt_paint/sculpt_dyntopo.cc b/source/blender/editors/sculpt_paint/sculpt_dyntopo.cc index 09843a11111..27c3d4db00f 100644 --- a/source/blender/editors/sculpt_paint/sculpt_dyntopo.cc +++ b/source/blender/editors/sculpt_paint/sculpt_dyntopo.cc @@ -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); diff --git a/source/blender/makesrna/intern/rna_attribute.cc b/source/blender/makesrna/intern/rna_attribute.cc index 68448d9e57e..2ff671b820b 100644 --- a/source/blender/makesrna/intern/rna_attribute.cc +++ b/source/blender/makesrna/intern/rna_attribute.cc @@ -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++; diff --git a/source/blender/makesrna/intern/rna_mesh.cc b/source/blender/makesrna/intern/rna_mesh.cc index 7fa2fb4861b..bb54e91168e 100644 --- a/source/blender/makesrna/intern/rna_mesh.cc +++ b/source/blender/makesrna/intern/rna_mesh.cc @@ -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); }