[Bf-blender-cvs] [352f9ed27b0] id_override_static: Some more cleanup, add (limited) copying of static override.

Bastien Montagne noreply at git.blender.org
Tue Jun 13 10:27:11 CEST 2017


Commit: 352f9ed27b007912af718ab3f6c5777d60f02eed
Author: Bastien Montagne
Date:   Tue Jun 13 10:25:59 2017 +0200
Branches: id_override_static
https://developer.blender.org/rB352f9ed27b007912af718ab3f6c5777d60f02eed

Some more cleanup, add (limited) copying of static override.

Working towards override template, still some work to do though.

===================================================================

M	source/blender/blenkernel/BKE_library_override.h
M	source/blender/blenkernel/intern/library.c
M	source/blender/blenkernel/intern/library_override.c
M	source/blender/editors/object/object_relations.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_library_override.h b/source/blender/blenkernel/BKE_library_override.h
index b5e56145cbc..51de378b008 100644
--- a/source/blender/blenkernel/BKE_library_override.h
+++ b/source/blender/blenkernel/BKE_library_override.h
@@ -39,6 +39,7 @@ struct IDOverridePropertyOperation;
 struct Main;
 
 struct IDOverride *BKE_override_init(struct ID *local_id, struct ID *reference_id);
+void BKE_override_copy(struct ID *dst_id, const struct ID *src_id);
 void BKE_override_clear(struct IDOverride *override);
 void BKE_override_free(struct IDOverride **override);
 
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index d3bb0ba7a4b..8a6e605c326 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -103,6 +103,7 @@
 #include "BKE_lamp.h"
 #include "BKE_lattice.h"
 #include "BKE_library.h"
+#include "BKE_library_override.h"
 #include "BKE_library_query.h"
 #include "BKE_library_remap.h"
 #include "BKE_linestyle.h"
@@ -1196,7 +1197,14 @@ void BKE_libblock_copy_data(ID *id, const ID *id_from, const bool do_action)
 	if (id_from->properties)
 		id->properties = IDP_CopyProperty(id_from->properties);
 
-	/* For now, just never copy override stuff... */
+	/* XXX Again... We need a way to control what we copy in a much more refined way.
+	 * Wa cannot always copy this, some internal copying will die on it! */
+	/* For now, upper level code will have to do that itself when required. */
+#if 0
+	if (id_from->override != NULL) {
+		BKE_override_copy(id, id_from);
+	}
+#endif
 
 	/* the duplicate should get a copy of the animdata */
 	id_copy_animdata(id, do_action);
diff --git a/source/blender/blenkernel/intern/library_override.c b/source/blender/blenkernel/intern/library_override.c
index f3ae2c9f314..503ee198ad1 100644
--- a/source/blender/blenkernel/intern/library_override.c
+++ b/source/blender/blenkernel/intern/library_override.c
@@ -52,16 +52,27 @@
 
 #define OVERRIDE_AUTO_CHECK_DELAY 0.2  /* 200ms between auto-override checks. */
 
+static void bke_override_property_copy(IDOverrideProperty *op_dst, IDOverrideProperty *op_src);
+static void bke_override_property_operation_copy(IDOverridePropertyOperation *opop_dst, IDOverridePropertyOperation *opop_src);
+
 static void bke_override_property_clear(IDOverrideProperty *op);
 static void bke_override_property_operation_clear(IDOverridePropertyOperation *opop);
 
 /** Initialize empty overriding of \a reference_id by \a local_id. */
-IDOverride *BKE_override_init(struct ID *local_id, struct ID *reference_id)
+IDOverride *BKE_override_init(ID *local_id, ID *reference_id)
 {
 	/* If reference_id is NULL, we are creating an override template for purely local data.
 	 * Else, reference *must* be linked data. */
 	BLI_assert(reference_id == NULL || reference_id->lib != NULL);
+	BLI_assert(local_id->override == NULL);
+
+	if (reference_id != NULL && reference_id->override != NULL && reference_id->override->reference == NULL) {
+		/* reference ID has an override template, use it! */
+		BKE_override_copy(local_id, reference_id);
+		return local_id->override;
+	}
 
+	/* Else, generate new empty override. */
 	local_id->override = MEM_callocN(sizeof(*local_id->override), __func__);
 	local_id->override->reference = reference_id;
 	id_us_plus(reference_id);
@@ -70,8 +81,45 @@ IDOverride *BKE_override_init(struct ID *local_id, struct ID *reference_id)
 	return local_id->override;
 }
 
+/** Deep copy of a whole override from \a src_id to \a dst_id. */
+void BKE_override_copy(ID *dst_id, const ID *src_id)
+{
+	BLI_assert(src_id->override != NULL);
+
+	if (dst_id->override != NULL) {
+		if (src_id->override == NULL) {
+			BKE_override_free(&dst_id->override);
+			return;
+		}
+		else {
+			BKE_override_clear(dst_id->override);
+		}
+	}
+	else if (src_id->override == NULL) {
+		return;
+	}
+	else {
+		BKE_override_init(dst_id, NULL);
+	}
+
+	/* Source is already overriding data, we copy it but reuse it's reference for dest ID.
+	 * otherwise, source is only an override template, it then becomes reference of dest ID. */
+	dst_id->override->reference = src_id->override->reference ? src_id->override->reference : (ID *)src_id;
+	id_us_plus(dst_id->override->reference);
+
+	BLI_duplicatelist(&dst_id->override->properties, &src_id->override->properties);
+	for (IDOverrideProperty *op_dst = dst_id->override->properties.first, *op_src = src_id->override->properties.first;
+	     op_dst;
+	     op_dst = op_dst->next, op_src = op_src->next)
+	{
+		bke_override_property_copy(op_dst, op_src);
+	}
+
+	dst_id->tag &= ~LIB_TAG_OVERRIDE_OK;
+}
+
 /** Clear any overriding data from given \a override. */
-void BKE_override_clear(struct IDOverride *override)
+void BKE_override_clear(IDOverride *override)
 {
 	BLI_assert(override != NULL);
 
@@ -79,6 +127,9 @@ void BKE_override_clear(struct IDOverride *override)
 		bke_override_property_clear(op);
 	}
 	BLI_freelistN(&override->properties);
+
+	id_us_min(override->reference);
+	/* override->storage should never be refcounted... */
 }
 
 /** Free given \a override. */
@@ -124,6 +175,19 @@ IDOverrideProperty *BKE_override_property_get(IDOverride *override, const char *
 	return op;
 }
 
+void bke_override_property_copy(IDOverrideProperty *op_dst, IDOverrideProperty *op_src)
+{
+	op_dst->rna_path = BLI_strdup(op_src->rna_path);
+	BLI_duplicatelist(&op_dst->operations, &op_src->operations);
+
+	for (IDOverridePropertyOperation *opop_dst = op_dst->operations.first, *opop_src = op_src->operations.first;
+	     opop_dst;
+	     opop_dst = opop_dst->next, opop_src = opop_src->next)
+	{
+		bke_override_property_operation_copy(opop_dst, opop_src);
+	}
+}
+
 void bke_override_property_clear(IDOverrideProperty *op)
 {
 	BLI_assert(op->rna_path != NULL);
@@ -239,6 +303,16 @@ IDOverridePropertyOperation *BKE_override_property_operation_get(
 	return opop;
 }
 
+void bke_override_property_operation_copy(IDOverridePropertyOperation *opop_dst, IDOverridePropertyOperation *opop_src)
+{
+	if (opop_src->subitem_reference_name) {
+		opop_dst->subitem_reference_name = BLI_strdup(opop_src->subitem_reference_name);
+	}
+	if (opop_src->subitem_local_name) {
+		opop_dst->subitem_local_name = BLI_strdup(opop_src->subitem_local_name);
+	}
+}
+
 void bke_override_property_operation_clear(IDOverridePropertyOperation *opop)
 {
 	if (opop->subitem_reference_name) {
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index f5c13c123ff..25057aa8312 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -2413,7 +2413,7 @@ static int make_override_exec(bContext *C, wmOperator *UNUSED(op))
 	/* Remapping *before* defining override (this will have to be fixed btw, remapping of ref pointer...). */
 	BKE_libblock_remap(bmain, refobj, locobj, ID_REMAP_SKIP_INDIRECT_USAGE);
 
-	IDOverride *override = BKE_override_init(&locobj->id, &refobj->id);
+	BKE_override_init(&locobj->id, &refobj->id);
 	locobj->id.flag |= LIB_AUTOOVERRIDE;
 
 	WM_event_add_notifier(C, NC_WINDOW, NULL);




More information about the Bf-blender-cvs mailing list