55 const float *v_prev = l_first->
prev->
v->
co;
56 const float *v_curr = l_first->
v->
co;
64 l_iter = l_iter->
next;
66 v_curr = l_iter->
v->
co;
68 }
while (l_iter != l_first);
81 float const (*vertexCos)[3])
94 l_iter = l_iter->
next;
97 }
while (l_iter != l_first);
107 float const (*vertexCos)[3])
109 const BMLoop *l_first, *l_iter;
117 }
while ((l_iter = l_iter->
next) != l_first);
131 const bool use_fixed_quad,
139 *r_loops++ = (l_iter = l_first);
140 *r_loops++ = (l_iter = l_iter->
next);
141 *r_loops++ = (l_iter->
next);
147 else if (f->
len == 4 && use_fixed_quad) {
148 *r_loops++ = (l_iter = l_first);
149 *r_loops++ = (l_iter = l_iter->
next);
150 *r_loops++ = (l_iter = l_iter->
next);
151 *r_loops++ = (l_iter->
next);
162 float axis_mat[3][3];
174 }
while ((l_iter = l_iter->
next) != l_first);
195 const int tottri = f->
len - 2;
200 float area_best = -1.0f;
204 for (j = 0; j < tottri; j++) {
205 const float *p1 = loops[index[j][0]]->
v->
co;
206 const float *p2 = loops[index[j][1]]->
v->
co;
207 const float *p3 = loops[index[j][2]]->
v->
co;
209 if (
area > area_best) {
216 l_tri, loops[index[j_best][0]], loops[index[j_best][1]], loops[index[j_best][2]]);
228 const BMLoop *l_iter, *l_first;
235 }
while ((l_iter = l_iter->
next) != l_first);
245 const BMLoop *l_iter, *l_first;
257 }
while ((l_iter = l_iter->
next) != l_first);
267 const BMLoop *l_iter, *l_first;
275 cross += (luv_next->
uv[0] - luv->
uv[0]) * (luv_next->
uv[1] + luv->
uv[1]);
276 }
while ((l_iter = l_iter->
next) != l_first);
285 const BMLoop *l_iter, *l_first;
286 float perimeter = 0.0f;
291 }
while ((l_iter = l_iter->
next) != l_first);
301 const BMLoop *l_iter, *l_first;
303 float perimeter = 0.0f;
312 }
while ((l_iter = l_iter->
next) != l_first);
328 for (
int i_prev = 1, i_curr = 2, i_next = 0; i_next < 3; i_prev = i_curr, i_curr = i_next++) {
329 const float *co =
verts[i_curr]->co;
330 const float *co_other[2] = {
verts[i_prev]->co,
verts[i_next]->co};
335 float proj_pair[2][3];
341 const float lens[3] = {
346 const float difs[3] = {
347 fabsf(lens[1] - lens[2]),
348 fabsf(lens[2] - lens[0]),
349 fabsf(lens[0] - lens[1]),
353 int order[3] = {0, 1, 2};
388 const float *v_a =
verts[index]->co;
389 const float *v_b =
verts[(index + 1) % 3]->co;
390 const float *v_other =
verts[(index + 2) % 3]->co;
424 else if (f->
len == 4) {
427 float vec[3], vec_a[3], vec_b[3];
448 float len_max_sq = 0.0f;
449 float vec_a[3], vec_b[3];
456 if (len_sq >= len_max_sq) {
457 l_long_other = l_iter;
460 }
while ((l_iter = l_iter->
prev) != l_last);
490 float dist_max_sq = 0.0f;
496 float co_other[3], vec[3];
498 co_other, l_iter->
v->
co, l_iter_other->
v->
co, l_iter_other->
next->
v->
co);
502 if (dist_sq > dist_max_sq) {
503 dist_max_sq = dist_sq;
506 }
while ((l_iter_other = l_iter_other->
next) != l_iter_last);
507 }
while ((l_iter = l_iter->
next) != l_first);
527 float dist_max_sq = 0.0f;
535 if (dist_sq > dist_max_sq) {
536 dist_max_sq = dist_sq;
539 }
while ((l_iter_other = l_iter_other->
next) != l_iter);
540 }
while ((l_iter = l_iter->
next) != l_first);
558 else if (f->
len == 4) {
573 const BMLoop *l_iter, *l_first;
577 }
while ((l_iter = l_iter->
next) != l_first);
585 const BMLoop *l_iter, *l_first;
593 }
while ((l_iter = l_iter->
next) != l_first);
604 float const (*vertexCos)[3])
610 const BMLoop *l_iter, *l_first;
618 }
while ((l_iter = l_iter->
next) != l_first);
628 const BMLoop *l_iter, *l_first;
635 }
while ((l_iter = l_iter->
next) != l_first);
656 const float w = (w_curr + w_prev);
660 }
while ((l_iter = l_iter->
next) != l_first);
682 for (i = 0; i < nverts; i++) {
706 float vec1[3], vec2[3], fac;
830 const float *co2 = (
l =
l->
next)->v->co;
832 const float *co4 = (
l->
next)->v->co;
838 const float *co2 = (
l =
l->
next)->v->co;
839 const float *co3 = (
l->
next)->
v->
co;
857 float const (*vertexCos)[3])
895 BMVert **varr,
int varr_len,
float r_normal[3],
float r_center[3],
int *r_index_tangent)
897 const float varr_len_inv = 1.0f / (
float)varr_len;
900 float center[3] = {0.0f, 0.0f, 0.0f};
901 for (
int i = 0; i < varr_len; i++) {
907 const float *co_a =
NULL;
909 float dist_sq_max = -1.0f;
910 for (
int i = 0; i < varr_len; i++) {
912 if (!(dist_sq_test <= dist_sq_max)) {
915 dist_sq_max = dist_sq_test;
924 const float *co_b =
NULL;
925 float dir_b[3] = {0.0f, 0.0f, 0.0f};
927 float dist_sq_max = -1.0f;
928 for (
int i = 0; i < varr_len; i++) {
929 if (varr[i]->co == co_a) {
936 if (!(dist_sq_test <= dist_sq_max)) {
938 dist_sq_max = dist_sq_test;
951 const float *co_a_opposite =
NULL;
952 const float *co_b_opposite =
NULL;
955 float dot_a_min = FLT_MAX;
956 float dot_b_min = FLT_MAX;
957 for (
int i = 0; i < varr_len; i++) {
958 const float *co_test = varr[i]->
co;
961 if (co_test != co_a) {
962 dot_test =
dot_v3v3(dir_a, co_test);
963 if (dot_test < dot_a_min) {
964 dot_a_min = dot_test;
965 co_a_opposite = co_test;
969 if (co_test != co_b) {
970 dot_test =
dot_v3v3(dir_b, co_test);
971 if (dot_test < dot_b_min) {
972 dot_b_min = dot_test;
973 co_b_opposite = co_test;
979 normal_quad_v3(r_normal, co_a, co_b, co_a_opposite, co_b_opposite);
982 if (r_center !=
NULL) {
985 if (r_index_tangent !=
NULL) {
986 *r_index_tangent = co_a_index;
1000 const float *v_prev, *v_curr;
1003 const BMLoop *l_iter = l_first;
1008 v_prev = l_last->
v->
co;
1010 v_curr = l_iter->
v->
co;
1013 }
while ((l_iter = l_iter->
next) != l_term);
1022 float const (*vertexCos)[3])
1039 const int cd_loop_mdisp_offset,
1040 const bool use_loop_mdisp_flip)
1064 float axis_mat[3][3];
1110 int *r_faces_new_tot,
1112 int *r_edges_new_tot,
1114 const int quad_method,
1115 const int ngon_method,
1121 struct Heap *pf_heap)
1140 const int totfilltri = f->
len - 2;
1141 const int last_tri = f->
len - 3;
1153 switch (quad_method) {
1160 l_v1 = l_first->
next;
1161 l_v2 = l_first->
prev;
1170 l_v1 = l_first->
next;
1172 l_v3 = l_first->
prev;
1179 split_24 = ((d2 - d1) > 0.0f);
1185 if (
UNLIKELY(flip_flag & (1 << 0))) {
1188 else if (
UNLIKELY(flip_flag & (1 << 1))) {
1211 loops[1] = l_v1->
next;
1213 loops[3] = l_v2->
next;
1220 float axis_mat[3][3];
1239 if (cd_loop_mdisp_offset != -1) {
1244 for (i = 0; i < totfilltri; i++) {
1245 BMLoop *l_tri[3] = {loops[tris[i][0]], loops[tris[i][1]], loops[tris[i][2]]};
1247 BMVert *v_tri[3] = {l_tri[0]->
v, l_tri[1]->
v, l_tri[2]->
v};
1263 }
while ((l_iter = l_iter->
radial_next) != l_new);
1272 if (i != last_tri) {
1277 r_faces_new[nf_i++] = f_new;
1281 if (use_tag || r_edges_new) {
1285 l_iter = l_first = l_new;
1290 bool is_new_edge = (l_iter == l_iter->
radial_next);
1297 r_edges_new[ne_i++] =
e;
1301 }
while ((l_iter = l_iter->
next) != l_first);
1304 if (cd_loop_mdisp_offset != -1) {
1305 float f_new_center[3];
1320 if (r_faces_new_tot) {
1321 *r_faces_new_tot = nf_i;
1324 if (r_edges_new_tot) {
1325 *r_edges_new_tot = ne_i;
1339 float out[2] = {-FLT_MAX, -FLT_MAX};
1340 float center[2] = {0.0f, 0.0f};
1341 float axis_mat[3][3];
1369 out[0] =
max_ff(out[0], projverts[i][0]);
1370 out[1] =
max_ff(out[1], projverts[i][1]);
1377 for (i = 0; i <
len; i++) {
1383 for (i = 0; i <
len; i++) {
1385 mid_v2_v2v2(mid, edgeverts[i][0], edgeverts[i][1]);
1389 for (j = 0, j_prev = f->
len - 1; j < f->
len; j_prev = j++) {
1390 const float *f_edge[2] = {projverts[j_prev], projverts[j]};
1396 if (isect % 2 == 0) {
1401 #define EDGE_SHARE_VERT(e1, e2) \
1402 ((ELEM((e1)[0], (e2)[0], (e2)[1])) || (ELEM((e1)[1], (e2)[0], (e2)[1])))
1405 for (i = 0, i_prev = f->
len - 1; i < f->
len; i_prev = i++) {
1406 const float *f_edge[2] = {projverts[i_prev], projverts[i]};
1407 for (j = 0; j <
len; j++) {
1417 for (i = 0; i <
len; i++) {
1419 for (j = i + 1; j <
len; j++) {
1431 #undef EDGE_SHARE_VERT
1442 for (i = 0; i <
len; i++) {
1443 BMLoop *l_a_dummy, *l_b_dummy;
1445 loops[i][0]->
v, loops[i][1]->
v, &l_a_dummy, &l_b_dummy,
false)) {
1537 #define USE_TESSFACE_SPEEDUP
1557 #ifdef USE_TESSFACE_SPEEDUP
1561 else if (efa->
len == 3) {
1571 BMLoop **l_ptr = looptris[i++];
1577 else if (efa->
len == 4) {
1586 looptris[i][0] = ltmp[0];
1587 looptris[i][1] = ltmp[1];
1588 looptris[i][2] = ltmp[2];
1591 looptris[i][0] = ltmp[0];
1592 looptris[i][1] = ltmp[2];
1593 looptris[i][2] = ltmp[3];
1598 BMLoop **l_ptr_a = looptris[i++];
1599 BMLoop **l_ptr_b = looptris[i++];
1601 (l_ptr_a[1] =
l =
l->
next);
1602 (l_ptr_a[2] = l_ptr_b[1] =
l =
l->
next);
1603 (l_ptr_b[2] =
l->
next);
1607 l_ptr_a[0]->
v->
co, l_ptr_a[1]->
v->
co, l_ptr_a[2]->
v->
co, l_ptr_b[2]->
v->
co))) {
1609 l_ptr_a[2] = l_ptr_b[2];
1610 l_ptr_b[0] = l_ptr_a[1];
1623 float axis_mat[3][3];
1624 float(*projverts)[2];
1627 const int totfilltri = efa->
len - 2;
1645 }
while ((l_iter = l_iter->
next) != l_first);
1649 for (j = 0; j < totfilltri; j++) {
1650 BMLoop **l_ptr = looptris[i++];
1651 uint *tri = tris[j];
1653 l_ptr[0] = l_arr[tri[0]];
1654 l_ptr[1] = l_arr[tri[1]];
1655 l_ptr[2] = l_arr[tri[2]];
1667 *r_looptris_tot = i;
1671 #undef USE_TESSFACE_SPEEDUP
1699 else if (efa->
len == 3) {
1701 BMLoop **l_ptr = looptris[i++];
1706 else if (efa->
len == 4) {
1719 l_v1->
v, l_v2->
v, l_v3->
v, l_v4->
v, 0, 0) < 0.0f);
1721 float axis_mat[3][3], v_quad[4][2];
1729 v_quad[0], v_quad[1], v_quad[2], v_quad[3]) < 0.0f;
1732 BMLoop **l_ptr_a = looptris[i++];
1733 BMLoop **l_ptr_b = looptris[i++];
1760 float axis_mat[3][3];
1761 float(*projverts)[2];
1762 unsigned int(*tris)[3];
1764 const int totfilltri = efa->
len - 2;
1783 }
while ((l_iter = l_iter->
next) != l_first);
1789 for (j = 0; j < totfilltri; j++) {
1790 BMLoop **l_ptr = looptris[i++];
1791 unsigned int *tri = tris[j];
1793 l_ptr[0] = l_arr[tri[0]];
1794 l_ptr[1] = l_arr[tri[1]];
1795 l_ptr[2] = l_arr[tri[2]];
1808 *r_looptris_tot = i;
typedef float(TangentPoint)[2]
CustomData interface, see also DNA_customdata_types.h.
int CustomData_get_offset(const struct CustomData *data, int type)
#define BLI_array_alloca(arr, realsize)
#define BLI_array_grow_items(arr, num)
A min-heap / priority queue ADT.
void BLI_heap_free(Heap *heap, HeapFreeFP ptrfreefp) ATTR_NONNULL(1)
Heap * BLI_heap_new_ex(unsigned int tot_reserve) ATTR_WARN_UNUSED_RESULT
void void BLI_linklist_prepend(LinkNode **listp, void *ptr) ATTR_NONNULL(1)
MINLINE float saacos(float fac)
MINLINE float max_ff(float a, float b)
int isect_seg_seg_v2(const float v1[2], const float v2[2], const float v3[2], const float v4[2])
float normal_quad_v3(float n[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3])
MINLINE int poly_to_tri_count(const int poly_count, const int corner_count)
int is_quad_flip_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3])
bool isect_point_poly_v2(const float pt[2], const float verts[][2], const unsigned int nr, const bool use_holes)
bool is_quad_flip_v3_first_third_fast(const float v1[3], const float v2[3], const float v3[3], const float v4[3])
void axis_dominant_v3_to_m3_negate(float r_mat[3][3], const float normal[3])
void axis_dominant_v3_to_m3(float r_mat[3][3], const float normal[3])
Normal to x,y matrix.
float area_squared_tri_v3(const float v1[3], const float v2[3], const float v3[3])
void closest_to_line_segment_v3(float r_close[3], const float p[3], const float l1[3], const float l2[3])
bool is_poly_convex_v2(const float verts[][2], unsigned int nr)
float normal_tri_v3(float n[3], const float v1[3], const float v2[3], const float v3[3])
#define ISECT_LINE_LINE_CROSS
void mul_v2_m3v3(float r[2], const float M[3][3], const float a[3])
void mul_v3_m3v3(float r[3], const float M[3][3], const float a[3])
void axis_sort_v3(const float axis_values[3], int r_axis_order[3])
MINLINE float len_squared_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
void minmax_v3v3_v3(float min[3], float max[3], const float vec[3])
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void sub_v2_v2(float r[2], const float a[2])
MINLINE float normalize_v3(float r[3])
MINLINE void sub_v3_v3(float r[3], const float a[3])
MINLINE float len_squared_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void add_newell_cross_v3_v3v3(float n[3], const float v_prev[3], const float v_curr[3])
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void mul_v2_fl(float r[2], float f)
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
void project_v3_v3v3(float out[3], const float p[3], const float v_proj[3])
MINLINE void add_v2_v2(float r[2], const float a[2])
void project_plane_normalized_v3_v3v3(float out[3], const float p[3], const float v_plane[3])
MINLINE float dot_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void add_v2_fl(float r[2], float f)
MINLINE void negate_v3(float r[3])
void mid_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE float normalize_v3_v3(float r[3], const float a[3])
void mid_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void zero_v3(float r[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
void mid_v3_v3v3v3(float v[3], const float v1[3], const float v2[3], const float v3[3])
MINLINE float len_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
void BLI_memarena_free(struct MemArena *ma) ATTR_NONNULL(1)
#define BLI_MEMARENA_STD_BUFSIZE
void * BLI_memarena_alloc(struct MemArena *ma, size_t size) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC ATTR_ALLOC_SIZE(2)
void BLI_memarena_clear(MemArena *ma) ATTR_NONNULL(1)
struct MemArena * BLI_memarena_new(const size_t bufsize, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(2) ATTR_MALLOC
void BLI_polyfill_calc_arena(const float(*coords)[2], const unsigned int coords_tot, const int coords_sign, unsigned int(*r_tris)[3], struct MemArena *arena)
void BLI_polyfill_calc(const float(*coords)[2], const unsigned int coords_tot, const int coords_sign, unsigned int(*r_tris)[3])
#define BLI_POLYFILL_ALLOC_NGON_RESERVE
#define BLI_polyfill_beautify_quad_rotate_calc(v1, v2, v3, v4)
void BLI_polyfill_beautify(const float(*coords)[2], const unsigned int coords_tot, unsigned int(*tris)[3], struct MemArena *arena, struct Heap *eheap)
#define INIT_MINMAX(min, max)
#define ARRAY_SET_ITEMS(...)
These structs are the foundation for all linked lists in the library system.
@ MOD_TRIANGULATE_QUAD_SHORTEDGE
@ MOD_TRIANGULATE_QUAD_FIXED
@ MOD_TRIANGULATE_QUAD_BEAUTY
@ MOD_TRIANGULATE_QUAD_ALTERNATE
@ MOD_TRIANGULATE_NGON_BEAUTY
NSNotificationCenter * center
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint order
Read Guarded memory(de)allocation.
float BM_verts_calc_rotate_beauty(const BMVert *v1, const BMVert *v2, const BMVert *v3, const BMVert *v4, const short flag, const short method)
#define BM_FACE_FIRST_LOOP(p)
#define BM_ELEM_CD_GET_VOID_P(ele, offset)
void BM_elem_attrs_copy(BMesh *bm_src, BMesh *bm_dst, const void *ele_src, void *ele_dst)
void bmesh_face_swap_data(BMFace *f_a, BMFace *f_b)
BMFace * BM_face_create_verts(BMesh *bm, BMVert **vert_arr, const int len, const BMFace *f_example, const eBMCreateFlag create_flag, const bool create_edges)
void BM_face_kill(BMesh *bm, BMFace *f)
void bmesh_kernel_loop_reverse(BMesh *bm, BMFace *f, const int cd_loop_mdisp_offset, const bool use_loop_mdisp_flip)
Loop Reverse.
#define BM_elem_index_get(ele)
#define BM_elem_index_set(ele, index)
#define BM_elem_flag_test(ele, hflag)
#define BM_elem_flag_enable(ele, hflag)
void BM_face_interp_multires_ex(BMesh *bm, BMFace *f_dst, const BMFace *f_src, const float f_dst_center[3], const float f_src_center[3], const int cd_loop_mdisp_offset)
#define BM_ITER_ELEM(ele, iter, data, itype)
#define BM_ITER_MESH(ele, iter, bm, itype)
#define BM_ITER_ELEM_INDEX(ele, iter, data, itype, indexvar)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_face_calc_tangent_edge_pair(const BMFace *f, float r_tangent[3])
void BM_face_as_array_loop_tri(BMFace *f, BMLoop *r_loops[3])
float BM_face_calc_area_uv(const BMFace *f, int cd_loop_uv_offset)
void poly_rotate_plane(const float normal[3], float(*verts)[3], const uint nverts)
POLY ROTATE PLANE.
void BM_face_splits_check_optimal(BMFace *f, BMLoop *(*loops)[2], int len)
void BM_face_calc_center_bounds(const BMFace *f, float r_cent[3])
void BM_vert_normal_update(BMVert *v)
void BM_face_splits_check_legal(BMesh *bm, BMFace *f, BMLoop *(*loops)[2], int len)
void BM_face_calc_tangent_vert_diagonal(const BMFace *f, float r_tangent[3])
void BM_mesh_calc_tessellation_beauty(BMesh *bm, BMLoop *(*looptris)[3], int *r_looptris_tot)
void BM_face_as_array_vert_quad(BMFace *f, BMVert *r_verts[4])
void BM_face_triangulate(BMesh *bm, BMFace *f, BMFace **r_faces_new, int *r_faces_new_tot, BMEdge **r_edges_new, int *r_edges_new_tot, LinkNode **r_faces_double, const int quad_method, const int ngon_method, const bool use_tag, MemArena *pf_arena, struct Heap *pf_heap)
BMESH TRIANGULATE FACE.
static int bm_vert_tri_find_unique_edge(BMVert *verts[3])
float BM_face_calc_area_with_mat3(const BMFace *f, const float mat3[3][3])
void BM_face_calc_point_in_face(const BMFace *f, float r_co[3])
void BM_verts_calc_normal_from_cloud(BMVert **varr, int varr_len, float r_normal[3])
bool BM_face_point_inside_test(const BMFace *f, const float co[3])
bool BM_vert_calc_normal(const BMVert *v, float r_no[3])
void BM_face_calc_tangent_edge_diagonal(const BMFace *f, float r_tangent[3])
static float bm_face_calc_poly_normal_vertex_cos(const BMFace *f, float r_no[3], float const (*vertexCos)[3])
COMPUTE POLY NORMAL (BMFace)
void BM_face_normal_flip_ex(BMesh *bm, BMFace *f, const int cd_loop_mdisp_offset, const bool use_loop_mdisp_flip)
Face Flip Normal.
void BM_vert_tri_calc_tangent_edge(BMVert *verts[3], float r_tangent[3])
void BM_face_normal_update(BMFace *f)
void BM_face_as_array_vert_tri(BMFace *f, BMVert *r_verts[3])
bool BM_vert_calc_normal_ex(const BMVert *v, const char hflag, float r_no[3])
void BM_face_as_array_loop_quad(BMFace *f, BMLoop *r_loops[4])
static void bm_face_calc_poly_center_median_vertex_cos(const BMFace *f, float r_cent[3], float const (*vertexCos)[3])
COMPUTE POLY CENTER (BMFace)
void BM_mesh_calc_tessellation(BMesh *bm, BMLoop *(*looptris)[3], int *r_looptris_tot)
BM_mesh_calc_tessellation get the looptris and its number from a certain bmesh.
void BM_face_normal_flip(BMesh *bm, BMFace *f)
void BM_face_calc_tangent_edge(const BMFace *f, float r_tangent[3])
void BM_verts_calc_normal_from_cloud_ex(BMVert **varr, int varr_len, float r_normal[3], float r_center[3], int *r_index_tangent)
void BM_face_calc_bounds_expand(const BMFace *f, float min[3], float max[3])
float BM_face_calc_area(const BMFace *f)
#define EDGE_SHARE_VERT(e1, e2)
float BM_face_calc_normal_subset(const BMLoop *l_first, const BMLoop *l_last, float r_no[3])
void BM_face_calc_center_median_vcos(const BMesh *bm, const BMFace *f, float r_cent[3], float const (*vertexCos)[3])
float BM_face_calc_normal(const BMFace *f, float r_no[3])
BMESH UPDATE FACE NORMAL.
float BM_face_calc_perimeter_with_mat3(const BMFace *f, const float mat3[3][3])
void BM_face_calc_center_bounds_vcos(const BMesh *bm, const BMFace *f, float r_cent[3], float const (*vertexCos)[3])
static void bm_loop_normal_accum(const BMLoop *l, float no[3])
void BM_vert_tri_calc_tangent_edge_pair(BMVert *verts[3], float r_tangent[3])
void BM_face_calc_tessellation(const BMFace *f, const bool use_fixed_quad, BMLoop **r_loops, uint(*r_index)[3])
void BM_face_calc_center_median(const BMFace *f, float r_cent[3])
void BM_face_calc_tangent_auto(const BMFace *f, float r_tangent[3])
static float bm_face_calc_poly_normal(const BMFace *f, float n[3])
COMPUTE POLY NORMAL (BMFace)
void BM_face_calc_center_median_weighted(const BMFace *f, float r_cent[3])
void BM_vert_normal_update_all(BMVert *v)
float BM_face_calc_perimeter(const BMFace *f)
float BM_face_calc_normal_vcos(const BMesh *bm, const BMFace *f, float r_no[3], float const (*vertexCos)[3])
void BM_edge_normals_update(BMEdge *e)
bool BM_face_is_normal_valid(const BMFace *f)
BMFace * BM_vert_pair_share_face_by_angle(BMVert *v_a, BMVert *v_b, BMLoop **r_l_a, BMLoop **r_l_b, const bool allow_adjacent)
float BM_edge_calc_length(const BMEdge *e)
BMLoop * BM_face_find_longest_loop(BMFace *f)
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
BLI_INLINE BMEdge * bmesh_disk_edge_next(const BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
IconTextureDrawCall normal
static void area(int d1, int d2, int e1, int e2, float weights[2])
struct BMLoop * radial_next
__forceinline avxf cross(const avxf &a, const avxf &b)