forked from bartvdbraak/blender
utility functions for getting the corner angles of a quad or tri: angle_quad_v3 & angle_tri_v3
This commit is contained in:
parent
55898c04fd
commit
7fc799d4a9
@ -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 **********************************/
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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];
|
||||
|
Loading…
Reference in New Issue
Block a user