diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-12-15 12:39:46 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-12-15 12:39:46 +0300 |
commit | 7fc799d4a9c52254390e5df2942c73831ca7e5ac (patch) | |
tree | c265c60e3cff3913d280f6229b9eae01cc91e44b | |
parent | 55898c04fd4935de5610242bfb259f30e58b0413 (diff) |
utility functions for getting the corner angles of a quad or tri: angle_quad_v3 & angle_tri_v3
-rw-r--r-- | source/blender/blenlib/BLI_math_vector.h | 2 | ||||
-rw-r--r-- | source/blender/blenlib/intern/math_vector.c | 38 | ||||
-rw-r--r-- | source/blender/editors/mesh/editmesh_lib.c | 50 |
3 files changed, 49 insertions, 41 deletions
diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h index 399c234a108..e915a9a85f3 100644 --- a/source/blender/blenlib/BLI_math_vector.h +++ b/source/blender/blenlib/BLI_math_vector.h @@ -131,6 +131,8 @@ float angle_normalized_v2v2(float a[2], float b[2]); float angle_v3v3(float a[2], float b[2]); float angle_v3v3v3(float a[2], float b[2], float c[2]); float angle_normalized_v3v3(float a[3], float b[3]); +void angle_tri_v3(float angles[3], const float v1[3], const float v2[3], const float v3[3]); +void angle_quad_v3(float angles[4], const float v1[3], const float v2[3], const float v3[3], const float v4[3]); /********************************* Geometry **********************************/ diff --git a/source/blender/blenlib/intern/math_vector.c b/source/blender/blenlib/intern/math_vector.c index 289d8818753..2ce4a069a48 100644 --- a/source/blender/blenlib/intern/math_vector.c +++ b/source/blender/blenlib/intern/math_vector.c @@ -205,6 +205,44 @@ float angle_normalized_v2v2(float *v1, float *v2) return 2.0f*(float)saasin(len_v2v2(v2, v1)/2.0f); } +void angle_tri_v3(float angles[3], const float v1[3], const float v2[3], const float v3[3]) +{ + float ed1[3], ed2[3], ed3[3]; + + sub_v3_v3v3(ed1, v3, v1); + sub_v3_v3v3(ed2, v1, v2); + sub_v3_v3v3(ed3, v2, v3); + + normalize_v3(ed1); + normalize_v3(ed2); + normalize_v3(ed3); + + angles[0]= M_PI - angle_normalized_v3v3(ed1, ed2); + angles[1]= M_PI - angle_normalized_v3v3(ed2, ed3); + // face_angles[2] = M_PI - angle_normalized_v3v3(ed3, ed1); + angles[2]= M_PI - (angles[0] + angles[1]); +} + +void angle_quad_v3(float angles[4], const float v1[3], const float v2[3], const float v3[3], const float v4[3]) +{ + float ed1[3], ed2[3], ed3[3], ed4[3]; + + sub_v3_v3v3(ed1, v4, v1); + sub_v3_v3v3(ed2, v1, v2); + sub_v3_v3v3(ed3, v2, v3); + sub_v3_v3v3(ed4, v3, v4); + + normalize_v3(ed1); + normalize_v3(ed2); + normalize_v3(ed3); + normalize_v3(ed4); + + angles[0]= M_PI - angle_normalized_v3v3(ed1, ed2); + angles[1]= M_PI - angle_normalized_v3v3(ed2, ed3); + angles[2]= M_PI - angle_normalized_v3v3(ed3, ed4); + angles[3]= M_PI - angle_normalized_v3v3(ed4, ed1); +} + /********************************* Geometry **********************************/ /* Project v1 on v2 */ diff --git a/source/blender/editors/mesh/editmesh_lib.c b/source/blender/editors/mesh/editmesh_lib.c index c543c3287a0..52af5ce8e2f 100644 --- a/source/blender/editors/mesh/editmesh_lib.c +++ b/source/blender/editors/mesh/editmesh_lib.c @@ -2388,45 +2388,6 @@ void EM_make_hq_normals(EditMesh *em) EM_free_index_arrays(); } -#define FLT_EPSILON 0.00001 - -static void em_face_angles(EditFace *efa, float *face_angles) -{ - float vec1[3], vec2[3], vec3[3], vec4[3]; - - /* note, could cache normalized edges? */ - if(efa->v4) { - sub_v3_v3v3(vec1, efa->v4->co, efa->v1->co); - sub_v3_v3v3(vec2, efa->v1->co, efa->v2->co); - sub_v3_v3v3(vec3, efa->v2->co, efa->v3->co); - sub_v3_v3v3(vec4, efa->v3->co, efa->v4->co); - - normalize_v3(vec1); - normalize_v3(vec2); - normalize_v3(vec3); - normalize_v3(vec4); - - face_angles[0]= M_PI - angle_normalized_v3v3(vec1, vec2); - face_angles[1]= M_PI - angle_normalized_v3v3(vec2, vec3); - face_angles[2]= M_PI - angle_normalized_v3v3(vec3, vec4); - face_angles[3]= M_PI - angle_normalized_v3v3(vec4, vec1); - } - else { - sub_v3_v3v3(vec1, efa->v3->co, efa->v1->co); - sub_v3_v3v3(vec2, efa->v1->co, efa->v2->co); - sub_v3_v3v3(vec3, efa->v2->co, efa->v3->co); - - normalize_v3(vec1); - normalize_v3(vec2); - normalize_v3(vec3); - - face_angles[0]= M_PI - angle_normalized_v3v3(vec1, vec2); - face_angles[1]= M_PI - angle_normalized_v3v3(vec2, vec3); - - //face_angles[2]= M_PI - (face_angles[0] + face_angles[1]); - face_angles[2] = M_PI - angle_normalized_v3v3(vec3, vec1); - } -} void EM_solidify(EditMesh *em, float dist) { EditFace *efa; @@ -2446,9 +2407,16 @@ void EM_solidify(EditMesh *em, float dist) if(!(efa->f & SELECT)) continue; - em_face_angles(efa, face_angles); + if(efa->v4) { + angle_quad_v3(face_angles, efa->v1->co, efa->v2->co, efa->v3->co, efa->v4->co); + j= 3; + } + else { + angle_tri_v3(face_angles, efa->v1->co, efa->v2->co, efa->v3->co); + j= 2; + } - for(j= efa->v4 ? 3:2; j>=0; j--) { + for(; j>=0; j--) { eve= *(&efa->v1 + j); vert_accum[eve->tmp.l] += face_angles[j]; vert_angles[eve->tmp.l]+= shell_angle_to_dist(angle_normalized_v3v3(eve->no, efa->n)) * face_angles[j]; |