utility functions for getting the corner angles of a quad or tri: angle_quad_v3 ...
authorCampbell Barton <ideasman42@gmail.com>
Tue, 15 Dec 2009 09:39:46 +0000 (09:39 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 15 Dec 2009 09:39:46 +0000 (09:39 +0000)
source/blender/blenlib/BLI_math_vector.h
source/blender/blenlib/intern/math_vector.c
source/blender/editors/mesh/editmesh_lib.c

index 399c234a1081d58e653d3202037b03a67403352d..e915a9a85f340aaefebf1267abc9ddb735d2254c 100644 (file)
@@ -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 **********************************/
 
index 289d881875354947c52f1253419eaeec30d699f9..2ce4a069a480876b6c97353f69fe53d835511e43 100644 (file)
@@ -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 */
index c543c3287a0d32976caf12fd488c6e6a2d69fe11..52af5ce8e2f73adf8ecfa09ae0f07c553a7aaa7f 100644 (file)
@@ -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];