[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58621] branches/ soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c : Using vertex tables to eliminate the usage of BM_vert_at_index to optimize for the vertex access speed

Walid Shouman eng.walidshouman at gmail.com
Fri Jul 26 13:44:23 CEST 2013


Revision: 58621
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58621
Author:   walid
Date:     2013-07-26 11:44:23 +0000 (Fri, 26 Jul 2013)
Log Message:
-----------
Using vertex tables to eliminate the usage of BM_vert_at_index to optimize for the vertex access speed

Modified Paths:
--------------
    branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c

Modified: branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c
===================================================================
--- branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c	2013-07-26 11:15:22 UTC (rev 58620)
+++ branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c	2013-07-26 11:44:23 UTC (rev 58621)
@@ -443,6 +443,13 @@
 	return true;
 }
 
+typedef struct BMVert_map {
+	BMVert *v1;
+	BMVert *v2;
+}BMVert_map;
+
+#define MAX_AUTO_TOL 100
+
 /**
  * @brief inherit vertices' offset from the source, then interpolate within the destination by using distance from
  * vertices that inherited And normals from those vertices
@@ -490,10 +497,13 @@
 
 	int i, j, k, m;
 
-	int *inherit_vert_ind;
-	int *interp_vert_ind;
-
+	//weights carry the weights of the vertices organized by their index
+	//act as a link between the offsets of the barycentric transformation and the vertices' data
 	float ** weights;
+	BMVert *v_match;
+	BMVert_map *inherit_v_table;
+	BMVert **interp_v_table;			//the vertices for interpolation are those that don't have matches
+										//in the source
 
 	//---for interpolation
 	float (*eff_vert)[3];				//the effective vertices' shapekeys
@@ -554,8 +564,9 @@
 		vertexCos_dst_basis = MEM_mallocN(sizeof(*vertexCos_dst_basis) * num_vert, "vertexCos_dst_basis bmesh_data_transfer.c");
 		vertexCos_dst_offset = MEM_mallocN(sizeof(*vertexCos_dst_offset) * num_vert, "vertexCos_dst_offset bmesh_data_transfer.c");
 
-		interp_vert_ind = MEM_mallocN(sizeof(*interp_vert_ind) * num_vert, "interp_vert_ind bmesh_data_transfer.c");
-		inherit_vert_ind = MEM_mallocN(sizeof(*inherit_vert_ind) * num_vert, "inherit_vert_ind bmesh_data_transfer.c");
+		//table for the inheriting vertices
+		inherit_v_table = MEM_mallocN(sizeof(*inherit_v_table) * num_vert, "inherit_v_table bmesh_data_transfer.c");
+		interp_v_table = MEM_mallocN(sizeof(*interp_v_table) * num_vert, "interp_v_table bmesh_data_transfer.c");
 
 		//getting the cage coordinates is by using
 		//const float (*cagecos)[3];
@@ -586,7 +597,6 @@
 
 		//the way we do it is by looping over each vertex!!
 		for (v = BM_iter_new(&iter, bm_dst, BM_VERTS_OF_MESH, NULL); v; v = BM_iter_step(&iter)) {
-			BMVert *v_match;
 			float tmp1[3];
 
 			//this check may be useless under the current algorithm
@@ -608,11 +618,12 @@
 					//pointing weights to vertexCos_dst_offset[ident_vert - 1]
 					weights[BM_elem_index_get(v)] = vertexCos_dst_offset[ident_vert - 1];
 
-					inherit_vert_ind[ident_vert - 1] = BM_elem_index_get(v);
+					inherit_v_table[ident_vert - 1].v1 = v;
+					inherit_v_table[ident_vert - 1].v2 = v_match;
 				}
 				else {
 					interp_vert++;
-					interp_vert_ind[interp_vert - 1] = BM_elem_index_get(v);
+					interp_v_table[interp_vert - 1] = v;
 				}
 			}
 		}
@@ -625,7 +636,7 @@
 
 		//updating the main vertices in the destination
 		for (k = 0; k < ident_vert; k++) {
-			v = BM_vert_at_index(bm_dst, inherit_vert_ind[k]);
+			v = inherit_v_table[k].v1;
 			add_v3_v3v3(BM_ELEM_CD_GET_VOID_P(v,CD_offset_dst), BM_ELEM_CD_GET_VOID_P(v,CD_basis_dst),
 						(float*) weights[BM_elem_index_get(v)]);
 		}
@@ -646,13 +657,13 @@
 			float weight_accu[3];
 			zero_v3(weight_accu);
 
-			v = BM_vert_at_index(bm_dst, interp_vert_ind[m]);
+			v = interp_v_table[m];
 
 			j = 0;
 			//get the effective vertices
 			for(k = 0; k < ident_vert; k++)
 			{
-				v2 = BM_vert_at_index(bm_dst, inherit_vert_ind[k]);
+				v2 = inherit_v_table[k].v1;
 				len = len_v3v3(v2->co, v->co);
 				if (len <= radius_interp) {
 					num_effective_v++;
@@ -718,14 +729,13 @@
 	MEM_freeN(eff_vert);
 
 	MEM_freeN(weights);
-	MEM_freeN(inherit_vert_ind);
-	MEM_freeN(interp_vert_ind);
+	MEM_freeN(inherit_v_table);
+	MEM_freeN(interp_v_table);
 
-	MEM_freeN(vertexCos_dst_offset);
-
 	MEM_freeN(vertexCos_src_basis);
 	MEM_freeN(vertexCos_src_offset);
 	MEM_freeN(vertexCos_dst_basis);
+	MEM_freeN(vertexCos_dst_offset);
 
 	return true;
 }




More information about the Bf-blender-cvs mailing list