[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42228] branches/bmesh/blender/source/ blender/bmesh/intern/bmesh_operators.c: validate the index values when an operator finishes since the arrays are looped over anyway .

Campbell Barton ideasman42 at gmail.com
Mon Nov 28 19:43:34 CET 2011


Revision: 42228
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42228
Author:   campbellbarton
Date:     2011-11-28 18:43:34 +0000 (Mon, 28 Nov 2011)
Log Message:
-----------
validate the index values when an operator finishes since the arrays are looped over anyway.

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	2011-11-28 18:32:29 UTC (rev 42227)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c	2011-11-28 18:43:34 UTC (rev 42228)
@@ -820,6 +820,7 @@
 
 	BMIter iter;
 	BLI_mempool *oldpool = bm->toolflagpool; 		/*old flag pool*/
+	BLI_mempool *newpool;
 	void *oldflags;
 
 	/* store memcpy size for reuse */
@@ -828,24 +829,24 @@
 	bm->totflags++;
 
 	/*allocate new flag pool*/
-	bm->toolflagpool = BLI_mempool_create(sizeof(BMFlagLayer)*bm->totflags, 512, 512, FALSE, FALSE);
+	bm->toolflagpool= newpool= BLI_mempool_create(sizeof(BMFlagLayer)*bm->totflags, 512, 512, FALSE, FALSE);
 	
 	/*now go through and memcpy all the flags. Loops don't get a flag layer at this time...*/
-	for(ele = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++){
+	for (ele = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++) {
 		oldflags = ele->flags;
-		ele->flags = BLI_mempool_calloc(bm->toolflagpool);
+		ele->flags = BLI_mempool_calloc(newpool);
 		memcpy(ele->flags, oldflags, old_totflags_size);
 		BM_SetIndex(ele, i); /* set_inline */
 	}
-	for(ele = BMIter_New(&iter, bm, BM_EDGES_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++){
+	for (ele = BMIter_New(&iter, bm, BM_EDGES_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++) {
 		oldflags = ele->flags;
-		ele->flags = BLI_mempool_calloc(bm->toolflagpool);
+		ele->flags = BLI_mempool_calloc(newpool);
 		memcpy(ele->flags, oldflags, old_totflags_size);
 		BM_SetIndex(ele, i); /* set_inline */
 	}
-	for(ele = BMIter_New(&iter, bm, BM_FACES_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++){
+	for (ele = BMIter_New(&iter, bm, BM_FACES_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++) {
 		oldflags = ele->flags;
-		ele->flags = BLI_mempool_calloc(bm->toolflagpool);
+		ele->flags = BLI_mempool_calloc(newpool);
 		memcpy(ele->flags, oldflags, old_totflags_size);
 		BM_SetIndex(ele, i); /* set_inline */
 	}
@@ -857,38 +858,46 @@
 
 static void free_flag_layer(BMesh *bm)
 {
-	BMVert *v;
-	BMEdge *e;
-	BMFace *f;
+	BMHeader *ele;
+	/* set the index values since we are looping over all data anyway,
+	 * may save time later on */
+	int i;
 
-	BMIter verts;
-	BMIter edges;
-	BMIter faces;
+	BMIter iter;
 	BLI_mempool *oldpool = bm->toolflagpool;
+	BLI_mempool *newpool;
 	void *oldflags;
 	
+	/* store memcpy size for reuse */
+	const size_t new_totflags_size= ((bm->totflags-1) * sizeof(BMFlagLayer));
+
 	/*de-increment the totflags first...*/
 	bm->totflags--;
 	/*allocate new flag pool*/
-	bm->toolflagpool = BLI_mempool_create(sizeof(BMFlagLayer)*bm->totflags, 512, 512, TRUE, FALSE);
+	bm->toolflagpool= newpool= BLI_mempool_create(new_totflags_size, 512, 512, TRUE, FALSE);
 	
 	/*now go through and memcpy all the flags*/
-	for(v = BMIter_New(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = BMIter_Step(&verts)){
-		oldflags = v->head.flags;
-		v->head.flags = BLI_mempool_calloc(bm->toolflagpool);
-		memcpy(v->head.flags, oldflags, sizeof(BMFlagLayer)*bm->totflags);  /*correct?*/
+	for (ele = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++) {
+		oldflags = ele->flags;
+		ele->flags = BLI_mempool_calloc(newpool);
+		memcpy(ele->flags, oldflags, new_totflags_size);
+		BM_SetIndex(ele, i); /* set_inline */
 	}
-	for(e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BMIter_Step(&edges)){
-		oldflags = e->head.flags;
-		e->head.flags = BLI_mempool_calloc(bm->toolflagpool);
-		memcpy(e->head.flags, oldflags, sizeof(BMFlagLayer)*bm->totflags);
+	for (ele = BMIter_New(&iter, bm, BM_EDGES_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++) {
+		oldflags = ele->flags;
+		ele->flags = BLI_mempool_calloc(newpool);
+		memcpy(ele->flags, oldflags, new_totflags_size);
+		BM_SetIndex(ele, i); /* set_inline */
 	}
-	for(f = BMIter_New(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BMIter_Step(&faces)){
-		oldflags = f->head.flags;
-		f->head.flags = BLI_mempool_calloc(bm->toolflagpool);
-		memcpy(f->head.flags, oldflags, sizeof(BMFlagLayer)*bm->totflags);
+	for (ele = BMIter_New(&iter, bm, BM_FACES_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++) {
+		oldflags = ele->flags;
+		ele->flags = BLI_mempool_calloc(newpool);
+		memcpy(ele->flags, oldflags, new_totflags_size);
+		BM_SetIndex(ele, i); /* set_inline */
 	}
 
+	bm->elem_index_dirty &= ~(BM_VERT|BM_EDGE|BM_FACE);
+
 	BLI_mempool_destroy(oldpool);
 }
 




More information about the Bf-blender-cvs mailing list