[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46359] branches/meshdata_transfer/source/ blender/editors/object/object_vgroup.c: ED_vgroup_copy_by_nearest_vertex_single:
Ove Murberg Henriksen
sorayasilvermoon at hotmail.com
Sun May 6 19:19:16 CEST 2012
Revision: 46359
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46359
Author: cyborgmuppet
Date: 2012-05-06 17:19:16 +0000 (Sun, 06 May 2012)
Log Message:
-----------
ED_vgroup_copy_by_nearest_vertex_single:
Added transformation into target space
ED_vgroup_copy_by_nearest_face_single:
Is incomplete. BVHTree fails.
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-06 17:14:56 UTC (rev 46358)
+++ branches/meshdata_transfer/source/blender/editors/object/object_vgroup.c 2012-05-06 17:19:16 UTC (rev 46359)
@@ -421,7 +421,7 @@
}
/*Copy a single vertex group from source to destination with weights by nearest weight*/
-int ED_vgroup_copy_by_nearest_vertex_single(Object *ob_dst, const Object *ob_src)
+int ED_vgroup_copy_by_nearest_vertex_single(Object *ob_dst, Object *ob_src)
{
bDeformGroup *dg_src, *dg_dst;
MDeformVert **dv_array_src, **dv_array_dst;
@@ -432,6 +432,7 @@
BVHTreeNearest nearest;
DerivedMesh *dmesh_src;
int dv_tot_src, dv_tot_dst, i, index_dst, index_src;
+ float tmp_co[3], tmp_mat[4][4];
/*get source deform group*/
dg_src= BLI_findlink(&ob_src->defbase, (ob_src->actdef-1));
@@ -461,6 +462,11 @@
/*get vertices*/
mv_dst= me_dst->mvert;
+ /*Prepearing transformation matrix*/
+ /*This can be excluded to make a lazy feature that works better when object centers relative to mesh is the same*/
+ invert_m4_m4(ob_src->imat, ob_src->obmat);
+ mult_m4_m4m4(tmp_mat, ob_src->imat, ob_dst->obmat);
+
/* Loop through the vertices and copy weight from nearest weight*/
for(i=0; i < me_dst->totvert; i++, mv_dst++, dv_array_dst++){
@@ -468,8 +474,11 @@
nearest.index= -1;
nearest.dist= FLT_MAX;
+ /*Transforming into target space*/
+ mul_v3_m4v3(tmp_co, tmp_mat, mv_dst->co);
+
/*Node tree accelerated search for closest vetex*/
- BLI_bvhtree_find_nearest(tree_mesh_src.tree, mv_dst->co, &nearest, tree_mesh_src.nearest_callback, &tree_mesh_src);
+ BLI_bvhtree_find_nearest(tree_mesh_src.tree, tmp_co, &nearest, tree_mesh_src.nearest_callback, &tree_mesh_src);
/*copy weight*/
dw_src= defvert_verify_index(dv_array_src[nearest.index], index_src);
@@ -483,6 +492,7 @@
}
/*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;
@@ -495,7 +505,7 @@
BVHTreeNearest nearest;
DerivedMesh *dmesh_src;
int dv_tot_src, dv_tot_dst, i, index_dst, index_src;
- float weight;
+ float weight/*, tot_dist*/;
/*get source deform group*/
dg_src= BLI_findlink(&ob_src->defbase, (ob_src->actdef-1));
@@ -510,12 +520,13 @@
/*get meshes*/
me_dst= ob_dst->data;
me_src= ob_src->data;
- dmesh_src= ob_src->derivedDeform;
+ 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);
@@ -529,6 +540,7 @@
/* 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*/
nearest.index= -1;
nearest.dist= FLT_MAX;
@@ -536,12 +548,28 @@
/*Node tree accelerated search for closest face*/
BLI_bvhtree_find_nearest(tree_mesh_faces_src.tree, mv_dst->co, &nearest, tree_mesh_faces_src.nearest_callback, &tree_mesh_faces_src);
- /*get*/
+ /*get weight*/
mface_src= me_src->mface + nearest.index;
+ /*tot_dist= ()+()+(); use a comparable distance
+ if(mface_src->v4){
+ tot_dist+= ();
+ }*/
dw_src= defvert_verify_index(dv_array_src[mface_src->v1], index_src);
weight= dw_src->weight;
- weight= 0;
+ 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;
+ }
+ else{
+ weight/=3;
+ }
+
/*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