[Bf-blender-cvs] [70b0a2e] mesh-transfer-data: Add standalone part of 'data layout transfer' op.
Bastien Montagne
noreply at git.blender.org
Tue Nov 18 17:24:39 CET 2014
Commit: 70b0a2ee5def0398e1b04a6c7a468fe5adbc967d
Author: Bastien Montagne
Date: Tue Nov 18 16:58:57 2014 +0100
Branches: mesh-transfer-data
https://developer.blender.org/rB70b0a2ee5def0398e1b04a6c7a468fe5adbc967d
Add standalone part of 'data layout transfer' op.
===================================================================
M source/blender/editors/object/object_data_transfer.c
M source/blender/editors/object/object_ops.c
===================================================================
diff --git a/source/blender/editors/object/object_data_transfer.c b/source/blender/editors/object/object_data_transfer.c
index 8688ac7..9bea71e 100644
--- a/source/blender/editors/object/object_data_transfer.c
+++ b/source/blender/editors/object/object_data_transfer.c
@@ -324,6 +324,7 @@ static int data_transfer_exec(bContext *C, wmOperator *op)
#endif
}
+/* Used by both OBJECT_OT_data_transfer and OBJECT_OT_datalayout_transfer */
static int data_transfer_poll(bContext *C)
{
Object *ob = ED_object_context(C);
@@ -331,12 +332,31 @@ static int data_transfer_poll(bContext *C)
return (ob && !ob->id.lib && ob->type == OB_MESH && data && !data->lib);
}
+/* Used by both OBJECT_OT_data_transfer and OBJECT_OT_datalayout_transfer */
static bool data_transfer_draw_check_prop(PointerRNA *ptr, PropertyRNA *prop)
{
+ PropertyRNA *prop_other;
+
const char *prop_id = RNA_property_identifier(prop);
const int data_type = RNA_enum_get(ptr, "data_type");
- const bool use_max_distance = RNA_boolean_get(ptr, "use_max_distance");
- const int mix_mode = RNA_enum_get(ptr, "mix_mode");
+ bool use_max_distance = false;
+ bool use_modifier = false;
+
+ if ((prop_other = RNA_struct_find_property(ptr, "use_max_distance"))) {
+ use_max_distance = RNA_property_boolean_get(ptr, prop_other);
+ }
+ if ((prop_other = RNA_struct_find_property(ptr, "modifier"))) {
+ use_modifier = RNA_property_is_set(ptr, prop_other);
+ }
+
+ if (STREQ(prop_id, "modifier")) {
+ return use_modifier;
+ }
+
+ if (use_modifier) {
+ /* Hide everything but 'modifier' property, if set. */
+ return false;
+ }
if (STREQ(prop_id, "max_distance") && !use_max_distance) {
return false;
@@ -355,10 +375,6 @@ static bool data_transfer_draw_check_prop(PointerRNA *ptr, PropertyRNA *prop)
return false;
}
- if (STREQ(prop_id, "mix_factor") && (mix_mode == CDT_MIX_TRANSFER)) {
- return false;
- }
-
if ((STREQ(prop_id, "fromlayers_select") || STREQ(prop_id, "tolayers_select")) &&
!DT_DATATYPE_IS_MULTILAYERS(data_type))
{
@@ -369,6 +385,7 @@ static bool data_transfer_draw_check_prop(PointerRNA *ptr, PropertyRNA *prop)
return true;
}
+/* Used by both OBJECT_OT_data_transfer and OBJECT_OT_datalayout_transfer */
static void data_transfer_ui(bContext *C, wmOperator *op)
{
uiLayout *layout = op->layout;
@@ -479,11 +496,28 @@ static int datalayout_transfer_exec(bContext *C, wmOperator *op)
Object *ob_src = ob_act;
Object *ob_dst;
+ const int data_type = RNA_enum_get(op->ptr, "data_type");
+ const bool use_delete = RNA_boolean_get(op->ptr, "use_delete");
+
+ const int fromlayers = RNA_enum_get(op->ptr, "fromlayers_select");
+ const int tolayers = RNA_enum_get(op->ptr, "tolayers_select");
+ int fromlayers_select[DT_MULTILAYER_INDEX_MAX] = {0};
+ int tolayers_select[DT_MULTILAYER_INDEX_MAX] = {0};
+ const int fromto_idx = BKE_object_data_transfer_dttype_to_srcdst_index(data_type);
+
+ if (fromto_idx != DT_MULTILAYER_INDEX_INVALID) {
+ fromlayers_select[fromto_idx] = fromlayers;
+ tolayers_select[fromto_idx] = tolayers;
+ }
+
CTX_DATA_BEGIN (C, Object *, ob_dst, selected_editable_objects)
{
if ((ob_dst == ob_src) || (ob_dst->type != OB_MESH)) {
continue;
}
+
+ BKE_object_data_transfer_layout(scene, ob_src, ob_dst, data_type, use_delete,
+ fromlayers_select, tolayers_select);
}
CTX_DATA_END;
}
@@ -491,23 +525,47 @@ static int datalayout_transfer_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int datalayout_transfer_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
+static int datalayout_transfer_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
- edit_modifier_invoke_properties(C, op);
- return datalayout_transfer_exec(C, op);
+ 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)
{
- ot->name = "Datalayout Transfer";
- ot->description = "Transfer layout of data layer(s) from active object to selected ones";
+ PropertyRNA *prop;
+
+ ot->name = "Transfer Mesh Datalayout";
+ ot->description = "Transfer layout of data layer(s) from active to selected meshes";
ot->idname = "OBJECT_OT_datalayout_transfer";
ot->poll = datalayout_transfer_poll;
ot->invoke = datalayout_transfer_invoke;
ot->exec = datalayout_transfer_exec;
+ ot->check = data_transfer_check;
+ ot->ui = data_transfer_ui;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ /* Properties.*/
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");
+ RNA_def_boolean(ot->srna, "use_delete", false, "Exact Match",
+ "Also delete some data layers from destination if necessary, so that it matches exactly source");
+
+ /* How to handle multi-layers types of data. */
+ prop = RNA_def_enum(ot->srna, "fromlayers_select", DT_fromlayers_select_items, DT_LAYERS_ACTIVE_SRC,
+ "Source Layers Selection", "Which layers to transfer, in case of multi-layers types");
+ RNA_def_property_enum_funcs_runtime(prop, NULL, NULL, dt_fromlayers_select_itemf);
+
+ prop = RNA_def_enum(ot->srna, "tolayers_select", DT_tolayers_select_items, DT_LAYERS_ACTIVE_DST,
+ "Destination Layers Matching", "How to match source and destination layers");
+ RNA_def_property_enum_funcs_runtime(prop, NULL, NULL, dt_tolayers_select_itemf);
}
diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c
index 153d967..4a9d832 100644
--- a/source/blender/editors/object/object_ops.c
+++ b/source/blender/editors/object/object_ops.c
@@ -425,6 +425,7 @@ void ED_keymap_object(wmKeyConfig *keyconf)
WM_keymap_add_menu(keymap, "VIEW3D_MT_object_specials", WKEY, KM_PRESS, 0, 0);
WM_keymap_verify_item(keymap, "OBJECT_OT_data_transfer", TKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_verify_item(keymap, "OBJECT_OT_datalayout_transfer", TKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
for (i = 0; i <= 5; i++) {
kmi = WM_keymap_add_item(keymap, "OBJECT_OT_subdivision_set", ZEROKEY + i, KM_PRESS, KM_CTRL, 0);
More information about the Bf-blender-cvs
mailing list