Revision: 46849
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46849
Author:   cyborgmuppet
Date:     2012-05-21 17:00:08 +0000 (Mon, 21 May 2012)
Log Message:
-----------
Added support for replace_selected_weights in all weight transfer fucntions.

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-21 16:52:04 UTC (rev 46848)
+++ branches/meshdata_transfer/source/blender/editors/object/object_vgroup.c    
2012-05-21 17:00:08 UTC (rev 46849)
@@ -431,6 +431,8 @@
        MDeformVert **dv_array_src;
        MDeformVert **dv_array_dst;
        MDeformWeight *dw_dst, *dw_src;
+       MVert *mv_src;
+       Mesh *me_src;
        int dv_tot_src, dv_tot_dst;
        int i, index_src, index_dst;
        bDeformGroup *dg_src, *dg_dst;
@@ -448,6 +450,12 @@
                ED_vgroup_add_name(ob_dst, dg_src->name);
        }
 
+       /*get meshes*/
+       me_src = ob_src->data;
+
+       /*get vertices*/
+       mv_src = me_src->mvert;
+
        /*get destination deformgroup*/
        dg_dst = defgroup_find_name(ob_dst, dg_src->name);
 
@@ -460,18 +468,18 @@
        index_dst = BLI_findindex(&ob_dst->defbase, dg_dst);
 
        /*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) {
+       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*/
-       for(i = 0; i < dv_tot_dst; i++, dv_array_src++, dv_array_dst++){
+       for(i = 0; i < dv_tot_dst; i++, dv_array_src++, dv_array_dst++, 
mv_src++){
                dw_src = defvert_verify_index(*dv_array_src, index_src);
                dw_dst = defvert_verify_index(*dv_array_dst, index_dst);
                if(mode == 1) dw_dst->weight = dw_src->weight;
                else if(mode == 2) {if(!dw_dst->weight || dw_dst->weight == 0) 
dw_dst->weight = dw_src->weight;}
-               else if(mode == 3) {if((*dv_array_src)->flag == 1) 
dw_dst->weight = dw_src->weight;}/*This does not work*/
+               else if(mode == 3) {if(mv_src->flag == 1) dw_dst->weight = 
dw_src->weight;}
                else return 0;
        }
        return 1;
@@ -482,8 +490,8 @@
        bDeformGroup *dg_src, *dg_dst;
        MDeformVert **dv_array_src, **dv_array_dst;
        MDeformWeight *dw_dst, *dw_src;
-       MVert *mv_dst;
-       Mesh *me_dst;
+       MVert *mv_dst, *mv_src;
+       Mesh *me_dst, *me_src;
        BVHTreeFromMesh tree_mesh_src;
        BVHTreeNearest nearest;
        DerivedMesh *dmesh_src;
@@ -507,6 +515,7 @@
 
        /*get meshes*/
        me_dst = ob_dst->data;
+       me_src = ob_src->data;
        dmesh_src = ob_src->derivedDeform;
 
        /*make node tree*/
@@ -522,6 +531,7 @@
 
        /*get vertices*/
        mv_dst = me_dst->mvert;
+       mv_src = me_src->mvert;
 
        /*prepare transformation matrix*/
        /*this can be excluded to make a lazy feature that works better when 
object centers relative to mesh is the same*/
@@ -541,7 +551,7 @@
                dw_dst = defvert_verify_index(*dv_array_dst, index_dst);
                if(mode == 1) dw_dst->weight = dw_src->weight;
                else if(mode == 2) {if(!dw_dst->weight || dw_dst->weight == 0) 
dw_dst->weight = dw_src->weight;}
-               else if(mode == 3) {dw_dst->weight= dw_src->weight;}/*TODO fix 
this*/
+               else if(mode == 3) {if(mv_src[nearest.index].flag == 1) 
dw_dst->weight = dw_src->weight;}
                else return 0;
        }
        /*free memory and return*/
@@ -560,7 +570,7 @@
        MFace *mface_src;
        BVHTreeNearest nearest;
        MDeformWeight *dw_dst, *dw_src;
-       int dv_tot_src, dv_tot_dst, i, index_dst, index_src;
+       int dv_tot_src, dv_tot_dst, i, index_dst, index_src, 
index_nearest_vertex;
        float dist_v1, dist_v2, dist_v3, dist_v4, tmp_co[3], tmp_mat[4][4];
 
        /*remove this:*/
@@ -623,28 +633,21 @@
                dist_v1 = len_squared_v3v3(tmp_co, 
mv_src[mface_src[nearest.index].v1].co);
                dist_v2 = len_squared_v3v3(tmp_co, 
mv_src[mface_src[nearest.index].v2].co);
                dist_v3 = len_squared_v3v3(tmp_co, 
mv_src[mface_src[nearest.index].v3].co);
-               /*get weight from triangle*/
-               if(dist_v1 < dist_v2 && dist_v1 < dist_v3){
-                       dw_src = 
defvert_verify_index(dv_array_src[mface_src[nearest.index].v1], index_src);
-               }
-               else if(dist_v2 < dist_v3){
-                       dw_src = 
defvert_verify_index(dv_array_src[mface_src[nearest.index].v2], index_src);
-               }
-               else{
-                       dw_src = 
defvert_verify_index(dv_array_src[mface_src[nearest.index].v3], index_src);
-               }
-               /*check for and get weight from quad*/
+               /*get closest vertex*/
+               if(dist_v1 < dist_v2 && dist_v1 < dist_v3) index_nearest_vertex 
= mface_src[nearest.index].v1;
+               else if(dist_v2 < dist_v3) index_nearest_vertex = 
mface_src[nearest.index].v2;
+               else index_nearest_vertex = mface_src[nearest.index].v3;
                if(mface_src[nearest.index].v4){
                        dist_v4 = len_squared_v3v3(tmp_co, 
mv_src[mface_src[nearest.index].v4].co);
-                       if(dist_v4 < dist_v1 && dist_v4 < dist_v2 && dist_v4 < 
dist_v3){
-                               dw_src = 
defvert_verify_index(dv_array_src[mface_src[nearest.index].v4], index_src);
-                       }
+                       if(dist_v4 < dist_v1 && dist_v4 < dist_v2 && dist_v4 < 
dist_v3) index_nearest_vertex = mface_src[nearest.index].v1;
                }
                /*copy weight*/
+               dw_src = 
defvert_verify_index(dv_array_src[index_nearest_vertex], index_src);
                dw_dst = defvert_verify_index(*dv_array_dst, index_dst);
                if(mode == 1) dw_dst->weight = dw_src->weight;
                else if(mode == 2) {if(!dw_dst->weight || dw_dst->weight == 0) 
dw_dst->weight = dw_src->weight;}
-               else if(mode == 3) {dw_dst->weight= dw_src->weight;}/*TODO: fix 
this!*/
+               /*ATTENTION: face select in weightpaint mode seems reversed. 
Might create bug when fixed*/
+               else if(mode == 3) {if(mface_src[nearest.index].flag != SELECT) 
dw_dst->weight = dw_src->weight;}
                else return 0;
        }
        /*free memory and return*/
@@ -734,7 +737,8 @@
                dw_dst = defvert_verify_index(*dv_array_dst, index_dst);
                if(mode == 1) dw_dst->weight = weight;
                else if(mode == 2) {if(!dw_dst->weight || dw_dst->weight == 0) 
dw_dst->weight = weight;}
-               else if(mode == 3) {dw_dst->weight= weight;}/*TODO: fix this!*/
+               /*ATTENTION: face select in weightpaint mode seems reversed. 
Might create bug when fixed*/
+               else if(mode == 3) {if(mface_src[nearest.index].flag != SELECT) 
dw_dst->weight = weight;}
                else return 0;
        }
        /*free memory and return*/
@@ -3139,9 +3143,15 @@
        /*TODO: get these parameters*/
        enum Function {by_index = 1, by_nearest_vertex = 2, by_nearest_face = 
3, by_nearest_vertex_in_face = 4} function = 4;
        /*TODO: pass these on to functions*/
-       enum Mode {replace_all_weights = 1, replace_empty_weights = 2, 
replace_selected_weights = 3} mode= 1;
+       enum Mode {replace_all_weights = 1, replace_empty_weights = 2, 
replace_selected_weights = 3} mode= 3;
        enum Option {single = 1, all = 2} option = 1;
 
+       /*Truth table for testing:*/
+       /*1,3,1 working*/
+       /*2,3,1 working*/
+       /*3,3,1 working*/
+       /*4,3,1 working*/
+
        /*Macro to loop through selected objects and perform operation 
depending on function, option and method*/
        CTX_DATA_BEGIN(C, Object*, obslc, selected_editable_objects)
        {

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to