33 #define BMW_state_remove_r(walker, owalk) \
35 memcpy(owalk, BMW_current_state(walker), sizeof(*(owalk))); \
36 BMW_state_remove(walker); \
178 for (i = 0; i < 2; i++) {
179 v = i ?
e->v2 :
e->v1;
193 bool restrictpass =
true;
206 if (!walker->restrictflag ||
207 (walker->restrictflag &&
219 newState->base = v_old;
220 newState->curedge = curedge;
318 e_edj_pair[0] =
l->
e;
319 e_edj_pair[1] =
l->
prev->
e;
321 for (i = 0; i < 2; i++) {
326 l_iter = l_first =
e->l;
328 BMLoop *l_radial = (l_iter->
v ==
l->
v) ? l_iter : l_iter->
next;
333 }
while ((l_iter = l_iter->
radial_next) != l_first);
454 l_iter = l_first =
e->l;
458 }
while ((l_iter = l_iter->
radial_next) != l_first);
555 l_iter = l_first =
e->l;
562 }
while ((l_iter = l_iter->
radial_next) != l_first);
687 if (BM_loop_is_manifold(
l)) {
776 if (only_manifold && (l_iter->
radial_next != l_iter)) {
783 if (face_count == 3) {
787 }
while ((l_radial_iter = l_radial_iter->
radial_next) != l_iter);
789 if (face_count != 2) {
794 l_radial_iter = l_iter;
795 while ((l_radial_iter = l_radial_iter->
radial_next) != l_iter) {
803 if (f == iwalk->
cur) {
816 }
while ((l_iter = l_iter->
next) != l_first);
854 const int vert_edge_count[2] = {
858 const int vert_face_count[2] = {
940 ((vert_edge_count[0] == 3 && vert_face_count[0] == 3) ||
941 (vert_edge_count[1] == 3 && vert_face_count[1] == 3))) {
947 if (f_best ==
NULL || f_best->
len < f_iter->
len) {
1008 if (vert_edge_tot == 3) {
1027 else if (
l ==
NULL) {
1031 for (
int i = 0; i < 2; i++) {
1032 v = i ?
e->v2 :
e->v1;
1059 if (
ELEM(vert_edge_tot, 4, 2)) {
1060 int i_opposite = vert_edge_tot / 2;
1071 }
while ((++i != i_opposite));
1102 (owalk.
is_single ==
false && vert_edge_tot > 2) ||
1163 if (
l->
f->
len != 4) {
1275 if (
l->
f->
len != 4) {
1327 #ifdef BMW_EDGERING_NGON
1328 if (lwalk->
l->
f->
len % 2 != 0)
1330 if (lwalk->
l->
f->
len != 4)
1359 #ifdef BMW_EDGERING_NGON
1363 #define EDGE_CHECK(e) \
1364 (bmw_mask_check_edge(walker, e) && (BM_edge_is_boundary(e) || BM_edge_is_manifold(e)))
1383 #ifdef BMW_EDGERING_NGON
1555 for (i = 0; i < 2; i++) {
1557 BMLoop *l_pivot, *l_radial;
1559 l_pivot = i ?
l->
next :
l;
1561 BMLoop *l_radial_first = l_radial;
1572 if (l_radial->
v != l_pivot->
v) {
1578 l_other = (l_radial->
v != l_pivot->
v) ? l_radial->
next : l_radial;
1588 lwalk->
l = l_radial;
1590 }
while ((l_radial = l_radial->
radial_next) != l_radial_first);
1640 if (BM_loop_is_manifold(
l)) {
1664 for (
int pass = 0; pass < 2; pass++) {
1680 if (l_cur ==
NULL) {
1683 else if (l_cur->
e != l_next->
e) {
1692 if (l_cur !=
NULL) {
1697 if (l_cur !=
NULL) {
1702 lwalk->
cur = l_cur->
e;
CustomData interface, see also DNA_customdata_types.h.
bool CustomData_data_equals(int type, const void *data1, const void *data2)
void BLI_gset_clear(GSet *gs, GSetKeyFreeFP keyfreefp)
void BLI_gset_insert(GSet *gs, void *key)
bool BLI_gset_haskey(GSet *gs, const void *key) ATTR_WARN_UNUSED_RESULT
bool BLI_gset_add(GSet *gs, void *key)
_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 type
#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)
BMEdge * BM_edge_exists(BMVert *v_a, BMVert *v_b)
bool BM_edge_is_all_face_flag_test(const BMEdge *e, const char hflag, const bool respect_hide)
BMLoop * BM_face_other_vert_loop(BMFace *f, BMVert *v_prev, BMVert *v)
Other Loop in Face Sharing a Vertex.
int BM_vert_face_count(const BMVert *v)
int BM_edge_face_count(const BMEdge *e)
BMLoop * BM_loop_other_edge_loop(BMLoop *l, BMVert *v)
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_current_state(BMWalker *walker)
Current Walker State.
void * BMW_walk(BMWalker *walker)
Main Walking Function.
void * BMW_state_add(BMWalker *walker)
Add a new Walker State.
void BMW_state_remove(BMWalker *walker)
Remove Current Walker State.
static void * bmw_IslandManifoldWalker_step(BMWalker *walker)
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 BMWalker bmw_UVEdgeWalker_Type
static void bmw_ConnectedVertexWalker_begin(BMWalker *walker, void *data)
static void * bmw_VertShellWalker_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_FaceLoopWalker_step(BMWalker *walker)
static void * bmw_FaceLoopWalker_yield(BMWalker *walker)
static bool bm_edge_is_single(BMEdge *e)
static BMWalker bmw_FaceLoopWalker_Type
static void * bmw_EdgeboundaryWalker_step(BMWalker *walker)
static void * bmw_LoopShellWireWalker_step(BMWalker *walker)
static void bmw_IslandboundWalker_begin(BMWalker *walker, void *data)
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 void * bmw_UVEdgeWalker_step(BMWalker *walker)
static BMWalker bmw_FaceShellWalker_Type
static BMWalker bmw_EdgeboundaryWalker_Type
static void bmw_EdgeringWalker_begin(BMWalker *walker, void *data)
static void * bmw_EdgeringWalker_yield(BMWalker *walker)
static void bmw_VertShellWalker_visitEdge(BMWalker *walker, BMEdge *e)
static void bmw_LoopShellWalker_visitLoop(BMWalker *walker, BMLoop *l)
static BMLoop * bmw_NonManifoldLoop_find_next_around_vertex(BMLoop *l, BMVert *v, int face_count)
static void * bmw_EdgeLoopWalker_yield(BMWalker *walker)
static void * bmw_FaceShellWalker_yield(BMWalker *walker)
#define BMW_state_remove_r(walker, owalk)
static bool bmw_mask_check_edge(BMWalker *walker, BMEdge *e)
static BMWalker bmw_LoopShellWireWalker_Type
static void * bmw_ConnectedVertexWalker_yield(BMWalker *walker)
static void bmw_NonManifoldedgeWalker_begin(BMWalker *walker, void *data)
static void bmw_LoopShellWalker_visitEdgeWire(BMWalker *walker, BMEdge *e)
static void * bmw_LoopShellWalker_step(BMWalker *walker)
static void * bmw_FaceShellWalker_step(BMWalker *walker)
static void bmw_ConnectedVertexWalker_visitVertex(BMWalker *walker, BMVert *v)
static BMWalker bmw_IslandboundWalker_Type
static void * bmw_IslandWalker_step(BMWalker *walker)
static void * bmw_IslandboundWalker_step(BMWalker *walker)
static bool bmw_mask_check_face(BMWalker *walker, BMFace *f)
static void * bmw_UVEdgeWalker_yield(BMWalker *walker)
static void bmw_LoopShellWireWalker_visitVert(BMWalker *walker, BMVert *v, const BMEdge *e_from)
static void bmw_EdgeLoopWalker_begin(BMWalker *walker, void *data)
static void * bmw_NonManifoldedgeWalker_yield(BMWalker *walker)
static BMWalker bmw_EdgeringWalker_Type
static void * bmw_IslandboundWalker_yield(BMWalker *walker)
static bool bmw_mask_check_vert(BMWalker *walker, BMVert *v)
static void bmw_FaceShellWalker_visitEdge(BMWalker *walker, BMEdge *e)
static void * bmw_NonManifoldedgeWalker_step(BMWalker *walker)
static void bmw_LoopShellWireWalker_begin(BMWalker *walker, void *data)
static void * bmw_VertShellWalker_step(BMWalker *walker)
static void * bmw_LoopShellWireWalker_yield(BMWalker *walker)
static void bmw_UVEdgeWalker_begin(BMWalker *walker, void *data)
static BMWalker bmw_LoopShellWalker_Type
static void * bmw_ConnectedVertexWalker_step(BMWalker *walker)
static void * bmw_IslandWalker_step_ex(BMWalker *walker, bool only_manifold)
static void * bmw_IslandWalker_yield(BMWalker *walker)
static void * bmw_EdgeLoopWalker_step(BMWalker *walker)
static BMWalker bmw_EdgeLoopWalker_Type
static BMWalker bmw_VertShellWalker_Type
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_LoopShellWalker_yield(BMWalker *walker)
static void * bmw_EdgeringWalker_step(BMWalker *walker)
static void * bmw_EdgeboundaryWalker_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