Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Oeser <info@graphics-engineer.com>2022-04-21 13:39:09 +0300
committerPhilipp Oeser <info@graphics-engineer.com>2022-04-22 16:25:11 +0300
commit5179b8236ba84e50d26485a17df6b17d8e581477 (patch)
treebd5340e3f52374d3fdec973cd9ae0ccc5a3a8e7e
parent048c769774ac7f2be32ecb354f0416bd13b632e6 (diff)
Fix accessing attribute data in editmode
When in mesh editmode, attributes point to bmesh customdata, the attribute data is empty since custom data is stored per element instead of a single array there (same es UVs etc.). Opposed to e.g. UVs, general attributes were not setting their data length/size to zero in case of editmode though, which could lead to - crash in Outliner Data Api view [that was reported in T95922] - RuntimeError such as the following: ``` RuntimeError: bpy_prop_collection[index]: internal error, valid index 0 given in 8 sized collection, but value not found ``` Now check for mesh editmode in `BKE_id_attribute_data_length` (and return zero in that case). Alternatively, the check could also be done in `rna_Attribute_data_length` only (such as UVs do in `rna_MeshUVLoopLayer_data_length`). Ref D11998 Fixes T95922 Maniphest Tasks: T95922 Differential Revision: https://developer.blender.org/D14714
-rw-r--r--source/blender/blenkernel/intern/attribute.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/attribute.c b/source/blender/blenkernel/intern/attribute.c
index 9b8ae4b3804..0cb0704ff80 100644
--- a/source/blender/blenkernel/intern/attribute.c
+++ b/source/blender/blenkernel/intern/attribute.c
@@ -311,6 +311,20 @@ AttributeDomain BKE_id_attribute_domain(const ID *id, const CustomDataLayer *lay
int BKE_id_attribute_data_length(ID *id, CustomDataLayer *layer)
{
+ /* When in mesh editmode, attributes point to bmesh customdata layers, the attribute data is
+ * empty since custom data is stored per element instead of a single array there (same es UVs
+ * etc.), see D11998. */
+ switch (GS(id->name)) {
+ case ID_ME: {
+ Mesh *mesh = (Mesh *)id;
+ if (mesh->edit_mesh != NULL) {
+ return 0;
+ }
+ }
+ default:
+ break;
+ }
+
DomainInfo info[ATTR_DOMAIN_NUM];
get_domains(id, info);