[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60959] trunk/blender/source/blender: move bmesh array lookup data and utility functions from editmesh into bmesh ,

Campbell Barton ideasman42 at gmail.com
Mon Oct 28 03:05:35 CET 2013


Revision: 60959
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60959
Author:   campbellbarton
Date:     2013-10-28 02:05:33 +0000 (Mon, 28 Oct 2013)
Log Message:
-----------
move bmesh array lookup data and utility functions from editmesh into bmesh,
since enough bmesh operations can also take advantage of direct index lookups on verts/edges/faces.

developers note:
- EDBM_index_arrays_init/ensure/free -> BM_mesh_elem_table_ensure/init/free
- EDBM_vert/edge/face_at_index -> BM_vert/edge/face_at_index
- EDBM_uv_element_map_create/free -> BM_uv_element_map_create/free
- ED_uv_element_get -> BM_uv_element_get

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_editmesh.h
    trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/editmesh.c
    trunk/blender/source/blender/blenkernel/intern/mesh_evaluate.c
    trunk/blender/source/blender/bmesh/bmesh_class.h
    trunk/blender/source/blender/bmesh/intern/bmesh_core.c
    trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c
    trunk/blender/source/blender/bmesh/intern/bmesh_mesh.h
    trunk/blender/source/blender/editors/include/ED_mesh.h
    trunk/blender/source/blender/editors/mesh/editface.c
    trunk/blender/source/blender/editors/mesh/editmesh_loopcut.c
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/editors/mesh/editmesh_utils.c
    trunk/blender/source/blender/editors/mesh/mesh_navmesh.c
    trunk/blender/source/blender/editors/mesh/meshtools.c
    trunk/blender/source/blender/editors/object/object_vgroup.c
    trunk/blender/source/blender/editors/sculpt_paint/sculpt_uv.c
    trunk/blender/source/blender/editors/space_view3d/drawmesh.c
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/editors/space_view3d/view3d_iterators.c
    trunk/blender/source/blender/editors/space_view3d/view3d_snap.c
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/editors/transform/transform_snap.c
    trunk/blender/source/blender/editors/uvedit/uvedit_ops.c
    trunk/blender/source/blender/editors/uvedit/uvedit_smart_stitch.c
    trunk/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c
    trunk/blender/source/blender/modifiers/intern/MOD_decimate.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_types.c

Modified: trunk/blender/source/blender/blenkernel/BKE_editmesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_editmesh.h	2013-10-28 01:58:05 UTC (rev 60958)
+++ trunk/blender/source/blender/blenkernel/BKE_editmesh.h	2013-10-28 02:05:33 UTC (rev 60959)
@@ -71,13 +71,6 @@
 	unsigned char (*derivedFaceColor)[4];
 	int derivedFaceColorLen;
 
-	/* index tables, to map indices to elements via
-	 * EDBM_index_arrays_init and associated functions.  don't
-	 * touch this or read it directly.*/
-	struct BMVert **vert_index;
-	struct BMEdge **edge_index;
-	struct BMFace **face_index;
-
 	/*selection mode*/
 	short selectmode;
 	short mat_nr;

Modified: trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c	2013-10-28 01:58:05 UTC (rev 60958)
+++ trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c	2013-10-28 02:05:33 UTC (rev 60959)
@@ -1233,7 +1233,8 @@
 		return;
 	}
 
-	ev = bmdm->em->vert_index[index];  /* should be EDBM_vert_at_index() */
+	BLI_assert((bm->elem_table_dirty & BM_VERT) == 0);
+	ev = bm->vtable[index];  /* should be BM_vert_at_index() */
 	// ev = BM_vert_at_index(bm, index); /* warning, does list loop, _not_ ideal */
 
 	bmvert_to_mvert(bm, ev, r_vert);
@@ -1255,7 +1256,10 @@
 		copy_v3_v3(r_co, bmdm->vertexCos[index]);
 	}
 	else {
-		BMVert *ev = bmdm->em->vert_index[index];  /* should be EDBM_vert_at_index() */
+		BMVert *ev;
+
+		BLI_assert((bm->elem_table_dirty & BM_VERT) == 0);
+		ev = bm->vtable[index];  /* should be BM_vert_at_index() */
 		// ev = BM_vert_at_index(bm, index); /* warning, does list loop, _not_ ideal */
 		copy_v3_v3(r_co, ev->co);
 	}
@@ -1277,7 +1281,10 @@
 		copy_v3_v3(r_no, bmdm->vertexNos[index]);
 	}
 	else {
-		BMVert *ev = bmdm->em->vert_index[index];  /* should be EDBM_vert_at_index() */
+		BMVert *ev;
+
+		BLI_assert((bm->elem_table_dirty & BM_VERT) == 0);
+		ev = bm->vtable[index];  /* should be BM_vert_at_index() */
 		// ev = BM_vert_at_index(bm, index); /* warning, does list loop, _not_ ideal */
 		copy_v3_v3(r_no, ev->no);
 	}
@@ -1298,7 +1305,10 @@
 		copy_v3_v3(r_no, bmdm->polyNos[index]);
 	}
 	else {
-		BMFace *efa = bmdm->em->face_index[index];  /* should be EDBM_vert_at_index() */
+		BMFace *efa;
+
+		BLI_assert((bm->elem_table_dirty & BM_FACE) == 0);
+		efa = bm->ftable[index];  /* should be BM_vert_at_index() */
 		// efa = BM_face_at_index(bm, index); /* warning, does list loop, _not_ ideal */
 		copy_v3_v3(r_no, efa->no);
 	}
@@ -1316,7 +1326,8 @@
 		return;
 	}
 
-	e = bmdm->em->edge_index[index];  /* should be EDBM_edge_at_index() */
+	BLI_assert((bm->elem_table_dirty & BM_EDGE) == 0);
+	e = bm->etable[index];  /* should be BM_edge_at_index() */
 	// e = BM_edge_at_index(bm, index); /* warning, does list loop, _not_ ideal */
 
 	r_edge->flag = BM_edge_flag_to_mflag(e);

Modified: trunk/blender/source/blender/blenkernel/intern/editmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/editmesh.c	2013-10-28 01:58:05 UTC (rev 60958)
+++ trunk/blender/source/blender/blenkernel/intern/editmesh.c	2013-10-28 02:05:33 UTC (rev 60959)
@@ -78,10 +78,6 @@
 	 * used.*/
 	em_copy->looptris = NULL;
 
-	em_copy->vert_index = NULL;
-	em_copy->edge_index = NULL;
-	em_copy->face_index = NULL;
-
 	return em_copy;
 }
 
@@ -345,10 +341,6 @@
 
 	if (em->looptris) MEM_freeN(em->looptris);
 
-	if (em->vert_index) MEM_freeN(em->vert_index);
-	if (em->edge_index) MEM_freeN(em->edge_index);
-	if (em->face_index) MEM_freeN(em->face_index);
-
 	if (em->bm)
 		BM_mesh_free(em->bm);
 }

Modified: trunk/blender/source/blender/blenkernel/intern/mesh_evaluate.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh_evaluate.c	2013-10-28 01:58:05 UTC (rev 60958)
+++ trunk/blender/source/blender/blenkernel/intern/mesh_evaluate.c	2013-10-28 02:05:33 UTC (rev 60959)
@@ -946,7 +946,7 @@
  * \{ */
 
 
-/* ngon version wip, based on EDBM_uv_vert_map_create */
+/* ngon version wip, based on BM_uv_vert_map_create */
 /* this replaces the non bmesh function (in trunk) which takes MTFace's, if we ever need it back we could
  * but for now this replaces it because its unused. */
 

Modified: trunk/blender/source/blender/bmesh/bmesh_class.h
===================================================================
--- trunk/blender/source/blender/bmesh/bmesh_class.h	2013-10-28 01:58:05 UTC (rev 60958)
+++ trunk/blender/source/blender/bmesh/bmesh_class.h	2013-10-28 02:05:33 UTC (rev 60959)
@@ -183,9 +183,28 @@
 	 * BM_LOOP isn't handled so far. */
 	char elem_index_dirty;
 
+	/* flag array table as being dirty so we know when its safe to use it,
+	 * or when it needs to be re-created */
+	char elem_table_dirty;
+
+
 	/* element pools */
 	struct BLI_mempool *vpool, *epool, *lpool, *fpool;
 
+	/* mempool lookup tables (optional)
+	 * index tables, to map indices to elements via
+	 * BM_mesh_elem_table_ensure and associated functions.  don't
+	 * touch this or read it directly.\
+	 * Use BM_mesh_elem_table_ensure(), BM_vert/edge/face_at_index() */
+	BMVert **vtable;
+	BMEdge **etable;
+	BMFace **ftable;
+
+	/* size of allocated tables */
+	int vtable_tot;
+	int etable_tot;
+	int ftable_tot;
+
 	/* operator api stuff (must be all NULL or all alloc'd) */
 	struct BLI_mempool *vtoolflagpool, *etoolflagpool, *ftoolflagpool;
 

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_core.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_core.c	2013-10-28 01:58:05 UTC (rev 60958)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_core.c	2013-10-28 02:05:33 UTC (rev 60959)
@@ -70,7 +70,9 @@
 	/* disallow this flag for verts - its meaningless */
 	BLI_assert((create_flag & BM_CREATE_NO_DOUBLE) == 0);
 
-	bm->elem_index_dirty |= BM_VERT; /* may add to middle of the pool */
+	/* may add to middle of the pool */
+	bm->elem_index_dirty |= BM_VERT;
+	bm->elem_table_dirty |= BM_VERT;
 
 	bm->totvert++;
 
@@ -130,7 +132,9 @@
 	BM_elem_index_set(e, -1); /* set_ok_invalid */
 #endif
 
-	bm->elem_index_dirty |= BM_EDGE; /* may add to middle of the pool */
+	/* may add to middle of the pool */
+	bm->elem_index_dirty |= BM_EDGE;
+	bm->elem_table_dirty |= BM_EDGE;
 
 	bm->totedge++;
 
@@ -292,7 +296,9 @@
 	BM_elem_index_set(f, -1); /* set_ok_invalid */
 #endif
 
-	bm->elem_index_dirty |= BM_FACE; /* may add to middle of the pool */
+	/* may add to middle of the pool */
+	bm->elem_index_dirty |= BM_FACE;
+	bm->elem_table_dirty |= BM_FACE;
 
 	bm->totface++;
 
@@ -562,6 +568,7 @@
 {
 	bm->totvert--;
 	bm->elem_index_dirty |= BM_VERT;
+	bm->elem_table_dirty |= BM_VERT;
 
 	BM_select_history_remove(bm, v);
 
@@ -582,6 +589,7 @@
 {
 	bm->totedge--;
 	bm->elem_index_dirty |= BM_EDGE;
+	bm->elem_table_dirty |= BM_EDGE;
 
 	BM_select_history_remove(bm, (BMElem *)e);
 
@@ -605,6 +613,7 @@
 
 	bm->totface--;
 	bm->elem_index_dirty |= BM_FACE;
+	bm->elem_table_dirty |= BM_FACE;
 
 	BM_select_history_remove(bm, (BMElem *)f);
 

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c	2013-10-28 01:58:05 UTC (rev 60958)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c	2013-10-28 02:05:33 UTC (rev 60959)
@@ -213,6 +213,10 @@
 	BLI_mempool_destroy(bm->lpool);
 	BLI_mempool_destroy(bm->fpool);
 
+	if (bm->vtable) MEM_freeN(bm->vtable);
+	if (bm->etable) MEM_freeN(bm->etable);
+	if (bm->ftable) MEM_freeN(bm->ftable);
+
 	/* destroy flag pool */
 	BM_mesh_elem_toolflags_clear(bm);
 
@@ -623,6 +627,179 @@
 
 }
 
+/* debug check only - no need to optimize */
+#ifndef NDEBUG
+bool BM_mesh_elem_table_check(BMesh *bm)
+{
+	BMIter iter;
+	BMElem *ele;
+	int i;
+
+	if (bm->vtable && ((bm->elem_table_dirty & BM_VERT) == 0)) {
+		BM_ITER_MESH_INDEX (ele, &iter, bm, BM_VERTS_OF_MESH, i) {
+			if (ele != (BMElem *)bm->vtable[i]) {
+				return false;
+			}
+		}
+	}
+
+	if (bm->etable && ((bm->elem_table_dirty & BM_EDGE) == 0)) {
+		BM_ITER_MESH_INDEX (ele, &iter, bm, BM_EDGES_OF_MESH, i) {
+			if (ele != (BMElem *)bm->etable[i]) {
+				return false;
+			}
+		}
+	}
+
+	if (bm->ftable && ((bm->elem_table_dirty & BM_FACE) == 0)) {
+		BM_ITER_MESH_INDEX (ele, &iter, bm, BM_FACES_OF_MESH, i) {
+			if (ele != (BMElem *)bm->ftable[i]) {
+				return false;
+			}
+		}
+	}
+
+	return true;
+}
+#endif
+
+
+
+void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
+{
+	/* assume if the array is non-null then its valid and no need to recalc */
+	const char htype_needed = (((bm->vtable && ((bm->elem_table_dirty & BM_VERT) == 0)) ? 0 : BM_VERT) |
+	                           ((bm->etable && ((bm->elem_table_dirty & BM_EDGE) == 0)) ? 0 : BM_EDGE) |
+	                           ((bm->ftable && ((bm->elem_table_dirty & BM_FACE) == 0)) ? 0 : BM_FACE)) & htype;
+
+	BLI_assert((htype & ~BM_ALL_NOLOOP) == 0);
+
+	/* in debug mode double check we didn't need to recalculate */
+	BLI_assert(BM_mesh_elem_table_check(bm) == true);
+
+	if (htype_needed & BM_VERT) {
+		if (bm->vtable && bm->totvert <= bm->vtable_tot && bm->totvert * 2 >= bm->vtable_tot) {
+			/* pass (re-use the array) */
+		}
+		else {
+			if (bm->vtable)
+				MEM_freeN(bm->vtable);
+			bm->vtable = MEM_mallocN(sizeof(void **) * bm->totvert, "bm->vtable");
+			bm->vtable_tot = bm->totvert;
+		}
+		bm->elem_table_dirty &= ~BM_VERT;
+	}
+	if (htype_needed & BM_EDGE) {
+		if (bm->etable && bm->totedge <= bm->etable_tot && bm->totedge * 2 >= bm->etable_tot) {
+			/* pass (re-use the array) */
+		}
+		else {
+			if (bm->etable)
+				MEM_freeN(bm->etable);
+			bm->etable = MEM_mallocN(sizeof(void **) * bm->totedge, "bm->etable");
+			bm->etable_tot = bm->totedge;
+		}
+		bm->elem_table_dirty &= ~BM_EDGE;
+	}
+	if (htype_needed & BM_FACE) {
+		if (bm->ftable && bm->totface <= bm->ftable_tot && bm->totface * 2 >= bm->ftable_tot) {
+			/* pass (re-use the array) */
+		}
+		else {
+			if (bm->ftable)
+				MEM_freeN(bm->ftable);
+			bm->ftable = MEM_mallocN(sizeof(void **) * bm->totface, "bm->ftable");
+			bm->ftable_tot = bm->totface;
+		}
+		bm->elem_table_dirty &= ~BM_FACE;
+	}
+
+#pragma omp parallel sections if (em->bm->totvert + em->bm->totedge + em->bm->totface >= BM_OMP_LIMIT)
+	{

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list