Commit: fcddb7cda7668ca36bb29a4256a31624ff00b645 Author: Bastien Montagne Date: Tue Dec 20 23:36:29 2022 +0900 Branches: master https://developer.blender.org/rBfcddb7cda7668ca36bb29a4256a31624ff00b645
Small refactor of some of the RNA diffing API. Propagate `eRNAOverrideMatchResult` 'return' flags at higher level into BKE API, instead of just returning a boolean true when new override rules have been created. NOTE: This is an intermediary step towards fixing T102766. Differential Revision: https://developer.blender.org/D16761 =================================================================== M source/blender/blenkernel/BKE_lib_override.h M source/blender/blenkernel/intern/blendfile.c M source/blender/blenkernel/intern/blendfile_link_append.c M source/blender/blenkernel/intern/lib_override.cc M source/blender/blenkernel/intern/undo_system.c M source/blender/makesrna/RNA_access.h M source/blender/makesrna/intern/rna_ID.c M source/blender/windowmanager/intern/wm_files.c =================================================================== diff --git a/source/blender/blenkernel/BKE_lib_override.h b/source/blender/blenkernel/BKE_lib_override.h index 963e2d09b17..a98984250b9 100644 --- a/source/blender/blenkernel/BKE_lib_override.h +++ b/source/blender/blenkernel/BKE_lib_override.h @@ -401,6 +401,8 @@ bool BKE_lib_override_library_status_check_reference(struct Main *bmain, struct * Compare local and reference data-blocks and create new override operations as needed, * or reset to reference values if overriding is not allowed. * + * \param r_report_flags #eRNAOverrideMatchResult flags giving info about the result of this call. + * * \note Defining override operations is only mandatory before saving a `.blend` file on disk * (not for undo!). * Knowing that info at runtime is only useful for UI/UX feedback. @@ -411,11 +413,17 @@ bool BKE_lib_override_library_status_check_reference(struct Main *bmain, struct * * \return true if any library operation was created. */ -bool BKE_lib_override_library_operations_create(struct Main *bmain, struct ID *local); +void BKE_lib_override_library_operations_create(struct Main *bmain, + struct ID *local, + int *r_report_flags); /** * Check all overrides from given \a bmain and create/update overriding operations as needed. + * + * \param r_report_flags #eRNAOverrideMatchResult flags giving info about the result of this call. */ -bool BKE_lib_override_library_main_operations_create(struct Main *bmain, bool force_auto); +void BKE_lib_override_library_main_operations_create(struct Main *bmain, + bool force_auto, + int *r_report_flags); /** * Reset all overrides in given \a id_root, while preserving ID relations. diff --git a/source/blender/blenkernel/intern/blendfile.c b/source/blender/blenkernel/intern/blendfile.c index fb50de47881..7aa3fd4b9c5 100644 --- a/source/blender/blenkernel/intern/blendfile.c +++ b/source/blender/blenkernel/intern/blendfile.c @@ -435,7 +435,7 @@ static void setup_app_data(bContext *C, reports->duration.lib_overrides_resync; /* We need to rebuild some of the deleted override rules (for UI feedback purpose). */ - BKE_lib_override_library_main_operations_create(bmain, true); + BKE_lib_override_library_main_operations_create(bmain, true, NULL); } } diff --git a/source/blender/blenkernel/intern/blendfile_link_append.c b/source/blender/blenkernel/intern/blendfile_link_append.c index 409ae39f6be..3f3c1028d10 100644 --- a/source/blender/blenkernel/intern/blendfile_link_append.c +++ b/source/blender/blenkernel/intern/blendfile_link_append.c @@ -1424,7 +1424,7 @@ void BKE_blendfile_library_relocate(BlendfileLinkAppendContext *lapp_context, /* All override rules need to be up to date, since there will be no do_version here, otherwise * older, now-invalid rules might be applied and likely fail, or some changes might be missing, * etc. See T93353. */ - BKE_lib_override_library_main_operations_create(bmain, true); + BKE_lib_override_library_main_operations_create(bmain, true, NULL); /* Remove all IDs to be reloaded from Main. */ lba_idx = set_listbasepointers(bmain, lbarray); @@ -1634,7 +1634,7 @@ void BKE_blendfile_library_relocate(BlendfileLinkAppendContext *lapp_context, .reports = reports, }); /* We need to rebuild some of the deleted override rules (for UI feedback purpose). */ - BKE_lib_override_library_main_operations_create(bmain, true); + BKE_lib_override_library_main_operations_create(bmain, true, NULL); } BKE_main_collection_sync(bmain); diff --git a/source/blender/blenkernel/intern/lib_override.cc b/source/blender/blenkernel/intern/lib_override.cc index 07eb4741b1f..ce7abe63eac 100644 --- a/source/blender/blenkernel/intern/lib_override.cc +++ b/source/blender/blenkernel/intern/lib_override.cc @@ -1427,7 +1427,7 @@ bool BKE_lib_override_library_create(Main *bmain, BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false); /* We need to rebuild some of the deleted override rules (for UI feedback purpose). */ - BKE_lib_override_library_main_operations_create(bmain, true); + BKE_lib_override_library_main_operations_create(bmain, true, nullptr); return success; } @@ -3297,19 +3297,18 @@ bool BKE_lib_override_library_status_check_reference(Main *bmain, ID *local) return true; } -bool BKE_lib_override_library_operations_create(Main *bmain, ID *local) +void BKE_lib_override_library_operations_create(Main *bmain, ID *local, int *r_report_flags) { BLI_assert(!ID_IS_LINKED(local)); BLI_assert(local->override_library != nullptr); const bool is_template = (local->override_library->reference == nullptr); - bool created = false; if (!is_template) { /* Do not attempt to generate overriding rules from an empty place-holder generated by link * code when it cannot find the actual library/ID. Much better to keep the local data-block as * is in the file in that case, until broken lib is fixed. */ if (ID_MISSING(local->override_library->reference)) { - return created; + return; } if (GS(local->name) == ID_OB) { @@ -3330,7 +3329,7 @@ bool BKE_lib_override_library_operations_create(Main *bmain, ID *local) RNA_id_pointer_create(local, &rnaptr_local); RNA_id_pointer_create(local->override_library->reference, &rnaptr_reference); - eRNAOverrideMatchResult report_flags = (eRNAOverrideMatchResult)0; + eRNAOverrideMatchResult local_report_flags = RNA_OVERRIDE_MATCH_RESULT_INIT; RNA_struct_override_matches( bmain, &rnaptr_local, @@ -3339,28 +3338,27 @@ bool BKE_lib_override_library_operations_create(Main *bmain, ID *local) 0, local->override_library, (eRNAOverrideMatch)(RNA_OVERRIDE_COMPARE_CREATE | RNA_OVERRIDE_COMPARE_RESTORE), - &report_flags); - - if (report_flags & RNA_OVERRIDE_MATCH_RESULT_CREATED) { - created = true; - } + &local_report_flags); - if (report_flags & RNA_OVERRIDE_MATCH_RESULT_RESTORED) { + if (local_report_flags & RNA_OVERRIDE_MATCH_RESULT_RESTORED) { CLOG_INFO(&LOG, 2, "We did restore some properties of %s from its reference", local->name); } - if (report_flags & RNA_OVERRIDE_MATCH_RESULT_CREATED) { + if (local_report_flags & RNA_OVERRIDE_MATCH_RESULT_CREATED) { CLOG_INFO(&LOG, 2, "We did generate library override rules for %s", local->name); } else { CLOG_INFO(&LOG, 2, "No new library override rules for %s", local->name); } + + if (r_report_flags != nullptr) { + *r_report_flags |= local_report_flags; + } } - return created; } struct LibOverrideOpCreateData { Main *bmain; - bool changed; + eRNAOverrideMatchResult report_flags; }; static void lib_override_library_operations_create_cb(TaskPool *__restrict pool, void *taskdata) @@ -3369,14 +3367,16 @@ static void lib_override_library_operations_create_cb(TaskPool *__restrict pool, BLI_task_pool_user_data(pool)); ID *id = static_cast<ID *>(taskdata); - if (BKE_lib_override_library_operations_create(create_data->bmain, id)) { - /* Technically no need for atomic, all jobs write the same value and we only care if one did - * it. But play safe and avoid implicit assumptions. */ - atomic_fetch_and_or_uint8(reinterpret_cast<uint8_t *>(&create_data->changed), true); - } + eRNAOverrideMatchResult report_flags = RNA_OVERRIDE_MATCH_RESULT_INIT; + BKE_lib_override_library_operations_create( + create_data->bmain, id, reinterpret_cast<int *>(&report_flags)); + atomic_fetch_and_or_uint32(reinterpret_cast<uint32_t *>(&create_data->report_flags), + report_flags); } -bool BKE_lib_override_library_main_operations_create(Main *bmain, const bool force_auto) +void BKE_lib_override_library_main_operations_create(Main *bmain, + const bool force_auto, + int *r_report_flags) { ID *id; @@ -3403,7 +3403,7 @@ bool BKE_lib_override_library_main_operations_create(Main *bmain, const bool for LibOverrideOpCreateData create_pool_data{}; create_pool_data.bmain = bmain; - create_pool_data.changed = false; + create_pool_data.report_flags = RNA_OVERRIDE_MATCH_RESULT_INIT; TaskPool *task_pool = BLI_task_pool_create(&create_pool_data, TASK_PRIORITY_HIGH); FOREACH_MAIN_ID_BEGIN (bmain, id) { @@ -3443,6 +3443,10 @@ bool BKE_lib_override_library_main_operations_create(Main *bmain, const bool for BLI_task_pool_free(task_pool); + if (r_report_flags != nullptr) { + *r_report_flags |= create_pool_data.report_flags; + } + if (force_auto) { BKE_lib_override_library_main_unused_cleanup(bmain); } @@ -3450,8 +3454,6 @@ bool BKE_lib_override_library_main_operations_create(Main *bmain, const bool for #ifdef DEBUG_OVERRIDE_TIMEIT TIMEIT_END_AVERAGED(BKE_lib_override_library_main_operations_create); #endif - - return create_pool_data.changed; } static bool lib_override_library_id_reset_do(Main *bmain, @@ -3906,7 +3908,7 @@ ID *BKE_lib_override_library_operations_store_start(Main *bmain, UNUSED_VARS_NDEBUG(override_storage); /* Forcefully ensure we know about all needed override operations. */ - BKE_lib_override_library_operations_create(bmain, local); + BKE_lib_override_library_operations_create(bmain, local, nullptr); ID *storage_id; #ifdef DEBUG_OVERRIDE_TIMEIT diff --git a/source/blender/blenkernel/intern/undo_system.c b/source/blender/blenkernel/intern/undo_system.c index db2a6b658fa..0c0de957773 100644 --- a/source/blender/blenkernel/intern/undo_system.c +++ b/source/blender/blenkernel/intern/undo_system.c @@ -27,6 +27,8 @@ #include "BKE_main.h" #include "BKE_undo_system.h" +#include "RNA_access.h" + #include "MEM_guardedalloc.h" #define undo_stack _wm_undo_stack_disallow /* pass in as a variable always. */ @@ -494,7 +496,9 @@ eUndoPushReturn B @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
