[Bf-blender-cvs] [978c413d835] override-refactor-tmp-2: LibOverrides: First stage of detection of 'need resync'.
Bastien Montagne
noreply at git.blender.org
Wed Jan 27 18:32:05 CET 2021
Commit: 978c413d83575182986755d07fb125b4c854a7a9
Author: Bastien Montagne
Date: Thu Dec 31 18:03:45 2020 +0100
Branches: override-refactor-tmp-2
https://developer.blender.org/rB978c413d83575182986755d07fb125b4c854a7a9
LibOverrides: First stage of detection of 'need resync'.
We can fairly easily detect some resync-needed cases when applying the
overrides operations on a Pointer RNA property.
This should cover all cases where an existing override's ID pointer is
changed in its linked data.
We still have to add code to detect when a not-yet-overridden linked ID
needs to become overridden (because its relations to other data-blocks
changed in a way that requires it).
===================================================================
M source/blender/blenkernel/intern/lib_override.c
M source/blender/makesdna/DNA_ID.h
M source/blender/makesrna/intern/rna_access_compare_override.c
M source/blender/makesrna/intern/rna_rna.c
===================================================================
diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c
index b0438500413..6fc75f6120d 100644
--- a/source/blender/blenkernel/intern/lib_override.c
+++ b/source/blender/blenkernel/intern/lib_override.c
@@ -817,6 +817,8 @@ bool BKE_lib_override_library_resync(Main *bmain, Scene *scene, ViewLayer *view_
ID *id_override_new = id->newid;
ID *id_override_old = BLI_ghash_lookup(linkedref_to_old_override, id);
+ BLI_assert((id_override_new->flag & LIB_LIB_OVERRIDE_NEED_RESYNC) == 0);
+
if (id_override_old != NULL) {
/* Swap the names between old override ID and new one. */
char id_name_buf[MAX_ID_NAME];
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index 2c7e82e6587..ad702590ee5 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -570,6 +570,10 @@ enum {
* Note that this also applies to shapekeys, even though they are not 100% embedded data...
*/
LIB_EMBEDDED_DATA_LIB_OVERRIDE = 1 << 12,
+ /**
+ * The data-block is a library override that needs re-sync to its linked reference.
+ */
+ LIB_LIB_OVERRIDE_NEED_RESYNC = 1 << 13,
};
/**
diff --git a/source/blender/makesrna/intern/rna_access_compare_override.c b/source/blender/makesrna/intern/rna_access_compare_override.c
index 2d6f1bbc059..9a563d165b3 100644
--- a/source/blender/makesrna/intern/rna_access_compare_override.c
+++ b/source/blender/makesrna/intern/rna_access_compare_override.c
@@ -57,7 +57,7 @@
* Find the actual ID owner of the given \a ptr #PointerRNA, in override sense, and generate the
* full rna path from it to given \a prop #PropertyRNA if \a rna_path is given.
*
- * \note this is slightly different than 'generic' RNA 'id owner' as returned by
+ * \note This is slightly different than 'generic' RNA 'id owner' as returned by
* #RNA_find_real_ID_and_path, since in overrides we also consider shape keys as embedded data, not
* only root node trees and master collections.
*/
@@ -100,10 +100,6 @@ static ID *rna_property_override_property_real_id_owner(Main *bmain,
}
}
- if (!ID_IS_OVERRIDE_LIBRARY_REAL(owner_id)) {
- return NULL;
- }
-
if (r_rna_path == NULL) {
return owner_id;
}
@@ -1153,6 +1149,41 @@ void RNA_struct_override_apply(Main *bmain,
ptr_storage, op->rna_path, &data_storage, &prop_storage, &data_item_storage);
}
+ /* Check if an overridden ID pointer supposed to be in sync with linked data gets out of
+ * sync. */
+ if ((ptr_dst->owner_id->flag & LIB_LIB_OVERRIDE_NEED_RESYNC) == 0 &&
+ op->rna_prop_type == PROP_POINTER &&
+ (((IDOverrideLibraryPropertyOperation *)op->operations.first)->flag &
+ IDOVERRIDE_LIBRARY_FLAG_IDPOINTER_MATCH_REFERENCE) != 0) {
+ BLI_assert(ptr_src->owner_id ==
+ rna_property_override_property_real_id_owner(bmain, &data_src, NULL, NULL));
+ BLI_assert(ptr_dst->owner_id ==
+ rna_property_override_property_real_id_owner(bmain, &data_dst, NULL, NULL));
+
+ ID *id_src = RNA_property_pointer_get(&data_src, prop_src).owner_id;
+ ID *id_dst = RNA_property_pointer_get(&data_dst, prop_dst).owner_id;
+
+ PointerRNA prop_ptr_src, prop_ptr_dst;
+ RNA_id_pointer_create(id_src, &prop_ptr_src);
+ RNA_id_pointer_create(id_dst, &prop_ptr_dst);
+
+ id_src = rna_property_override_property_real_id_owner(bmain, &prop_ptr_src, NULL, NULL);
+ id_dst = rna_property_override_property_real_id_owner(bmain, &prop_ptr_dst, NULL, NULL);
+
+ BLI_assert(id_src == NULL || ID_IS_OVERRIDE_LIBRARY_REAL(id_src));
+
+ if (/* We might be in a case where id_dst has already been processed and its usages
+ * remapped to its new local override. In that case overrides and linked data are
+ * always properly matching. */
+ id_src != id_dst &&
+ /* If one of the pointers is NULL and not the other, or if linked reference ID of
+ * `id_src` is not `id_dst`, we are in a non-matching case. */
+ (ELEM(NULL, id_src, id_dst) || id_src->override_library->reference != id_dst)) {
+ ptr_dst->owner_id->flag |= LIB_LIB_OVERRIDE_NEED_RESYNC;
+ printf("Local override %s detected as needing resync!\n", ptr_dst->owner_id->name);
+ }
+ }
+
rna_property_override_apply_ex(bmain,
&data_dst,
&data_src,
diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c
index cad0d77607b..d011ec67725 100644
--- a/source/blender/makesrna/intern/rna_rna.c
+++ b/source/blender/makesrna/intern/rna_rna.c
@@ -1238,6 +1238,8 @@ static bool rna_property_override_diff_propptr_validate_diffing(PointerRNA *prop
/* Used for both Pointer and Collection properties. */
static int rna_property_override_diff_propptr(Main *bmain,
+ ID *owner_id_a,
+ ID *owner_id_b,
PointerRNA *propptr_a,
PointerRNA *propptr_b,
eRNACompareMode mode,
@@ -1354,7 +1356,18 @@ static int rna_property_override_diff_propptr(Main *bmain,
BLI_assert(propptr_b->data == propptr_b->owner_id);
ID *id_a = propptr_a->data;
ID *id_b = propptr_b->data;
- if (ELEM(NULL, id_a, id_b)) {
+ if ((owner_id_a->flag & LIB_LIB_OVERRIDE_NEED_RESYNC) != 0 ||
+ (owner_id_b->flag & LIB_LIB_OVERRIDE_NEED_RESYNC) != 0) {
+ /* In case one of the owner of the checked property is tagged as needing resync, do
+ * not change the 'match reference' status of its ID pointer properties overrides,
+ * since many non-matching ones are likely due to missing resync. */
+ printf(
+ "%s: Not checking matching ID pointer properties, since owner %s is tagged as "
+ "needing resync.\n",
+ __func__,
+ id_a->name);
+ }
+ else if (ELEM(NULL, id_a, id_b)) {
/* In case one of the pointer is NULL and not the other, we consider that the
* override is not matching its reference anymore. */
opop->flag &= ~IDOVERRIDE_LIBRARY_FLAG_IDPOINTER_MATCH_REFERENCE;
@@ -1778,6 +1791,8 @@ int rna_property_override_diff_default(Main *bmain,
PointerRNA propptr_a = RNA_property_pointer_get(ptr_a, rawprop_a);
PointerRNA propptr_b = RNA_property_pointer_get(ptr_b, rawprop_b);
return rna_property_override_diff_propptr(bmain,
+ ptr_a->owner_id,
+ ptr_b->owner_id,
&propptr_a,
&propptr_b,
mode,
@@ -1934,6 +1949,8 @@ int rna_property_override_diff_default(Main *bmain,
else if (is_id || is_valid_for_diffing) {
if (equals || do_create) {
const int eq = rna_property_override_diff_propptr(bmain,
+ ptr_a->owner_id,
+ ptr_b->owner_id,
&iter_a.ptr,
&iter_b.ptr,
mode,
More information about the Bf-blender-cvs
mailing list