[Bf-blender-cvs] [7867f32] master: BMesh: minor speedup, avoid calloc+assign, assign all members instead

Campbell Barton noreply at git.blender.org
Tue Apr 8 04:59:20 CEST 2014


Commit: 7867f32fce305382daf28c417bf07d6660bdc64c
Author: Campbell Barton
Date:   Tue Apr 8 12:51:00 2014 +1000
https://developer.blender.org/rB7867f32fce305382daf28c417bf07d6660bdc64c

BMesh: minor speedup, avoid calloc+assign, assign all members instead

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

M	source/blender/bmesh/intern/bmesh_core.c

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

diff --git a/source/blender/bmesh/intern/bmesh_core.c b/source/blender/bmesh/intern/bmesh_core.c
index ed1789f..3efee37 100644
--- a/source/blender/bmesh/intern/bmesh_core.c
+++ b/source/blender/bmesh/intern/bmesh_core.c
@@ -60,7 +60,11 @@
 BMVert *BM_vert_create(BMesh *bm, const float co[3],
                        const BMVert *v_example, const eBMCreateFlag create_flag)
 {
-	BMVert *v = BLI_mempool_calloc(bm->vpool);
+	BMVert *v = BLI_mempool_alloc(bm->vpool);
+
+
+	/* --- assign all members --- */
+	v->head.data = NULL;
 
 #ifdef USE_DEBUG_INDEX_MEMCHECK
 	DEBUG_MEMCHECK_INDEX_INVALIDATE(v)
@@ -68,6 +72,26 @@ BMVert *BM_vert_create(BMesh *bm, const float co[3],
 	BM_elem_index_set(v, -1); /* set_ok_invalid */
 #endif
 
+	v->head.htype = BM_VERT;
+	v->head.hflag = 0;
+	v->head.api_flag = 0;
+
+	/* allocate flags */
+	v->oflags = bm->vtoolflagpool ? BLI_mempool_calloc(bm->vtoolflagpool) : NULL;
+
+	/* 'v->no' is handled by BM_elem_attrs_copy */
+	if (co) {
+		copy_v3_v3(v->co, co);
+	}
+	else {
+		zero_v3(v->co);
+	}
+	zero_v3(v->no);
+
+	v->e = NULL;
+	/* --- done --- */
+
+
 	/* disallow this flag for verts - its meaningless */
 	BLI_assert((create_flag & BM_CREATE_NO_DOUBLE) == 0);
 
@@ -77,18 +101,6 @@ BMVert *BM_vert_create(BMesh *bm, const float co[3],
 
 	bm->totvert++;
 
-	v->head.htype = BM_VERT;
-
-	/* 'v->no' is handled by BM_elem_attrs_copy */
-	if (co) {
-		copy_v3_v3(v->co, co);
-	}
-
-	/* allocate flags */
-	if (bm->vtoolflagpool) {
-		v->oflags = BLI_mempool_calloc(bm->vtoolflagpool);
-	}
-
 	if (!(create_flag & BM_CREATE_SKIP_CD)) {
 		if (v_example) {
 			int *keyi;
@@ -125,7 +137,11 @@ BMEdge *BM_edge_create(BMesh *bm, BMVert *v1, BMVert *v2,
 	if ((create_flag & BM_CREATE_NO_DOUBLE) && (e = BM_edge_exists(v1, v2)))
 		return e;
 	
-	e = BLI_mempool_calloc(bm->epool);
+	e = BLI_mempool_alloc(bm->epool);
+
+
+	/* --- assign all members --- */
+	e->head.data = NULL;
 
 #ifdef USE_DEBUG_INDEX_MEMCHECK
 	DEBUG_MEMCHECK_INDEX_INVALIDATE(e)
@@ -133,27 +149,30 @@ BMEdge *BM_edge_create(BMesh *bm, BMVert *v1, BMVert *v2,
 	BM_elem_index_set(e, -1); /* set_ok_invalid */
 #endif
 
-	/* may add to middle of the pool */
-	bm->elem_index_dirty |= BM_EDGE;
-	bm->elem_table_dirty |= BM_EDGE;
-
-	bm->totedge++;
-
 	e->head.htype = BM_EDGE;
-	
+	e->head.hflag = BM_ELEM_SMOOTH | BM_ELEM_DRAW;
+	e->head.api_flag = 0;
+
 	/* allocate flags */
-	if (bm->etoolflagpool) {
-		e->oflags = BLI_mempool_calloc(bm->etoolflagpool);
-	}
+	e->oflags = bm->etoolflagpool ? BLI_mempool_calloc(bm->etoolflagpool) : NULL;
 
 	e->v1 = v1;
 	e->v2 = v2;
-	
-	BM_elem_flag_enable(e, BM_ELEM_SMOOTH | BM_ELEM_DRAW);
-	
+	e->l = NULL;
+
+	memset(&e->v1_disk_link, 0, sizeof(BMDiskLink) * 2);
+	/* --- done --- */
+
+
 	bmesh_disk_edge_append(e, e->v1);
 	bmesh_disk_edge_append(e, e->v2);
-	
+
+	/* may add to middle of the pool */
+	bm->elem_index_dirty |= BM_EDGE;
+	bm->elem_table_dirty |= BM_EDGE;
+
+	bm->totedge++;
+
 	if (!(create_flag & BM_CREATE_SKIP_CD)) {
 		if (e_example) {
 			BM_elem_attrs_copy(bm, bm, e_example, e);
@@ -163,7 +182,6 @@ BMEdge *BM_edge_create(BMesh *bm, BMVert *v1, BMVert *v2,
 		}
 	}
 
-	
 	BM_CHECK_ELEMENT(e);
 
 	return e;
@@ -174,14 +192,25 @@ static BMLoop *bm_loop_create(BMesh *bm, BMVert *v, BMEdge *e, BMFace *f,
 {
 	BMLoop *l = NULL;
 
-	l = BLI_mempool_calloc(bm->lpool);
-	l->next = l->prev = NULL;
+	l = BLI_mempool_alloc(bm->lpool);
+
+	/* --- assign all members --- */
+	l->head.data = NULL;
+	BM_elem_index_set(l, 0); /* set_loop */
+	l->head.hflag = 0;
+	l->head.htype = BM_LOOP;
+	l->head.api_flag = 0;
+
 	l->v = v;
 	l->e = e;
 	l->f = f;
-	l->radial_next = l->radial_prev = NULL;
-	l->head.data = NULL;
-	l->head.htype = BM_LOOP;
+
+	l->radial_next = NULL;
+	l->radial_prev = NULL;
+	l->next = NULL;
+	l->prev = NULL;
+	/* --- done --- */
+
 
 	bm->totloop++;
 
@@ -284,36 +313,48 @@ BMFace *BM_face_copy(BMesh *bm_dst, BMesh *bm_src, BMFace *f,
 /**
  * only create the face, since this calloc's the length is initialized to 0,
  * leave adding loops to the caller.
+ *
+ * \note, caller needs to handle customdata.
  */
-BLI_INLINE BMFace *bm_face_create__internal(BMesh *bm, const eBMCreateFlag create_flag)
+BLI_INLINE BMFace *bm_face_create__internal(BMesh *bm)
 {
 	BMFace *f;
 
-	f = BLI_mempool_calloc(bm->fpool);
+	f = BLI_mempool_alloc(bm->fpool);
 
+
+	/* --- assign all members --- */
+	f->head.data = NULL;
 #ifdef USE_DEBUG_INDEX_MEMCHECK
 	DEBUG_MEMCHECK_INDEX_INVALIDATE(f)
 #else
 	BM_elem_index_set(f, -1); /* set_ok_invalid */
 #endif
 
+	f->head.htype = BM_FACE;
+	f->head.hflag = 0;
+	f->head.api_flag = 0;
+
+	/* allocate flags */
+	f->oflags = bm->ftoolflagpool ? BLI_mempool_calloc(bm->ftoolflagpool) : NULL;
+
+#ifdef USE_BMESH_HOLES
+	BLI_listbase_clear(&f->loops);
+#else
+	f->l_first = NULL;
+#endif
+	f->len = 0;
+	zero_v3(f->no);
+	f->mat_nr = 0;
+	/* --- done --- */
+
+
 	/* may add to middle of the pool */
 	bm->elem_index_dirty |= BM_FACE;
 	bm->elem_table_dirty |= BM_FACE;
 
 	bm->totface++;
 
-	f->head.htype = BM_FACE;
-
-	/* allocate flags */
-	if (bm->ftoolflagpool) {
-		f->oflags = BLI_mempool_calloc(bm->ftoolflagpool);
-	}
-
-	if (!(create_flag & BM_CREATE_SKIP_CD)) {
-		CustomData_bmesh_set_default(&bm->pdata, &f->head.data);
-	}
-
 #ifdef USE_BMESH_HOLES
 	f->totbounds = 0;
 #endif
@@ -353,7 +394,7 @@ BMFace *BM_face_create(BMesh *bm, BMVert **verts, BMEdge **edges, const int len,
 		}
 	}
 
-	f = bm_face_create__internal(bm, create_flag);
+	f = bm_face_create__internal(bm);
 
 	startl = lastl = bm_face_boundary_add(bm, f, verts[0], edges[0], create_flag);
 	
@@ -1208,7 +1249,7 @@ static BMFace *bm_face_create__sfme(BMesh *bm, BMFace *UNUSED(example))
 	BMLoopList *lst;
 #endif
 
-	f = bm_face_create__internal(bm, 0);
+	f = bm_face_create__internal(bm);
 
 #ifdef USE_BMESH_HOLES
 	lst = BLI_mempool_calloc(bm->looplistpool);
@@ -1219,6 +1260,8 @@ static BMFace *bm_face_create__sfme(BMesh *bm, BMFace *UNUSED(example))
 	f->totbounds = 1;
 #endif
 
+	CustomData_bmesh_set_default(&bm->pdata, &f->head.data);
+
 	return f;
 }




More information about the Bf-blender-cvs mailing list