skip assigning vars for inline bmesh flag funcs, just cast.
[blender.git] / source / blender / bmesh / bmesh_walkers.h
1 #ifndef BM_WALKERS_H
2 #define BM_WALKERS_H
3
4 #include "BLI_ghash.h"
5
6 /*
7   NOTE: do NOT modify topology while walking a mesh!
8 */
9
10 /*Walkers*/
11 typedef struct BMWalker {
12         void (*begin) (struct BMWalker *walker, void *start);
13         void *(*step) (struct BMWalker *walker);
14         void *(*yield)(struct BMWalker *walker);
15         int structsize;
16         int flag;
17
18         BMesh *bm;
19         BLI_mempool *stack;
20         void *currentstate;
21         int restrictflag;
22         GHash *visithash;
23 } BMWalker;
24
25 /*initialize a walker.  searchmask restricts some (not all) walkers to
26   elements with a specific tool flag set.  flags is specific to each walker.*/
27 void BMW_Init(struct BMWalker *walker, BMesh *bm, int type, int searchmask, int flags);
28 void *BMW_Begin(BMWalker *walker, void *start);
29 void *BMW_Step(struct BMWalker *walker);
30 void BMW_End(struct BMWalker *walker);
31
32 /*these are used by custom walkers*/
33 void BMW_pushstate(BMWalker *walker);
34 void BMW_popstate(BMWalker *walker);
35 void *BMW_walk(BMWalker *walker);
36 void BMW_reset(BMWalker *walker);
37
38 /*
39 example of usage, walking over an island of tool flagged faces:
40
41 BMWalker walker;
42 BMFace *f;
43
44 BMW_Init(&walker, bm, BMW_ISLAND, SOME_OP_FLAG);
45 f = BMW_Begin(&walker, some_start_face);
46 for (; f; f=BMW_Step(&walker)) {
47         //do something with f
48 }
49 BMW_End(&walker);
50 */
51
52 enum {
53         /*walk over connected geometry.  can restrict to a search flag,
54         or not, it's optional.
55         
56         takes a vert as an arugment, and spits out edges, restrict flag acts
57         on the edges as well.*/
58         BMW_SHELL,
59         /*walk over an edge loop.  search flag doesn't do anything.*/
60         BMW_LOOP,
61         BMW_FACELOOP,
62         BMW_EDGERING,
63         /*#define BMW_RING      2*/
64         //walk over uv islands; takes a loop as input.  restrict flag 
65         //restricts the walking to loops whose vert has restrict flag set as a
66         //tool flag.
67         //
68         //the flag parameter to BMW_Init maps to a loop customdata layer index.
69         BMW_LOOPDATA_ISLAND,
70         /*walk over an island of flagged faces.  note, that this doesn't work on
71           non-manifold geometry.  it might be better to rewrite this to extract
72           boundary info from the island walker, rather then directly walking
73           over the boundary.  raises an error if it encouters nonmanifold
74           geometry.*/
75         BMW_ISLANDBOUND,
76         /*walk over all faces in an island of tool flagged faces.*/
77         BMW_ISLAND,
78         /*do not intitialze function pointers and struct size in BMW_Init*/
79         BMW_CUSTOM,
80         BMW_MAXWALKERS
81 };
82
83 #endif