Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2012-02-28 20:47:12 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-02-28 20:47:12 +0400
commitdf0f0c63d32b3819bab625f72d62e1fcf6d5ced5 (patch)
treefdece62e1b06e2b7701ef0001d0440dfcba92ad4 /source/blender/bmesh/intern/bmesh_walkers.h
parent22abc63f676dc7681ee8f734cbc96a7279172d24 (diff)
bmesh: re-arrange headers
Diffstat (limited to 'source/blender/bmesh/intern/bmesh_walkers.h')
-rw-r--r--source/blender/bmesh/intern/bmesh_walkers.h141
1 files changed, 141 insertions, 0 deletions
diff --git a/source/blender/bmesh/intern/bmesh_walkers.h b/source/blender/bmesh/intern/bmesh_walkers.h
new file mode 100644
index 00000000000..765576c9ab7
--- /dev/null
+++ b/source/blender/bmesh/intern/bmesh_walkers.h
@@ -0,0 +1,141 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Joseph Eagar.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __BMESH_WALKERS_H__
+#define __BMESH_WALKERS_H__
+
+/** \file blender/bmesh/intern/bmesh_walkers.h
+ * \ingroup bmesh
+ */
+
+#include "BLI_ghash.h"
+
+/*
+ NOTE: do NOT modify topology while walking a mesh!
+*/
+
+typedef enum {
+ BMW_DEPTH_FIRST,
+ BMW_BREADTH_FIRST
+} BMWOrder;
+
+/*Walkers*/
+typedef struct BMWalker {
+ void (*begin) (struct BMWalker *walker, void *start);
+ void *(*step) (struct BMWalker *walker);
+ void *(*yield) (struct BMWalker *walker);
+ int structsize;
+ BMWOrder order;
+ int valid_mask;
+
+ /* runtime */
+ int layer;
+
+ BMesh *bm;
+ BLI_mempool *worklist;
+ ListBase states;
+
+ /* these masks are to be tested against elements BMO_elem_flag_test() */
+ short mask_vert;
+ short mask_edge;
+ short mask_loop;
+ short mask_face;
+
+ GHash *visithash;
+ int depth;
+} BMWalker;
+
+/* define to make BMW_init more clear */
+#define BMW_MASK_NOP 0
+
+/* initialize a walker. searchmask restricts some (not all) walkers to
+ * elements with a specific tool flag set. flags is specific to each walker.*/
+void BMW_init(struct BMWalker *walker, BMesh *bm, int type,
+ short mask_vert, short mask_edge, short mask_loop, short mask_face,
+ int layer);
+void *BMW_begin(BMWalker *walker, void *start);
+void *BMW_step(struct BMWalker *walker);
+void BMW_end(struct BMWalker *walker);
+int BMW_current_depth(BMWalker *walker);
+
+/*these are used by custom walkers*/
+void *BMW_current_state(BMWalker *walker);
+void *BMW_state_add(BMWalker *walker);
+void BMW_state_remove(BMWalker *walker);
+void *BMW_walk(BMWalker *walker);
+void BMW_reset(BMWalker *walker);
+
+/*
+example of usage, walking over an island of tool flagged faces:
+
+BMWalker walker;
+BMFace *f;
+
+BMW_init(&walker, bm, BMW_ISLAND, SOME_OP_FLAG);
+f = BMW_begin(&walker, some_start_face);
+for (; f; f = BMW_step(&walker))
+{
+ //do something with f
+}
+BMW_end(&walker);
+*/
+
+enum {
+ /* walk over connected geometry. can restrict to a search flag,
+ * or not, it's optional.
+ *
+ * takes a vert as an arugment, and spits out edges, restrict flag acts
+ * on the edges as well. */
+ BMW_SHELL,
+ /*walk over an edge loop. search flag doesn't do anything.*/
+ BMW_LOOP,
+ BMW_FACELOOP,
+ BMW_EDGERING,
+ /* #define BMW_RING 2 */
+ /* walk over uv islands; takes a loop as input. restrict flag
+ * restricts the walking to loops whose vert has restrict flag set as a
+ * tool flag.
+ *
+ * the flag parameter to BMW_init maps to a loop customdata layer index.
+ */
+ BMW_LOOPDATA_ISLAND,
+ /* walk over an island of flagged faces. note, that this doesn't work on
+ * non-manifold geometry. it might be better to rewrite this to extract
+ * boundary info from the island walker, rather then directly walking
+ * over the boundary. raises an error if it encouters nonmanifold
+ * geometry. */
+ BMW_ISLANDBOUND,
+ /* walk over all faces in an island of tool flagged faces. */
+ BMW_ISLAND,
+ /* walk from a vertex to all connected vertices. */
+ BMW_CONNECTED_VERTEX,
+ /* end of array index enum vals */
+
+ /* do not intitialze function pointers and struct size in BMW_init */
+ BMW_CUSTOM,
+ BMW_MAXWALKERS
+};
+
+/* use with BMW_init, so as not to confuse with restrict flags */
+#define BMW_NIL_LAY 0
+
+#endif /* __BMESH_WALKERS_H__ */