104 if (l_iter->
prev->
v == v_prev) {
107 if (l_iter->
next->
v == v_prev) {
143 if (
l->
prev->
v == v_prev) {
195 if (v_a->
e && v_b->
e) {
214 if (v_a->
e && v_b->
e) {
232 const bool allow_adjacent,
238 if (v_a->
e && v_b->
e) {
267 if (v_a->
e && v_b->
e) {
272 if ((f_cur ==
NULL) || (l_a->
f->
len < f_cur->
len)) {
295 if (e_a->
l && e_b->
l) {
300 if ((f_cur ==
NULL) || (l_a->
f->
len < f_cur->
len)) {
336 const float *axis =
l->
f->
no;
348 const float *axis =
l->
f->
no;
372 if (v_a->
e && v_b->
e) {
375 float dot_best = -1.0f;
389 if (dot_best == -1.0f) {
394 if (
dot > dot_best) {
435 #ifdef USE_BMESH_HOLES
437 for (lst = f->loops.first; lst; lst = lst->next)
440 #ifdef USE_BMESH_HOLES
441 l_iter = l_first = lst->first;
446 if (l_iter->
v ==
v) {
449 }
while ((l_iter = l_iter->
next) != l_first);
463 #ifdef USE_BMESH_HOLES
469 for (i = 0; i <
len; i++) {
473 #ifdef USE_BMESH_HOLES
474 for (lst = f->loops.first; lst; lst = lst->next)
478 #ifdef USE_BMESH_HOLES
479 l_iter = l_first = lst->first;
489 }
while ((l_iter = l_iter->
next) != l_first);
492 for (i = 0; i <
len; i++) {
506 #ifdef USE_BMESH_HOLES
518 for (i = 0; i <
len; i++) {
522 #ifdef USE_BMESH_HOLES
523 for (lst = f->loops.first; lst; lst = lst->next)
527 #ifdef USE_BMESH_HOLES
528 l_iter = l_first = lst->first;
542 }
while ((l_iter = l_iter->
next) != l_first);
545 for (i = 0; i <
len; i++) {
558 const BMLoop *l_iter, *l_first;
560 l_iter = l_first =
e->l;
562 if (l_iter->
f == f) {
565 }
while ((l_iter = l_iter->
radial_next) != l_first);
599 if (l_other->
v ==
l->
v) {
602 else if (l_other->
next->
v ==
l->
v) {
603 l_other = l_other->
next;
641 if (
l->
e == e_prev) {
644 else if (
l->
prev->
e == e_prev) {
684 }
while (l_a != e_first->
l);
705 }
while (l_a != e_first->
l);
854 l_iter = l_first =
e->l;
857 }
while ((l_iter = l_iter->
radial_next) != l_first);
870 l_iter = l_first =
e->l;
873 if (
count == count_max) {
876 }
while ((l_iter = l_iter->
radial_next) != l_first);
904 const BMEdge *e_iter, *e_first;
905 e_first = e_iter =
v->
e;
907 if (e_iter->
l !=
NULL) {
924 e_first = e_iter =
v->
e;
945 BMEdge *e_iter, *e_first, *e_prev;
947 int loop_num = 0, loop_num_region = 0, boundary_num = 0;
955 e_first = e_iter =
v->
e;
967 if (e_iter->
l->
v ==
v) {
982 if (boundary_num == 3) {
988 e_first = l_first->
e;
989 l_first = (l_first->
v ==
v) ? l_first : l_first->
next;
996 loop_num_region += 1;
999 return (loop_num == loop_num_region);
1002 #define LOOP_VISIT _FLAG_WALK
1003 #define EDGE_VISIT _FLAG_WALK
1007 BMLoop *l_iter, *l_first;
1013 l_iter = l_first =
e->l;
1015 if (l_iter->
v ==
v) {
1025 else if (l_iter->
next->
v ==
v) {
1038 }
while ((l_iter = l_iter->
radial_next) != l_first);
1046 BMEdge *e_iter, *e_first;
1049 e_iter = e_first =
l->
e;
1053 BMLoop *l_iter, *l_first;
1054 l_iter = l_first = e_iter->
l;
1056 if (l_iter->
v ==
l->
v) {
1060 }
while ((l_iter = l_iter->
radial_next) != l_first);
1075 *r_loop_total = count_total;
1096 int count, count_total;
1098 return (
count == count_total);
1111 BMLoop *l2 =
e->l->radial_next;
1128 const int cd_loop_type,
1129 const int cd_loop_offset)
1133 if (
e->l &&
e->l->radial_next !=
e->l) {
1134 const BMLoop *l_base_v1 =
e->l;
1135 const BMLoop *l_base_v2 =
e->l->next;
1138 const BMLoop *l_iter =
e->l->radial_next;
1142 const void *l_iter_cd_v1;
1143 const void *l_iter_cd_v2;
1145 if (l_iter->
v == l_base_v1->
v) {
1147 l_iter_v2 = l_iter->
next;
1150 l_iter_v1 = l_iter->
next;
1153 BLI_assert((l_iter_v1->
v == l_base_v1->
v) && (l_iter_v2->
v == l_base_v2->
v));
1171 BMEdge *e_first, *e_iter;
1173 e_first = e_iter =
v->
e;
1242 }
while ((l_iter = l_iter->
next) != l_first);
1260 }
while ((l_iter = l_iter->
next) != l_first);
1279 }
while ((l_iter = l_iter->
next) != l_first);
1297 }
while ((l_iter = l_iter->
next) != l_first);
1319 if (e1->
l && e2->
l) {
1327 }
while (
l != e1->
l);
1340 if (e1->
l && e2->
l) {
1350 }
while (
l != e1->
l);
1360 return (e1->
v1 == e2->
v1 || e1->
v1 == e2->
v2 || e1->
v2 == e2->
v1 || e1->
v2 == e2->
v2);
1410 if (l_iter->
v ==
v) {
1413 }
while ((l_iter = l_iter->
next) != l_first);
1431 l_iter = l_first =
e->l;
1433 if (l_iter->
f == f) {
1436 }
while ((l_iter = l_iter->
radial_next) != l_first);
1460 *r_v1 = edge_loop->
v;
1461 *r_v2 = edge_loop->
next->
v;
1479 l_step = l_step->
prev;
1499 l_step = l_step->
next;
1515 float e_dir_prev[3];
1516 float e_dir_next[3];
1554 float v1[3],
v2[3], v_tmp[3];
1558 const float fac = ((
v2[0] == 0.0f) ?
1559 ((
v2[1] == 0.0f) ? ((
v2[2] == 0.0f) ? 0.0f :
v1[2] /
v2[2]) :
1578 const float normal_fallback[3],
1579 float const (*vertexCos)[3],
1580 const float epsilon_sq,
1587 float v1[3],
v2[3], v_tmp[3];
1591 const float fac = ((
v2[0] == 0.0f) ?
1592 ((
v2[1] == 0.0f) ? ((
v2[2] == 0.0f) ? 0.0f :
v1[2] /
v2[2]) :
1618 const float normal_fallback[3],
1619 float const (*vertexCos)[3],
1694 if (
compare_v3v3(v_prev, v_next, FLT_EPSILON * 10.0f) ==
false) {
1723 const BMLoop *l2 =
e->l->radial_next;
1742 const float imat3[3][3],
1743 const float fallback)
1747 const BMLoop *l2 =
e->l->radial_next;
1748 float no1[3], no2[3];
1779 BMLoop *l2 =
e->l->radial_next;
1854 float accum_shell = 0.0f;
1855 float accum_angle = 0.0f;
1860 accum_angle += face_angle;
1863 if (accum_angle != 0.0f) {
1864 return accum_shell / accum_angle;
1874 float accum_shell = 0.0f;
1875 float accum_angle = 0.0f;
1876 int tot_sel = 0, tot = 0;
1882 accum_angle += face_angle;
1888 if (accum_angle != 0.0f) {
1889 return accum_shell / accum_angle;
1892 if (tot != 0 && tot_sel == 0) {
1929 float shortest_len = FLT_MAX;
1938 if (len_sq <= shortest_len) {
1939 shortest_loop = l_iter;
1940 shortest_len = len_sq;
1942 }
while ((l_iter = l_iter->
next) != l_first);
1944 return shortest_loop;
1953 float len_max_sq = 0.0f;
1962 if (len_sq >= len_max_sq) {
1963 longest_loop = l_iter;
1964 len_max_sq = len_sq;
1966 }
while ((l_iter = l_iter->
next) != l_first);
1968 return longest_loop;
1987 if (
e->v1 == v_b ||
e->v2 == v_b) {
2005 if ((e_a = v_a->
e) && (e_b = v_b->
e)) {
2006 BMEdge *e_a_iter = e_a, *e_b_iter = e_b;
2052 BMLoop *l_iter, *l_first;
2053 l_iter = l_first =
e->l;
2058 }
while ((l_iter = l_iter->
radial_next) != l_first);
2073 BMEdge *e_iter, *e_first;
2074 e_iter = e_first = varr[0]->
e;
2080 BMLoop *l_iter_radial, *l_first_radial;
2081 l_iter_radial = l_first_radial = e_iter->
l;
2084 if ((l_iter_radial->
v == varr[0]) && (l_iter_radial->
f->
len ==
len)) {
2089 if (l_iter_radial->
next->
v == varr[1]) {
2092 if (l_walk->
v != varr[i_walk]) {
2095 }
while ((
void)(l_walk = l_walk->
next), ++i_walk !=
len);
2097 else if (l_iter_radial->
prev->
v == varr[1]) {
2100 if (l_walk->
v != varr[i_walk]) {
2103 }
while ((
void)(l_walk = l_walk->
prev), ++i_walk !=
len);
2106 if (i_walk ==
len) {
2107 return l_iter_radial->
f;
2110 }
while ((l_iter_radial = l_iter_radial->
radial_next) != l_first_radial);
2125 if (l_iter->f->len == l_first->
f->
len) {
2126 if (l_iter->v == l_first->
v) {
2127 BMLoop *l_a = l_first, *
l_b = l_iter, *l_b_init = l_iter;
2129 if (l_a->
e !=
l_b->
e) {
2132 }
while (((
void)(l_a = l_a->
next), (
l_b =
l_b->
next)) != l_b_init);
2133 if (
l_b == l_b_init) {
2138 BMLoop *l_a = l_first, *
l_b = l_iter, *l_b_init = l_iter;
2140 if (l_a->
e !=
l_b->
e) {
2143 }
while (((
void)(l_a = l_a->
prev), (
l_b =
l_b->
next)) != l_b_init);
2144 if (
l_b == l_b_init) {
2178 for (i = 0; i <
len; i++) {
2196 for (i = 0; i <
len; i++) {
2205 for (i = 0; i <
len; i++) {
2237 for (i = 0; i <
len; i++) {
2245 int tot_face_tag = 0;
2252 if (tot_face_tag != 2) {
2266 for (i = 0; i <
len; i++) {
2311 for (i = 0; i <
len; i++) {
2318 for (i = 0; i <
len; i++) {
2332 for (; f_lnk; f_lnk = f_lnk->
next) {
2351 bool is_init =
false;
2352 bool is_overlap =
false;
2357 for (
int i = 0; i <
len; i++) {
2365 for (
int i = 0; i <
len; i++) {
2369 BMLoop *l_iter, *l_first;
2371 if (is_init ==
false) {
2373 for (
int j = 0; j <
len; j++) {
2385 }
while ((l_iter = l_iter->
next) != l_first);
2397 if (is_init ==
true) {
2398 for (
int i = 0; i <
len; i++) {
2403 for (; f_lnk; f_lnk = f_lnk->
next) {
2449 BMLoop *l_iter, *l_first;
2451 l_iter = l_first =
e->l;
2458 }
while ((l_iter = l_iter->
radial_next) != l_first);
2467 BMLoop *l_iter, *l_first;
2469 l_iter = l_first =
e->l;
2474 }
while ((l_iter = l_iter->
radial_next) != l_first);
2496 }
while ((l_iter = l_iter->
next) != l_first);
2510 }
while ((l_iter = l_iter->
next) != l_first);
2517 BMLoop *l_iter, *l_first;
2519 l_iter = l_first =
e->l;
2524 }
while ((l_iter = l_iter->
radial_next) != l_first);
2535 const float eps = 0.0001f;
2549 const int tottri = f->
len - 2;
2556 for (
int j = 0; j < tottri; j++) {
2557 const float *p1 = loops[index[j][0]]->
v->
co;
2558 const float *p2 = loops[index[j][1]]->
v->
co;
2559 const float *p3 = loops[index[j][2]]->
v->
co;
2574 return (1.0 / 6.0) * vol;
2587 if (is_signed ==
false) {
2612 int *r_groups_array,
2613 int (**r_group_index)[2],
2617 const char hflag_test,
2618 const char htype_step)
2621 int group_index_len = 1;
2623 int group_index_len = 32;
2626 int(*group_index)[2] =
MEM_mallocN(
sizeof(*group_index) * group_index_len, __func__);
2628 int *group_array = r_groups_array;
2663 stack =
MEM_mallocN(
sizeof(*stack) * tot_faces, __func__);
2665 while (tot_touch != tot_faces) {
2686 if (group_index_len == group_curr) {
2687 group_index_len *= 2;
2688 group_index =
MEM_reallocN(group_index,
sizeof(*group_index) * group_index_len);
2691 group_item = group_index[group_curr];
2696 BMLoop *l_iter, *l_first;
2709 if ((l_radial_iter != l_iter) && ((filter_fn ==
NULL) || filter_fn(l_iter,
user_data))) {
2711 if ((filter_pair_fn ==
NULL) || filter_pair_fn(l_iter, l_radial_iter,
user_data)) {
2712 BMFace *f_other = l_radial_iter->
f;
2718 }
while ((l_radial_iter = l_radial_iter->
radial_next) != l_iter);
2720 }
while ((l_iter = l_iter->
next) != l_first);
2731 if ((filter_pair_fn ==
NULL) || filter_pair_fn(l_iter, l_other,
user_data)) {
2740 }
while ((l_iter = l_iter->
next) != l_first);
2750 group_index =
MEM_reallocN(group_index,
sizeof(*group_index) * group_curr);
2751 *r_group_index = group_index;
2776 int *r_groups_array,
2777 int (**r_group_index)[2],
2780 const char hflag_test)
2783 int group_index_len = 1;
2785 int group_index_len = 32;
2788 int(*group_index)[2] =
MEM_mallocN(
sizeof(*group_index) * group_index_len, __func__);
2790 int *group_array = r_groups_array;
2823 stack =
MEM_mallocN(
sizeof(*stack) * tot_edges, __func__);
2825 while (tot_touch != tot_edges) {
2846 if (group_index_len == group_curr) {
2847 group_index_len *= 2;
2848 group_index =
MEM_reallocN(group_index,
sizeof(*group_index) * group_index_len);
2851 group_item = group_index[group_curr];
2886 group_index =
MEM_reallocN(group_index,
sizeof(*group_index) * group_curr);
2887 *r_group_index = group_index;
2937 if (v_stack_init->
e !=
NULL) {
2938 BMVert *v_iter = v_stack_init;
2940 BMEdge *e_iter, *e_first;
2941 e_iter = e_first = v_iter->
e;
2947 if (e_iter->
l !=
NULL) {
2948 BMLoop *l_iter, *l_first;
2949 l_iter = l_first = e_iter->
l;
2955 }
while ((l_iter = l_iter->
radial_next) != l_first);
2988 val = 3.0f * val * val - 2.0f * val * val * val;
2991 val =
sqrtf(2.0f * val - val * val);
3002 val = val * (2.0f - val);
typedef float(TangentPoint)[2]
CustomData interface, see also DNA_customdata_types.h.
bool CustomData_data_equals(int type, const void *data1, const void *data2)
#define BLI_array_alloca(arr, realsize)
#define BLI_linklist_prepend_alloca(listp, ptr)
MINLINE float shell_v3v3_normalized_to_dist(const float a[3], const float b[3])
float dist_signed_squared_to_plane_v3(const float p[3], const float plane[4])
float dist_signed_squared_to_corner_v3v3v3(const float p[3], const float v1[3], const float v2[3], const float v3[3], const float axis_ref[3])
void mul_transposed_m3_v3(const float M[3][3], float r[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
MINLINE bool compare_v3v3(const float a[3], const float b[3], const float limit) ATTR_WARN_UNUSED_RESULT
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 sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE double dot_v3v3_db(const double a[3], const double b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE bool is_zero_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
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 cross_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void negate_v3(float r[3])
MINLINE void copy_v3db_v3fl(double r[3], const float a[3])
MINLINE void cross_v3_v3v3_db(double r[3], const double a[3], const double b[3])
MINLINE bool equals_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
float angle_v3v3v3(const float a[3], const float b[3], const float c[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
float angle_normalized_v3v3(const float v1[3], const float v2[3]) ATTR_WARN_UNUSED_RESULT
#define UNUSED_VARS_NDEBUG(...)
#define STACK_PUSH(stack, val)
#define STACK_DECLARE(stack)
#define STACK_INIT(stack, tot)
#define STACK_SIZE(stack)
#define STACK_PUSH_RET(stack)
_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 const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
bool(* BMVertFilterFunc)(const BMVert *, void *user_data)
#define BM_DISK_EDGE_NEXT(e, v)
bool(* BMLoopFilterFunc)(const BMLoop *, void *user_data)
#define BM_FACE_FIRST_LOOP(p)
bool(* BMLoopPairFilterFunc)(const BMLoop *, const BMLoop *, void *user_data)
#define BM_ELEM_CD_GET_VOID_P(ele, offset)
bool BM_verts_from_edges(BMVert **vert_arr, BMEdge **edge_arr, const int len)
#define BM_elem_index_get(ele)
#define BM_elem_flag_disable(ele, hflag)
#define BM_elem_index_set(ele, index)
#define BM_elem_flag_test(ele, hflag)
#define BM_elem_flag_enable(ele, hflag)
#define BM_ITER_ELEM(ele, iter, data, itype)
#define BM_ITER_MESH(ele, iter, bm, itype)
#define BM_ITER_MESH_INDEX(ele, iter, bm, itype, indexvar)
#define BM_ITER_ELEM_INDEX(ele, iter, data, itype, indexvar)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_mesh_elem_hflag_disable_all(BMesh *bm, const char htype, const char hflag, const bool respecthide)
float BM_face_calc_normal_subset(const BMLoop *l_first, const BMLoop *l_last, float r_no[3])
float BM_face_calc_normal(const BMFace *f, float r_no[3])
BMESH UPDATE FACE NORMAL.
void BM_face_calc_tessellation(const BMFace *f, const bool use_fixed_quad, BMLoop **r_loops, uint(*r_index)[3])
#define BM_ELEM_API_FLAG_DISABLE(element, f)
#define BM_ELEM_API_FLAG_TEST(element, f)
int bmesh_disk_count_at_most(const BMVert *v, const int count_max)
#define BM_ELEM_API_FLAG_ENABLE(element, f)
int bmesh_disk_count(const BMVert *v)
BMLoop * BM_face_other_edge_loop(BMFace *f, BMEdge *e, BMVert *v)
Other Loop in Face Sharing an Edge.
bool BM_face_share_face_check(BMFace *f_a, BMFace *f_b)
float BM_vert_calc_edge_angle(const BMVert *v)
int BM_mesh_calc_edge_groups_as_arrays(BMesh *bm, BMVert **verts, BMEdge **edges, BMFace **faces, int(**r_groups)[3])
BMEdge * BM_edge_exists(BMVert *v_a, BMVert *v_b)
float BM_loop_calc_face_normal_safe(const BMLoop *l, float r_normal[3])
int BM_edge_face_count_at_most(const BMEdge *e, const int count_max)
float BM_loop_point_side_of_loop_test(const BMLoop *l, const float co[3])
void BM_edge_ordered_verts_ex(const BMEdge *edge, BMVert **r_v1, BMVert **r_v2, const BMLoop *edge_loop)
BMLoop * BM_vert_find_first_loop_visible(BMVert *v)
bool BM_vert_is_wire(const BMVert *v)
bool BM_edge_is_contiguous_loop_cd(const BMEdge *e, const int cd_loop_type, const int cd_loop_offset)
bool BM_edge_is_all_face_flag_test(const BMEdge *e, const char hflag, const bool respect_hide)
BMLoop * BM_loop_find_next_nodouble(BMLoop *l, BMLoop *l_stop, const float eps_sq)
void BM_edge_ordered_verts(const BMEdge *edge, BMVert **r_v1, BMVert **r_v2)
bool BM_edge_share_quad_check(BMEdge *e1, BMEdge *e2)
int BM_vert_edge_count_at_most(const BMVert *v, const int count_max)
BMFace * BM_edge_pair_share_face_by_len(BMEdge *e_a, BMEdge *e_b, BMLoop **r_l_a, BMLoop **r_l_b, const bool allow_adjacent)
BMLoop * BM_face_other_vert_loop(BMFace *f, BMVert *v_prev, BMVert *v)
Other Loop in Face Sharing a Vertex.
BMEdge * BM_edge_find_double(BMEdge *e)
float BM_edge_calc_face_angle(const BMEdge *e)
bool BM_face_exists_multi(BMVert **varr, BMEdge **earr, int len)
bool BM_vert_pair_share_face_check(BMVert *v_a, BMVert *v_b)
int BM_mesh_calc_face_groups(BMesh *bm, int *r_groups_array, int(**r_group_index)[2], BMLoopFilterFunc filter_fn, BMLoopPairFilterFunc filter_pair_fn, void *user_data, const char hflag_test, const char htype_step)
float BM_vert_calc_shell_factor_ex(const BMVert *v, const float no[3], const char hflag)
bool BM_edge_in_face(const BMEdge *e, const BMFace *f)
BMEdge * BM_vert_other_disk_edge(BMVert *v, BMEdge *e_first)
bool BM_face_is_any_edge_flag_test(const BMFace *f, const char hflag)
float BM_loop_calc_face_normal_safe_vcos(const BMLoop *l, const float normal_fallback[3], float const (*vertexCos)[3], float r_normal[3])
BMLoop * BM_vert_find_first_loop(BMVert *v)
bool BM_edge_is_any_face_len_test(const BMEdge *e, const int len)
bool BM_face_exists_multi_edge(BMEdge **earr, int len)
bool BM_loop_share_edge_check(BMLoop *l_a, BMLoop *l_b)
bool BM_face_is_any_vert_flag_test(const BMFace *f, const char hflag)
float BM_vert_calc_median_tagged_edge_length(const BMVert *v)
bool BM_face_share_edge_check(BMFace *f1, BMFace *f2)
static int bm_loop_region_count__recursive(BMEdge *e, BMVert *v)
bool BM_vert_is_manifold_region(const BMVert *v)
void BM_loop_calc_face_tangent(const BMLoop *l, float r_tangent[3])
BM_loop_calc_face_tangent.
BMFace * BM_face_find_double(BMFace *f)
bool BM_edge_loop_pair(BMEdge *e, BMLoop **r_la, BMLoop **r_lb)
bool BM_vert_is_all_edge_flag_test(const BMVert *v, const char hflag, const bool respect_hide)
bool BM_vert_is_manifold(const BMVert *v)
float BM_loop_calc_face_normal_safe_vcos_ex(const BMLoop *l, const float normal_fallback[3], float const (*vertexCos)[3], const float epsilon_sq, float r_normal[3])
int BM_face_share_vert_count(BMFace *f_a, BMFace *f_b)
int BM_face_share_edge_count(BMFace *f_a, BMFace *f_b)
bool BM_face_share_vert_check(BMFace *f_a, BMFace *f_b)
float BM_edge_calc_face_angle_with_imat3_ex(const BMEdge *e, const float imat3[3][3], const float fallback)
BMESH EDGE/FACE ANGLE.
float BM_edge_calc_length_squared(const BMEdge *e)
bool BM_edge_face_pair(BMEdge *e, BMFace **r_fa, BMFace **r_fb)
float BM_edge_calc_face_angle_signed(const BMEdge *e)
float BM_loop_calc_face_normal_safe_ex(const BMLoop *l, const float epsilon_sq, float r_normal[3])
BM_loop_calc_face_normal.
BMLoop * BM_loop_find_prev_nodouble(BMLoop *l, BMLoop *l_stop, const float eps_sq)
float bmesh_subd_falloff_calc(const int falloff, float val)
bool BM_edge_share_vert_check(BMEdge *e1, BMEdge *e2)
float BM_vert_calc_shell_factor(const BMVert *v)
BMLoop * BM_face_edge_share_loop(BMFace *f, BMEdge *e)
Return the Loop Shared by Face and Edge.
BMFace * BM_vert_pair_shared_face_cb(BMVert *v_a, BMVert *v_b, const bool allow_adjacent, bool(*callback)(BMFace *, BMLoop *, BMLoop *, void *userdata), void *user_data, BMLoop **r_l_a, BMLoop **r_l_b)
bool BM_face_is_normal_valid(const BMFace *f)
bool BM_vert_edge_pair(BMVert *v, BMEdge **r_e_a, BMEdge **r_e_b)
int BM_vert_face_count(const BMVert *v)
int BM_edge_face_count(const BMEdge *e)
float BM_vert_calc_edge_angle_ex(const BMVert *v, const float fallback)
BMESH VERT/EDGE ANGLE.
bool BM_verts_in_face(BMVert **varr, int len, BMFace *f)
BMVert * BM_edge_share_vert(BMEdge *e1, BMEdge *e2)
static float bm_face_calc_split_dot(BMLoop *l_a, BMLoop *l_b)
void BM_loop_calc_face_direction(const BMLoop *l, float r_dir[3])
BM_loop_calc_face_direction.
BMFace * BM_face_exists(BMVert **varr, int len)
bool BM_edge_share_face_check(BMEdge *e1, BMEdge *e2)
int BM_loop_region_loops_count(BMLoop *l)
BMLoop * BM_loop_other_vert_loop(BMLoop *l, BMVert *v)
Other Loop in Face Sharing a Vert.
int BM_mesh_calc_edge_groups(BMesh *bm, int *r_groups_array, int(**r_group_index)[2], BMVertFilterFunc filter_fn, void *user_data, const char hflag_test)
int BM_loop_region_loops_count_at_most(BMLoop *l, int *r_loop_total)
BMLoop * BM_edge_vert_share_loop(BMLoop *l, BMVert *v)
Return the Loop Shared by Edge and Vert.
bool BM_vert_in_face(BMVert *v, BMFace *f)
bool BM_edge_is_any_vert_flag_test(const BMEdge *e, const char hflag)
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)
BMLoop * BM_loop_other_vert_loop_by_edge(BMLoop *l, BMEdge *e)
float BM_edge_calc_length(const BMEdge *e)
BMFace * BM_face_exists_overlap(BMVert **varr, const int len)
float BM_edge_calc_face_angle_ex(const BMEdge *e, const float fallback)
BMESH EDGE/FACE ANGLE.
int BM_vert_edge_count(const BMVert *v)
BMLoop * BM_face_find_shortest_loop(BMFace *f)
bool BM_loop_is_convex(const BMLoop *l)
BMLoop * BM_edge_other_loop(BMEdge *e, BMLoop *l)
double BM_mesh_calc_volume(BMesh *bm, bool is_signed)
BMFace * BM_vert_pair_share_face_by_len(BMVert *v_a, BMVert *v_b, BMLoop **r_l_a, BMLoop **r_l_b, const bool allow_adjacent)
static int bm_loop_region_count__clear(BMLoop *l)
BMLoop * BM_edge_find_first_loop_visible(BMEdge *e)
float BM_edge_calc_face_angle_with_imat3(const BMEdge *e, const float imat3[3][3])
float BM_loop_calc_face_angle(const BMLoop *l)
BMLoop * BM_vert_step_fan_loop(BMLoop *l, BMEdge **e_step)
bool BM_vert_face_check(const BMVert *v)
static double bm_mesh_calc_volume_face(const BMFace *f)
bool BM_vert_is_edge_pair(const BMVert *v)
int BM_vert_face_count_at_most(const BMVert *v, int count_max)
float BM_edge_calc_face_angle_signed_ex(const BMEdge *e, const float fallback)
BMESH EDGE/FACE ANGLE.
bool BM_vert_is_edge_pair_manifold(const BMVert *v)
int BM_face_share_face_count(BMFace *f_a, BMFace *f_b)
BMLoop * BM_loop_other_edge_loop(BMLoop *l, BMVert *v)
void BM_edge_calc_face_tangent(const BMEdge *e, const BMLoop *e_loop, float r_tangent[3])
BMESH EDGE/FACE TANGENT.
float BM_loop_calc_face_normal(const BMLoop *l, float r_normal[3])
BM_loop_calc_face_normal.
bool BM_vert_is_boundary(const BMVert *v)
int BM_vert_edge_count_nonwire(const BMVert *v)
bool BM_edge_is_convex(const BMEdge *e)
bool BM_vert_is_all_face_flag_test(const BMVert *v, const char hflag, const bool respect_hide)
int BM_verts_in_face_count(BMVert **varr, int len, BMFace *f)
BMLoop * BM_face_find_longest_loop(BMFace *f)
bool BM_edge_is_any_face_flag_test(const BMEdge *e, const char hflag)
BMLoop * BM_face_vert_share_loop(BMFace *f, BMVert *v)
Return the Loop Shared by Face and Vertex.
bool BM_face_exists_overlap_subset(BMVert **varr, const int len)
float BM_loop_point_side_of_edge_test(const BMLoop *l, const float co[3])
bool BM_vert_pair_share_face_check_cb(BMVert *v_a, BMVert *v_b, bool(*test_fn)(BMFace *, void *user_data), void *user_data)
BLI_INLINE bool BM_edge_is_manifold(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
BLI_INLINE bool BM_edge_is_boundary(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
BLI_INLINE bool BM_loop_is_adjacent(const BMLoop *l_a, const BMLoop *l_b) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
BLI_INLINE BMVert * BM_edge_other_vert(BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
BLI_INLINE bool BM_vert_in_edge(const BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMLoop * l_b
ATTR_WARN_UNUSED_RESULT const BMVert * v
BMLoop * bmesh_disk_faceloop_find_first_visible(const BMEdge *e, const BMVert *v)
BMLoop * bmesh_disk_faceloop_find_first(const BMEdge *e, const BMVert *v)
int bmesh_disk_facevert_count(const BMVert *v)
DISK COUNT FACE VERT.
int bmesh_disk_facevert_count_at_most(const BMVert *v, const int count_max)
BLI_INLINE BMEdge * bmesh_disk_edge_next(const BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
SIMD_FORCE_INLINE btScalar length(const btQuaternion &q)
Return the length of a quaternion.
SIMD_FORCE_INLINE btScalar angle(const btVector3 &v) const
Return the angle between this and another vector.
DEGForeachIDComponentCallback callback
void(* MEM_freeN)(void *vmemh)
void *(* MEM_mallocN)(size_t len, const char *str)
struct BMLoop * radial_next
__forceinline avxf cross(const avxf &a, const avxf &b)
ccl_device_inline float dot(const float2 &a, const float2 &b)
ccl_device_inline float2 fabs(const float2 &a)