Blender  V3.3
Classes | Macros | Typedefs | Enumerations | Functions
bmesh_walkers.h File Reference

Go to the source code of this file.

Classes

struct  BMWalker
 

Macros

#define BMW_MASK_NOP   0
 
#define BMW_ITER(ele, walker, data)
 
#define BMW_NIL_LAY   0
 

Typedefs

typedef struct BMWalker BMWalker
 

Enumerations

enum  BMWOrder { BMW_DEPTH_FIRST , BMW_BREADTH_FIRST }
 
enum  BMWFlag { BMW_FLAG_NOP = 0 , BMW_FLAG_TEST_HIDDEN = (1 << 0) }
 
enum  {
  BMW_VERT_SHELL , BMW_LOOP_SHELL , BMW_LOOP_SHELL_WIRE , BMW_FACE_SHELL ,
  BMW_EDGELOOP , BMW_FACELOOP , BMW_EDGERING , BMW_EDGEBOUNDARY ,
  BMW_EDGELOOP_NONMANIFOLD , BMW_LOOPDATA_ISLAND , BMW_ISLANDBOUND , BMW_ISLAND ,
  BMW_ISLAND_MANIFOLD , BMW_CONNECTED_VERTEX , BMW_CUSTOM , BMW_MAXWALKERS
}
 

Functions

void BMW_init (struct BMWalker *walker, BMesh *bm, int type, short mask_vert, short mask_edge, short mask_face, BMWFlag flag, int layer)
 Init Walker. More...
 
voidBMW_begin (BMWalker *walker, void *start)
 
voidBMW_step (struct BMWalker *walker)
 Step Walker. More...
 
void BMW_end (struct BMWalker *walker)
 End Walker. More...
 
int BMW_current_depth (BMWalker *walker)
 Walker Current Depth. More...
 
voidBMW_current_state (BMWalker *walker)
 Current Walker State. More...
 
voidBMW_state_add (BMWalker *walker)
 Add a new Walker State. More...
 
void BMW_state_remove (BMWalker *walker)
 Remove Current Walker State. More...
 
voidBMW_walk (BMWalker *walker)
 Main Walking Function. More...
 
void BMW_reset (BMWalker *walker)
 Reset Walker. More...
 

Macro Definition Documentation

◆ BMW_ITER

#define BMW_ITER (   ele,
  walker,
  data 
)
Value:
BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BMW_step(walker))
#define BM_CHECK_TYPE_ELEM_ASSIGN(ele)
Definition: bmesh_class.h:466
#define BM_CHECK_TYPE_ELEM(ele)
Definition: bmesh_class.h:435
void * BMW_begin(BMWalker *walker, void *start)
Definition: bmesh_walkers.c:40
void * BMW_step(struct BMWalker *walker)
Step Walker.

Definition at line 128 of file bmesh_walkers.h.

◆ BMW_MASK_NOP

#define BMW_MASK_NOP   0

Definition at line 54 of file bmesh_walkers.h.

◆ BMW_NIL_LAY

#define BMW_NIL_LAY   0

Definition at line 170 of file bmesh_walkers.h.

Typedef Documentation

◆ BMWalker

typedef struct BMWalker BMWalker

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
BMW_VERT_SHELL 
BMW_LOOP_SHELL 
BMW_LOOP_SHELL_WIRE 
BMW_FACE_SHELL 
BMW_EDGELOOP 
BMW_FACELOOP 
BMW_EDGERING 
BMW_EDGEBOUNDARY 
BMW_EDGELOOP_NONMANIFOLD 
BMW_LOOPDATA_ISLAND 
BMW_ISLANDBOUND 
BMW_ISLAND 
BMW_ISLAND_MANIFOLD 
BMW_CONNECTED_VERTEX 
BMW_CUSTOM 
BMW_MAXWALKERS 

Definition at line 146 of file bmesh_walkers.h.

◆ BMWFlag

enum BMWFlag
Enumerator
BMW_FLAG_NOP 
BMW_FLAG_TEST_HIDDEN 

Definition at line 18 of file bmesh_walkers.h.

◆ BMWOrder

enum BMWOrder
Enumerator
BMW_DEPTH_FIRST 
BMW_BREADTH_FIRST 

Definition at line 13 of file bmesh_walkers.h.

Function Documentation

◆ BMW_begin()

void* BMW_begin ( BMWalker walker,
void start 
)

NOTE(@joeedh): Details on design.

Original design: walkers directly emulation recursive functions. functions save their state onto a BMWalker.worklist, and also add new states to implement recursive or looping behavior. Generally only one state push per call with a specific state is desired.

basic design pattern: the walker step function goes through its list of possible choices for recursion, and recurses (by pushing a new state) using the first non-visited one. This choice is the flagged as visited using the GHash. Each step may push multiple new states onto the BMWalker.worklist at once.

  • Walkers use tool flags, not header flags.
  • Walkers now use GHash for storing visited elements, rather than stealing flags. GHash can be rewritten to be faster if necessary, in the far future :) .
  • tools should ALWAYS have necessary error handling for if walkers fail.

Definition at line 40 of file bmesh_walkers.c.

References BMWalker::begin, BMWalker::begin_htype, BLI_assert, BMW_current_state(), NULL, and BMWalker::step.

Referenced by BM_mesh_decimate_unsubdivide_ex(), bmo_collapse_exec(), bmo_collapsecon_do_layer(), bmo_dissolve_faces_exec(), check_hole_in_region(), edgering_select(), view3d_preselect_mesh_edgering_update_edges_from_edge(), walker_deselect_nth(), walker_select(), and walker_select_count().

◆ BMW_current_depth()

int BMW_current_depth ( BMWalker walker)

Walker Current Depth.

Returns the current depth of the walker.

Definition at line 123 of file bmesh_walkers.c.

References BMWalker::depth.

Referenced by BM_mesh_decimate_unsubdivide_ex(), and walker_deselect_nth().

◆ BMW_current_state()

void* BMW_current_state ( BMWalker walker)

◆ BMW_end()

void BMW_end ( struct BMWalker walker)

◆ BMW_init()

void BMW_init ( struct BMWalker walker,
BMesh bm,
int  type,
short  mask_vert,
short  mask_edge,
short  mask_face,
BMWFlag  flag,
int  layer 
)

◆ BMW_reset()

void BMW_reset ( BMWalker walker)

Reset Walker.

Frees all states from the worklist, resetting the walker for reuse in a new walk.

Definition at line 187 of file bmesh_walkers.c.

References BLI_gset_clear(), BMW_current_state(), BMW_state_remove(), BMWalker::depth, NULL, BMWalker::visit_set, and BMWalker::visit_set_alt.

◆ BMW_state_add()

void* BMW_state_add ( BMWalker walker)

◆ BMW_state_remove()

void BMW_state_remove ( BMWalker walker)

Remove Current Walker State.

Remove and free an item from the end of the walker state worklist.

Definition at line 160 of file bmesh_walkers.c.

References BLI_mempool_free(), BLI_remlink(), BMW_current_state(), BMWalker::states, and BMWalker::worklist.

Referenced by bmw_IslandboundWalker_step(), and BMW_reset().

◆ BMW_step()

void* BMW_step ( struct BMWalker walker)

◆ BMW_walk()

void* BMW_walk ( BMWalker walker)

Main Walking Function.

Steps a mesh walker forward by one element

Definition at line 128 of file bmesh_walkers.c.

References BMW_current_state(), NULL, and BMWalker::step.

Referenced by bmw_EdgeLoopWalker_begin(), bmw_EdgeringWalker_begin(), bmw_FaceLoopWalker_begin(), and BMW_step().