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) {
1280 if (
l->
f->
len != 4) {
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
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) {
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)
#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 BMwNonManifoldEdgeLoopWalker BMwNonManifoldEdgeLoopWalker
struct BMwIslandWalker BMwIslandWalker
struct BMwFaceLoopWalker BMwFaceLoopWalker
struct BMwEdgeLoopWalker BMwEdgeLoopWalker
struct BMwIslandboundWalker BMwIslandboundWalker
struct BMwEdgeringWalker BMwEdgeringWalker
struct BMwConnectedVertexWalker BMwConnectedVertexWalker
struct BMwLoopShellWalker BMwLoopShellWalker
struct BMwEdgeboundaryWalker BMwEdgeboundaryWalker
struct BMwLoopShellWireWalker BMwLoopShellWireWalker
struct BMwShellWalker BMwShellWalker
struct BMwUVEdgeWalker BMwUVEdgeWalker
struct BMLoop * radial_next
struct GSet * visit_set_alt