diff options
-rw-r--r-- | source/blender/blenkernel/BKE_lib_override.h | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/lib_override.c | 48 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 1 |
3 files changed, 55 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_lib_override.h b/source/blender/blenkernel/BKE_lib_override.h index ccb313f0e2a..e0cb2d9abb0 100644 --- a/source/blender/blenkernel/BKE_lib_override.h +++ b/source/blender/blenkernel/BKE_lib_override.h @@ -50,6 +50,7 @@ struct Main; struct Object; struct PointerRNA; struct PropertyRNA; +struct ReportList; struct Scene; struct ViewLayer; @@ -129,6 +130,11 @@ bool BKE_lib_override_library_property_operation_operands_validate( struct PropertyRNA *prop_src, struct PropertyRNA *prop_storage); +void BKE_lib_override_library_validate(struct Main *bmain, + struct ID *id, + struct ReportList *reports); +void BKE_lib_override_library_main_validate(struct Main *bmain, struct ReportList *reports); + bool BKE_lib_override_library_status_check_local(struct Main *bmain, struct ID *local); bool BKE_lib_override_library_status_check_reference(struct Main *bmain, struct ID *local); diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c index 7a6e7a35724..6cdc7fce34b 100644 --- a/source/blender/blenkernel/intern/lib_override.c +++ b/source/blender/blenkernel/intern/lib_override.c @@ -48,6 +48,7 @@ #include "BKE_lib_query.h" #include "BKE_lib_remap.h" #include "BKE_main.h" +#include "BKE_report.h" #include "BKE_scene.h" #include "BLI_ghash.h" @@ -1540,6 +1541,53 @@ bool BKE_lib_override_library_property_operation_operands_validate( return true; } +/** Check against potential \a bmain. */ +void BKE_lib_override_library_validate(Main *UNUSED(bmain), ID *id, ReportList *reports) +{ + if (id->override_library == NULL) { + return; + } + if (id->override_library->reference == NULL) { + /* This is a template ID, could be linked or local, not an override. */ + return; + } + if (id->override_library->reference == id) { + /* Very serious data corruption, cannot do much about it besides removing the reference + * (therefore making the id a local override template one only). */ + BKE_reportf(reports, + RPT_ERROR, + "Data corruption: data-block '%s' is using itself as library override reference", + id->name); + id->override_library->reference = NULL; + return; + } + if (id->override_library->reference->lib == NULL) { + /* Very serious data corruption, cannot do much about it besides removing the reference + * (therefore making the id a local override template one only). */ + BKE_reportf(reports, + RPT_ERROR, + "Data corruption: data-block '%s' is using another local data-block ('%s') as " + "library override reference", + id->name, + id->override_library->reference->name); + id->override_library->reference = NULL; + return; + } +} + +/** Check against potential \a bmain. */ +void BKE_lib_override_library_main_validate(Main *bmain, ReportList *reports) +{ + ID *id; + + FOREACH_MAIN_ID_BEGIN (bmain, id) { + if (id->override_library != NULL) { + BKE_lib_override_library_validate(bmain, id, reports); + } + } + FOREACH_MAIN_ID_END; +} + /** * Check that status of local data-block is still valid against current reference one. * diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 369c10a65b4..f97f6f65551 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -4237,6 +4237,7 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath) * we can re-generate overrides from their references. */ if (fd->memfile == NULL) { /* Do not apply in undo case! */ + BKE_lib_override_library_main_validate(bfd->main, fd->reports); BKE_lib_override_library_main_update(bfd->main); } |