[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46564] branches/meshdata_transfer/source/ blender/editors/object/object_vgroup.c: ED_vgroup_copy_by_nearest_face_single()

Ove Murberg Henriksen sorayasilvermoon at hotmail.com
Sat May 12 02:37:46 CEST 2012


Revision: 46564
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46564
Author:   cyborgmuppet
Date:     2012-05-12 00:37:45 +0000 (Sat, 12 May 2012)
Log Message:
-----------
ED_vgroup_copy_by_nearest_face_single()
Is supposed to work, but something funny is going on. (logick error)
Function also needs optimization. 

Modified Paths:
--------------
    branches/meshdata_transfer/source/blender/editors/object/object_vgroup.c

Modified: branches/meshdata_transfer/source/blender/editors/object/object_vgroup.c
===================================================================
--- branches/meshdata_transfer/source/blender/editors/object/object_vgroup.c	2012-05-11 22:48:41 UTC (rev 46563)
+++ branches/meshdata_transfer/source/blender/editors/object/object_vgroup.c	2012-05-12 00:37:45 UTC (rev 46564)
@@ -491,21 +491,30 @@
 	return 1;
 }
 
+float sqr_dist_v3v3(float v1[3], float v2[3])
+{
+	float d[3];
+	d[0]= v2[0]-v1[0];
+	d[1]= v2[1]-v1[1];
+	d[2]= v2[2]-v1[2];
+	return dot_v3v3(d, d);
+}
+
 /*Copy a single vertex group from source to destination with weights by nearest weight*/
 /*TODO: transform into target space as in by_vertex function. postphoned due to easier testing during development*/
 int ED_vgroup_copy_by_nearest_face_single(Object *ob_dst, Object *ob_src)
 {
 	bDeformGroup *dg_src, *dg_dst;
+	Mesh *me_dst;
+	DerivedMesh *dmesh_src;
+	BVHTreeFromMesh tree_mesh_faces_src = {NULL};
 	MDeformVert **dv_array_src, **dv_array_dst;
-	MDeformWeight *dw_dst, *dw_src;
-	MVert *mv_dst;
+	MVert *mv_dst, *mv_src;
 	MFace *mface_src;
-	Mesh *me_dst, *me_src;
-	BVHTreeFromMesh tree_mesh_faces_src = {NULL};
 	BVHTreeNearest nearest;
-	DerivedMesh *dmesh_src;
+	MDeformWeight *dw_dst, *dw_src;
 	int dv_tot_src, dv_tot_dst, i, index_dst, index_src;
-	float weight/*, tot_dist*/;
+	float weight, tot_dist, dist_v1, dist_v2, dist_v3, dist_v4;
 
 	/*get source deform group*/
 	dg_src= BLI_findlink(&ob_src->defbase, (ob_src->actdef-1));
@@ -519,14 +528,12 @@
 
 	/*get meshes*/
 	me_dst= ob_dst->data;
-	me_src= ob_src->data; /*mfaces does not exist*/
 	dmesh_src= ob_src->derivedDeform; /*sergey- : this might easily be null?? (using ob_src.deriveddeform*/
 
 	/*make node tree*/
 	DM_ensure_tessface(dmesh_src);
 	bvhtree_from_mesh_faces(&tree_mesh_faces_src, dmesh_src, 0.0, 2, 6);
 
-
 	/*get vertex group arrays*/
 	ED_vgroup_give_parray(ob_src->data, &dv_array_src, &dv_tot_src, FALSE);
 	ED_vgroup_give_parray(ob_dst->data, &dv_array_dst, &dv_tot_dst, FALSE);
@@ -537,16 +544,15 @@
 
 	/*get vertices*/
 	mv_dst= me_dst->mvert;
+	mv_src= dmesh_src->getVertArray(dmesh_src);
 
 	/*get faces*/
 	mface_src= dmesh_src->getTessFaceArray(dmesh_src);
 
-	/*printf("test % \n", *mface_src);*/
-
 	/* Loop through the vertices and copy weight from nearest weight*/
 	for(i=0; i < me_dst->totvert; i++, mv_dst++, dv_array_dst++){
 
-		/*Reset nearest*/
+		/*Reset nearest*//*can I accellerate further with tweaking this=*/
 		nearest.index= -1;
 		nearest.dist= FLT_MAX;
 
@@ -554,26 +560,57 @@
 		BLI_bvhtree_find_nearest(tree_mesh_faces_src.tree, mv_dst->co, &nearest, tree_mesh_faces_src.nearest_callback, &tree_mesh_faces_src);
 
 		/*get weight*/
-		/*tot_dist= ()+()+(); use a comparable distance
-		if(mface_src->v4){
-			tot_dist+= ();
-		}*/
-		dw_src= defvert_verify_index(dv_array_src[mface_src[nearest.index].v1], index_src);
-		weight= dw_src->weight;
-		dw_src= defvert_verify_index(dv_array_src[mface_src->v2], index_src);
-		weight+= dw_src->weight;
-		dw_src= defvert_verify_index(dv_array_src[mface_src->v3], index_src);
-		weight+= dw_src->weight;
-		if(mface_src->v4){
-			dw_src= defvert_verify_index(dv_array_src[mface_src->v4], index_src);
-			weight+= dw_src->weight;
-			weight/=4;
-		}
+		dist_v1= sqr_dist_v3v3(mv_dst->co, mv_src[mface_src[nearest.index].v1].co);
+		dist_v2= sqr_dist_v3v3(mv_dst->co, mv_src[mface_src[nearest.index].v2].co);
+		dist_v3= sqr_dist_v3v3(mv_dst->co, mv_src[mface_src[nearest.index].v3].co);
+
+		/*get weight from overlapping vert if any*/
+		if(dist_v1 == 0)weight= defvert_verify_index(dv_array_src[mface_src[nearest.index].v1], index_src)->weight;
+		if(dist_v2 == 0)weight= defvert_verify_index(dv_array_src[mface_src[nearest.index].v2], index_src)->weight;
+		if(dist_v3 == 0)weight= defvert_verify_index(dv_array_src[mface_src[nearest.index].v3], index_src)->weight;
+
+		/*interpolate weight*/
 		else{
-			weight/=3;
+
+			/*check for quad*/
+			if(mface_src[nearest.index].v4){
+				dist_v4= sqr_dist_v3v3(mv_dst->co, mv_src[mface_src->v4].co);
+
+				/*check if vert 4 is overlapping*/
+				if(dist_v4 == 0)weight= defvert_verify_index(dv_array_src[mface_src[nearest.index].v4], index_src)->weight;
+
+				/*get weight from quad*/
+				else{
+					tot_dist= dist_v1 + dist_v2 + dist_v3 + dist_v4;
+
+					dw_src= defvert_verify_index(dv_array_src[mface_src[nearest.index].v1], index_src);
+					weight= dw_src->weight * dist_v1;
+					dw_src= defvert_verify_index(dv_array_src[mface_src[nearest.index].v2], index_src);
+					weight+= dw_src->weight * dist_v2;
+					dw_src= defvert_verify_index(dv_array_src[mface_src[nearest.index].v3], index_src);
+					weight+= dw_src->weight * dist_v3;
+					dw_src= defvert_verify_index(dv_array_src[mface_src[nearest.index].v4], index_src);
+					weight+= dw_src->weight * dist_v4;
+
+					weight/=tot_dist;
+				}
+			}
+
+			/*get weight from triangle*/
+			else{
+				tot_dist= dist_v1 + dist_v2 + dist_v3;
+
+				dw_src= defvert_verify_index(dv_array_src[mface_src[nearest.index].v1], index_src);
+				weight= dw_src->weight * dist_v1;
+				dw_src= defvert_verify_index(dv_array_src[mface_src[nearest.index].v2], index_src);
+				weight+= dw_src->weight * dist_v2;
+				dw_src= defvert_verify_index(dv_array_src[mface_src[nearest.index].v3], index_src);
+				weight+= dw_src->weight * dist_v3;
+
+				weight/=tot_dist;
+			}
 		}
 
-
 		/*copy weight*/
 		dw_dst= defvert_verify_index(*dv_array_dst, index_dst);
 		dw_dst->weight= weight;




More information about the Bf-blender-cvs mailing list