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:
Bastien Montagne 2022-01-28 10:22:25 +01:00
parent e1be275878
commit 78647fbcc0
Notes: blender-bot 2023-02-14 10:29:32 +01:00
Referenced by issue #95060, Could not create library override from object datablock
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