diff options
author | Bastien Montagne <bastien@blender.org> | 2021-11-03 19:57:45 +0300 |
---|---|---|
committer | Bastien Montagne <bastien@blender.org> | 2021-11-03 20:15:51 +0300 |
commit | c29f9e14e4180af0fbba83d66e08c9852da7fa9c (patch) | |
tree | 786cd9cbabe84d66593b6ff484c6ff28f08a68bd /source/blender/blenkernel/intern/material.c | |
parent | d17128520d17733073b87b184d09cbd6057d28d5 (diff) |
Fix T92780: Lost material in case of local object, and missing linked obdata.
By default, when syncing materials slots between object and its obdata,
the amount of slots in obdata is the reference.
Missing linked obdata is replaced by an empty placeholder that has no
material. In that specific case, if we have a valid object ID, we want
to update the (placeholder) obdata's material count from the object one,
and not the other way around.
Diffstat (limited to 'source/blender/blenkernel/intern/material.c')
-rw-r--r-- | source/blender/blenkernel/intern/material.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index d3b34639d8a..d82559a27cb 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -900,7 +900,17 @@ void BKE_object_materials_test(Main *bmain, Object *ob, ID *id) return; } - BKE_object_material_resize(bmain, ob, *totcol, false); + if ((ob->id.tag & LIB_TAG_MISSING) == 0 && (id->tag & LIB_TAG_MISSING) != 0) { + /* Exception: In case the object is a valid data, but its obdata is an empty place-holder, + * use object's material slots amount as reference. + * This avoids loosing materials in a local object when its linked obdata gets missing. + * See T92780. */ + BKE_id_material_resize(bmain, id, (short)ob->totcol, false); + } + else { + /* Normal case: the use the obdata amount of materials slots to update the object's one. */ + BKE_object_material_resize(bmain, ob, *totcol, false); + } } void BKE_objects_materials_test_all(Main *bmain, ID *id) |