[Bf-blender-cvs] [2108a61] master: BMesh: minor optimizations for shapekey lookups on conversion

Campbell Barton noreply at git.blender.org
Tue Apr 22 16:50:46 CEST 2014


Commit: 2108a616910dc814be13a0b640970bfe4b7eb4ce
Author: Campbell Barton
Date:   Wed Apr 23 00:49:28 2014 +1000
https://developer.blender.org/rB2108a616910dc814be13a0b640970bfe4b7eb4ce

BMesh: minor optimizations for shapekey lookups on conversion

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

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

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

diff --git a/source/blender/bmesh/intern/bmesh_mesh_conv.c b/source/blender/bmesh/intern/bmesh_mesh_conv.c
index e9c0005..b7be0cc 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_conv.c
+++ b/source/blender/bmesh/intern/bmesh_mesh_conv.c
@@ -233,12 +233,12 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me,
 	BMEdge *e, **etable = NULL;
 	BMFace *f;
 	float (*keyco)[3] = NULL;
-	int *keyi;
 	int totuv, i, j;
 
 	int cd_vert_bweight_offset;
 	int cd_edge_bweight_offset;
 	int cd_edge_crease_offset;
+	int cd_shape_keyindex_offset;
 
 	/* free custom data */
 	/* this isnt needed in most cases but do just incase */
@@ -325,6 +325,7 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me,
 	cd_vert_bweight_offset = CustomData_get_offset(&bm->vdata, CD_BWEIGHT);
 	cd_edge_bweight_offset = CustomData_get_offset(&bm->edata, CD_BWEIGHT);
 	cd_edge_crease_offset  = CustomData_get_offset(&bm->edata, CD_CREASE);
+	cd_shape_keyindex_offset = me->key ? CustomData_get_offset(&bm->vdata, CD_SHAPE_KEYINDEX) : -1;
 
 	for (i = 0, mvert = me->mvert; i < me->totvert; i++, mvert++) {
 		v = vtable[i] = BM_vert_create(bm, keyco && set_key ? keyco[i] : mvert->co, NULL, BM_CREATE_SKIP_CD);
@@ -348,10 +349,7 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me,
 		/* set shapekey data */
 		if (me->key) {
 			/* set shape key original index */
-			keyi = CustomData_bmesh_get(&bm->vdata, v->head.data, CD_SHAPE_KEYINDEX);
-			if (keyi) {
-				*keyi = i;
-			}
+			if (cd_shape_keyindex_offset != -1) BM_ELEM_CD_SET_INT(v, cd_shape_keyindex_offset, i);
 
 			for (block = me->key->block.first, j = 0; block; block = block->next, j++) {
 				float *co = CustomData_bmesh_get_n(&bm->vdata, v->head.data, CD_SHAPEKEY, j);
@@ -496,9 +494,9 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me,
  */
 static BMVert **bm_to_mesh_vertex_map(BMesh *bm, int ototvert)
 {
+	const int cd_shape_keyindex_offset = CustomData_get_offset(&bm->vdata, CD_SHAPE_KEYINDEX);
 	BMVert **vertMap = NULL;
 	BMVert *eve;
-	int index;
 	int i = 0;
 	BMIter iter;
 
@@ -506,32 +504,22 @@ static BMVert **bm_to_mesh_vertex_map(BMesh *bm, int ototvert)
 	BLI_assert(ototvert > 0);
 
 	vertMap = MEM_callocN(sizeof(*vertMap) * ototvert, "vertMap");
-	if (CustomData_has_layer(&bm->vdata, CD_SHAPE_KEYINDEX)) {
-		int *keyi;
-		BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
-			keyi = CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_SHAPE_KEYINDEX);
-			if (keyi) {
-				if (((index = *keyi) != ORIGINDEX_NONE) && (index < ototvert)) {
-					vertMap[index] = eve;
-				}
-			}
-			else {
-				if (i < ototvert) {
-					vertMap[i] = eve;
-				}
+	if (cd_shape_keyindex_offset != -1) {
+		BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
+			const int keyi = BM_ELEM_CD_GET_INT(eve, cd_shape_keyindex_offset);
+			if ((keyi != ORIGINDEX_NONE) && (keyi < ototvert)) {
+				vertMap[keyi] = eve;
 			}
-			i++;
 		}
 	}
 	else {
-		BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
+		BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
 			if (i < ototvert) {
 				vertMap[i] = eve;
 			}
 			else {
 				break;
 			}
-			i++;
 		}
 	}
 
@@ -825,6 +813,8 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, bool do_tessface)
 	/* see comment below, this logic is in twice */
 
 	if (me->key) {
+		const int cd_shape_keyindex_offset = CustomData_get_offset(&bm->vdata, CD_SHAPE_KEYINDEX);
+
 		KeyBlock *currkey;
 		KeyBlock *actkey = BLI_findlink(&me->key->block, bm->shapenr - 1);
 
@@ -868,16 +858,17 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, bool do_tessface)
 				}
 			}
 
-			if (act_is_basis) { /* active key is a base */
+			/* active key is a base */
+			if (act_is_basis && (cd_shape_keyindex_offset != -1)) {
 				float (*fp)[3] = actkey->data;
-				int *keyi;
 
 				ofs = MEM_callocN(sizeof(float) * 3 * bm->totvert,  "currkey->data");
 				mvert = me->mvert;
 				BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
-					keyi = CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_SHAPE_KEYINDEX);
-					if (keyi && *keyi != ORIGINDEX_NONE) {
-						sub_v3_v3v3(ofs[i], mvert->co, fp[*keyi]);
+					const int keyi = BM_ELEM_CD_GET_INT(eve, cd_shape_keyindex_offset);
+
+					if (keyi != ORIGINDEX_NONE) {
+						sub_v3_v3v3(ofs[i], mvert->co, fp[keyi]);
 					}
 					else {
 						/* if there are new vertices in the mesh, we can't propagate the offset
@@ -894,12 +885,14 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, bool do_tessface)
 		}
 
 		for (currkey = me->key->block.first; currkey; currkey = currkey->next) {
-			int apply_offset = (ofs && (currkey != actkey) && (bm->shapenr - 1 == currkey->relative));
-			int *keyi;
+			const bool apply_offset = (ofs && (currkey != actkey) && (bm->shapenr - 1 == currkey->relative));
+			int cd_shape_offset;
+			int keyi;
 			float (*ofs_pt)[3] = ofs;
-			float *newkey, *oldkey, *fp;
+			float *newkey, (*oldkey)[3], *fp;
 
 			j = bm_to_mesh_shape_layer_index_from_kb(bm, currkey);
+			cd_shape_offset = CustomData_get_n_offset(&bm->vdata, CD_SHAPEKEY, j);
 
 
 			fp = newkey = MEM_callocN(me->key->elemsize * bm->totvert,  "currkey->data");
@@ -912,26 +905,29 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, bool do_tessface)
 					copy_v3_v3(fp, eve->co);
 
 					if (actkey != me->key->refkey) { /* important see bug [#30771] */
-						if (oldverts) {
-							keyi = CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_SHAPE_KEYINDEX);
-							if (*keyi != ORIGINDEX_NONE && *keyi < currkey->totelem) { /* valid old vertex */
-								copy_v3_v3(mvert->co, oldverts[*keyi].co);
+						if (cd_shape_keyindex_offset != -1) {
+							if (oldverts) {
+								keyi = BM_ELEM_CD_GET_INT(eve, cd_shape_keyindex_offset);
+								if (keyi != ORIGINDEX_NONE && keyi < currkey->totelem) { /* valid old vertex */
+									copy_v3_v3(mvert->co, oldverts[keyi].co);
+								}
 							}
 						}
 					}
 				}
 				else if (j != -1) {
 					/* in most cases this runs */
-					copy_v3_v3(fp, CustomData_bmesh_get_n(&bm->vdata, eve->head.data, CD_SHAPEKEY, j));
+					copy_v3_v3(fp, BM_ELEM_CD_GET_VOID_P(eve, cd_shape_offset));
 				}
-				else if (oldkey &&
-				         (keyi = CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_SHAPE_KEYINDEX)) &&
-				         (*keyi != ORIGINDEX_NONE && *keyi < currkey->totelem))
+				else if ((oldkey != NULL) &&
+				         (cd_shape_keyindex_offset != -1) &&
+				         ((keyi = BM_ELEM_CD_GET_INT(eve, cd_shape_keyindex_offset)) != ORIGINDEX_NONE) &&
+				         (keyi < currkey->totelem))
 				{
 					/* old method of reconstructing keys via vertice's original key indices,
 					 * currently used if the new method above fails (which is theoretically
 					 * possible in certain cases of undo) */
-					copy_v3_v3(fp, &oldkey[3 * (*keyi)]);
+					copy_v3_v3(fp, oldkey[keyi]);
 				}
 				else {
 					/* fail! fill in with dummy value */




More information about the Bf-blender-cvs mailing list