[Bf-blender-cvs] [fcddb7cda76] master: Small refactor of some of the RNA diffing API.
Bastien Montagne
noreply at git.blender.org
Wed Dec 21 07:03:26 CET 2022
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. @@
More information about the Bf-blender-cvs
mailing list