[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57048] trunk/blender/source/blender: bmesh optimization: use offsets for deform-vert lookups to avoid customdata layer lookups within loops .

Campbell Barton ideasman42 at gmail.com
Mon May 27 14:42:49 CEST 2013


Revision: 57048
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57048
Author:   campbellbarton
Date:     2013-05-27 12:42:48 +0000 (Mon, 27 May 2013)
Log Message:
-----------
bmesh optimization: use offsets for deform-vert lookups to avoid customdata layer lookups within loops.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/key.c
    trunk/blender/source/blender/bmesh/operators/bmo_similar.c
    trunk/blender/source/blender/editors/mesh/editmesh_select.c
    trunk/blender/source/blender/editors/object/object_hook.c
    trunk/blender/source/blender/editors/object/object_vgroup.c
    trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c

Modified: trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c	2013-05-27 11:33:17 UTC (rev 57047)
+++ trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c	2013-05-27 12:42:48 UTC (rev 57048)
@@ -1428,6 +1428,8 @@
 {
 	EditDerivedBMesh *bmdm = MEM_callocN(sizeof(*bmdm), __func__);
 	BMesh *bm = em->bm;
+	const int cd_dvert_offset = CustomData_get_offset(&bm->vdata, CD_MDEFORMVERT);
+	const int cd_skin_offset = CustomData_get_offset(&bm->vdata, CD_MVERT_SKIN);
 
 	bmdm->em = em;
 
@@ -1485,7 +1487,7 @@
 
 	bmdm->vertexCos = vertexCos;
 
-	if (CustomData_has_layer(&bm->vdata, CD_MDEFORMVERT)) {
+	if (cd_dvert_offset != -1) {
 		BMIter iter;
 		BMVert *eve;
 		int i;
@@ -1494,11 +1496,11 @@
 
 		BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
 			DM_set_vert_data(&bmdm->dm, i, CD_MDEFORMVERT,
-			                 CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_MDEFORMVERT));
+			                 BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset));
 		}
 	}
 
-	if (CustomData_has_layer(&bm->vdata, CD_MVERT_SKIN)) {
+	if (cd_skin_offset != -1) {
 		BMIter iter;
 		BMVert *eve;
 		int i;
@@ -1507,8 +1509,7 @@
 
 		BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
 			DM_set_vert_data(&bmdm->dm, i, CD_MVERT_SKIN,
-			                 CustomData_bmesh_get(&bm->vdata, eve->head.data,
-			                                      CD_MVERT_SKIN));
+			                 BM_ELEM_CD_GET_VOID_P(eve, cd_skin_offset));
 		}
 	}
 
@@ -1538,9 +1539,8 @@
 
 			/* following Mesh convention; we use vertex coordinate itself
 			 * for normal in this case */
-			if (normalize_v3(no) == 0.0f) {
-				copy_v3_v3(no, vertexCos[i]);
-				normalize_v3(no);
+			if (UNLIKELY(normalize_v3(no) == 0.0f)) {
+				normalize_v3_v3(no, vertexCos[i]);
 			}
 		}
 	}

Modified: trunk/blender/source/blender/blenkernel/intern/key.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/key.c	2013-05-27 11:33:17 UTC (rev 57047)
+++ trunk/blender/source/blender/blenkernel/intern/key.c	2013-05-27 12:42:48 UTC (rev 57048)
@@ -1067,12 +1067,10 @@
 		weights = MEM_callocN(totvert * sizeof(float), "weights");
 
 		if (em) {
+			const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
 			BM_ITER_MESH_INDEX (eve, &iter, em->bm, BM_VERTS_OF_MESH, i) {
-				dvert = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
-
-				if (dvert) {
-					weights[i] = defvert_find_weight(dvert, defgrp_index);
-				}
+				dvert = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
+				weights[i] = defvert_find_weight(dvert, defgrp_index);
 			}
 		}
 		else {

Modified: trunk/blender/source/blender/bmesh/operators/bmo_similar.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_similar.c	2013-05-27 11:33:17 UTC (rev 57047)
+++ trunk/blender/source/blender/bmesh/operators/bmo_similar.c	2013-05-27 12:42:48 UTC (rev 57048)
@@ -530,6 +530,7 @@
 {
 #define VERT_MARK	1
 
+	const int cd_dvert_offset = CustomData_get_offset(&bm->vdata, CD_MDEFORMVERT);
 	BMOIter vs_iter;	/* selected verts iterator */
 	BMIter v_iter;		/* mesh verts iterator */
 	BMVert *vs;		/* selected vertex */
@@ -573,13 +574,9 @@
 				break;
 
 			case SIMVERT_VGROUP:
-				if (CustomData_has_layer(&(bm->vdata), CD_MDEFORMVERT)) {
-					v_ext[i].dvert = CustomData_bmesh_get(&bm->vdata, v_ext[i].v->head.data, CD_MDEFORMVERT);
-				}
-				else {
-					v_ext[i].dvert = NULL;
-				}
+				v_ext[i].dvert = (cd_dvert_offset != -1) ? BM_ELEM_CD_GET_VOID_P(v_ext[i].v, cd_dvert_offset) : NULL;
 				break;
+
 			case SIMVERT_EDGE:
 				v_ext[i].num_edges = BM_vert_edge_count(v);
 				break;

Modified: trunk/blender/source/blender/editors/mesh/editmesh_select.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_select.c	2013-05-27 11:33:17 UTC (rev 57047)
+++ trunk/blender/source/blender/editors/mesh/editmesh_select.c	2013-05-27 12:42:48 UTC (rev 57048)
@@ -3312,11 +3312,12 @@
 	if (ED_operator_editmesh(C)) {
 		Object *obedit = CTX_data_edit_object(C);
 		BMEditMesh *em = BKE_editmesh_from_object(obedit);
+		const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
 
 		if ((em->selectmode & SCE_SELECT_VERTEX) == 0) {
 			CTX_wm_operator_poll_msg_set(C, "Must be in vertex selection mode");
 		}
-		else if (obedit->defbase.first == NULL) {
+		else if (obedit->defbase.first == NULL || cd_dvert_offset == -1) {
 			CTX_wm_operator_poll_msg_set(C, "No weights/vertex groups on object");
 		}
 		else {
@@ -3330,6 +3331,8 @@
 {
 	Object *obedit = CTX_data_edit_object(C);
 	BMEditMesh *em = BKE_editmesh_from_object(obedit);
+	const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
+
 	BMVert *eve;
 	BMIter iter;
 
@@ -3339,7 +3342,7 @@
 
 	BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
 		if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
-			MDeformVert *dv = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
+			MDeformVert *dv = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
 			/* no dv or dv set with no weight */
 			if (ELEM(NULL, dv, dv->dw)) {
 				BM_vert_select_set(em->bm, eve, true);

Modified: trunk/blender/source/blender/editors/object/object_hook.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_hook.c	2013-05-27 11:33:17 UTC (rev 57047)
+++ trunk/blender/source/blender/editors/object/object_hook.c	2013-05-27 12:42:48 UTC (rev 57048)
@@ -102,11 +102,13 @@
 	return totvert;
 }
 
-static int return_editmesh_vgroup(Object *obedit, BMEditMesh *em, char *name, float *cent)
+static bool return_editmesh_vgroup(Object *obedit, BMEditMesh *em, char *name, float *cent)
 {
+	const int cd_dvert_offset = obedit->actdef ? CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT) : -1;
+
 	zero_v3(cent);
 
-	if (obedit->actdef) {
+	if (cd_dvert_offset != -1) {
 		const int defgrp_index = obedit->actdef - 1;
 		int totvert = 0;
 
@@ -116,24 +118,22 @@
 
 		/* find the vertices */
 		BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
-			dvert = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
+			dvert = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
 
-			if (dvert) {
-				if (defvert_find_weight(dvert, defgrp_index) > 0.0f) {
-					add_v3_v3(cent, eve->co);
-					totvert++;
-				}
+			if (defvert_find_weight(dvert, defgrp_index) > 0.0f) {
+				add_v3_v3(cent, eve->co);
+				totvert++;
 			}
 		}
 		if (totvert) {
 			bDeformGroup *dg = BLI_findlink(&obedit->defbase, defgrp_index);
 			BLI_strncpy(name, dg->name, sizeof(dg->name));
 			mul_v3_fl(cent, 1.0f / (float)totvert);
-			return 1;
+			return true;
 		}
 	}
 	
-	return 0;
+	return false;
 }	
 
 static void select_editbmesh_hook(Object *ob, HookModifierData *hmd)
@@ -296,7 +296,7 @@
 	return totvert;
 }
 
-static int object_hook_index_array(Scene *scene, Object *obedit, int *tot, int **indexar, char *name, float *cent_r)
+static bool object_hook_index_array(Scene *scene, Object *obedit, int *tot, int **indexar, char *name, float *cent_r)
 {
 	*indexar = NULL;
 	*tot = 0;
@@ -319,11 +319,10 @@
 
 			/* check selected vertices first */
 			if (return_editmesh_indexar(em, tot, indexar, cent_r)) {
-				return 1;
+				return true;
 			}
 			else {
-				int ret = return_editmesh_vgroup(obedit, em, name, cent_r);
-				return ret;
+				return return_editmesh_vgroup(obedit, em, name, cent_r);
 			}
 		}
 		case OB_CURVE:
@@ -335,7 +334,7 @@
 			return return_editlattice_indexar(lt->editlatt->latt, tot, indexar, cent_r);
 		}
 		default:
-			return 0;
+			return false;
 	}
 }
 

Modified: trunk/blender/source/blender/editors/object/object_vgroup.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_vgroup.c	2013-05-27 11:33:17 UTC (rev 57047)
+++ trunk/blender/source/blender/editors/object/object_vgroup.c	2013-05-27 12:42:48 UTC (rev 57048)
@@ -223,11 +223,13 @@
 
 				if (me->edit_btmesh) {
 					BMEditMesh *em = me->edit_btmesh;
+					BMesh *bm = em->bm;
+					const int cd_dvert_offset  = CustomData_get_offset(&bm->vdata, CD_MDEFORMVERT);
 					BMIter iter;
 					BMVert *eve;
 					int i;
 
-					if (!CustomData_has_layer(&em->bm->vdata, CD_MDEFORMVERT)) {
+					if (cd_dvert_offset == -1) {
 						return false;
 					}
 
@@ -240,13 +242,13 @@
 					if (use_vert_sel) {
 						BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
 							(*dvert_arr)[i] = BM_elem_flag_test(eve, BM_ELEM_SELECT) ?
-							                  CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT) : NULL;
+							                  BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset) : NULL;
 							i++;
 						}
 					}
 					else {
 						BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
-							(*dvert_arr)[i] = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
+							(*dvert_arr)[i] = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
 							i++;
 						}
 					}
@@ -983,12 +985,19 @@
 		Mesh *me = ob->data;
 
 		if (me->edit_btmesh) {
+			BMEditMesh *em = me->edit_btmesh;
+			const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
 			/* warning, this lookup is _not_ fast */
-			BMVert *eve = BM_vert_at_index(me->edit_btmesh->bm, vertnum);
-			if (!eve) {
+			BMVert *eve;
+
+			EDBM_index_arrays_ensure(em, BM_VERT);
+
+			if ((cd_dvert_offset != -1) || (eve = EDBM_vert_at_index(em, vertnum))) {
+				dv = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
+			}
+			else {
 				return 0.0f;
 			}
-			dv = CustomData_bmesh_get(&me->edit_btmesh->bm->vdata, eve->head.data, CD_MDEFORMVERT);
 		}
 		else {
 			if (me->dvert) {
@@ -1052,12 +1061,13 @@
 
 		if (me->edit_btmesh) {
 			BMEditMesh *em = me->edit_btmesh;
+			const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
 			BMIter iter;
 			BMVert *eve;
 
 			BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
 				if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
-					MDeformVert *dv = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
+					MDeformVert *dv = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
 					if (defvert_find_index(dv, def_nr)) {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list