Revision: 37079 http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37079 Author: jason_hays22 Date: 2011-06-01 17:04:32 +0000 (Wed, 01 Jun 2011) Log Message: ----------- I've begun treating unlocked misc vertex groups differently than unlocked bone groups- unlocked misc vertex groups should no longer have any involvement in the redistribution of weights.
I may need a better auto normalize solution, however, because the weights can become 0 with enough division. Modified Paths: -------------- branches/soc-2011-radish/source/blender/editors/sculpt_paint/paint_vertex.c Modified: branches/soc-2011-radish/source/blender/editors/sculpt_paint/paint_vertex.c =================================================================== --- branches/soc-2011-radish/source/blender/editors/sculpt_paint/paint_vertex.c 2011-06-01 16:17:38 UTC (rev 37078) +++ branches/soc-2011-radish/source/blender/editors/sculpt_paint/paint_vertex.c 2011-06-01 17:04:32 UTC (rev 37079) @@ -1037,6 +1037,9 @@ it simply makes the highest weight sum add up to one the Mesh is needed to change the ratios across the group + +I need to resolve a precision error issue, however: +dividing can cause the weights to drop to 0 */ static void do_wp_auto_normalize_locked_groups(Mesh *me, MDeformVert *dvert, char* map) { @@ -1056,7 +1059,10 @@ cnt = dv.totweight; currentSum = 0.0f; for(k = 0; k < cnt; k++) { - currentSum += (dv.dw+k)->weight; + if(map[dv.dw->def_nr]) { + //printf("group %d considered\n", dv.dw->def_nr); + currentSum += (dv.dw+k)->weight; + } } if(highestSum < currentSum) { highestSum = currentSum; @@ -1070,7 +1076,9 @@ cnt = dv.totweight; for(k = 0; k < cnt; k++) { - (dv.dw+k)->weight /= highestSum; + if(map[dv.dw->def_nr]) { + (dv.dw+k)->weight /= highestSum; + } } } } @@ -1107,7 +1115,7 @@ { int i; for(i = 0; i < dvert->totweight; i++) { - if(flags[(dvert->dw+i)->def_nr]) { + if(flags[(dvert->dw+i)->def_nr] && (dvert->dw+i)->weight > 0.0f) { return TRUE; } } @@ -1196,7 +1204,7 @@ (if it has to, then it will put some/all of the change back onto the original group) */ -static void redistribute_weight_change(MDeformVert *dvert, MDeformWeight *pnt_dw, float oldw, char* flags, int defcnt) +static void redistribute_weight_change(MDeformVert *dvert, MDeformWeight *pnt_dw, float oldw, char* flags, int defcnt, char *map) { int i; float change_left = oldw - pnt_dw->weight; @@ -1207,7 +1215,7 @@ MDeformWeight *dw; //printf("start\n"); for(i = 0; i < defcnt; i++) { - if(pnt_dw->def_nr == i) { + if(pnt_dw->def_nr == i || !map[i]) { change_status[i] = FALSE; } else { change_status[i] = !flags[i]; @@ -1256,6 +1264,24 @@ MEM_freeN(change_status); //printf("done\n"); } +/* Jason */ +static void check_locks_and_normalize(Mesh *me, int index, int vgroup, MDeformWeight *dw, float oldw, char *validmap, char *flags, int defcnt, char *bone_groups) +{ + if(flags && has_locked_group(me->dvert+index, flags)) { + if(flags[dw->def_nr]) { + // cannot change locked groups! + dw->weight = oldw; + } else if(bone_groups[dw->def_nr]) { + redistribute_weight_change(me->dvert+index, dw, oldw, flags, defcnt, bone_groups); + do_wp_auto_normalize_locked_groups(me, me->dvert, validmap); + } + } else { + do_weight_paint_auto_normalize(me->dvert+index, vgroup, validmap); + } +} +// Jason +static char *wpaint_make_validmap(Object *ob); + static void do_weight_paint_vertex(VPaint *wp, Object *ob, int index, float alpha, float paintweight, int flip, int vgroup_mirror, char *validmap) @@ -1266,8 +1292,14 @@ /* Jason was here */ char* flags; + char* bone_groups; float oldw; int defcnt; + if(validmap) { + bone_groups = validmap; + }else { + bone_groups = wpaint_make_validmap(ob); + } if(wp->flag & VP_ONLYVGROUP) { dw= defvert_find_index(me->dvert+index, vgroup); @@ -1286,17 +1318,7 @@ wpaint_blend(wp, dw, uw, alpha, paintweight, flip); /* Jason was here */ - if(flags && has_locked_group(me->dvert+index, flags)) { - if(flags[dw->def_nr]) { - // cannot change locked groups! - dw->weight = oldw; - } else { - redistribute_weight_change(me->dvert+index, dw, oldw, flags, defcnt); - do_wp_auto_normalize_locked_groups(me, me->dvert, validmap); - } - } else { - do_weight_paint_auto_normalize(me->dvert+index, vgroup, validmap); - } + check_locks_and_normalize(me, index, vgroup, dw, oldw, validmap, flags, defcnt, bone_groups); if(me->editflag & ME_EDIT_MIRROR_X) { /* x mirror painting */ int j= mesh_get_x_mirror_vert(ob, index); if(j>=0) { @@ -1310,23 +1332,16 @@ uw->weight= dw->weight; /* Jason */ - if(flags && has_locked_group(me->dvert+j, flags)) { - if(flags[uw->def_nr]) { - // cannot change locked groups! - uw->weight = oldw; - } else { - redistribute_weight_change(me->dvert+j, uw, oldw, flags, defcnt); - do_wp_auto_normalize_locked_groups(me, me->dvert, validmap); - } - } else { - do_weight_paint_auto_normalize(me->dvert+j, vgroup, validmap); - } + check_locks_and_normalize(me, j, vgroup, dw, oldw, validmap, flags, defcnt, bone_groups); } } /* Jason */ if(flags) { MEM_freeN(flags); } + if(!validmap) { + MEM_freeN(bone_groups); + } } _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs