[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