blender-v3.6-release #119429

Merged
Bastien Montagne merged 3 commits from mont29/blender:blender-v3.6-release into blender-v3.6-release 2024-03-14 04:07:07 +01:00
1 changed files with 28 additions and 13 deletions
Showing only changes of commit cdb6e15b62 - Show all commits

View File

@ -3938,47 +3938,62 @@ bool BKE_lib_override_library_property_operation_operands_validate(
return true;
}
void BKE_lib_override_library_validate(Main * /*bmain*/, ID *id, ReportList *reports)
void BKE_lib_override_library_validate(Main *bmain, ID *id, ReportList *reports)
{
if (id->override_library == nullptr) {
if (!ID_IS_OVERRIDE_LIBRARY(id)) {
return;
}
ID *liboverride_id = id;
IDOverrideLibrary *liboverride = id->override_library;
if (ID_IS_OVERRIDE_LIBRARY_VIRTUAL(id)) {
liboverride = BKE_lib_override_library_get(bmain, id, nullptr, &liboverride_id);
if (!liboverride) {
/* Happens in case the given ID is a liboverride-embedded one (actual embedded ID like
* NodeTree or master collection, or shapekeys), used by a totally not-liboverride owner ID.
* Just clear the relevant ID flag.
*/
id->flag &= ~LIB_EMBEDDED_DATA_LIB_OVERRIDE;
return;
}
}
BLI_assert(liboverride);
/* NOTE: In code deleting liboverride data below, #BKE_lib_override_library_make_local is used
* instead of directly calling #BKE_lib_override_library_free, because the former also handles
* properly 'liboverride embedded' IDs, like root nodetrees, or shapekeys. */
if (id->override_library->reference == nullptr) {
if (liboverride->reference == nullptr) {
/* This (probably) used to be a template ID, could be linked or local, not an override. */
BKE_reportf(reports,
RPT_WARNING,
"Library override templates have been removed: removing all override data from "
"the data-block '%s'",
id->name);
BKE_lib_override_library_make_local(nullptr, id);
liboverride_id->name);
BKE_lib_override_library_make_local(nullptr, liboverride_id);
return;
}
if (id->override_library->reference == id) {
if (liboverride->reference == liboverride_id) {
/* Very serious data corruption, cannot do much about it besides removing the liboverride data.
*/
BKE_reportf(reports,
RPT_ERROR,
"Data corruption: data-block '%s' is using itself as library override reference, "
"removing all override data",
id->name);
BKE_lib_override_library_make_local(nullptr, id);
liboverride_id->name);
BKE_lib_override_library_make_local(nullptr, liboverride_id);
return;
}
if (!ID_IS_LINKED(id->override_library->reference)) {
if (!ID_IS_LINKED(liboverride->reference)) {
/* Very serious data corruption, cannot do much about it besides removing the liboverride data.
*/
BKE_reportf(reports,
RPT_ERROR,
"Data corruption: data-block '%s' is using another local data-block ('%s') as "
"library override reference, removing all override data",
id->name,
id->override_library->reference->name);
BKE_lib_override_library_make_local(nullptr, id);
liboverride_id->name,
liboverride->reference->name);
BKE_lib_override_library_make_local(nullptr, liboverride_id);
return;
}
}
@ -3988,7 +4003,7 @@ void BKE_lib_override_library_main_validate(Main *bmain, ReportList *reports)
ID *id;
FOREACH_MAIN_ID_BEGIN (bmain, id) {
if (id->override_library != nullptr) {
if (ID_IS_OVERRIDE_LIBRARY(id)) {
BKE_lib_override_library_validate(bmain, id, reports);
}
}