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
path: root/source
diff options
context:
space:
mode:
authorBastien Montagne <bastien@blender.org>2021-11-03 19:57:45 +0300
committerBastien Montagne <bastien@blender.org>2021-11-03 20:15:51 +0300
commitc29f9e14e4180af0fbba83d66e08c9852da7fa9c (patch)
tree786cd9cbabe84d66593b6ff484c6ff28f08a68bd /source
parentd17128520d17733073b87b184d09cbd6057d28d5 (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')
-rw-r--r--source/blender/blenkernel/intern/material.c12
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)