static float polyedge_rotate_beauty_calc( const float (*coords)[2], const unsigned int (*tris)[3], const struct PolyEdge *e) { const float *v1, *v2, *v3, *v4; v1 = coords[tris[e->faces[0]][e->faces_other_v[0]]]; v3 = coords[tris[e->faces[1]][e->faces_other_v[1]]]; v2 = coords[e->verts[0]]; v4 = coords[e->verts[1]]; return BLI_polyfill_beautify_quad_rotate_calc(v1, v2, v3, v4); }
static float bm_edge_calc_rotate_beauty__area( const float v1[3], const float v2[3], const float v3[3], const float v4[3]) { /* not a loop (only to be able to break out) */ do { float v1_xy[2], v2_xy[2], v3_xy[2], v4_xy[2]; /* first get the 2d values */ { const float eps = 1e-5; float no_a[3], no_b[3]; float no[3]; float axis_mat[3][3]; float no_scale; cross_tri_v3(no_a, v2, v3, v4); cross_tri_v3(no_b, v2, v4, v1); // printf("%p %p %p %p - %p %p\n", v1, v2, v3, v4, e->l->f, e->l->radial_next->f); BLI_assert((ELEM(v1, v2, v3, v4) == false) && (ELEM(v2, v1, v3, v4) == false) && (ELEM(v3, v1, v2, v4) == false) && (ELEM(v4, v1, v2, v3) == false)); add_v3_v3v3(no, no_a, no_b); if (UNLIKELY((no_scale = normalize_v3(no)) <= FLT_EPSILON)) { break; } axis_dominant_v3_to_m3(axis_mat, no); mul_v2_m3v3(v1_xy, axis_mat, v1); mul_v2_m3v3(v2_xy, axis_mat, v2); mul_v2_m3v3(v3_xy, axis_mat, v3); mul_v2_m3v3(v4_xy, axis_mat, v4); /** * Check if input faces are already flipped. * Logic for 'signum_i' addition is: * * Accept: * - (1, 1) or (-1, -1): same side (common case). * - (-1/1, 0): one degenerate, OK since we may rotate into a valid state. * * Ignore: * - (-1, 1): opposite winding, ignore. * - ( 0, 0): both degenerate, ignore. * * \note The cross product is divided by 'no_scale' * so the rotation calculation is scale independent. */ if (!(signum_i_ex(cross_tri_v2(v2_xy, v3_xy, v4_xy) / no_scale, eps) + signum_i_ex(cross_tri_v2(v2_xy, v4_xy, v1_xy) / no_scale, eps))) { break; } } return BLI_polyfill_beautify_quad_rotate_calc(v1_xy, v2_xy, v3_xy, v4_xy); } while (false); return FLT_MAX; }