Revision: 46597
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46597
Author:   cyborgmuppet
Date:     2012-05-13 05:33:25 +0000 (Sun, 13 May 2012)
Log Message:
-----------
Cleanup.
Basis changed/added for:
ED_vgroup_copy_by_nearest_face_single() 
Interpolation is still not working 100%

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-13 03:46:46 UTC (rev 46596)
+++ branches/meshdata_transfer/source/blender/editors/object/object_vgroup.c    
2012-05-13 05:33:25 UTC (rev 46597)
@@ -376,7 +376,7 @@
        return 1;
 }
 
-/*Copy a single vertex group from source to destination with weights*/
+/*Copy a single vertex group from source to destination with weights by 
identical meshes*/
 int ED_vgroup_copy_single(Object *ob_dst, const Object *ob_src)
 {
        MDeformVert **dv_array_src;
@@ -389,7 +389,7 @@
        /*get source deform group*/
        dg_src= BLI_findlink(&ob_src->defbase, (ob_src->actdef-1));
 
-       /*Create new and overwrite vertex group on destination without data*/
+       /*create new and overwrite vertex group on destination without data*/
        ED_vgroup_delete(ob_dst, defgroup_find_name(ob_dst, dg_src->name));
        ED_vgroup_add_name(ob_dst, dg_src->name);
 
@@ -404,13 +404,13 @@
        index_src= BLI_findindex(&ob_src->defbase, dg_src);
        index_dst= BLI_findindex(&ob_dst->defbase, dg_dst);
 
-       /*Check if indices are matching, delete and return if not*/
+       /*check if indices are matching, delete and return if not*/
        if (ob_dst == ob_src || dv_tot_dst == 0 || (dv_tot_dst != dv_tot_src) 
|| dv_array_src == NULL || dv_array_dst == NULL) {
                ED_vgroup_delete(ob_dst, defgroup_find_name(ob_dst, 
dg_dst->name));
                return 0;
        }
 
-       /* Loop through the vertices and copy weight*/
+       /* loop through the vertices and copy weight*/
        for(i=0; i<dv_tot_dst; i++, dv_array_src++, dv_array_dst++) {
                dw_src= defvert_verify_index(*dv_array_src, index_src);
                dw_dst= defvert_verify_index(*dv_array_dst, index_dst);
@@ -437,7 +437,7 @@
        /*get source deform group*/
        dg_src= BLI_findlink(&ob_src->defbase, (ob_src->actdef-1));
 
-       /*Create new and overwrite vertex group on destination without data*/
+       /*create new and overwrite vertex group on destination without data*/
        ED_vgroup_delete(ob_dst, defgroup_find_name(ob_dst, dg_src->name));
        ED_vgroup_add_name(ob_dst, dg_src->name);
 
@@ -462,22 +462,22 @@
        /*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*/
+       /*prepare 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*/
+       /* 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*/
                nearest.index= -1;
                nearest.dist= FLT_MAX;
 
-               /*Transforming into target space*/
+               /*transform into target space*/
                mul_v3_m4v3(tmp_co, tmp_mat, mv_dst->co);
 
-               /*Node tree accelerated search for closest vetex*/
+               /*node tree accelerated search for closest vetex*/
                BLI_bvhtree_find_nearest(tree_mesh_src.tree, tmp_co, &nearest, 
tree_mesh_src.nearest_callback, &tree_mesh_src);
 
                /*copy weight*/
@@ -491,6 +491,7 @@
        return 1;
 }
 
+/*Return the squared distance between two points in 3d space*/
 float sqr_dist_v3v3(float v1[3], float v2[3])
 {
        float d[3];
@@ -518,7 +519,7 @@
        /*get source deform group*/
        dg_src= BLI_findlink(&ob_src->defbase, (ob_src->actdef-1));
 
-       /*Create new and overwrite vertex group on destination without data*/
+       /*create new and overwrite vertex group on destination without data*/
        ED_vgroup_delete(ob_dst, defgroup_find_name(ob_dst, dg_src->name));
        ED_vgroup_add_name(ob_dst, dg_src->name);
 
@@ -543,27 +544,26 @@
 
        /*get vertices*/
        mv_dst= me_dst->mvert;
-
        mv_src= dmesh_src->getVertArray(dmesh_src);
 
        /*get faces*/
        mface_src= dmesh_src->getTessFaceArray(dmesh_src);
 
-       /*Prepearing transformation matrix*/
+       /*prepare transformation matrix*/
        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*/
+       /* 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*/
                nearest.index= -1;
                nearest.dist= FLT_MAX;
 
-               /*Transforming into target space*/
+               /*transform into target space*/
                mul_v3_m4v3(tmp_co, tmp_mat, mv_dst->co);
 
-               /*Node tree accelerated search for closest face*/
+               /*node tree accelerated search for closest face*/
                BLI_bvhtree_find_nearest(tree_mesh_faces_src.tree, tmp_co, 
&nearest, tree_mesh_faces_src.nearest_callback, &tree_mesh_faces_src);
 
                /*get distances*/
@@ -581,7 +581,7 @@
                else{
                        dw_src= 
defvert_verify_index(dv_array_src[mface_src[nearest.index].v3], index_src);
                }
-               /*Check for and get weight from quad*/
+               /*check for and get weight from quad*/
                if(mface_src[nearest.index].v4){
                        dist_v4= sqr_dist_v3v3(tmp_co, 
mv_src[mface_src[nearest.index].v4].co);
                        if(dist_v4<dist_v1 && dist_v4<dist_v2 && 
dist_v4<dist_v3){
@@ -599,7 +599,7 @@
        return 1;
 }
 
-/*Copy a single vertex group from source to destination with weights by 
nearest weight*/
+/*Copy a single vertex group from source to destination with weights 
interpolated over nearest face*/
 /*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)
 {
@@ -618,7 +618,7 @@
        /*get source deform group*/
        dg_src= BLI_findlink(&ob_src->defbase, (ob_src->actdef-1));
 
-       /*Create new and overwrite vertex group on destination without data*/
+       /*create new and overwrite vertex group on destination without data*/
        ED_vgroup_delete(ob_dst, defgroup_find_name(ob_dst, dg_src->name));
        ED_vgroup_add_name(ob_dst, dg_src->name);
 
@@ -643,27 +643,24 @@
 
        /*get vertices*/
        mv_dst= me_dst->mvert;
-
        mv_src= dmesh_src->getVertArray(dmesh_src);
 
        /*get faces*/
        mface_src= dmesh_src->getTessFaceArray(dmesh_src);
 
-       /* Loop through the vertices and copy weight from nearest weight*/
+       /* 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*/
                nearest.index= -1;
                nearest.dist= FLT_MAX;
 
                /*set destination coordinate*/
                copy_v3_v3(tmp_co, mv_dst->co);
 
-               /*Node tree accelerated search for closest face*/
+               /*node tree accelerated search for closest face*/
                BLI_bvhtree_find_nearest(tree_mesh_faces_src.tree, tmp_co, 
&nearest, tree_mesh_faces_src.nearest_callback, &tree_mesh_faces_src);
 
-               /*get weight*/
-
                /*TODO: Have to project onto face to get a decent result*/
                /*Smart solution might be to just substract the distance 
difference to plane instead.*/
 
@@ -672,90 +669,40 @@
                distribution_v2= sqr_dist_v3v3(tmp_co, 
mv_src[mface_src[nearest.index].v2].co);
                distribution_v3= sqr_dist_v3v3(tmp_co, 
mv_src[mface_src[nearest.index].v3].co);
 
-               /*test
-               printf("dist_v1 %f index v1%d \n", dist_v1, 
mface_src[nearest.index].v1);
-               printf("dist_v2 %f index v2%d \n", dist_v2, 
mface_src[nearest.index].v2);
-               printf("dist_v3 %f index v3%d \n", dist_v3, 
mface_src[nearest.index].v3);*/
-
                /*get weight from overlapping vert if any*/
                if(distribution_v1 == 0) weight= 
defvert_verify_index(dv_array_src[mface_src[nearest.index].v1], 
index_src)->weight;
                if(distribution_v2 == 0) weight= 
defvert_verify_index(dv_array_src[mface_src[nearest.index].v2], 
index_src)->weight;
                if(distribution_v3 == 0) weight= 
defvert_verify_index(dv_array_src[mface_src[nearest.index].v3], 
index_src)->weight;
-
-               /*interpolate weight*/
                else{
+                       /*invert distribution*/
+                       distribution_v1= 1/distribution_v1;
+                       distribution_v2= 1/distribution_v2;
+                       distribution_v3= 1/distribution_v3;
 
+                       /*set total distribution*/
+                       tot_distribution= distribution_v1 + distribution_v2 + 
distribution_v3;
+
                        /*check for quad*/
                        if(mface_src[nearest.index].v4){
                                distribution_v4= sqr_dist_v3v3(tmp_co, 
mv_src[mface_src->v4].co);
-
-                               /*check if vert 4 is overlapping*/
                                if(distribution_v4 == 0) weight= 
defvert_verify_index(dv_array_src[mface_src[nearest.index].v4], 
index_src)->weight;
-
-                               /*get weight from quad*/
                                else{
+                                       distribution_v4= 1/distribution_v4;
+                                       tot_distribution+= distribution_v4;
 
-                                       /*invert distribution*/
-                                       distribution_v1= 1 / distribution_v1;
-                                       distribution_v2= 1 / distribution_v2;
-                                       distribution_v3= 1 / distribution_v3;
-                                       distribution_v4= 1 / distribution_v4;
-
-                                       /*exclude v1 and get weight from the 3 
closest*/
-                                       if(distribution_v1 > distribution_v2 && 
distribution_v1 > distribution_v3 && distribution_v1 > distribution_v4){
-                                               tot_distribution= 
distribution_v4 + distribution_v2 + distribution_v3;
-                                               dw_src= 
defvert_verify_index(dv_array_src[mface_src[nearest.index].v4], index_src);
-                                               weight= dw_src->weight * 
distribution_v4 / tot_distribution;
-                                               dw_src= 
defvert_verify_index(dv_array_src[mface_src[nearest.index].v2], index_src);
-                                               weight+= dw_src->weight * 
distribution_v2 / tot_distribution;
-                                               dw_src= 
defvert_verify_index(dv_array_src[mface_src[nearest.index].v3], index_src);
-                                               weight+= dw_src->weight * 
distribution_v3 / tot_distribution;
-                                       }
-
-                                       /*exclude v2 and get weight from the 3 
closest*/
-                                       else if(distribution_v2 > 
distribution_v3 && distribution_v2 > distribution_v4){
-                                               tot_distribution= 
distribution_v1 + distribution_v4 + distribution_v3;
-                                               dw_src= 
defvert_verify_index(dv_array_src[mface_src[nearest.index].v1], index_src);
-                                               weight= dw_src->weight * 
distribution_v1 / tot_distribution;
-                                               dw_src= 
defvert_verify_index(dv_array_src[mface_src[nearest.index].v4], index_src);
-                                               weight+= dw_src->weight * 
distribution_v4 / tot_distribution;
-                                               dw_src= 
defvert_verify_index(dv_array_src[mface_src[nearest.index].v3], index_src);
-                                               weight+= dw_src->weight * 
distribution_v3 / tot_distribution;
-                                       }
-
-                                       /*exclude v3 and get weight from the 3 
closest*/
-                                       else if(distribution_v3 > 
distribution_v4){
-                                               tot_distribution= 
distribution_v1 + distribution_v2 + distribution_v4;

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to