46 const float *v_prev = l_first->
prev->
v->
co;
47 const float *v_curr = l_first->
v->
co;
55 l_iter = l_iter->
next;
57 v_curr = l_iter->
v->
co;
59 }
while (l_iter != l_first);
85 l_iter = l_iter->
next;
88 }
while (l_iter != l_first);
99 const BMLoop *l_first, *l_iter;
107 }
while ((l_iter = l_iter->
next) != l_first);
112 const bool use_fixed_quad,
120 *r_loops++ = (l_iter = l_first);
121 *r_loops++ = (l_iter = l_iter->
next);
122 *r_loops++ = (l_iter->
next);
128 else if (f->
len == 4 && use_fixed_quad) {
129 *r_loops++ = (l_iter = l_first);
130 *r_loops++ = (l_iter = l_iter->
next);
131 *r_loops++ = (l_iter = l_iter->
next);
132 *r_loops++ = (l_iter->
next);
143 float axis_mat[3][3];
155 }
while ((l_iter = l_iter->
next) != l_first);
173 const int tottri = f->
len - 2;
178 float area_best = -1.0f;
182 for (j = 0; j < tottri; j++) {
183 const float *p1 = loops[index[j][0]]->v->co;
184 const float *p2 = loops[index[j][1]]->v->co;
185 const float *p3 = loops[index[j][2]]->v->co;
187 if (area > area_best) {
194 ltri, loops[index[j_best][0]], loops[index[j_best][1]], loops[index[j_best][2]]);
203 const BMLoop *l_iter, *l_first;
210 }
while ((l_iter = l_iter->
next) != l_first);
217 const BMLoop *l_iter, *l_first;
229 }
while ((l_iter = l_iter->
next) != l_first);
236 const BMLoop *l_iter, *l_first;
245 cross += (luv_next[0] - luv[0]) * (luv_next[1] + luv[1]);
246 }
while ((l_iter = l_iter->
next) != l_first);
257 const BMLoop *l_iter, *l_first;
258 float perimeter = 0.0f;
263 }
while ((l_iter = l_iter->
next) != l_first);
270 const BMLoop *l_iter, *l_first;
272 float perimeter = 0.0f;
281 }
while ((l_iter = l_iter->
next) != l_first);
297 for (
int i_prev = 1, i_curr = 2, i_next = 0; i_next < 3; i_prev = i_curr, i_curr = i_next++) {
298 const float *co =
verts[i_curr]->co;
299 const float *co_other[2] = {
verts[i_prev]->co,
verts[i_next]->co};
304 float proj_pair[2][3];
310 const float lens[3] = {
315 const float difs[3] = {
316 fabsf(lens[1] - lens[2]),
317 fabsf(lens[2] - lens[0]),
318 fabsf(lens[0] - lens[1]),
322 int order[3] = {0, 1, 2};
341 const float *v_a =
verts[index]->co;
342 const float *v_b =
verts[(index + 1) % 3]->co;
343 const float *v_other =
verts[(index + 2) % 3]->co;
369 else if (f->
len == 4) {
372 float vec[3], vec_a[3], vec_b[3];
391 BMLoop *l_long_other =
nullptr;
393 float len_max_sq = 0.0f;
394 float vec_a[3], vec_b[3];
401 if (len_sq >= len_max_sq) {
402 l_long_other = l_iter;
405 }
while ((l_iter = l_iter->
prev) != l_last);
430 float dist_max_sq = 0.0f;
436 float co_other[3], vec[3];
438 co_other, l_iter->
v->
co, l_iter_other->
v->
co, l_iter_other->
next->
v->
co);
442 if (dist_sq > dist_max_sq) {
443 dist_max_sq = dist_sq;
446 }
while ((l_iter_other = l_iter_other->
next) != l_iter_last);
447 }
while ((l_iter = l_iter->
next) != l_first);
462 float dist_max_sq = 0.0f;
470 if (dist_sq > dist_max_sq) {
471 dist_max_sq = dist_sq;
474 }
while ((l_iter_other = l_iter_other->
next) != l_iter);
475 }
while ((l_iter = l_iter->
next) != l_first);
488 else if (f->
len == 4) {
500 const BMLoop *l_iter, *l_first;
504 }
while ((l_iter = l_iter->
next) != l_first);
509 const BMLoop *l_iter, *l_first;
510 float min[3], max[3];
517 }
while ((l_iter = l_iter->
next) != l_first);
531 const BMLoop *l_iter, *l_first;
532 float min[3], max[3];
539 }
while ((l_iter = l_iter->
next) != l_first);
546 const BMLoop *l_iter, *l_first;
553 }
while ((l_iter = l_iter->
next) != l_first);
570 const float w = (w_curr + w_prev);
574 }
while ((l_iter = l_iter->
next) != l_first);
590 for (i = 0; i < nverts; i++) {
611 float vec1[3], vec2[3], fac;
724 const float *co4 = (
l->
next)->
v->
co;
731 const float *co3 = (
l->
next)->
v->
co;
780 BMVert **varr,
int varr_len,
float r_normal[3],
float r_center[3],
int *r_index_tangent)
782 const float varr_len_inv = 1.0f /
float(varr_len);
785 float center[3] = {0.0f, 0.0f, 0.0f};
786 for (
int i = 0; i < varr_len; i++) {
792 const float *co_a =
nullptr;
794 float dist_sq_max = -1.0f;
795 for (
int i = 0; i < varr_len; i++) {
797 if (!(dist_sq_test <= dist_sq_max)) {
800 dist_sq_max = dist_sq_test;
809 const float *co_b =
nullptr;
810 float dir_b[3] = {0.0f, 0.0f, 0.0f};
812 float dist_sq_max = -1.0f;
813 for (
int i = 0; i < varr_len; i++) {
814 if (varr[i]->co == co_a) {
821 if (!(dist_sq_test <= dist_sq_max)) {
823 dist_sq_max = dist_sq_test;
837 const float *co_a_opposite =
nullptr;
838 const float *co_b_opposite =
nullptr;
843 for (
int i = 0; i < varr_len; i++) {
844 const float *co_test = varr[i]->
co;
847 if (co_test != co_a) {
848 dot_test =
dot_v3v3(dir_a, co_test);
849 if (dot_test < dot_a_min) {
850 dot_a_min = dot_test;
851 co_a_opposite = co_test;
855 if (co_test != co_b) {
856 dot_test =
dot_v3v3(dir_b, co_test);
857 if (dot_test < dot_b_min) {
858 dot_b_min = dot_test;
859 co_b_opposite = co_test;
865 normal_quad_v3(r_normal, co_a, co_b, co_a_opposite, co_b_opposite);
869 if (r_center !=
nullptr) {
872 if (r_index_tangent !=
nullptr) {
873 *r_index_tangent = co_a_index;
884 const float *v_prev, *v_curr;
887 const BMLoop *l_iter = l_first;
892 v_prev = l_last->
v->
co;
894 v_curr = l_iter->
v->
co;
897 }
while ((l_iter = l_iter->
next) != l_term);
916 const int cd_loop_mdisp_offset,
917 const bool use_loop_mdisp_flip)
931 float axis_mat[3][3];
954 int *r_faces_new_tot,
956 int *r_edges_new_tot,
958 const int quad_method,
959 const int ngon_method,
977 BLI_assert((r_faces_new ==
nullptr) == (r_faces_new_tot ==
nullptr));
984 const int totfilltri = f->
len - 2;
985 const int last_tri = f->
len - 3;
997 switch (quad_method) {
1004 l_v1 = l_first->
next;
1005 l_v2 = l_first->
prev;
1015 l_v1 = l_first->
next;
1017 l_v3 = l_first->
prev;
1024 split_24 = ((d2 - d1) > 0.0f);
1030 split_24 = ((d2 - d1) < 0.0f);
1036 if (
UNLIKELY(flip_flag & (1 << 0))) {
1039 else if (
UNLIKELY(flip_flag & (1 << 1))) {
1062 loops[1] = l_v1->
next;
1064 loops[3] = l_v2->
next;
1071 float axis_mat[3][3];
1090 if (cd_loop_mdisp_offset != -1) {
1095 for (i = 0; i < totfilltri; i++) {
1096 BMLoop *ltri[3] = {loops[tris[i][0]], loops[tris[i][1]], loops[tris[i][2]]};
1098 BMVert *v_tri[3] = {ltri[0]->
v, ltri[1]->
v, ltri[2]->
v};
1114 }
while ((l_iter = l_iter->
radial_next) != l_new);
1123 if (i != last_tri) {
1128 r_faces_new[nf_i++] = f_new;
1132 if (use_tag || r_edges_new) {
1136 l_iter = l_first = l_new;
1141 bool is_new_edge = (l_iter == l_iter->
radial_next);
1148 r_edges_new[ne_i++] =
e;
1152 }
while ((l_iter = l_iter->
next) != l_first);
1155 if (cd_loop_mdisp_offset != -1) {
1156 float f_new_center[3];
1171 if (r_faces_new_tot) {
1172 *r_faces_new_tot = nf_i;
1175 if (r_edges_new_tot) {
1176 *r_edges_new_tot = ne_i;
1183 float center[2] = {0.0f, 0.0f};
1184 float axis_mat[3][3];
1212 out[0] =
max_ff(out[0], projverts[i][0]);
1213 out[1] =
max_ff(out[1], projverts[i][1]);
1220 for (i = 0; i <
len; i++) {
1226 for (i = 0; i <
len; i++) {
1228 mid_v2_v2v2(mid, edgeverts[i][0], edgeverts[i][1]);
1232 for (j = 0, j_prev = f->
len - 1; j < f->
len; j_prev = j++) {
1233 const float *f_edge[2] = {projverts[j_prev], projverts[j]};
1239 if (isect % 2 == 0) {
1240 loops[i][0] =
nullptr;
1244#define EDGE_SHARE_VERT(e1, e2) \
1245 (ELEM((e1)[0], (e2)[0], (e2)[1]) || ELEM((e1)[1], (e2)[0], (e2)[1]))
1248 for (i = 0, i_prev = f->
len - 1; i < f->
len; i_prev = i++) {
1249 const float *f_edge[2] = {projverts[i_prev], projverts[i]};
1250 for (j = 0; j <
len; j++) {
1251 if ((loops[j][0] !=
nullptr) && !
EDGE_SHARE_VERT(f_edge, edgeverts[j])) {
1253 loops[j][0] =
nullptr;
1260 for (i = 0; i <
len; i++) {
1262 for (j = i + 1; j <
len; j++) {
1263 if ((loops[j][0] !=
nullptr) && !
EDGE_SHARE_VERT(edgeverts[i], edgeverts[j])) {
1267 loops[i][0] =
nullptr;
1275#undef EDGE_SHARE_VERT
1282 for (i = 0; i <
len; i++) {
1283 BMLoop *l_a_dummy, *l_b_dummy;
1285 loops[i][0]->
v, loops[i][1]->
v, &l_a_dummy, &l_b_dummy,
false))
1287 loops[i][0] =
nullptr;
CustomData interface, see also DNA_customdata_types.h.
int CustomData_get_offset(const CustomData *data, eCustomDataType type)
#define BLI_array_alloca(arr, realsize)
void void BLI_linklist_prepend(LinkNode **listp, void *ptr) ATTR_NONNULL(1)
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])
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], unsigned int nr)
float closest_to_line_segment_v3(float r_close[3], const float p[3], const float l1[3], const float l2[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])
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 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])
MINLINE float normalize_v3(float n[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 void BLI_memarena_clear(MemArena *ma) ATTR_NONNULL(1)
void BLI_polyfill_calc(const float(*coords)[2], unsigned int coords_num, int coords_sign, unsigned int(*r_tris)[3])
void BLI_polyfill_calc_arena(const float(*coords)[2], unsigned int coords_num, int coords_sign, unsigned int(*r_tris)[3], struct MemArena *arena)
void BLI_polyfill_beautify(const float(*coords)[2], unsigned int coords_num, 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_LONGEDGE
@ MOD_TRIANGULATE_QUAD_BEAUTY
@ MOD_TRIANGULATE_QUAD_ALTERNATE
@ MOD_TRIANGULATE_NGON_BEAUTY
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_FLOAT_P(ele, offset)
void BM_elem_attrs_copy(BMesh *bm, const BMCustomDataCopyMap &map, const BMVert *src, BMVert *dst)
void bmesh_face_swap_data(BMFace *f_a, BMFace *f_b)
void BM_face_kill(BMesh *bm, BMFace *f)
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 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)
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])
static void bm_face_calc_poly_center_median_vertex_cos(const BMFace *f, float r_cent[3], const blender::Span< blender::float3 > vert_positions)
COMPUTE POLY CENTER (BMFace)
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_face_as_array_vert_quad(BMFace *f, BMVert *r_verts[4])
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])
float BM_face_calc_area_uv_signed(const BMFace *f, int cd_loop_uv_offset)
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])
void BM_face_calc_center_bounds_vcos(const BMesh *bm, const BMFace *f, float r_cent[3], const blender::Span< blender::float3 > vert_positions)
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])
float BM_face_calc_normal_vcos(const BMesh *bm, const BMFace *f, float r_no[3], const Span< float3 > vertexCos)
void BM_face_normal_flip(BMesh *bm, BMFace *f)
void BM_face_calc_tangent_edge(const BMFace *f, float r_tangent[3])
void BM_face_calc_center_median_vcos(const BMesh *bm, const BMFace *f, float r_cent[3], const blender::Span< blender::float3 > vert_positions)
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])
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_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, Heap *pf_heap)
static float bm_face_calc_poly_normal_vertex_cos(const BMFace *f, float r_no[3], const Span< float3 > vertexCos)
COMPUTE POLY NORMAL (BMFace)
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)
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)
BMLoop * BM_face_find_longest_loop(BMFace *f)
float BM_edge_calc_length(const BMEdge *e)
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.
draw_view in_light_buf[] float
ccl_device_inline float cross(const float2 a, const float2 b)
float safe_acos_approx(float x)
struct BMLoop * radial_next