Merge branch 'blender-v3.3-release'

This commit is contained in:
Bastien Montagne 2022-08-16 15:43:24 +02:00
commit 850126ab44
5 changed files with 129 additions and 8 deletions

View File

@ -2360,6 +2360,17 @@ class VIEW3D_MT_object_relations(Menu):
layout.menu("VIEW3D_MT_make_single_user")
class VIEW3D_MT_object_liboverride(Menu):
bl_label = "Library Override"
def draw(self, _context):
layout = self.layout
layout.operator("object.make_override_library", text="Make")
layout.operator("object.reset_override_library", text="Reset")
layout.operator("object.clear_override_library", text="Clear")
class VIEW3D_MT_object(Menu):
bl_context = "objectmode"
bl_label = "Object"
@ -2391,6 +2402,7 @@ class VIEW3D_MT_object(Menu):
layout.menu("VIEW3D_MT_object_parent")
layout.menu("VIEW3D_MT_object_collection")
layout.menu("VIEW3D_MT_object_relations")
layout.menu("VIEW3D_MT_object_liboverride")
layout.menu("VIEW3D_MT_object_constraints")
layout.menu("VIEW3D_MT_object_track")
layout.menu("VIEW3D_MT_make_links")
@ -7854,6 +7866,7 @@ classes = (
VIEW3D_MT_object_shading,
VIEW3D_MT_object_apply,
VIEW3D_MT_object_relations,
VIEW3D_MT_object_liboverride,
VIEW3D_MT_object_parent,
VIEW3D_MT_object_track,
VIEW3D_MT_object_collection,

View File

@ -49,10 +49,14 @@ void OBJECT_OT_vertex_parent_set(struct wmOperatorType *ot);
void OBJECT_OT_track_set(struct wmOperatorType *ot);
void OBJECT_OT_track_clear(struct wmOperatorType *ot);
void OBJECT_OT_make_local(struct wmOperatorType *ot);
void OBJECT_OT_make_override_library(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);
void OBJECT_OT_make_override_library(struct wmOperatorType *ot);
void OBJECT_OT_reset_override_library(struct wmOperatorType *ot);
void OBJECT_OT_clear_override_library(struct wmOperatorType *ot);
/**
* Used for drop-box.
* Assigns to object under cursor, only first material slot.

View File

@ -58,11 +58,14 @@ void ED_operatortypes_object(void)
WM_operatortype_append(OBJECT_OT_track_set);
WM_operatortype_append(OBJECT_OT_track_clear);
WM_operatortype_append(OBJECT_OT_make_local);
WM_operatortype_append(OBJECT_OT_make_override_library);
WM_operatortype_append(OBJECT_OT_make_single_user);
WM_operatortype_append(OBJECT_OT_make_links_scene);
WM_operatortype_append(OBJECT_OT_make_links_data);
WM_operatortype_append(OBJECT_OT_make_override_library);
WM_operatortype_append(OBJECT_OT_reset_override_library);
WM_operatortype_append(OBJECT_OT_clear_override_library);
WM_operatortype_append(OBJECT_OT_select_random);
WM_operatortype_append(OBJECT_OT_select_all);
WM_operatortype_append(OBJECT_OT_select_same_collection);

View File

@ -2325,6 +2325,14 @@ static int make_override_library_exec(bContext *C, wmOperator *op)
user_overrides_from_selected_objects = true;
}
/* Make already existing selected liboverrides editable. */
FOREACH_SELECTED_OBJECT_BEGIN (view_layer, CTX_wm_view3d(C), ob_iter) {
if (ID_IS_OVERRIDE_LIBRARY_REAL(ob_iter) && !ID_IS_LINKED(ob_iter)) {
ob_iter->id.override_library->flag &= ~IDOVERRIDE_LIBRARY_FLAG_SYSTEM_DEFINED;
}
}
FOREACH_SELECTED_OBJECT_END;
if (do_fully_editable) {
/* Pass. */
}
@ -2435,6 +2443,9 @@ static int make_override_library_invoke(bContext *C, wmOperator *op, const wmEve
}
if (!ID_IS_LINKED(obact)) {
if (ID_IS_OVERRIDE_LIBRARY_REAL(obact)) {
return make_override_library_exec(C, op);
}
BKE_report(op->reports, RPT_ERROR, "Cannot make library override from a local object");
return OPERATOR_CANCELLED;
}
@ -2473,17 +2484,20 @@ static bool make_override_library_poll(bContext *C)
Object *obact = CTX_data_active_object(C);
/* Object must be directly linked to be overridable. */
return (ED_operator_objectmode(C) && obact != NULL &&
(ID_IS_LINKED(obact) || (obact->instance_collection != NULL &&
ID_IS_OVERRIDABLE_LIBRARY(obact->instance_collection) &&
!ID_IS_OVERRIDE_LIBRARY(obact))));
return (
ED_operator_objectmode(C) && obact != NULL &&
(ID_IS_LINKED(obact) || ID_IS_OVERRIDE_LIBRARY(obact) ||
(obact->instance_collection != NULL &&
ID_IS_OVERRIDABLE_LIBRARY(obact->instance_collection) && !ID_IS_OVERRIDE_LIBRARY(obact))));
}
void OBJECT_OT_make_override_library(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Make Library Override";
ot->description = "Make a local override of this library linked data-block";
ot->description =
"Create a local override of the selected linked objects, and their hierarchy of "
"dependencies";
ot->idname = "OBJECT_OT_make_override_library";
/* api callbacks */
@ -2510,6 +2524,93 @@ void OBJECT_OT_make_override_library(wmOperatorType *ot)
ot->prop = prop;
}
static bool reset_clear_override_library_poll(bContext *C)
{
Object *obact = CTX_data_active_object(C);
/* Object must be local and an override. */
return (ED_operator_objectmode(C) && obact != NULL && !ID_IS_LINKED(obact) &&
ID_IS_OVERRIDE_LIBRARY(obact));
}
static int reset_override_library_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
/* Make already existing selected liboverrides editable. */
FOREACH_SELECTED_OBJECT_BEGIN (CTX_data_view_layer(C), CTX_wm_view3d(C), ob_iter) {
if (ID_IS_OVERRIDE_LIBRARY_REAL(ob_iter) && !ID_IS_LINKED(ob_iter)) {
BKE_lib_override_library_id_reset(bmain, &ob_iter->id, false);
}
}
FOREACH_SELECTED_OBJECT_END;
WM_event_add_notifier(C, NC_WM | ND_DATACHANGED, NULL);
WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, NULL);
return OPERATOR_FINISHED;
}
void OBJECT_OT_reset_override_library(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Reset Library Override";
ot->description = "Reset the selected local overrides to their linked references values";
ot->idname = "OBJECT_OT_reset_override_library";
/* api callbacks */
ot->exec = reset_override_library_exec;
ot->poll = reset_clear_override_library_poll;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
static int clear_override_library_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
/* Make already existing selected liboverrides editable. */
FOREACH_SELECTED_OBJECT_BEGIN (CTX_data_view_layer(C), CTX_wm_view3d(C), ob_iter) {
if (ID_IS_LINKED(ob_iter)) {
continue;
}
if (BKE_lib_override_library_is_hierarchy_leaf(bmain, &ob_iter->id)) {
BKE_libblock_remap(bmain,
&ob_iter->id,
ob_iter->id.override_library->reference,
ID_REMAP_SKIP_INDIRECT_USAGE);
BKE_id_delete(bmain, &ob_iter->id);
}
else {
BKE_lib_override_library_id_reset(bmain, &ob_iter->id, true);
}
}
FOREACH_SELECTED_OBJECT_END;
WM_event_add_notifier(C, NC_WM | ND_DATACHANGED, NULL);
WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, NULL);
return OPERATOR_FINISHED;
}
void OBJECT_OT_clear_override_library(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Clear Library Override";
ot->description =
"Delete the selected local overrides and relink their usages to the linked data-blocks if "
"possible, else reset them and mark them as non editable";
ot->idname = "OBJECT_OT_clear_override_library";
/* api callbacks */
ot->exec = clear_override_library_exec;
ot->poll = reset_clear_override_library_poll;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/** \} */
/* ------------------------------------------------------------------- */

View File

@ -1641,7 +1641,7 @@ static const EnumPropertyItem prop_liboverride_op_types[] = {
"OVERRIDE_LIBRARY_RESET",
0,
"Reset",
"Reset the selected local override to their linked references values"},
"Reset the selected local overrides to their linked references values"},
{OUTLINER_LIBOVERRIDE_OP_CLEAR_SINGLE,
"OVERRIDE_LIBRARY_CLEAR_SINGLE",
0,