forked from bartvdbraak/blender
bmesh todo: uv stretch area draw mode wasn't calculating ngon area - added area_poly_v2().
This commit is contained in:
parent
2a43380ded
commit
7c64109bce
@ -53,6 +53,7 @@ float area_tri_signed_v2(const float v1[2], const float v2[2], const float v3[2]
|
||||
float area_tri_v3(const float a[3], const float b[3], const float c[3]);
|
||||
float area_quad_v3(const float a[3], const float b[3], const float c[3], const float d[3]);
|
||||
float area_poly_v3(int nr, float verts[][3], const float normal[3]);
|
||||
float area_poly_v2(int nr, float verts[][2]);
|
||||
|
||||
int is_quad_convex_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3]);
|
||||
int is_quad_convex_v2(const float v1[2], const float v2[2], const float v3[2], const float v4[2]);
|
||||
|
@ -149,6 +149,25 @@ float area_poly_v3(int nr, float verts[][3], const float normal[3])
|
||||
return fabsf(0.5f * area / max);
|
||||
}
|
||||
|
||||
float area_poly_v2(int nr, float verts[][2])
|
||||
{
|
||||
int a;
|
||||
float area;
|
||||
float *co_curr, *co_prev;
|
||||
|
||||
/* The Trapezium Area Rule */
|
||||
co_prev = verts[nr - 1];
|
||||
co_curr = verts[0];
|
||||
area = 0.0f;
|
||||
for (a = 0; a < nr; a++) {
|
||||
area += (co_curr[0] - co_prev[0]) * (co_curr[1] + co_prev[1]);
|
||||
co_prev = verts[a];
|
||||
co_curr = verts[a + 1];
|
||||
}
|
||||
|
||||
return fabsf(0.5f * area);
|
||||
}
|
||||
|
||||
/********************************* Distance **********************************/
|
||||
|
||||
/* distance p to line v1-v2
|
||||
|
@ -158,7 +158,6 @@ float BM_face_calc_area(BMFace *f)
|
||||
BMLoop *l;
|
||||
BMIter iter;
|
||||
float (*verts)[3] = BLI_array_alloca(verts, f->len);
|
||||
float normal[3];
|
||||
float area;
|
||||
int i;
|
||||
|
||||
@ -173,6 +172,7 @@ float BM_face_calc_area(BMFace *f)
|
||||
area = area_quad_v3(verts[0], verts[1], verts[2], verts[3]);
|
||||
}
|
||||
else {
|
||||
float normal[3];
|
||||
calc_poly_normal(normal, verts, f->len);
|
||||
area = area_poly_v3(f->len, verts, normal);
|
||||
}
|
||||
|
@ -194,8 +194,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
|
||||
uv_poly_copy_aspect(tf_uvorig, tf_uv, aspx, aspy, efa->len);
|
||||
|
||||
totarea += BM_face_calc_area(efa);
|
||||
//totuvarea += tf_area(tf, efa->v4!=0);
|
||||
totuvarea += uv_poly_area(tf_uv, efa->len);
|
||||
totuvarea += area_poly_v2(efa->len, tf_uv);
|
||||
|
||||
if (uvedit_face_visible_test(scene, ima, efa, tf)) {
|
||||
BM_elem_flag_enable(efa, BM_ELEM_TAG);
|
||||
@ -238,8 +237,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
|
||||
|
||||
uv_poly_copy_aspect(tf_uvorig, tf_uv, aspx, aspy, efa->len);
|
||||
|
||||
//uvarea = tf_area(tf, efa->v4!=0) / totuvarea;
|
||||
uvarea = uv_poly_area(tf_uv, efa->len) / totuvarea;
|
||||
uvarea = area_poly_v2(efa->len, tf_uv) / totuvarea;
|
||||
|
||||
if (area < FLT_EPSILON || uvarea < FLT_EPSILON)
|
||||
areadiff = 1.0f;
|
||||
|
@ -50,7 +50,6 @@ struct BMVert;
|
||||
int uvedit_face_visible_nolocal(struct Scene *scene, struct BMFace *efa);
|
||||
|
||||
/* geometric utilities */
|
||||
float uv_poly_area(float uv[][2], int len);
|
||||
void uv_poly_copy_aspect(float uv_orig[][2], float uv[][2], float aspx, float aspy, int len);
|
||||
void uv_poly_center(struct BMEditMesh *em, struct BMFace *f, float r_cent[2]);
|
||||
|
||||
|
@ -575,19 +575,6 @@ void uv_poly_center(BMEditMesh *em, BMFace *f, float r_cent[2])
|
||||
mul_v2_fl(r_cent, 1.0f / (float)f->len);
|
||||
}
|
||||
|
||||
float uv_poly_area(float uv[][2], int len)
|
||||
{
|
||||
//BMESH_TODO: make this not suck
|
||||
//maybe use scanfill? I dunno.
|
||||
|
||||
if (len >= 4)
|
||||
return area_tri_v2(uv[0], uv[1], uv[2]) + area_tri_v2(uv[0], uv[2], uv[3]);
|
||||
else
|
||||
return area_tri_v2(uv[0], uv[1], uv[2]);
|
||||
|
||||
return 1.0;
|
||||
}
|
||||
|
||||
void uv_poly_copy_aspect(float uv_orig[][2], float uv[][2], float aspx, float aspy, int len)
|
||||
{
|
||||
int i;
|
||||
|
Loading…
Reference in New Issue
Block a user