diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-01-13 18:49:04 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-01-13 18:49:04 +0400 |
commit | 14925a8e510a65bd53528c3a158cd6121278eebe (patch) | |
tree | 307548f28f48dba915941a6663ebc65d785542bd /source/blender/editors/transform | |
parent | cdb5e557b03cbe2e29a48fca3bb4bbd1faa66052 (diff) |
optimization for calcNonProportionalEdgeSlide(), avoid matrix multiply for each vertex.
Diffstat (limited to 'source/blender/editors/transform')
-rw-r--r-- | source/blender/editors/transform/transform.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 8ce388af89a..2afc1168cbd 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -4944,24 +4944,38 @@ static void calcNonProportionalEdgeSlide(TransInfo *t, EdgeSlideData *sld, const TransDataEdgeSlideVert *sv = sld->sv; if (sld->totsv > 0) { + ARegion *ar = t->ar; + RegionView3D *rv3d = NULL; + float projectMat[4][4]; + int i = 0; - float v_proj[3]; + float v_proj[2]; float dist = 0; float min_dist = FLT_MAX; + if (t->spacetype == SPACE_VIEW3D) { + /* background mode support */ + rv3d = t->ar ? t->ar->regiondata : NULL; + } + + if (!rv3d) { + /* ok, let's try to survive this */ + unit_m4(projectMat); + } + else { + ED_view3d_ob_project_mat_get(rv3d, t->obedit, projectMat); + } + for (i = 0; i < sld->totsv; i++, sv++) { /* Set length */ sv->edge_len = len_v3v3(sv->upvec, sv->downvec); - mul_v3_m4v3(v_proj, t->obedit->obmat, sv->v->co); - /* allow points behind the view [#33643] */ - if (ED_view3d_project_float_global(t->ar, v_proj, v_proj, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_OK) { - dist = len_squared_v2v2(mval, v_proj); - if (dist < min_dist) { - min_dist = dist; - sld->curr_sv_index = i; - } + ED_view3d_project_float_v2_m4(ar, sv->v->co, v_proj, projectMat); + dist = len_squared_v2v2(mval, v_proj); + if (dist < min_dist) { + min_dist = dist; + sld->curr_sv_index = i; } } } |