[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42229] branches/bmesh/blender/source/ blender/bmesh/intern: trust 'bm->elem_index_dirty' is correct, this avoids looping over edges/faces/verts if its not needed, but if set wrong it could crash too so added verification when built with debeg .

Campbell Barton ideasman42 at gmail.com
Mon Nov 28 19:52:38 CET 2011


Revision: 42229
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42229
Author:   campbellbarton
Date:     2011-11-28 18:52:35 +0000 (Mon, 28 Nov 2011)
Log Message:
-----------
trust 'bm->elem_index_dirty' is correct, this avoids looping over edges/faces/verts if its not needed, but if set wrong it could crash too so added verification when built with debeg.

also added debug define to help solve invalid values with valgrind's memcheck.

gives noticeable speedup since there was a loop no all faces to set index values on redraw.

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

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c	2011-11-28 18:43:34 UTC (rev 42228)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c	2011-11-28 18:52:35 UTC (rev 42229)
@@ -490,37 +490,53 @@
 	BMIter iter;
 	BMHeader *ele;
 
-	/* TODO, mark arrays as dirty, only calculate if needed!,
-	 * uncomment bm->elem_index_dirty checks */
+#ifdef DEBUG
+	BM_ELEM_INDEX_VALIDATE(bm, "Should Never Fail!", __func__);
+#endif
 
-	if ((hflag & BM_VERT) /* && (bm->elem_index_dirty & BM_VERT) */) {
-		int index= 0;
-		BM_ITER(ele, &iter, bm, BM_VERTS_OF_MESH, NULL) {
-			BM_SetIndex(ele, index); /* set_ok */
-			index++;
+	if (hflag & BM_VERT) {
+		if (bm->elem_index_dirty & BM_VERT) {
+			int index= 0;
+			BM_ITER(ele, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+				BM_SetIndex(ele, index); /* set_ok */
+				index++;
+			}
+			bm->elem_index_dirty &= ~BM_VERT;
+			BLI_assert(index == bm->totvert);
 		}
-		bm->elem_index_dirty &= ~BM_VERT;
-		BLI_assert(index == bm->totvert);
+		else {
+			// printf("%s: skipping vert index calc!\n", __func__);
+		}
 	}
 
-	if ((hflag & BM_EDGE) /* && (bm->elem_index_dirty & BM_EDGE) */) {
-		int index= 0;
-		BM_ITER(ele, &iter, bm, BM_EDGES_OF_MESH, NULL) {
-			BM_SetIndex(ele, index); /* set_ok */
-			index++;
+	if (hflag & BM_EDGE) {
+		if (bm->elem_index_dirty & BM_EDGE) {
+			int index= 0;
+			BM_ITER(ele, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+				BM_SetIndex(ele, index); /* set_ok */
+				index++;
+			}
+			bm->elem_index_dirty &= ~BM_EDGE;
+			BLI_assert(index == bm->totedge);
 		}
-		bm->elem_index_dirty &= ~BM_EDGE;
-		BLI_assert(index == bm->totedge);
+		else {
+			// printf("%s: skipping edge index calc!\n", __func__);
+		}
 	}
 
-	if ((hflag & BM_FACE) /* && (bm->elem_index_dirty & BM_FACES) */) {
-		int index= 0;
-		BM_ITER(ele, &iter, bm, BM_FACES_OF_MESH, NULL) {
-			BM_SetIndex(ele, index); /* set_ok */
-			index++;
+	if (hflag & BM_FACE) {
+		if (bm->elem_index_dirty & BM_FACE) {
+			int index= 0;
+			BM_ITER(ele, &iter, bm, BM_FACES_OF_MESH, NULL) {
+				BM_SetIndex(ele, index); /* set_ok */
+				index++;
+			}
+			bm->elem_index_dirty &= ~BM_FACE;
+			BLI_assert(index == bm->totface);
 		}
-		bm->elem_index_dirty &= ~BM_FACE;
-		BLI_assert(index == bm->totface);
+		else {
+			// printf("%s: skipping face index calc!\n", __func__);
+		}
 	}
 }
 
@@ -553,10 +569,12 @@
 		int err_idx= 0;
 
 		BM_ITER(ele, &iter, bm, types[i], NULL) {
-			if (BM_GetIndex(ele) != index) {
-				err_val= BM_GetIndex(ele);
-				err_idx= index;
-				is_error= TRUE;
+			if (!is_dirty) {
+				if (BM_GetIndex(ele) != index) {
+					err_val= BM_GetIndex(ele);
+					err_idx= index;
+					is_error= TRUE;
+				}
 			}
 
 			BM_SetIndex(ele, index); /* set_ok */
@@ -590,6 +608,8 @@
 	}
 #endif
 #endif
+	(void) is_any_error; /* shut up the compiler */
+
 }
 
 BMVert *BM_Vert_AtIndex(BMesh *bm, const int index)

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c	2011-11-28 18:43:34 UTC (rev 42228)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c	2011-11-28 18:52:35 UTC (rev 42229)
@@ -21,11 +21,29 @@
 #include "bmesh_iterators.h"
 #include "bmesh_private.h"
 
+/* use so valgrinds memcheck alerts us when undefined index is used.
+ * TESTING ONLY! */
+// #define USE_DEBUG_INDEX_MEMCHECK
+
+#ifdef USE_DEBUG_INDEX_MEMCHECK
+#define DEBUG_MEMCHECK_INDEX_INVALIDATE(ele)               \
+	{                                                      \
+		int undef_idx;                                     \
+		BM_SetIndex(ele, undef_idx); /* set_ok_invalid */  \
+	}                                                      \
+
+#endif
+
 BMVert *BM_Make_Vert(BMesh *bm, float co[3], const struct BMVert *example)
 {
 	BMVert *v = BLI_mempool_calloc(bm->vpool);
 
+#ifdef USE_DEBUG_INDEX_MEMCHECK
+	DEBUG_MEMCHECK_INDEX_INVALIDATE(v)
+#else
 	BM_SetIndex(v, -1); /* set_ok_invalid */
+#endif
+
 	bm->elem_index_dirty |= BM_VERT; /* may add to middle of the pool */
 
 	bm->totvert++;
@@ -82,7 +100,12 @@
 	
 	e = BLI_mempool_calloc(bm->epool);
 
+#ifdef USE_DEBUG_INDEX_MEMCHECK
+	DEBUG_MEMCHECK_INDEX_INVALIDATE(e)
+#else
 	BM_SetIndex(e, -1); /* set_ok_invalid */
+#endif
+
 	bm->elem_index_dirty |= BM_EDGE; /* may add to middle of the pool */
 
 	bm->totedge++;
@@ -232,7 +255,12 @@
 	
 	f = BLI_mempool_calloc(bm->fpool);
 
+#ifdef USE_DEBUG_INDEX_MEMCHECK
+	DEBUG_MEMCHECK_INDEX_INVALIDATE(f)
+#else
 	BM_SetIndex(f, -1); /* set_ok_invalid */
+#endif
+
 	bm->elem_index_dirty |= BM_FACE; /* may add to middle of the pool */
 
 	bm->totface++;
@@ -928,7 +956,12 @@
 	f->head.htype = BM_FACE;
 	BLI_addtail(&f->loops, lst);
 
+#ifdef USE_DEBUG_INDEX_MEMCHECK
+	DEBUG_MEMCHECK_INDEX_INVALIDATE(f)
+#else
 	BM_SetIndex(f, -1); /* set_ok_invalid */
+#endif
+
 	bm->elem_index_dirty |= BM_FACE; /* may add to middle of the pool */
 
 	bm->totface++;




More information about the Bf-blender-cvs mailing list