diff options
Diffstat (limited to 'source/blender/editors/object')
-rw-r--r-- | source/blender/editors/object/object_data_transfer.c | 31 | ||||
-rw-r--r-- | source/blender/editors/object/object_intern.h | 11 | ||||
-rw-r--r-- | source/blender/editors/object/object_modifier.c | 10 |
3 files changed, 43 insertions, 9 deletions
diff --git a/source/blender/editors/object/object_data_transfer.c b/source/blender/editors/object/object_data_transfer.c index 1d994746ba6..8dfd31c92bb 100644 --- a/source/blender/editors/object/object_data_transfer.c +++ b/source/blender/editors/object/object_data_transfer.c @@ -535,15 +535,33 @@ void OBJECT_OT_data_transfer(wmOperatorType *ot) static int datalayout_transfer_poll(bContext *C) { - return (data_transfer_poll(C)); + return (edit_modifier_poll_generic(C, &RNA_DataTransferModifier, (1 << OB_MESH)) || data_transfer_poll(C)); } static int datalayout_transfer_exec(bContext *C, wmOperator *op) { Scene *scene = CTX_data_scene(C); Object *ob_act = ED_object_active_context(C); + DataTransferModifierData *dtmd; - { + dtmd = (DataTransferModifierData *)edit_modifier_property_get(op, ob_act, eModifierType_DataTransfer); + + /* If we have a modifier, we transfer data layout from this modifier's source object to active one. + * Else, we transfer data layout from active object to all selected ones. */ + if (dtmd) { + Object *ob_src = dtmd->ob_source; + Object *ob_dst = ob_act; + + const bool use_delete = false; /* Never when used from modifier, for now. */ + + if (!ob_src) { + return OPERATOR_CANCELLED; + } + + BKE_object_data_transfer_layout(scene, ob_src, ob_dst, dtmd->data_types, use_delete, + dtmd->layers_select_src, dtmd->layers_select_dst); + } + else { Object *ob_src = ob_act; ListBase ctx_objects; @@ -581,7 +599,12 @@ static int datalayout_transfer_exec(bContext *C, wmOperator *op) static int datalayout_transfer_invoke(bContext *C, wmOperator *op, const wmEvent *event) { - return WM_menu_invoke(C, op, event); + if (edit_modifier_invoke_properties(C, op)) { + return datalayout_transfer_exec(C, op); + } + else { + return WM_menu_invoke(C, op, event); + } } void OBJECT_OT_datalayout_transfer(wmOperatorType *ot) @@ -602,7 +625,7 @@ void OBJECT_OT_datalayout_transfer(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; /* Properties.*/ - /* edit_modifier_properties(ot); */ + edit_modifier_properties(ot); /* Data type to transfer. */ ot->prop = RNA_def_enum(ot->srna, "data_type", DT_layer_items, 0, "Data Type", "Which data to transfer"); diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h index bcf77d819fe..207afdf1028 100644 --- a/source/blender/editors/object/object_intern.h +++ b/source/blender/editors/object/object_intern.h @@ -37,6 +37,11 @@ struct Lattice; struct Curve; struct Object; struct Mesh; +struct bContext; +struct StructRNA; +struct wmOperator; + +struct ModifierData; struct HookModifierData; /* add hook menu */ @@ -155,6 +160,12 @@ void GROUP_OT_objects_add_active(struct wmOperatorType *ot); void GROUP_OT_objects_remove_active(struct wmOperatorType *ot); /* object_modifier.c */ +int edit_modifier_poll_generic(struct bContext *C, struct StructRNA *rna_type, int obtype_flag); +int edit_modifier_poll(struct bContext *C); +void edit_modifier_properties(struct wmOperatorType *ot); +int edit_modifier_invoke_properties(struct bContext *C, struct wmOperator *op); +struct ModifierData *edit_modifier_property_get(struct wmOperator *op, struct Object *ob, int type); + void OBJECT_OT_modifier_add(struct wmOperatorType *ot); void OBJECT_OT_modifier_remove(struct wmOperatorType *ot); void OBJECT_OT_modifier_move_up(struct wmOperatorType *ot); diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 97556365466..5a479af83b5 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -808,7 +808,7 @@ void OBJECT_OT_modifier_add(wmOperatorType *ot) /************************ generic functions for operators using mod names and data context *********************/ -static int edit_modifier_poll_generic(bContext *C, StructRNA *rna_type, int obtype_flag) +int edit_modifier_poll_generic(bContext *C, StructRNA *rna_type, int obtype_flag) { PointerRNA ptr = CTX_data_pointer_get_type(C, "modifier", rna_type); Object *ob = (ptr.id.data) ? ptr.id.data : ED_object_active_context(C); @@ -820,17 +820,17 @@ static int edit_modifier_poll_generic(bContext *C, StructRNA *rna_type, int obty return 1; } -static int edit_modifier_poll(bContext *C) +int edit_modifier_poll(bContext *C) { return edit_modifier_poll_generic(C, &RNA_Modifier, 0); } -static void edit_modifier_properties(wmOperatorType *ot) +void edit_modifier_properties(wmOperatorType *ot) { RNA_def_string(ot->srna, "modifier", NULL, MAX_NAME, "Modifier", "Name of the modifier to edit"); } -static int edit_modifier_invoke_properties(bContext *C, wmOperator *op) +int edit_modifier_invoke_properties(bContext *C, wmOperator *op) { ModifierData *md; @@ -849,7 +849,7 @@ static int edit_modifier_invoke_properties(bContext *C, wmOperator *op) return false; } -static ModifierData *edit_modifier_property_get(wmOperator *op, Object *ob, int type) +ModifierData *edit_modifier_property_get(wmOperator *op, Object *ob, int type) { char modifier_name[MAX_NAME]; ModifierData *md; |