19 #define BMW_state_remove_r(walker, owalk) \
21 memcpy(owalk, BMW_current_state(walker), sizeof(*(owalk))); \
22 BMW_state_remove(walker); \
166 for (i = 0; i < 2; i++) {
167 v = i ?
e->v2 :
e->v1;
181 bool restrictpass =
true;
194 if (!walker->visibility_flag ||
195 (walker->visibility_flag &&
207 newState->base = v_old;
208 newState->curedge = curedge;
307 e_edj_pair[0] =
l->
e;
308 e_edj_pair[1] =
l->
prev->
e;
310 for (i = 0; i < 2; i++) {
315 l_iter = l_first =
e->l;
317 BMLoop *l_radial = (l_iter->
v ==
l->
v) ? l_iter : l_iter->
next;
322 }
while ((l_iter = l_iter->
radial_next) != l_first);
443 l_iter = l_first =
e->l;
447 }
while ((l_iter = l_iter->
radial_next) != l_first);
545 l_iter = l_first =
e->l;
552 }
while ((l_iter = l_iter->
radial_next) != l_first);
680 if (BM_loop_is_manifold(
l)) {
770 if (only_manifold && (l_iter->
radial_next != l_iter)) {
777 if (face_count == 3) {
781 }
while ((l_radial_iter = l_radial_iter->
radial_next) != l_iter);
783 if (face_count != 2) {
788 l_radial_iter = l_iter;
789 while ((l_radial_iter = l_radial_iter->
radial_next) != l_iter) {
797 if (f == iwalk->
cur) {
810 }
while ((l_iter = l_iter->
next) != l_first);
848 const int vert_edge_count[2] = {
852 const int vert_face_count[2] = {
934 ((vert_edge_count[0] == 3 && vert_face_count[0] == 3) ||
935 (vert_edge_count[1] == 3 && vert_face_count[1] == 3))) {
941 if (f_best ==
NULL || f_best->
len < f_iter->
len) {
1002 if (vert_edge_tot == 3) {
1021 else if (
l ==
NULL) {
1025 for (
int i = 0; i < 2; i++) {
1026 v = i ?
e->v2 :
e->v1;
1053 if (
ELEM(vert_edge_tot, 4, 2)) {
1054 int i_opposite = vert_edge_tot / 2;
1065 }
while ((++i != i_opposite));
1096 (owalk.
is_single ==
false && vert_edge_tot > 2) ||
1157 if (
l->
f->
len != 4) {
1269 if (
l->
f->
len != 4) {
1322 #ifdef BMW_EDGERING_NGON
1323 if (lwalk->
l->
f->
len % 2 != 0)
1325 if (lwalk->
l->
f->
len != 4)
1354 #ifdef BMW_EDGERING_NGON
1358 #define EDGE_CHECK(e) \
1359 (bmw_mask_check_edge(walker, e) && (BM_edge_is_boundary(e) || BM_edge_is_manifold(e)))
1378 #ifdef BMW_EDGERING_NGON
1550 for (i = 0; i < 2; i++) {
1552 BMLoop *l_pivot, *l_radial;
1554 l_pivot = i ?
l->
next :
l;
1556 BMLoop *l_radial_first = l_radial;
1567 if (l_radial->
v != l_pivot->
v) {
1573 l_other = (l_radial->
v != l_pivot->
v) ? l_radial->
next : l_radial;
1583 lwalk->
l = l_radial;
1585 }
while ((l_radial = l_radial->
radial_next) != l_radial_first);
1635 if (BM_loop_is_manifold(
l)) {
1659 for (
int pass = 0; pass < 2; pass++) {
1675 if (l_cur ==
NULL) {
1678 else if (l_cur->
e != l_next->
e) {
1687 if (l_cur !=
NULL) {
1692 if (l_cur !=
NULL) {
1697 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)
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)
_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
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
struct BMLoop * radial_next
struct GSet * visit_set_alt