Refactor BMain relations temp data.
`bmain.relations` is used to store temp data of relations between IDs, to speed-up some complex processes heavily relying on such information. Previous implementation was failry unclear/confusing, and required a not-so-nice hack to 'tag' some ID as processed. New code changes as such: * Using `from`/`to` naming (instead of `user`/`used`). * More clear separation between `to` `id_pointer` and `from` one, using an union instead of hacking around difference between `ID *` and `ID **` pointers. * Adds storage of `session_uuid` informations (mainly useful as debug/ensuring proper consistency of data currently). * Adds a structure per ID in the mapping. This enables possibility of storing tags (and potentially more data in the future) per-ID, without polluting the IDs themselves with very short-life info. Differential Revision: https://developer.blender.org/D10164
This commit is contained in:
@@ -1795,32 +1795,31 @@ static void library_make_local_copying_check(ID *id,
|
||||
return; /* Already checked, nothing else to do. */
|
||||
}
|
||||
|
||||
MainIDRelationsEntry *entry = BLI_ghash_lookup(id_relations->id_used_to_user, id);
|
||||
MainIDRelationsEntry *entry = BLI_ghash_lookup(id_relations->relations_from_pointers, id);
|
||||
BLI_gset_insert(loop_tags, id);
|
||||
for (; entry != NULL; entry = entry->next) {
|
||||
|
||||
/* Used_to_user stores ID pointer, not pointer to ID pointer. */
|
||||
ID *par_id = (ID *)entry->id_pointer;
|
||||
|
||||
for (MainIDRelationsEntryItem *from_id_entry = entry->from_ids; from_id_entry != NULL;
|
||||
from_id_entry = from_id_entry->next) {
|
||||
/* Our oh-so-beloved 'from' pointers... Those should always be ignored here, since the actual
|
||||
* relation we want to check is in the other way around. */
|
||||
if (entry->usage_flag & IDWALK_CB_LOOPBACK) {
|
||||
if (from_id_entry->usage_flag & IDWALK_CB_LOOPBACK) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ID *from_id = from_id_entry->id_pointer.from;
|
||||
|
||||
/* Shape-keys are considered 'private' to their owner ID here, and never tagged
|
||||
* (since they cannot be linked), so we have to switch effective parent to their owner.
|
||||
*/
|
||||
if (GS(par_id->name) == ID_KE) {
|
||||
par_id = ((Key *)par_id)->from;
|
||||
if (GS(from_id->name) == ID_KE) {
|
||||
from_id = ((Key *)from_id)->from;
|
||||
}
|
||||
|
||||
if (par_id->lib == NULL) {
|
||||
if (from_id->lib == NULL) {
|
||||
/* Local user, early out to avoid some gset querying... */
|
||||
continue;
|
||||
}
|
||||
if (!BLI_gset_haskey(done_ids, par_id)) {
|
||||
if (BLI_gset_haskey(loop_tags, par_id)) {
|
||||
if (!BLI_gset_haskey(done_ids, from_id)) {
|
||||
if (BLI_gset_haskey(loop_tags, from_id)) {
|
||||
/* We are in a 'dependency loop' of IDs, this does not say us anything, skip it.
|
||||
* Note that this is the situation that can lead to archipelagoes of linked data-blocks
|
||||
* (since all of them have non-local users, they would all be duplicated,
|
||||
@@ -1829,10 +1828,10 @@ static void library_make_local_copying_check(ID *id,
|
||||
continue;
|
||||
}
|
||||
/* Else, recursively check that user ID. */
|
||||
library_make_local_copying_check(par_id, loop_tags, id_relations, done_ids);
|
||||
library_make_local_copying_check(from_id, loop_tags, id_relations, done_ids);
|
||||
}
|
||||
|
||||
if (par_id->tag & LIB_TAG_DOIT) {
|
||||
if (from_id->tag & LIB_TAG_DOIT) {
|
||||
/* This user will be fully local in future, so far so good,
|
||||
* nothing to do here but check next user. */
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user