/* connects face with smallest len, which I think should always be correct for * edge subdivision */ static BMEdge *connect_smallest_face(BMesh *bm, BMVert *v1, BMVert *v2, BMFace **r_f_new) { BMIter iter, iter2; BMVert *v; BMLoop *l_new; BMFace *f, *f_cur = NULL; /* this isn't the best thing in the world. it doesn't handle cases where there's * multiple faces yet. that might require a convexity test to figure out which * face is "best" and who knows what for non-manifold conditions. */ for (f = BM_iter_new(&iter, bm, BM_FACES_OF_VERT, v1); f; f = BM_iter_step(&iter)) { for (v = BM_iter_new(&iter2, bm, BM_VERTS_OF_FACE, f); v; v = BM_iter_step(&iter2)) { if (v == v2) { if (!f_cur || f->len < f_cur->len) f_cur = f; } } } if (f_cur) { f = BM_face_split(bm, f_cur, v1, v2, &l_new, NULL, false); if (r_f_new) *r_f_new = f; return l_new ? l_new->e : NULL; } return NULL; }
/** * \brief Mesh Iter Flag Count * * Counts how many flagged / unflagged items are found in this mesh. */ int BM_iter_mesh_count_flag(const char itype, BMesh *bm, const char hflag, const bool value) { BMIter iter; BMElem *ele; int count = 0; for (ele = BM_iter_new(&iter, bm, itype, NULL); ele; ele = BM_iter_step(&iter)) { if (BM_elem_flag_test_bool(ele, hflag) == value) { count++; } } return count; }
/** * \brief Elem Iter Flag Count * * Counts how many flagged / unflagged items are found in this element. */ int BM_iter_elem_count_flag(const char itype, void *data, const char hflag, const bool value) { BMIter iter; BMElem *ele; int count = 0; for (ele = BM_iter_new(&iter, NULL, itype, data); ele; ele = BM_iter_step(&iter)) { if (BM_elem_flag_test_bool(ele, hflag) == value) { count++; } } return count; }
/** * \brief Iterator as Array * * Sometimes its convenient to get the iterator as an array * to avoid multiple calls to #BM_iter_at_index. */ int BM_iter_as_array(BMesh *bm, const char itype, void *data, void **array, const int len) { int i = 0; /* sanity check */ if (len > 0) { BMIter iter; void *ele; for (ele = BM_iter_new(&iter, bm, itype, data); ele; ele = BM_iter_step(&iter)) { array[i] = ele; i++; if (i == len) { return len; } } } return i; }
/** * \note Use #BM_vert_at_index / #BM_edge_at_index / #BM_face_at_index for mesh arrays. */ void *BM_iter_at_index(BMesh *bm, const char itype, void *data, int index) { BMIter iter; void *val; int i; /* sanity check */ if (index < 0) { return NULL; } val = BM_iter_new(&iter, bm, itype, data); i = 0; while (i < index) { val = BM_iter_step(&iter); i++; } return val; }