diff options
author | mano-wii <germano.costa@ig.com.br> | 2019-09-11 19:48:42 +0300 |
---|---|---|
committer | mano-wii <germano.costa@ig.com.br> | 2019-09-11 19:49:18 +0300 |
commit | 3bd4f229beb1e18802d93c9f5a44b0ec80828a26 (patch) | |
tree | 1776fbabac0554092f0f45b2e22de457235b75b1 /source/blender/editors/transform/transform_generics.c | |
parent | 003802db83b561f9ff061811c6cde83356e5b277 (diff) |
Transform: Edit Mesh: Support mirror on all axes
Part of T68930
Now two other mirror options that can be enabled simultaneously: Mirror Y and Z.
Reviewers: campbellbarton
Reviewed By: campbellbarton
Subscribers: ThatAsherGuy
Differential Revision: https://developer.blender.org/D5720
Diffstat (limited to 'source/blender/editors/transform/transform_generics.c')
-rw-r--r-- | source/blender/editors/transform/transform_generics.c | 63 |
1 files changed, 28 insertions, 35 deletions
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 32d8c7381e7..e4d3c9abceb 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -224,35 +224,31 @@ static void clipMirrorModifier(TransInfo *t) } /* assumes obedit set to mesh object */ -static void editbmesh_apply_to_mirror(TransInfo *t) +static void transform_apply_to_mirror(TransInfo *t) { FOREACH_TRANS_DATA_CONTAINER (t, tc) { - if (tc->mirror.axis_flag) { - TransData *td = tc->data; - BMVert *eve; + if (tc->mirror.use_mirror_any) { int i; - - for (i = 0; i < tc->data_len; i++, td++) { - if (td->flag & TD_NOACTION) { - break; - } - if (td->loc == NULL) { - break; - } - if (td->flag & TD_SKIP) { - continue; - } - - eve = td->extra; - if (eve) { - eve->co[0] = -td->loc[0]; - eve->co[1] = td->loc[1]; - eve->co[2] = td->loc[2]; + TransData *td; + for (i = 0, td = tc->data; i < tc->data_len; i++, td++) { + if (td->flag & (TD_MIRROR_EDGE_X | TD_MIRROR_EDGE_Y | TD_MIRROR_EDGE_Z)) { + if (td->flag & TD_MIRROR_EDGE_X) { + td->loc[0] = 0.0f; + } + if (td->flag & TD_MIRROR_EDGE_Y) { + td->loc[1] = 0.0f; + } + if (td->flag & TD_MIRROR_EDGE_Z) { + td->loc[2] = 0.0f; + } } + } - if (td->flag & TD_MIRROR_EDGE) { - td->loc[0] = 0; - } + TransDataMirror *tdm; + for (i = 0, tdm = tc->mirror.data; i < tc->mirror.data_len; i++, tdm++) { + tdm->loc_dst[0] = tdm->loc_src[0] * tdm->sign_x; + tdm->loc_dst[1] = tdm->loc_src[1] * tdm->sign_y; + tdm->loc_dst[2] = tdm->loc_src[2] * tdm->sign_z; } } } @@ -889,7 +885,7 @@ static void recalcData_objects(TransInfo *t) clipMirrorModifier(t); } if ((t->flag & T_NO_MIRROR) == 0 && (t->options & CTX_NO_MIRROR) == 0) { - editbmesh_apply_to_mirror(t); + transform_apply_to_mirror(t); } if (t->mode == TFM_EDGE_SLIDE) { @@ -1361,11 +1357,12 @@ void initTransDataContainers_FromObjectData(TransInfo *t, for (int i = 0; i < objects_len; i++) { TransDataContainer *tc = &t->data_container[i]; - /* TODO, multiple axes. */ - tc->mirror.axis_flag = (((t->flag & T_NO_MIRROR) == 0) && - ((t->options & CTX_NO_MIRROR) == 0) && - (objects[i]->type == OB_MESH) && - (((Mesh *)objects[i]->data)->editflag & ME_EDIT_MIRROR_X) != 0); + if (((t->flag & T_NO_MIRROR) == 0) && ((t->options & CTX_NO_MIRROR) == 0) && + (objects[i]->type == OB_MESH)) { + tc->mirror.axis_x = (((Mesh *)objects[i]->data)->editflag & ME_EDIT_MIRROR_X) != 0; + tc->mirror.axis_y = (((Mesh *)objects[i]->data)->editflag & ME_EDIT_MIRROR_Y) != 0; + tc->mirror.axis_z = (((Mesh *)objects[i]->data)->editflag & ME_EDIT_MIRROR_Z) != 0; + } if (object_mode & OB_MODE_EDIT) { tc->obedit = objects[i]; @@ -1902,6 +1899,7 @@ void postTrans(bContext *C, TransInfo *t) MEM_SAFE_FREE(tc->data_ext); MEM_SAFE_FREE(tc->data_2d); + MEM_SAFE_FREE(tc->mirror.data); } } @@ -2349,11 +2347,6 @@ void calculatePropRatio(TransInfo *t) if (td->flag & TD_SELECTED) { td->factor = 1.0f; } - else if (tc->mirror.axis_flag && (td->loc[0] * tc->mirror.sign) < -0.00001f) { - td->flag |= TD_SKIP; - td->factor = 0.0f; - restoreElement(td); - } else if ((connected && (td->flag & TD_NOTCONNECTED || td->dist > t->prop_size)) || (connected == 0 && td->rdist > t->prop_size)) { /* |