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