[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