[Bf-blender-cvs] [09b22616693] sculpt-dev: Sculpt-dev: fix crash in rna color_attributes iterator
Joseph Eagar
noreply at git.blender.org
Thu May 12 10:11:18 CEST 2022
Commit: 09b22616693e7ce114a6db9e2a6be6f8dc5414f2
Author: Joseph Eagar
Date: Thu May 12 00:23:11 2022 -0700
Branches: sculpt-dev
https://developer.blender.org/rB09b22616693e7ce114a6db9e2a6be6f8dc5414f2
Sculpt-dev: fix crash in rna color_attributes iterator
===================================================================
M source/blender/blenkernel/BKE_attribute.h
M source/blender/blenkernel/BKE_customdata.h
M source/blender/blenkernel/intern/attribute.c
M source/blender/blenkernel/intern/customdata.cc
M source/blender/draw/intern/draw_cache_impl_mesh.c
M source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_vcol.cc
M source/blender/makesrna/intern/rna_attribute.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_attribute.h b/source/blender/blenkernel/BKE_attribute.h
index f7166e5d1a7..2084524ba25 100644
--- a/source/blender/blenkernel/BKE_attribute.h
+++ b/source/blender/blenkernel/BKE_attribute.h
@@ -74,7 +74,8 @@ bool BKE_id_attribute_rename(struct ID *id,
int BKE_id_attributes_length(const struct ID *id,
AttributeDomainMask domain_mask,
- CustomDataMask mask);
+ CustomDataMask mask,
+ bool skip_temporary);
struct CustomDataLayer *BKE_id_attributes_active_get(struct ID *id);
void BKE_id_attributes_active_set(struct ID *id, struct CustomDataLayer *layer);
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index 4235bb91f33..11f7884f471 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -250,7 +250,9 @@ bool CustomData_has_layer(const struct CustomData *data, int type);
* Returns the number of layers with this type.
*/
int CustomData_number_of_layers(const struct CustomData *data, int type);
-int CustomData_number_of_layers_typemask(const struct CustomData *data, CustomDataMask mask);
+int CustomData_number_of_layers_typemask(const struct CustomData *data,
+ CustomDataMask mask,
+ bool skip_temporary);
/**
* Duplicate data of a layer with flag NOFREE, and remove that flag.
diff --git a/source/blender/blenkernel/intern/attribute.c b/source/blender/blenkernel/intern/attribute.c
index 7f93eb7b393..5cdfe6cf5e6 100644
--- a/source/blender/blenkernel/intern/attribute.c
+++ b/source/blender/blenkernel/intern/attribute.c
@@ -274,7 +274,7 @@ CustomDataLayer *BKE_id_attribute_find(const ID *id,
return NULL;
}
-int BKE_id_attributes_length(const ID *id, AttributeDomainMask domain_mask, CustomDataMask mask)
+int BKE_id_attributes_length(const ID *id, AttributeDomainMask domain_mask, CustomDataMask mask, bool skip_temporary)
{
DomainInfo info[ATTR_DOMAIN_NUM];
get_domains(id, info);
@@ -285,7 +285,7 @@ int BKE_id_attributes_length(const ID *id, AttributeDomainMask domain_mask, Cust
CustomData *customdata = info[domain].customdata;
if (customdata && ((1 << (int)domain) & domain_mask)) {
- length += CustomData_number_of_layers_typemask(customdata, mask);
+ length += CustomData_number_of_layers_typemask(customdata, mask, skip_temporary);
}
}
@@ -357,7 +357,7 @@ bool BKE_id_attribute_required(ID *id, CustomDataLayer *layer)
CustomDataLayer *BKE_id_attributes_active_get(ID *id)
{
int active_index = *BKE_id_attributes_active_index_p(id);
- if (active_index > BKE_id_attributes_length(id, ATTR_DOMAIN_MASK_ALL, CD_MASK_PROP_ALL)) {
+ if (active_index > BKE_id_attributes_length(id, ATTR_DOMAIN_MASK_ALL, CD_MASK_PROP_ALL, false)) {
active_index = 0;
}
diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc
index 7e849b72522..2b18659728f 100644
--- a/source/blender/blenkernel/intern/customdata.cc
+++ b/source/blender/blenkernel/intern/customdata.cc
@@ -3266,12 +3266,17 @@ int CustomData_number_of_layers(const CustomData *data, int type)
return number;
}
-int CustomData_number_of_layers_typemask(const CustomData *data, CustomDataMask mask)
+int CustomData_number_of_layers_typemask(const CustomData *data,
+ CustomDataMask mask,
+ bool skip_temporary)
{
int number = 0;
for (int i = 0; i < data->totlayer; i++) {
- if (mask & CD_TYPE_AS_MASK(data->layers[i].type)) {
+ bool ok = mask & CD_TYPE_AS_MASK(data->layers[i].type);
+ ok = ok && (!skip_temporary || !(data->layers[i].flag & (int)CD_FLAG_TEMPORARY));
+
+ if (ok) {
number++;
}
}
@@ -4094,7 +4099,7 @@ bool CustomData_bmesh_merge(const CustomData *source,
const char htype)
{
- if (CustomData_number_of_layers_typemask(source, mask) == 0) {
+ if (CustomData_number_of_layers_typemask(source, mask, false) == 0) {
return false;
}
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 24c9917b9b5..17bc89828dc 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -505,10 +505,10 @@ static bool custom_data_match_attribute(const CustomData *custom_data,
return false;
}
-static uint mesh_cd_calc_gpu_layers_vcol_used(const Mesh *me_query,
- const CustomData *cd_vdata,
- const CustomData *cd_ldata,
- const char name[])
+ATTR_NO_OPT static uint mesh_cd_calc_gpu_layers_vcol_used(const Mesh *me_query,
+ const CustomData *cd_vdata,
+ const CustomData *cd_ldata,
+ const char name[])
{
CustomDataLayer *layer = NULL;
AttributeDomain domain;
@@ -552,11 +552,11 @@ static uint mesh_cd_calc_gpu_layers_vcol_used(const Mesh *me_query,
return vcol_i;
}
-static DRW_MeshCDMask mesh_cd_calc_used_gpu_layers(const Object *object,
- const Mesh *me,
- struct GPUMaterial **gpumat_array,
- int gpumat_array_len,
- DRW_MeshAttributes *attributes)
+ATTR_NO_OPT static DRW_MeshCDMask mesh_cd_calc_used_gpu_layers(const Object *object,
+ const Mesh *me,
+ struct GPUMaterial **gpumat_array,
+ int gpumat_array_len,
+ DRW_MeshAttributes *attributes)
{
const Mesh *me_final = editmesh_final_or_this(object, me);
const CustomData *cd_ldata = mesh_cd_ldata_get_from_mesh(me_final);
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_vcol.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_vcol.cc
index e5dd025787d..0a0d3f4e37c 100644
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_vcol.cc
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_vcol.cc
@@ -25,7 +25,7 @@ struct VColRef {
* corresponds to the integer position of the attribute
* within the global color attribute list.
*/
-static blender::Vector<VColRef> get_vcol_refs(const CustomData *cd_vdata,
+ATTR_NO_OPT static blender::Vector<VColRef> get_vcol_refs(const CustomData *cd_vdata,
const CustomData *cd_ldata,
const uint vcol_layers)
{
@@ -71,7 +71,7 @@ namespace blender::draw {
* \{ */
/* Initialize the common vertex format for vcol for coarse and subdivided meshes. */
-static void init_vcol_format(GPUVertFormat *format,
+ATTR_NO_OPT static void init_vcol_format(GPUVertFormat *format,
const MeshBatchCache *cache,
CustomData *cd_vdata,
CustomData *cd_ldata,
@@ -122,7 +122,7 @@ using gpuMeshVcol = struct gpuMeshVcol {
ushort r, g, b, a;
};
-static void extract_vcol_init(const MeshRenderData *mr,
+ATTR_NO_OPT static void extract_vcol_init(const MeshRenderData *mr,
struct MeshBatchCache *cache,
void *buf,
void *UNUSED(tls_data))
diff --git a/source/blender/makesrna/intern/rna_attribute.c b/source/blender/makesrna/intern/rna_attribute.c
index bba5cb7c06f..4ba50f664ff 100644
--- a/source/blender/makesrna/intern/rna_attribute.c
+++ b/source/blender/makesrna/intern/rna_attribute.c
@@ -451,14 +451,12 @@ PointerRNA rna_AttributeGroup_color_iterator_get(CollectionPropertyIterator *ite
int rna_AttributeGroup_color_length(PointerRNA *ptr)
{
- return BKE_id_attributes_length(ptr->owner_id,
- ATTR_DOMAIN_MASK_POINT | ATTR_DOMAIN_MASK_CORNER,
- CD_MASK_PROP_COLOR | CD_MASK_PROP_BYTE_COLOR);
+ return BKE_id_attributes_length(ptr->owner_id, ATTR_DOMAIN_MASK_COLOR, CD_MASK_COLOR_ALL, true);
}
ATTR_NO_OPT int rna_AttributeGroup_length(PointerRNA *ptr)
{
- return BKE_id_attributes_length(ptr->owner_id, ATTR_DOMAIN_MASK_ALL, CD_MASK_PROP_ALL);
+ return BKE_id_attributes_length(ptr->owner_id, ATTR_DOMAIN_MASK_ALL, CD_MASK_PROP_ALL, false);
}
static int rna_AttributeGroup_active_index_get(PointerRNA *ptr)
@@ -494,7 +492,7 @@ static void rna_AttributeGroup_active_index_range(
PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
{
*min = 0;
- *max = BKE_id_attributes_length(ptr->owner_id, ATTR_DOMAIN_MASK_ALL, CD_MASK_PROP_ALL);
+ *max = BKE_id_attributes_length(ptr->owner_id, ATTR_DOMAIN_MASK_ALL, CD_MASK_PROP_ALL, false);
*softmin = *min;
*softmax = *max;
@@ -550,7 +548,7 @@ static void rna_AttributeGroup_active_color_index_range(
PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
{
*min = 0;
- *max = BKE_id_attributes_length(ptr->owner_id, ATTR_DOMAIN_MASK_COLOR, CD_MASK_COLOR_ALL);
+ *max = BKE_id_attributes_length(ptr->owner_id, ATTR_DOMAIN_MASK_COLOR, CD_MASK_COLOR_ALL, true);
*softmin = *min;
*softmax = *max;
@@ -594,7 +592,7 @@ static void rna_AttributeGroup_render_color_index_range(
PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
{
*min = 0;
- *max = BKE_id_attributes_length(ptr->owner_id, ATTR_DOMAIN_MASK_COLOR, CD_MASK_COLOR_ALL);
+ *max = BKE_id_attributes_length(ptr->owner_id, ATTR_DOMAIN_MASK_COLOR, CD_MASK_COLOR_ALL, true);
*softmin = *m
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list