diff options
Diffstat (limited to 'source/blender/editors/object/object_data_transfer.c')
-rw-r--r-- | source/blender/editors/object/object_data_transfer.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/source/blender/editors/object/object_data_transfer.c b/source/blender/editors/object/object_data_transfer.c index d6a1694b4b0..0b604a73977 100644 --- a/source/blender/editors/object/object_data_transfer.c +++ b/source/blender/editors/object/object_data_transfer.c @@ -339,6 +339,7 @@ static int data_transfer_exec(bContext *C, wmOperator *op) const int map_loop_mode = RNA_enum_get(op->ptr, "loop_mapping"); const int map_poly_mode = RNA_enum_get(op->ptr, "poly_mapping"); + const bool use_auto_transform = RNA_boolean_get(op->ptr, "use_auto_transform"); const bool use_object_transform = RNA_boolean_get(op->ptr, "use_object_transform"); const bool use_max_distance = RNA_boolean_get(op->ptr, "use_max_distance"); const float max_distance = use_max_distance ? RNA_float_get(op->ptr, "max_distance") : FLT_MAX; @@ -355,7 +356,7 @@ static int data_transfer_exec(bContext *C, wmOperator *op) const float mix_factor = RNA_float_get(op->ptr, "mix_factor"); SpaceTransform space_transform_data; - SpaceTransform *space_transform = use_object_transform ? &space_transform_data : NULL; + SpaceTransform *space_transform = (use_object_transform && !use_auto_transform) ? &space_transform_data : NULL; if (reverse_transfer && ((ID *)(ob_src->data))->lib) { /* Do not transfer to linked data, not supported. */ @@ -384,7 +385,8 @@ static int data_transfer_exec(bContext *C, wmOperator *op) if (BKE_object_data_transfer_mesh( scene, ob_src, ob_dst, data_type, use_create, map_vert_mode, map_edge_mode, map_loop_mode, map_poly_mode, - space_transform, max_distance, ray_radius, islands_precision, + space_transform, use_auto_transform, + max_distance, ray_radius, islands_precision, layers_select_src, layers_select_dst, mix_mode, mix_factor, NULL, false, op->reports)) { @@ -428,9 +430,13 @@ static bool data_transfer_draw_check_prop(PointerRNA *ptr, PropertyRNA *prop) const char *prop_id = RNA_property_identifier(prop); const int data_type = RNA_enum_get(ptr, "data_type"); + bool use_auto_transform = false; bool use_max_distance = false; bool use_modifier = false; + if ((prop_other = RNA_struct_find_property(ptr, "use_auto_transform"))) { + use_auto_transform = RNA_property_boolean_get(ptr, prop_other); + } if ((prop_other = RNA_struct_find_property(ptr, "use_max_distance"))) { use_max_distance = RNA_property_boolean_get(ptr, prop_other); } @@ -447,6 +453,9 @@ static bool data_transfer_draw_check_prop(PointerRNA *ptr, PropertyRNA *prop) return false; } + if (STREQ(prop_id, "use_object_transform") && use_auto_transform) { + return false; + } if (STREQ(prop_id, "max_distance") && !use_max_distance) { return false; } @@ -530,6 +539,9 @@ void OBJECT_OT_data_transfer(wmOperatorType *ot) "Method used to map source faces to destination ones"); /* Mapping options and filtering. */ + RNA_def_boolean(ot->srna, "use_auto_transform", false, "Auto Transform", + "Automatically compute transformation to get the best possible match between source and " + "destination meshes (WARNING: results will never be as good as manual matching of objects)"); RNA_def_boolean(ot->srna, "use_object_transform", true, "Object Transform", "Evaluate source and destination meshes in global space"); RNA_def_boolean(ot->srna, "use_max_distance", false, "Only Neighbor Geometry", |