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
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2017-12-09 12:26:08 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2017-12-11 14:07:13 +0300
commit75fbd60b0658e1f7de4975417d752ce428fc3dc0 (patch)
tree8082853263d77bbc775727df1a78519264baaeb2 /source/blender/blenkernel/intern/library_override.c
parent48fe46943e03a0d96e7fe6ff4d5a7a070a779503 (diff)
Walk all the overriding chain to try to find a template.
When one creates a new local static override from another linked data-block already overriding a third one etc., walk the whole inheritance chain up to the original ancestor to try to find an overriding template, instead of only checking the immediate reference...
Diffstat (limited to 'source/blender/blenkernel/intern/library_override.c')
-rw-r--r--source/blender/blenkernel/intern/library_override.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/source/blender/blenkernel/intern/library_override.c b/source/blender/blenkernel/intern/library_override.c
index 22896cff64a..26aeca0564d 100644
--- a/source/blender/blenkernel/intern/library_override.c
+++ b/source/blender/blenkernel/intern/library_override.c
@@ -66,16 +66,26 @@ IDOverrideStatic *BKE_override_static_init(ID *local_id, ID *reference_id)
BLI_assert(reference_id == NULL || reference_id->lib != NULL);
BLI_assert(local_id->override_static == NULL);
- if (reference_id != NULL && reference_id->override_static != NULL && reference_id->override_static->reference == NULL) {
- /* reference ID has an override template, use it! */
- BKE_override_static_copy(local_id, reference_id);
+ ID *ancestor_id;
+ for (ancestor_id = reference_id;
+ ancestor_id != NULL && ancestor_id->override_static != NULL && ancestor_id->override_static->reference != NULL;
+ ancestor_id = ancestor_id->override_static->reference);
+
+ if (ancestor_id != NULL && ancestor_id->override_static != NULL) {
+ /* Original ID has a template, use it! */
+ BKE_override_static_copy(local_id, ancestor_id);
+ if (local_id->override_static->reference != reference_id) {
+ id_us_min(local_id->override_static->reference);
+ local_id->override_static->reference = reference_id;
+ id_us_plus(local_id->override_static->reference);
+ }
return local_id->override_static;
}
/* Else, generate new empty override. */
local_id->override_static = MEM_callocN(sizeof(*local_id->override_static), __func__);
local_id->override_static->reference = reference_id;
- id_us_plus(reference_id);
+ id_us_plus(local_id->override_static->reference);
local_id->tag &= ~LIB_TAG_OVERRIDESTATIC_OK;
/* TODO do we want to add tag or flag to referee to mark it as such? */
return local_id->override_static;