Fix T95060: Outliner: Broken 'make override hierarchy' in indirect linked casae.

In Outliner, 'Make Override Hierarchy' on an indirectly linked data would
fail in case some items higher up in the hierarchy also needed to be
overridden was also indirectly linked.
This commit is contained in:
2022-01-28 10:22:25 +01:00
parent 49b9b0251b
commit c37b837244
2 changed files with 8 additions and 5 deletions

View File

@@ -859,8 +859,9 @@ static void id_override_library_create_fn(bContext *C,
if (!ID_IS_LINKED(te->store_elem->id)) {
break;
}
/* If we'd need to override that aren't ID, but it is not overridable, abort. */
if (!ID_IS_OVERRIDABLE_LIBRARY(te->store_elem->id)) {
/* If some element in the tree needs to be overridden, but its ID is not overridable,
* abort. */
if (!ID_IS_OVERRIDABLE_LIBRARY_HIERARCHY(te->store_elem->id)) {
BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false);
BKE_reportf(reports,
RPT_WARNING,

View File

@@ -534,12 +534,14 @@ typedef struct PreviewImage {
#define ID_IS_LINKED(_id) (((const ID *)(_id))->lib != NULL)
/* Note that this is a fairly high-level check, should be used at user interaction level, not in
/* Note that these are fairly high-level checks, should be used at user interaction level, not in
* BKE_library_override typically (especially due to the check on LIB_TAG_EXTERN). */
#define ID_IS_OVERRIDABLE_LIBRARY(_id) \
(ID_IS_LINKED(_id) && !ID_MISSING(_id) && (((const ID *)(_id))->tag & LIB_TAG_EXTERN) != 0 && \
#define ID_IS_OVERRIDABLE_LIBRARY_HIERARCHY(_id) \
(ID_IS_LINKED(_id) && !ID_MISSING(_id) && \
(BKE_idtype_get_info_from_id((const ID *)(_id))->flags & IDTYPE_FLAGS_NO_LIBLINKING) == 0 && \
!ELEM(GS(((ID *)(_id))->name), ID_SCE))
#define ID_IS_OVERRIDABLE_LIBRARY(_id) \
(ID_IS_OVERRIDABLE_LIBRARY_HIERARCHY((_id)) && (((const ID *)(_id))->tag & LIB_TAG_EXTERN) != 0)
/* NOTE: The three checks below do not take into account whether given ID is linked or not (when
* chaining overrides over several libraries). User must ensure the ID is not linked itself