LibOverride: Replace linked objects by their overrides when created from 3DView.

From the 3DView code has basically no knowledge of collection hierarchy,
so we can either not remap any local usage of linked objects that are
being overridden, or remap them in all their local collections.

The second behavior makes most sense in the vast majority of cases.

Note that this was only an issue when directly linking and overriding
objects, not when doing so through collections.
This commit is contained in:
Bastien Montagne 2022-08-31 14:44:55 +02:00
parent d210ab90d4
commit 24fe659224
1 changed files with 19 additions and 0 deletions

View File

@ -2356,6 +2356,25 @@ static int make_override_library_exec(bContext *C, wmOperator *op)
BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false);
/* For the time being, replace selected linked objects by their overrides in all collections.
* While this may not be the absolute best behavior in all cases, in most common one this should
* match the expected result. */
if (user_overrides_objects_uids != NULL) {
LISTBASE_FOREACH (Collection *, coll_iter, &bmain->collections) {
if (ID_IS_LINKED(coll_iter)) {
continue;
}
LISTBASE_FOREACH (CollectionObject *, coll_ob_iter, &coll_iter->gobject) {
if (BLI_gset_haskey(user_overrides_objects_uids,
POINTER_FROM_UINT(coll_ob_iter->ob->id.session_uuid))) {
/* Tag for remapping when creating overrides. */
coll_iter->id.tag |= LIB_TAG_DOIT;
break;
}
}
}
}
ID *id_root_override;
const bool success = BKE_lib_override_library_create(bmain,
scene,