From 82636ab0fbbeeccd3ca76d6ceb7ab018445acbc1 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 4 Apr 2013 08:47:07 +0000 Subject: improved method of getting the tangent axis from a bmesh triangle, rather then getting the longest edge, get the edge which which is most different from the 2 others ends up giving more useful results: for an isosceles triangle it returns the base weather its longer or shorter then the other sides. --- source/blender/blenlib/BLI_math_vector.h | 2 ++ source/blender/blenlib/intern/math_vector.c | 22 ++++++++++++++++++++ source/blender/bmesh/intern/bmesh_marking.c | 24 ++++++++++++++++++++-- .../editors/transform/transform_manipulator.c | 21 ------------------- 4 files changed, 46 insertions(+), 23 deletions(-) diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h index 9cf571aa98b..d4f16506551 100644 --- a/source/blender/blenlib/BLI_math_vector.h +++ b/source/blender/blenlib/BLI_math_vector.h @@ -244,6 +244,8 @@ void minmax_v2v2_v2(float min[2], float max[2], const float vec[2]); void dist_ensure_v3_v3fl(float v1[3], const float v2[3], const float dist); void dist_ensure_v2_v2fl(float v1[2], const float v2[2], const float dist); +void axis_sort_v3(const float axis_values[3], int r_axis_order[3]); + /***************************** Array Functions *******************************/ /* attempted to follow fixed length vertex functions. names could be improved*/ double dot_vn_vn(const float *array_src_a, const float *array_src_b, const int size); diff --git a/source/blender/blenlib/intern/math_vector.c b/source/blender/blenlib/intern/math_vector.c index 58d444f5794..572bc4526af 100644 --- a/source/blender/blenlib/intern/math_vector.c +++ b/source/blender/blenlib/intern/math_vector.c @@ -527,6 +527,28 @@ void dist_ensure_v2_v2fl(float v1[2], const float v2[2], const float dist) } } +void axis_sort_v3(const float axis_values[3], int r_axis_order[3]) +{ + float v[3]; + copy_v3_v3(v, axis_values); + +#define SWAP_AXIS(a, b) { \ + SWAP(float, v[a], v[b]); \ + SWAP(int, r_axis_order[a], r_axis_order[b]); \ +} (void)0 + + if (v[0] < v[1]) { + if (v[2] < v[0]) { SWAP_AXIS(0, 2); } + } + else { + if (v[1] < v[2]) { SWAP_AXIS(0, 1); } + else { SWAP_AXIS(0, 2); } + } + if (v[2] < v[1]) { SWAP_AXIS(1, 2); } + +#undef SWAP_AXIS +} + /***************************** Array Functions *******************************/ double dot_vn_vn(const float *array_src_a, const float *array_src_b, const int size) diff --git a/source/blender/bmesh/intern/bmesh_marking.c b/source/blender/bmesh/intern/bmesh_marking.c index 4e29756104a..73aee5917ae 100644 --- a/source/blender/bmesh/intern/bmesh_marking.c +++ b/source/blender/bmesh/intern/bmesh_marking.c @@ -710,8 +710,28 @@ void BM_editselection_plane(BMEditSelection *ese, float r_plane[3]) cross_v3_v3v3(r_plane, efa->no, vec); } else { - if (efa->len == 4) { - BMVert *verts[4] = {NULL}; + if (efa->len == 3) { + BMVert *verts[3]; + float lens[3]; + float difs[3]; + int order[3] = {0, 1, 2}; + + BM_face_as_array_vert_tri(efa, verts); + + lens[0] = len_v3v3(verts[0]->co, verts[1]->co); + lens[1] = len_v3v3(verts[1]->co, verts[2]->co); + lens[2] = len_v3v3(verts[2]->co, verts[0]->co); + + /* find the shortest or the longest loop */ + difs[0] = fabsf(lens[1] - lens[2]); + difs[1] = fabsf(lens[2] - lens[0]); + difs[2] = fabsf(lens[0] - lens[1]); + + axis_sort_v3(difs, order); + sub_v3_v3v3(r_plane, verts[order[0]]->co, verts[(order[0] + 1) % 3]->co); + } + else if (efa->len == 4) { + BMVert *verts[4]; float vecA[3], vecB[3]; // BM_iter_as_array(NULL, BM_VERTS_OF_FACE, efa, (void **)verts, 4); diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c index 36a64303156..889e4f01fc7 100644 --- a/source/blender/editors/transform/transform_manipulator.c +++ b/source/blender/editors/transform/transform_manipulator.c @@ -841,27 +841,6 @@ static void manipulator_setcolor(View3D *v3d, char axis, int colcode, unsigned c glColor4ubv(col); } -static void axis_sort_v3(const float axis_values[3], int r_axis_order[3]) -{ - float v[3]; - copy_v3_v3(v, axis_values); - -#define SWAP_AXIS(a, b) { \ - SWAP(float, v[a], v[b]); \ - SWAP(int, r_axis_order[a], r_axis_order[b]); \ -} (void)0 - - if (v[0] < v[1]) { - if (v[2] < v[0]) { SWAP_AXIS(0, 2); } - } - else { - if (v[1] < v[2]) { SWAP_AXIS(0, 1); } - else { SWAP_AXIS(0, 2); } - } - if (v[2] < v[1]) { SWAP_AXIS(1, 2); } - -#undef SWAP_AXIS -} static void manipulator_axis_order(RegionView3D *rv3d, int r_axis_order[3]) { float axis_values[3]; -- cgit v1.2.3