21#define BMW_state_remove_r(walker, owalk) \
23 memcpy(owalk, BMW_current_state(walker), sizeof(*(owalk))); \
24 BMW_state_remove(walker); \
168 for (
i = 0;
i < 2;
i++) {
169 v =
i ?
e->v2 :
e->v1;
183 bool restrictpass =
true;
196 if (!walker->visibility_flag ||
197 (walker->visibility_flag &&
210 newState->base = v_old;
211 newState->curedge = curedge;
310 e_edj_pair[0] =
l->e;
311 e_edj_pair[1] =
l->prev->e;
313 for (
i = 0;
i < 2;
i++) {
318 l_iter = l_first =
e->l;
320 BMLoop *l_radial = (l_iter->
v ==
l->v) ? l_iter : l_iter->
next;
325 }
while ((l_iter = l_iter->
radial_next) != l_first);
446 l_iter = l_first =
e->l;
450 }
while ((l_iter = l_iter->
radial_next) != l_first);
549 l_iter = l_first =
e->l;
556 }
while ((l_iter = l_iter->
radial_next) != l_first);
685 if (BM_loop_is_manifold(
l)) {
775 if (only_manifold && (l_iter->
radial_next != l_iter)) {
782 if (face_count == 3) {
786 }
while ((l_radial_iter = l_radial_iter->
radial_next) != l_iter);
788 if (face_count != 2) {
793 l_radial_iter = l_iter;
794 while ((l_radial_iter = l_radial_iter->
radial_next) != l_iter) {
802 if (f == iwalk->
cur) {
815 }
while ((l_iter = l_iter->
next) != l_first);
853 const int vert_edge_count[2] = {
857 const int vert_face_count[2] = {
939 ((vert_edge_count[0] == 3 && vert_face_count[0] == 3) ||
940 (vert_edge_count[1] == 3 && vert_face_count[1] == 3)))
947 if (f_best ==
nullptr || f_best->
len < f_iter->
len) {
955 lwalk->
f_hub = f_best->
len > 4 ? f_best :
nullptr;
959 lwalk->
f_hub =
nullptr;
963 lwalk->
f_hub =
nullptr;
1008 if (vert_edge_tot == 3) {
1028 else if (
l ==
nullptr) {
1032 for (
int i = 0;
i < 2;
i++) {
1033 v =
i ?
e->v2 :
e->v1;
1061 if (
ELEM(vert_edge_tot, 4, 2)) {
1062 int i_opposite = vert_edge_tot / 2;
1073 }
while (++
i != i_opposite);
1105 (owalk.
is_single ==
false && vert_edge_tot > 2) ||
1168 if (
l->f->len != 4) {
1225 owalk = *(owalk_pt);
1280 if (
l->f->len != 4) {
1326 owalk = *(owalk_pt);
1333#ifdef BMW_EDGERING_NGON
1334 if (lwalk->
l->
f->
len % 2 != 0)
1336 if (lwalk->
l->
f->
len != 4)
1365#ifdef BMW_EDGERING_NGON
1369#define EDGE_CHECK(e) \
1370 (bmw_mask_check_edge(walker, e) && (BM_edge_is_boundary(e) || BM_edge_is_manifold(e)))
1389#ifdef BMW_EDGERING_NGON
1392 i =
len =
l->f->len;
1561 for (
i = 0;
i < 2;
i++) {
1563 BMLoop *l_pivot, *l_radial;
1565 l_pivot =
i ?
l->next :
l;
1567 BMLoop *l_radial_first = l_radial;
1578 if (l_radial->
v != l_pivot->
v) {
1584 l_other = (l_radial->
v != l_pivot->
v) ? l_radial->
next : l_radial;
1594 lwalk->
l = l_radial;
1596 }
while ((l_radial = l_radial->
radial_next) != l_radial_first);
1647 if (BM_loop_is_manifold(
l)) {
1671 for (
int pass = 0; pass < 2; pass++) {
1687 if (l_cur ==
nullptr) {
1690 else if (l_cur->
e != l_next->
e) {
1697 }
while ((
l =
l->radial_next) !=
e->l);
1699 if (l_cur !=
nullptr) {
1704 if (l_cur !=
nullptr) {
1709 lwalk->
cur = l_cur->
e;
CustomData interface, see also DNA_customdata_types.h.
bool CustomData_data_equals(eCustomDataType type, const void *data1, const void *data2)
bool BLI_gset_haskey(const GSet *gs, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_gset_clear(GSet *gs, GSetKeyFreeFP keyfreefp)
void BLI_gset_insert(GSet *gs, void *key)
bool BLI_gset_add(GSet *gs, void *key)
#define BM_DISK_EDGE_NEXT(e, v)
#define BM_FACE_FIRST_LOOP(p)
#define BM_ELEM_CD_GET_VOID_P(ele, offset)
#define BM_elem_flag_test(ele, hflag)
#define BM_ITER_ELEM(ele, iter, data, itype)
BMesh const char void * data
#define BMO_edge_flag_test(bm, e, oflag)
#define BMO_vert_flag_test(bm, e, oflag)
#define BMO_face_flag_test(bm, e, oflag)
BMLoop * BM_loop_other_edge_loop(BMLoop *l, BMVert *v)
bool BM_edge_is_all_face_flag_test(const BMEdge *e, const char hflag, const bool respect_hide)
BMEdge * BM_edge_exists(BMVert *v_a, BMVert *v_b)
int BM_vert_face_count(const BMVert *v)
int BM_edge_face_count(const BMEdge *e)
BMLoop * BM_face_other_vert_loop(BMFace *f, BMVert *v_prev, BMVert *v)
Other Loop in Face Sharing a Vertex.
int BM_vert_edge_count_nonwire(const BMVert *v)
BLI_INLINE bool BM_edge_is_manifold(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
#define BM_edge_face_count_is_equal(e, n)
BLI_INLINE bool BM_edge_is_boundary(const BMEdge *e) 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_edge_is_wire(const BMEdge *e) 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 BMVert * v
BLI_INLINE BMEdge * bmesh_disk_edge_next(const BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void * BMW_state_add(BMWalker *walker)
Add a new Walker State.
void * BMW_current_state(BMWalker *walker)
Current Walker State.
void * BMW_walk(BMWalker *walker)
Main Walking Function.
void BMW_state_remove(BMWalker *walker)
Remove Current Walker State.
static void bmw_FaceLoopWalker_begin(BMWalker *walker, void *data)
static void bmw_VertShellWalker_begin(BMWalker *walker, void *data)
static bool bmw_edge_is_wire(const BMWalker *walker, const BMEdge *e)
static void * bmw_VertShellWalker_yield(BMWalker *walker)
static BMWalker bmw_UVEdgeWalker_Type
static void * bmw_IslandWalker_step_ex(BMWalker *walker, bool only_manifold)
static void bmw_ConnectedVertexWalker_begin(BMWalker *walker, void *data)
static void * bmw_NonManifoldedgeWalker_step(BMWalker *walker)
static void * bmw_IslandboundWalker_yield(BMWalker *walker)
static bool bmw_FaceLoopWalker_edge_begins_loop(BMWalker *walker, BMEdge *e)
static void bmw_FaceShellWalker_begin(BMWalker *walker, void *data)
static bool bmw_FaceLoopWalker_include_face(BMWalker *walker, BMLoop *l)
static void * bmw_LoopShellWalker_step(BMWalker *walker)
static bool bm_edge_is_single(BMEdge *e)
static BMWalker bmw_FaceLoopWalker_Type
static void * bmw_FaceLoopWalker_yield(BMWalker *walker)
static void * bmw_VertShellWalker_step(BMWalker *walker)
static void * bmw_IslandboundWalker_step(BMWalker *walker)
static void bmw_IslandboundWalker_begin(BMWalker *walker, void *data)
static void * bmw_EdgeringWalker_step(BMWalker *walker)
static void * bmw_IslandManifoldWalker_step(BMWalker *walker)
static void * bmw_EdgeLoopWalker_step(BMWalker *walker)
static void bmw_LoopShellWalker_step_impl(BMWalker *walker, BMLoop *l)
static void bmw_IslandWalker_begin(BMWalker *walker, void *data)
static void bmw_EdgeboundaryWalker_begin(BMWalker *walker, void *data)
static BMWalker bmw_ConnectedVertexWalker_Type
static BMWalker bmw_FaceShellWalker_Type
static void * bmw_IslandWalker_step(BMWalker *walker)
static BMWalker bmw_EdgeboundaryWalker_Type
static void bmw_EdgeringWalker_begin(BMWalker *walker, void *data)
static void * bmw_ConnectedVertexWalker_step(BMWalker *walker)
static void bmw_VertShellWalker_visitEdge(BMWalker *walker, BMEdge *e)
static void bmw_LoopShellWalker_visitLoop(BMWalker *walker, BMLoop *l)
static void * bmw_UVEdgeWalker_step(BMWalker *walker)
#define BMW_state_remove_r(walker, owalk)
static void * bmw_EdgeLoopWalker_yield(BMWalker *walker)
static bool bmw_mask_check_edge(BMWalker *walker, BMEdge *e)
static BMWalker bmw_LoopShellWireWalker_Type
static void bmw_NonManifoldedgeWalker_begin(BMWalker *walker, void *data)
static void bmw_LoopShellWalker_visitEdgeWire(BMWalker *walker, BMEdge *e)
static BMLoop * bmw_NonManifoldLoop_find_next_around_vertex(BMLoop *l, BMVert *v, int face_count)
static void bmw_ConnectedVertexWalker_visitVertex(BMWalker *walker, BMVert *v)
static BMWalker bmw_IslandboundWalker_Type
static bool bmw_mask_check_face(BMWalker *walker, BMFace *f)
static void bmw_LoopShellWireWalker_visitVert(BMWalker *walker, BMVert *v, const BMEdge *e_from)
static void * bmw_UVEdgeWalker_yield(BMWalker *walker)
static void bmw_EdgeLoopWalker_begin(BMWalker *walker, void *data)
static BMWalker bmw_EdgeringWalker_Type
static bool bmw_mask_check_vert(BMWalker *walker, BMVert *v)
static void bmw_FaceShellWalker_visitEdge(BMWalker *walker, BMEdge *e)
static void * bmw_FaceLoopWalker_step(BMWalker *walker)
static void * bmw_EdgeboundaryWalker_yield(BMWalker *walker)
static void * bmw_NonManifoldedgeWalker_yield(BMWalker *walker)
static void * bmw_LoopShellWalker_yield(BMWalker *walker)
static void bmw_LoopShellWireWalker_begin(BMWalker *walker, void *data)
static void bmw_UVEdgeWalker_begin(BMWalker *walker, void *data)
static void * bmw_LoopShellWireWalker_step(BMWalker *walker)
static BMWalker bmw_LoopShellWalker_Type
static void * bmw_EdgeboundaryWalker_step(BMWalker *walker)
static void * bmw_ConnectedVertexWalker_yield(BMWalker *walker)
static void * bmw_IslandWalker_yield(BMWalker *walker)
static void * bmw_FaceShellWalker_yield(BMWalker *walker)
static BMWalker bmw_EdgeLoopWalker_Type
static BMWalker bmw_VertShellWalker_Type
static void * bmw_FaceShellWalker_step(BMWalker *walker)
static void * bmw_EdgeringWalker_yield(BMWalker *walker)
static BMWalker bmw_IslandManifoldWalker_Type
static void bmw_LoopShellWalker_begin(BMWalker *walker, void *data)
static BMWalker bmw_NonManifoldedgeWalker_type
static BMWalker bmw_IslandWalker_Type
static void * bmw_LoopShellWireWalker_yield(BMWalker *walker)
BMWalker * bm_walker_types[]
struct BMLoop * radial_next
struct GSet * visit_set_alt