[Bf-blender-cvs] [648ce6a] id-remap: Some minor fixes and refactor of core id-remap code. Will also allow us to call it when bmain is already locked higher in code.
Bastien Montagne
noreply at git.blender.org
Mon Sep 14 22:31:12 CEST 2015
Commit: 648ce6a08012c121a0c1ffce12749b9be10aaeff
Author: Bastien Montagne
Date: Sun Sep 13 15:39:05 2015 +0200
Branches: id-remap
https://developer.blender.org/rB648ce6a08012c121a0c1ffce12749b9be10aaeff
Some minor fixes and refactor of core id-remap code. Will also allow us to call it when bmain is already locked higher in code.
===================================================================
M source/blender/blenkernel/BKE_library.h
M source/blender/blenkernel/intern/library.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index 767edb7..85ce132 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -58,6 +58,7 @@ void *BKE_libblock_copy(struct ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
void BKE_libblock_copy_data(struct ID *id, const struct ID *id_from, const bool do_action);
/* Note: Requiring new_id to be non-null, this *may* not be the case ultimately, but makes things simpler for now. */
+void BKE_libblock_remap_locked(struct Main *bmain, struct ID *old_id, struct ID *new_id) ATTR_NONNULL();
void BKE_libblock_remap(struct Main *bmain, struct ID *old_id, struct ID *new_id) ATTR_NONNULL();
void BKE_id_lib_local_paths(struct Main *bmain, struct Library *lib, struct ID *id);
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 6d9798d..9b1df04 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -1014,7 +1014,7 @@ typedef struct IDRemap {
ID *old_id;
ID *new_id;
ID *id; /* The ID in which we are replacing old_id by new_id usages. */
- int skipped; /* Number of usecase that could not be remmapped (e.g.: obdata when in edit mode). */
+ int skipped; /* Number of usecase that could not be remapped (e.g.: obdata when in edit mode). */
} IDRemap;
static bool foreach_libblock_remap_callback(void *user_data, ID **id_p, int UNUSED(cb_flag))
@@ -1050,7 +1050,7 @@ static bool foreach_libblock_remap_callback(void *user_data, ID **id_p, int UNUS
}
/** Replace all references in .blend file to \a old_id by \a new_id. */
-void BKE_libblock_remap(Main *bmain, ID *old_id, ID *new_id)
+void BKE_libblock_remap_locked(Main *bmain, ID *old_id, ID *new_id)
{
IDRemap id_remap_data = {(void *)bmain, (void *)old_id, (void *)new_id, NULL, 0};
ListBase *lb_array[MAX_LIBARRAY];
@@ -1060,12 +1060,10 @@ void BKE_libblock_remap(Main *bmain, ID *old_id, ID *new_id)
BLI_assert(GS(old_id->name) == GS(new_id->name));
BLI_assert(old_id != new_id);
- printf("%s: %s replaced by %s\n", __func__, old_id->name, new_id->name);
+ printf("%s: %s (%p) replaced by %s (%p)\n", __func__, old_id->name, old_id, new_id->name, new_id);
i = set_listbasepointers(bmain, lb_array);
- BKE_main_lock(bmain);
-
/* Note that this is a very 'bruteforce' approach, maybe we could use some depsgraph to only process
* objects actually using given old_id... But for now this will do. */
@@ -1083,7 +1081,7 @@ void BKE_libblock_remap(Main *bmain, ID *old_id, ID *new_id)
}
/* We assume editors do not hold references to their IDs... This is false in some cases
- * (Image is especially tricky here), editors' code is to handle refcound (id->us) itself then. */
+ * (Image is especially tricky here), editors' code is to handle refcount (id->us) itself then. */
if (remap_editor_id_reference_cb) {
remap_editor_id_reference_cb(old_id, new_id);
}
@@ -1091,28 +1089,26 @@ void BKE_libblock_remap(Main *bmain, ID *old_id, ID *new_id)
/* All ID 'users' do not actually incref it, so we just assume all uses of this ID have been cleared... */
skipped = id_remap_data.skipped;
if (old_id->flag & LIB_FAKEUSER) {
- BLI_assert(old_id->us - 1 - skipped >= 0);
- if (old_id->us > 1) {
- new_id->us += old_id->us - 1 - skipped;
- if (new_id->flag & LIB_INDIRECT) {
- new_id->flag &= ~LIB_INDIRECT;
- new_id->flag |= LIB_EXTERN;
- }
- old_id->us = 1 + skipped;
- }
+ skipped++;
}
- else if (old_id->us > 0) {
- BLI_assert(old_id->us - skipped >= 0);
- new_id->us += old_id->us - skipped;
- if (new_id->flag & LIB_INDIRECT) {
- new_id->flag &= ~LIB_INDIRECT;
- new_id->flag |= LIB_EXTERN;
- }
- old_id->us = skipped;
+
+ BLI_assert(old_id->us - skipped >= 0);
+ new_id->us += old_id->us - skipped;
+ if (new_id->flag & LIB_INDIRECT) {
+ new_id->flag &= ~LIB_INDIRECT;
+ new_id->flag |= LIB_EXTERN;
}
+ old_id->us = skipped;
/* Full rebuild of DAG! */
DAG_relations_tag_update(bmain);
+}
+
+void BKE_libblock_remap(Main *bmain, ID *old_id, ID *new_id)
+{
+ BKE_main_lock(bmain);
+
+ BKE_libblock_remap_locked(bmain, old_id, new_id);
BKE_main_unlock(bmain);
}
More information about the Bf-blender-cvs
mailing list