diff options
Diffstat (limited to 'source/blender/editors/transform/transform_generics.c')
-rw-r--r-- | source/blender/editors/transform/transform_generics.c | 89 |
1 files changed, 46 insertions, 43 deletions
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 41eb5f1e812..53e36f86a64 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -99,6 +99,7 @@ #include "ED_clip.h" #include "ED_screen.h" #include "ED_gpencil.h" +#include "ED_sculpt.h" #include "WM_types.h" #include "WM_api.h" @@ -109,6 +110,7 @@ #include "UI_view2d.h" #include "transform.h" +#include "transform_convert.h" /* ************************** Functions *************************** */ @@ -222,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; } } } @@ -887,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) { @@ -1090,12 +1088,12 @@ static void recalcData_objects(TransInfo *t) GSetIterator gs_iter; GSET_ITER (gs_iter, motionpath_updates) { Object *ob = BLI_gsetIterator_getKey(&gs_iter); - ED_pose_recalculate_paths(t->context, t->scene, ob, true); + ED_pose_recalculate_paths(t->context, t->scene, ob, POSE_PATH_CALC_RANGE_CURRENT_FRAME); } BLI_gset_free(motionpath_updates, NULL); } else if (base && (base->object->mode & OB_MODE_PARTICLE_EDIT) && - PE_get_current(t->scene, base->object)) { + PE_get_current(t->depsgraph, t->scene, base->object)) { if (t->state != TRANS_CANCEL) { applyProject(t); } @@ -1148,10 +1146,14 @@ static void recalcData_objects(TransInfo *t) if (motionpath_update) { /* Update motion paths once for all transformed objects. */ - ED_objects_recalculate_paths(t->context, t->scene, true); + ED_objects_recalculate_paths(t->context, t->scene, OBJECT_PATH_CALC_RANGE_CHANGED); + } + + if (t->options & CTX_OBMODE_XFORM_SKIP_CHILDREN) { + trans_obchild_in_obmode_update_all(t); } - if (t->flag & T_OBJECT_DATA_IN_OBJECT_MODE) { + if (t->options & CTX_OBMODE_XFORM_OBDATA) { trans_obdata_in_obmode_update_all(t); } } @@ -1201,6 +1203,11 @@ static void recalcData_gpencil_strokes(TransInfo *t) } } +static void recalcData_sculpt(TransInfo *t) +{ + ED_sculpt_update_modal_transform(t->context); +} + /* called for updating while transform acts, once per redraw */ void recalcData(TransInfo *t) { @@ -1221,6 +1228,9 @@ void recalcData(TransInfo *t) /* set recalc triangle cache flag */ recalcData_gpencil_strokes(t); } + else if (t->options & CTX_SCULPT) { + recalcData_sculpt(t); + } else if (t->spacetype == SPACE_IMAGE) { recalcData_image(t); } @@ -1347,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]; @@ -1888,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); } } @@ -1923,10 +1935,6 @@ void postTrans(bContext *C, TransInfo *t) BLI_rng_free(t->rng); } - if (t->flag & T_OBJECT_DATA_IN_OBJECT_MODE) { - trans_obdata_in_obmode_free_all(t); - } - freeSnapping(t); } @@ -2339,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)) { /* |