[Bf-blender-cvs] [4f67a79] override_static: Moar WIP: add operator to make override of linked object.

Bastien Montagne noreply at git.blender.org
Wed Dec 14 16:10:32 CET 2016


Commit: 4f67a79eacee4cd5421ac662b95fae570391eca6
Author: Bastien Montagne
Date:   Mon Dec 12 12:03:03 2016 +0100
Branches: override_static
https://developer.blender.org/rB4f67a79eacee4cd5421ac662b95fae570391eca6

Moar WIP: add operator to make override of linked object.

Mostly nasty testing code, only overriding location of object for now.
And of course, we are still missing bits in read/write code to actually
do the override.

Also, add some minimal exposure of override in RNA, here again, most to
be done still.

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

M	source/blender/editors/object/object_intern.h
M	source/blender/editors/object/object_ops.c
M	source/blender/editors/object/object_relations.c
M	source/blender/makesrna/intern/rna_ID.c

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

diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index 9710e4f..7d5aa33 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -67,6 +67,7 @@ void OBJECT_OT_track_clear(struct wmOperatorType *ot);
 void OBJECT_OT_slow_parent_set(struct wmOperatorType *ot);
 void OBJECT_OT_slow_parent_clear(struct wmOperatorType *ot);
 void OBJECT_OT_make_local(struct wmOperatorType *ot);
+void OBJECT_OT_make_override(struct wmOperatorType *ot);
 void OBJECT_OT_make_single_user(struct wmOperatorType *ot);
 void OBJECT_OT_make_links_scene(struct wmOperatorType *ot);
 void OBJECT_OT_make_links_data(struct wmOperatorType *ot);
diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c
index 7e7e1ef..16dc0a8 100644
--- a/source/blender/editors/object/object_ops.c
+++ b/source/blender/editors/object/object_ops.c
@@ -87,6 +87,7 @@ void ED_operatortypes_object(void)
 	WM_operatortype_append(OBJECT_OT_slow_parent_set);
 	WM_operatortype_append(OBJECT_OT_slow_parent_clear);
 	WM_operatortype_append(OBJECT_OT_make_local);
+	WM_operatortype_append(OBJECT_OT_make_override);
 	WM_operatortype_append(OBJECT_OT_make_single_user);
 	WM_operatortype_append(OBJECT_OT_make_links_scene);
 	WM_operatortype_append(OBJECT_OT_make_links_data);
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index d30022c..8be3da9 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -75,6 +75,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_main.h"
@@ -2357,6 +2358,64 @@ void OBJECT_OT_make_local(wmOperatorType *ot)
 	ot->prop = RNA_def_enum(ot->srna, "type", type_items, 0, "Type", "");
 }
 
+static int make_override_exec(bContext *C, wmOperator *UNUSED(op))
+{
+	Main *bmain = CTX_data_main(C);
+	Object *locobj, *refobj = CTX_data_active_object(C);
+
+	/* Note that we most likely want to do this in a more BKE generic function later, but for now will do for testing. */
+
+	id_copy(bmain, &refobj->id, (ID **)&locobj, false);
+
+	/* 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);
+
+	/* For testing only of course! This will have to be auto-generated... */
+	{
+		IDOverrideProperty *overp = MEM_callocN(sizeof(IDOverrideProperty), __func__);
+		overp->rna_path = BLI_strdup("location");
+
+		IDOverridePropertyOperation *overp_op = MEM_callocN(sizeof(IDOverridePropertyOperation), __func__);
+		overp_op->subitem_local_index = overp_op->subitem_reference_index = -1;
+		overp_op->operation = IDOVERRIDE_REPLACE;
+
+		BLI_addtail(&overp->operations, overp_op);
+
+		BLI_addtail(&override->properties, overp);
+	}
+
+	WM_event_add_notifier(C, NC_WINDOW, NULL);
+
+	return OPERATOR_FINISHED;
+}
+
+static int make_override_poll(bContext *C)
+{
+	Object *obact = CTX_data_active_object(C);
+
+	/* Object must be directly linked to be overridable. */
+	return (ED_operator_objectmode(C) && obact && obact->id.lib != NULL && obact->id.tag & LIB_TAG_EXTERN);
+}
+
+void OBJECT_OT_make_override(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name = "Make Override";
+	ot->description = "Make local override of this library linked data-block";
+	ot->idname = "OBJECT_OT_make_override";
+
+	/* api callbacks */
+	ot->exec = make_override_exec;
+	ot->poll = make_override_poll;
+
+	/* flags */
+	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+	/* properties */
+}
+
 enum {
 	MAKE_SINGLE_USER_ALL      = 1,
 	MAKE_SINGLE_USER_SELECTED = 2,
diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c
index e57f25f..6404419 100644
--- a/source/blender/makesrna/intern/rna_ID.c
+++ b/source/blender/makesrna/intern/rna_ID.c
@@ -736,6 +736,14 @@ static PointerRNA rna_IDPreview_get(PointerRNA *ptr)
 	return rna_pointer_inherit_refine(ptr, &RNA_ImagePreview, prv_img);
 }
 
+static PointerRNA rna_ID_override_reference_get(PointerRNA *ptr)
+{
+	ID *id = (ID *)ptr->data;
+	ID *reference = id->override ? id->override->reference : NULL;
+
+	return rna_pointer_inherit_refine(ptr, ID_code_to_RNA_type(GS(reference->name)), reference);
+}
+
 #else
 
 static void rna_def_ID_properties(BlenderRNA *brna)
@@ -994,6 +1002,11 @@ static void rna_def_ID(BlenderRNA *brna)
 	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 	RNA_def_property_ui_text(prop, "Library", "Library file the data-block is linked from");
 
+	prop = RNA_def_pointer(srna, "reference", "ID", "Reference", "Reference linked data-block overriden by this one");
+	RNA_def_property_pointer_sdna(prop, NULL, "override->reference");
+	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+	RNA_def_property_pointer_funcs(prop, "rna_ID_override_reference_get", NULL, NULL, NULL);
+
 	prop = RNA_def_pointer(srna, "preview", "ImagePreview", "Preview",
 	                       "Preview image and icon of this data-block (None if not supported for this type of data)");
 	RNA_def_property_clear_flag(prop, PROP_EDITABLE);




More information about the Bf-blender-cvs mailing list