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:
authorBastien Montagne <montagne29@wanadoo.fr>2015-07-13 19:00:08 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2015-07-13 19:05:38 +0300
commitdd44754c5ff3b2f200f5bb256ac9868eb43a65f6 (patch)
treef0abdbd24bf46d1260f0a71d588329c11809206a /source/blender/editors/object/object_data_transfer.c
parente93b969ac99e0205278580edae87892cc5eda60c (diff)
Data Transfer: Add an option to 'auto-transform' destination mesh so that it matches best the source one.
This allows to match and transfer data between two meshes with similar shape but complete arbitrary different transform. Note that the result will be best if the meshes (more precisely, their vertices) are exact copies of each other. Otherwise, method used can only perform an approximated best match, which means you'll likely get better results if you 'visually' make them match in 3D space (and use 'Object Transform') instead.
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",