[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43955] branches/bmesh/blender/source/ blender/bmesh/intern/bmesh_operators.c: make clear_flag_layer() validate index arrays.

Campbell Barton ideasman42 at gmail.com
Tue Feb 7 15:45:23 CET 2012


Revision: 43955
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43955
Author:   campbellbarton
Date:     2012-02-07 14:45:18 +0000 (Tue, 07 Feb 2012)
Log Message:
-----------
make clear_flag_layer() validate index arrays.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c	2012-02-07 14:27:08 UTC (rev 43954)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c	2012-02-07 14:45:18 UTC (rev 43955)
@@ -933,24 +933,29 @@
 
 static void clear_flag_layer(BMesh *bm)
 {
-	BMVert *v;
-	BMEdge *e;
-	BMFace *f;
-	
-	BMIter verts;
-	BMIter edges;
-	BMIter faces;
-	
+	BMHeader *ele;
+	/* set the index values since we are looping over all data anyway,
+	 * may save time later on */
+	int i;
+
+	BMIter iter;
+	const int totflags_offset = bm->totflags - 1;
+
 	/* now go through and memcpy all the flag */
-	for (v = BMIter_New(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = BMIter_Step(&verts)) {
-		memset(v->head.flags + (bm->totflags - 1), 0, sizeof(BMFlagLayer));
+	for (ele = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++) {
+		memset(ele->flags + totflags_offset, 0, sizeof(BMFlagLayer));
+		BM_SetIndex(ele, i); /* set_inline */
 	}
-	for (e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BMIter_Step(&edges)) {
-		memset(e->head.flags + (bm->totflags - 1), 0, sizeof(BMFlagLayer));
+	for (ele = BMIter_New(&iter, bm, BM_EDGES_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++) {
+		memset(ele->flags + totflags_offset, 0, sizeof(BMFlagLayer));
+		BM_SetIndex(ele, i); /* set_inline */
 	}
-	for (f = BMIter_New(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BMIter_Step(&faces)) {
-		memset(f->head.flags + (bm->totflags - 1), 0, sizeof(BMFlagLayer));
+	for (ele = BMIter_New(&iter, bm, BM_FACES_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++) {
+		memset(ele->flags + totflags_offset, 0, sizeof(BMFlagLayer));
+		BM_SetIndex(ele, i); /* set_inline */
 	}
+
+	bm->elem_index_dirty &= ~(BM_VERT|BM_EDGE|BM_FACE);
 }
 
 void *BMO_FirstElem(BMOperator *op, const char *slotname)




More information about the Bf-blender-cvs mailing list