diff options
Diffstat (limited to 'source/blender/blenkernel/intern/data_transfer.c')
-rw-r--r-- | source/blender/blenkernel/intern/data_transfer.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/source/blender/blenkernel/intern/data_transfer.c b/source/blender/blenkernel/intern/data_transfer.c index da00aecf9c0..53b6f4a1019 100644 --- a/source/blender/blenkernel/intern/data_transfer.c +++ b/source/blender/blenkernel/intern/data_transfer.c @@ -1064,8 +1064,8 @@ void BKE_object_data_transfer_layout( bool BKE_object_data_transfer_dm( Scene *scene, Object *ob_src, Object *ob_dst, DerivedMesh *dm_dst, const int data_types, bool use_create, const int map_vert_mode, const int map_edge_mode, const int map_loop_mode, const int map_poly_mode, - SpaceTransform *space_transform, const float max_distance, const float ray_radius, - const float islands_handling_precision, + SpaceTransform *space_transform, const bool auto_transform, + const float max_distance, const float ray_radius, const float islands_handling_precision, const int fromlayers_select[DT_MULTILAYER_INDEX_MAX], const int tolayers_select[DT_MULTILAYER_INDEX_MAX], const int mix_mode, const float mix_factor, const char *vgroup_name, const bool invert_vgroup, ReportList *reports) @@ -1076,6 +1076,8 @@ bool BKE_object_data_transfer_dm( #define PDATA 3 #define DATAMAX 4 + SpaceTransform auto_space_transform; + DerivedMesh *dm_src; Mesh *me_dst, *me_src; bool dirty_nors_dst = true; /* Assumed always true if not using a dm as destination. */ @@ -1126,6 +1128,17 @@ bool BKE_object_data_transfer_dm( return changed; } + if (auto_transform) { + MVert *verts_dst = dm_dst ? dm_dst->getVertArray(dm_dst) : me_dst->mvert; + const int num_verts_dst = dm_dst ? dm_dst->getNumVerts(dm_dst) : me_dst->totvert; + + if (space_transform == NULL) { + space_transform = &auto_space_transform; + } + + BKE_mesh_remap_find_best_match_from_dm(verts_dst, num_verts_dst, dm_src, space_transform); + } + /* Check all possible data types. * Note item mappings and dest mix weights are cached. */ for (i = 0; i < DT_TYPE_MAX; i++) { @@ -1388,15 +1401,17 @@ bool BKE_object_data_transfer_dm( bool BKE_object_data_transfer_mesh( Scene *scene, Object *ob_src, Object *ob_dst, const int data_types, const bool use_create, const int map_vert_mode, const int map_edge_mode, const int map_loop_mode, const int map_poly_mode, - SpaceTransform *space_transform, const float max_distance, const float ray_radius, - const float islands_handling_precision, + SpaceTransform *space_transform, const bool auto_transform, + const float max_distance, const float ray_radius, const float islands_handling_precision, const int fromlayers_select[DT_MULTILAYER_INDEX_MAX], const int tolayers_select[DT_MULTILAYER_INDEX_MAX], const int mix_mode, const float mix_factor, const char *vgroup_name, const bool invert_vgroup, ReportList *reports) { return BKE_object_data_transfer_dm( scene, ob_src, ob_dst, NULL, data_types, use_create, - map_vert_mode, map_edge_mode, map_loop_mode, map_poly_mode, space_transform, - max_distance, ray_radius, islands_handling_precision, fromlayers_select, tolayers_select, + map_vert_mode, map_edge_mode, map_loop_mode, map_poly_mode, + space_transform, auto_transform, + max_distance, ray_radius, islands_handling_precision, + fromlayers_select, tolayers_select, mix_mode, mix_factor, vgroup_name, invert_vgroup, reports); } |