[Bf-blender-cvs] [d82cd4d] master: BMesh Walker: typecheck args for walker->begin()

Campbell Barton noreply at git.blender.org
Fri May 23 12:53:06 CEST 2014


Commit: d82cd4d5ef877d22e5daeaa8e6df50f26cde58db
Author: Campbell Barton
Date:   Fri May 23 17:05:57 2014 +1000
https://developer.blender.org/rBd82cd4d5ef877d22e5daeaa8e6df50f26cde58db

BMesh Walker: typecheck args for walker->begin()

===================================================================

M	source/blender/bmesh/intern/bmesh_walkers.c
M	source/blender/bmesh/intern/bmesh_walkers.h
M	source/blender/bmesh/intern/bmesh_walkers_impl.c

===================================================================

diff --git a/source/blender/bmesh/intern/bmesh_walkers.c b/source/blender/bmesh/intern/bmesh_walkers.c
index 75513a4..8f74e98 100644
--- a/source/blender/bmesh/intern/bmesh_walkers.c
+++ b/source/blender/bmesh/intern/bmesh_walkers.c
@@ -60,6 +60,8 @@
 
 void *BMW_begin(BMWalker *walker, void *start)
 {
+	BLI_assert(((BMHeader *)start)->htype & walker->begin_htype);
+
 	walker->begin(walker, start);
 	
 	return BMW_current_state(walker) ? walker->step(walker) : NULL;
@@ -100,6 +102,7 @@ void BMW_init(BMWalker *walker, BMesh *bm, int type,
 	}
 	
 	if (type != BMW_CUSTOM) {
+		walker->begin_htype = bm_walker_types[type]->begin_htype;
 		walker->begin = bm_walker_types[type]->begin;
 		walker->yield = bm_walker_types[type]->yield;
 		walker->step = bm_walker_types[type]->step;
diff --git a/source/blender/bmesh/intern/bmesh_walkers.h b/source/blender/bmesh/intern/bmesh_walkers.h
index 9b0c200..b39ef80 100644
--- a/source/blender/bmesh/intern/bmesh_walkers.h
+++ b/source/blender/bmesh/intern/bmesh_walkers.h
@@ -27,8 +27,6 @@
  *  \ingroup bmesh
  */
 
-#include "BLI_ghash.h"
-
 /*
  * NOTE: do NOT modify topology while walking a mesh!
  */
@@ -45,6 +43,7 @@ typedef enum {
 
 /*Walkers*/
 typedef struct BMWalker {
+	char    begin_htype;  /* only for validating input */
 	void  (*begin) (struct BMWalker *walker, void *start);
 	void *(*step)  (struct BMWalker *walker);
 	void *(*yield) (struct BMWalker *walker);
@@ -67,8 +66,8 @@ typedef struct BMWalker {
 
 	BMWFlag flag;
 
-	GSet *visit_set;
-	GSet *visit_set_alt;
+	struct GSet *visit_set;
+	struct GSet *visit_set_alt;
 	int depth;
 } BMWalker;
 
@@ -108,34 +107,15 @@ void  BMW_reset(BMWalker *walker);
  */
 
 enum {
-	/* walk over connected geometry.  can restrict to a search flag,
-	 * or not, it's optional.
-	 *
-	 * takes a vert as an argument, 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,
 	BMW_EDGEBOUNDARY,
-	/* #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_RING, */
 	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 encounters 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 */
 
diff --git a/source/blender/bmesh/intern/bmesh_walkers_impl.c b/source/blender/bmesh/intern/bmesh_walkers_impl.c
index 70b9023..2ddc44d 100644
--- a/source/blender/bmesh/intern/bmesh_walkers_impl.c
+++ b/source/blender/bmesh/intern/bmesh_walkers_impl.c
@@ -93,6 +93,9 @@ static bool bmw_mask_check_face(BMWalker *walker, BMFace *f)
  * Starts at a vertex on the mesh and walks over the 'shell' it belongs
  * to via visiting connected edges.
  *
+ * takes an edge or vertex as an argument, and spits out edges,
+ * restrict flag acts on the edges as well.
+ *
  * \todo Add restriction flag/callback for wire edges.
  */
 static void bmw_ShellWalker_visitEdge(BMWalker *walker, BMEdge *e)
@@ -143,6 +146,8 @@ static void bmw_ShellWalker_begin(BMWalker *walker, void *data)
 			bmw_ShellWalker_visitEdge(walker, e);
 			break;
 		}
+		default:
+			BLI_assert(0);
 	}
 }
 
@@ -224,6 +229,9 @@ static void *bmw_ShellWalker_step(BMWalker *walker)
  * \{
  *
  * Similar to shell walker, but visits vertices instead of edges.
+ *
+ * Walk from a vertex to all connected vertices.
+ *
  */
 static void bmw_ConnectedVertexWalker_visitVertex(BMWalker *walker, BMVert *v)
 {
@@ -286,6 +294,11 @@ static void *bmw_ConnectedVertexWalker_step(BMWalker *walker)
  *
  * Starts at a edge on the mesh and walks over the boundary of an island it belongs to.
  *
+ * \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 encounters nonmanifold geometry.
+ *
  * \todo Add restriction flag/callback for wire edges.
  */
 static void bmw_IslandboundWalker_begin(BMWalker *walker, void *data)
@@ -456,6 +469,7 @@ static void *bmw_IslandWalker_step(BMWalker *walker)
  * \{
  *
  * Starts at a tool-flagged edge and walks over the edge loop
+ *
  */
 
 /* utility function to see if an edge is apart of an ngon boundary */
@@ -1066,6 +1080,13 @@ static void *bmw_EdgeboundaryWalker_step(BMWalker *walker)
 
 
 /** \name UV Edge Walker
+ *
+ * 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.
+ *
  * \{ */
 
 static void bmw_UVEdgeWalker_begin(BMWalker *walker, void *data)
@@ -1155,6 +1176,7 @@ static void *bmw_UVEdgeWalker_step(BMWalker *walker)
 
 
 static BMWalker bmw_ShellWalker_Type = {
+	BM_VERT | BM_EDGE,
 	bmw_ShellWalker_begin,
 	bmw_ShellWalker_step,
 	bmw_ShellWalker_yield,
@@ -1164,6 +1186,7 @@ static BMWalker bmw_ShellWalker_Type = {
 };
 
 static BMWalker bmw_IslandboundWalker_Type = {
+	BM_LOOP,
 	bmw_IslandboundWalker_begin,
 	bmw_IslandboundWalker_step,
 	bmw_IslandboundWalker_yield,
@@ -1173,6 +1196,7 @@ static BMWalker bmw_IslandboundWalker_Type = {
 };
 
 static BMWalker bmw_IslandWalker_Type = {
+	BM_FACE,
 	bmw_IslandWalker_begin,
 	bmw_IslandWalker_step,
 	bmw_IslandWalker_yield,
@@ -1182,6 +1206,7 @@ static BMWalker bmw_IslandWalker_Type = {
 };
 
 static BMWalker bmw_LoopWalker_Type = {
+	BM_EDGE,
 	bmw_LoopWalker_begin,
 	bmw_LoopWalker_step,
 	bmw_LoopWalker_yield,
@@ -1191,6 +1216,7 @@ static BMWalker bmw_LoopWalker_Type = {
 };
 
 static BMWalker bmw_FaceLoopWalker_Type = {
+	BM_EDGE,
 	bmw_FaceLoopWalker_begin,
 	bmw_FaceLoopWalker_step,
 	bmw_FaceLoopWalker_yield,
@@ -1200,6 +1226,7 @@ static BMWalker bmw_FaceLoopWalker_Type = {
 };
 
 static BMWalker bmw_EdgeringWalker_Type = {
+	BM_EDGE,
 	bmw_EdgeringWalker_begin,
 	bmw_EdgeringWalker_step,
 	bmw_EdgeringWalker_yield,
@@ -1209,6 +1236,7 @@ static BMWalker bmw_EdgeringWalker_Type = {
 };
 
 static BMWalker bmw_EdgeboundaryWalker_Type = {
+	BM_EDGE,
 	bmw_EdgeboundaryWalker_begin,
 	bmw_EdgeboundaryWalker_step,
 	bmw_EdgeboundaryWalker_yield,
@@ -1218,6 +1246,7 @@ static BMWalker bmw_EdgeboundaryWalker_Type = {
 };
 
 static BMWalker bmw_UVEdgeWalker_Type = {
+	BM_LOOP,
 	bmw_UVEdgeWalker_begin,
 	bmw_UVEdgeWalker_step,
 	bmw_UVEdgeWalker_yield,
@@ -1227,6 +1256,7 @@ static BMWalker bmw_UVEdgeWalker_Type = {
 };
 
 static BMWalker bmw_ConnectedVertexWalker_Type = {
+	BM_VERT,
 	bmw_ConnectedVertexWalker_begin,
 	bmw_ConnectedVertexWalker_step,
 	bmw_ConnectedVertexWalker_yield,




More information about the Bf-blender-cvs mailing list