Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/object/object_data_transfer.c')
-rw-r--r--source/blender/editors/object/object_data_transfer.c16
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",