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);

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to