[Bf-blender-cvs] [b76f2c0] id_override_static: Some cleanup and refactoring.
Bastien Montagne
noreply at git.blender.org
Mon Jan 2 12:56:40 CET 2017
Commit: b76f2c0b6c99ef3e6825a23119a3729ecde3bb57
Author: Bastien Montagne
Date: Wed Dec 14 10:07:13 2016 +0100
Branches: id_override_static
https://developer.blender.org/rBb76f2c0b6c99ef3e6825a23119a3729ecde3bb57
Some cleanup and refactoring.
===================================================================
M source/blender/blenkernel/BKE_library_override.h
M source/blender/blenkernel/intern/library_override.c
M source/blender/makesrna/RNA_access.h
M source/blender/makesrna/intern/rna_access.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_library_override.h b/source/blender/blenkernel/BKE_library_override.h
index 1fb4b92..03b8d55 100644
--- a/source/blender/blenkernel/BKE_library_override.h
+++ b/source/blender/blenkernel/BKE_library_override.h
@@ -44,7 +44,7 @@ void BKE_override_free(struct IDOverride **override);
bool BKE_override_status_check_local(struct ID *local);
bool BKE_override_status_check_reference(struct ID *local);
-bool BKE_override_operations_update(struct ID *local);
+bool BKE_override_operations_create(struct ID *local);
void BKE_override_update(struct ID *local);
void BKE_main_override_update(struct Main *bmain);
diff --git a/source/blender/blenkernel/intern/library_override.c b/source/blender/blenkernel/intern/library_override.c
index 14528d3..f15bcf6 100644
--- a/source/blender/blenkernel/intern/library_override.c
+++ b/source/blender/blenkernel/intern/library_override.c
@@ -44,6 +44,7 @@
#include "RNA_access.h"
#include "RNA_types.h"
+
/** Initialize empty overriding of \a reference_id by \a local_id. */
IDOverride *BKE_override_init(struct ID *local_id, struct ID *reference_id)
{
@@ -165,13 +166,13 @@ bool BKE_override_status_check_reference(ID *local)
/** Compares local and reference data-blocks and create new override operations as needed,
* or reset to reference values if overriding is not allowed.
* \return true is new overriding op was created, or some local data was reset. */
-bool BKE_override_operations_update(ID *local)
+bool BKE_override_operations_create(ID *local)
{
BLI_assert(local->override != NULL);
return false;
}
-#include "DNA_object_types.h"
-/** Update given override from its reference (not touching to overriden properties). */
+
+/** Update given override from its reference (re-applying overriden properties). */
void BKE_override_update(ID *local)
{
if (local->override == NULL) {
@@ -179,7 +180,7 @@ void BKE_override_update(ID *local)
}
/* Recursively do 'ancestors' overrides first, if any. */
- if (local->override->reference->override) {
+ if (local->override->reference->override && (local->override->reference->tag & LIB_TAG_OVERRIDE_OK) == 0) {
BKE_override_update(local->override->reference);
}
@@ -201,19 +202,20 @@ void BKE_override_update(ID *local)
return;
}
- PointerRNA rnaptr_local, rnaptr_data;
+ PointerRNA rnaptr_local, rnaptr_final;
RNA_id_pointer_create(local, &rnaptr_local);
- RNA_id_pointer_create(tmp_id, &rnaptr_data);
+ RNA_id_pointer_create(tmp_id, &rnaptr_final);
- RNA_struct_override_update(&rnaptr_local, &rnaptr_data, local->override);
+ RNA_struct_override_apply(&rnaptr_final, &rnaptr_local, local->override);
/* This also transfers all pointers (memory) owned by local to tmp_id, and vice-versa. So when we'll free tmp_id,
* we'll actually free old, outdated data from local. */
BKE_id_swap(local, tmp_id);
- /* Again, horribly innefficient in our case, we need something off-Main and off-usercounting
- * (aka moar generic nolib copy/free stuff)! */
+ /* Again, horribly innefficient in our case, we need something off-Main (aka moar generic nolib copy/free stuff)! */
BKE_libblock_free_ex(G.main, tmp_id, true, false);
+
+ local->flag |= LIB_TAG_OVERRIDE_OK;
}
/** Update all overrides from given \a bmain. */
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index 0d64a8d..8d0b667 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -40,6 +40,7 @@ extern "C" {
struct bContext;
struct ID;
struct IDOverride;
+struct IDOverrideProperty;
struct ListBase;
struct Main;
struct ReportList;
@@ -1214,10 +1215,15 @@ typedef enum eRNAEqualsMode {
bool RNA_property_equals(struct PointerRNA *a, struct PointerRNA *b, struct PropertyRNA *prop, eRNAEqualsMode mode);
bool RNA_struct_equals(struct PointerRNA *a, struct PointerRNA *b, eRNAEqualsMode mode);
+
+/* Override. */
+
bool RNA_struct_override_matches(struct PointerRNA *local, struct PointerRNA *reference,
struct IDOverride *override, const bool ignore_non_overridable, const bool ignore_overridden);
-void RNA_struct_override_update(struct PointerRNA *src, struct PointerRNA *dst, struct IDOverride *override);
+void RNA_property_override_apply(struct PointerRNA *dst,
+ struct PointerRNA *src, struct PropertyRNA *prop, struct IDOverrideProperty *op);
+void RNA_struct_override_apply(struct PointerRNA *dst, struct PointerRNA *src, struct IDOverride *override);
#ifdef __cplusplus
}
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index b37dbb5..cde407d 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -7127,7 +7127,21 @@ bool RNA_struct_override_matches(
return equals;
}
-void RNA_struct_override_update(PointerRNA *src, PointerRNA *dst, IDOverride *override)
+/** Apply given \a op override property operations on \a dst, using \a src as source. */
+void RNA_property_override_apply(PointerRNA *dst, PointerRNA *src, PropertyRNA *prop, IDOverrideProperty *op)
+{
+ for (IDOverridePropertyOperation *opop = op->operations.first; opop; opop = opop->next) {
+ switch (opop->operation) {
+ case IDOVERRIDE_REPLACE:
+ RNA_property_copy(dst, src, prop, -1);
+ break;
+ /* TODO other cases! */
+ }
+ }
+}
+
+/** Apply given \a override operations on \a dst, using \a src as source. */
+void RNA_struct_override_apply(PointerRNA *dst, PointerRNA *src, IDOverride *override)
{
for (IDOverrideProperty *op = override->properties.first; op; op = op->next) {
/* Simplified for now! */
@@ -7139,14 +7153,7 @@ void RNA_struct_override_update(PointerRNA *src, PointerRNA *dst, IDOverride *ov
{
BLI_assert(src_prop == dst_prop);
- for (IDOverridePropertyOperation *opop = op->operations.first; opop; opop = opop->next) {
- switch (opop->operation) {
- case IDOVERRIDE_REPLACE:
- RNA_property_copy(&dst_data, &src_data, src_prop, -1);
- break;
- /* TODO other cases! */
- }
- }
+ RNA_property_override_apply(&src_data, &dst_data, src_prop, op);
}
}
}
More information about the Bf-blender-cvs
mailing list