Revision: 37566
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37566
Author:   jason_hays22
Date:     2011-06-16 19:05:05 +0000 (Thu, 16 Jun 2011)
Log Message:
-----------
Made Multi-Paint and Locking more independent to better support future features.
(an if statement surrounding Multi-Paint still checks the lock flags to see if 
it should bother changing anything)

Also, I changed lock's redistribution method so that if there was no enough 
space
on other unlocked groups, it tries to keep the new weights' ratios to each other

Modified Paths:
--------------
    branches/soc-2011-radish/source/blender/blenkernel/intern/DerivedMesh.c
    branches/soc-2011-radish/source/blender/editors/sculpt_paint/paint_vertex.c

Modified: 
branches/soc-2011-radish/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/soc-2011-radish/source/blender/blenkernel/intern/DerivedMesh.c     
2011-06-16 18:27:20 UTC (rev 37565)
+++ branches/soc-2011-radish/source/blender/blenkernel/intern/DerivedMesh.c     
2011-06-16 19:05:05 UTC (rev 37566)
@@ -1612,8 +1612,6 @@
        Mesh *me = ob->data;
        float colf[4], input = 0.0f, unsel_sum = 0.0f;// Jason
        int i;
-       //Jason, a dw might be absent from dvert, so count the dw's you find
-       // to see if it should be disabled in multipaint
        int cnt = 0;
        char make_black = FALSE;
 
@@ -1622,12 +1620,10 @@
                        // Jason was here
                        if(multipaint && selected > 1) {
                                if(dg_flags[me->dvert[vert].dw[i].def_nr]) {
-                                       if(!me->dvert[vert].dw[i].weight) {
-                                               make_black = TRUE;
-                                               break;
+                                       if(me->dvert[vert].dw[i].weight) {
+                                               
input+=me->dvert[vert].dw[i].weight;
+                                               cnt++;
                                        }
-                                       input+=me->dvert[vert].dw[i].weight;
-                                       cnt++;
                                }
                                // TODO unselected non-bone groups should not 
be involved in this sum
                                else if(auto_normalize) {
@@ -1638,11 +1634,11 @@
                        }
                }
                // Jason was here
-               if(multipaint && selected > 1 && !make_black) {
-                       if(cnt!=selected || input == 1.0f && auto_normalize && 
!unsel_sum) {
+               if(multipaint && selected > 1) {
+                       if(cnt == 0 || input == 1.0f && auto_normalize && 
!unsel_sum) {
                                make_black = TRUE;
-                       } else {
-                               input/=selected;
+                       } else if (!auto_normalize){
+                               input /= selected;
                        }
                }
        }

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-16 18:27:20 UTC (rev 37565)
+++ branches/soc-2011-radish/source/blender/editors/sculpt_paint/paint_vertex.c 
2011-06-16 19:05:05 UTC (rev 37566)
@@ -1029,7 +1029,7 @@
        }
 }
 // Jason was here: the active group should be involved in auto normalize
-static void do_weight_paint_auto_normalize_change_act_group(MDeformVert 
*dvert, char *map)
+static void do_weight_paint_auto_normalize_all_groups(MDeformVert *dvert, char 
*map)
 {
 //     MDeformWeight *dw = dvert->dw;
        float sum=0.0f, fac=0.0f;
@@ -1107,23 +1107,8 @@
        }
        return FALSE;
 }
+
 /* Jason was here */
-static float get_change_allowed_from_unlocked_bone_groups(MDeformVert *dvert, 
int def_nr, int defcnt, char *selection, int pos, char *flags, char 
*bone_groups) {
-       int i;
-       float allowed_totchange = 0.0f;
-       for(i = 0; i < defcnt; i++) {
-               if(def_nr != i && bone_groups[i] && !selection[i] && !flags[i]) 
{
-                       // positive change
-                       if(pos == 1) {
-                               allowed_totchange -= 
1-defvert_verify_index(dvert, i)->weight;
-                       } else {//negative change
-                               allowed_totchange -= 
defvert_verify_index(dvert, i)->weight;
-                       }
-               }
-       }
-       return allowed_totchange;
-}
-/* Jason was here */
 static int has_unselected_unlocked_bone_group(int defcnt, char *selection, int 
selected, char *flags, char *bone_groups) {
        int i;
        if(defcnt == selected) {
@@ -1136,216 +1121,222 @@
        }
        return FALSE;
 }
-/*
-The idea behind this function is to get the difference in weight,
-and to redistribute that weight to the unlocked groups
-(if it has to, then it will put some/all of the change
-back onto the original group)
-*/
-static void redistribute_weight_change(Object *ob, MDeformVert *dvert, int 
index, int def_nr, int multipaint, char *selection, int selected, float 
change_left, char* flags, int defcnt, char *map)
-{
+
+/*Jason*/
+static void multipaint_selection(MDeformVert *dvert, float change, char 
*selection, int defcnt) {
        int i;
-       float old_change_left;
-       // make sure the redistribution the same per loop.
-       float change;
-       char was_a_change;
-       int groups_left_that_can_change = 0;
-       char* change_status = MEM_mallocN(defcnt*sizeof(char), "defflags");
        MDeformWeight *dw;
+       // make sure they are all at most 1 after the change
        for(i = 0; i < defcnt; i++) {
-               if(def_nr == i || (multipaint && selection[i]) || !map[i]) {
-                       change_status[i] = FALSE;
-               } else {
-                       change_status[i] = !flags[i];
+               if(selection[i]) {
+                       dw = defvert_find_index(dvert, i);
+                       if(dw && dw->weight) {
+                               if(dw->weight * change > 1) {
+                                       change = 1.0f/dw->weight;
+                               }
+                       }
                }
-               if(change_status[i]) {
-                       groups_left_that_can_change++;
-                       defvert_verify_index(dvert, i);
-               }
        }
-       if(groups_left_that_can_change > 0) {
-               change = change_left/groups_left_that_can_change;
-               /* the division could cause it to be zero, so if it is, forget 
it*/
-               if(change == 0) {
-                       change = change_left;
+       for(i = 0; i < defcnt; i++) {
+               if(selection[i]) {
+                       dw = defvert_find_index(dvert, i);
+                       if(dw && dw->weight) {
+                               dw->weight = dw->weight * change;
+                       }
                }
-               do {
-                       was_a_change = FALSE;
-                       for(i = 0; i < dvert->totweight; i++) {
-                               dw = defvert_verify_index(dvert, i);
-                               if(!change_status[dw->def_nr]) {
-                                       continue;
-                               }
-
-                               old_change_left = change_left;
-                               change_left -= change;
-                               // sign change?
-                               if(change_left!=0 && 
change_left/fabs(change_left) != old_change_left/fabs(old_change_left)) {
-                                       change_left = old_change_left;
-                                       break;
+       }
+}
+/*Jason*/
+static float redistribute_change(MDeformVert *ndv, char *change_status, int 
changeme, int changeto, char *validmap, float totchange, float total_valid) {
+       float was_change;
+       float change;
+       float oldval;
+       MDeformWeight *ndw;
+       int i;
+       do {
+               was_change = FALSE;
+               change = totchange/total_valid;
+               for(i = 0; i < ndv->totweight && total_valid && totchange; i++) 
{
+                       ndw = (ndv->dw+i);
+                       if(change_status[ndw->def_nr] == changeme) {
+                               oldval = ndw->weight;
+                               if(!validmap && ndw->weight + change > 1) {
+                                       totchange -= 1-ndw->weight;
+                                       ndw->weight = 1;
+                                       change_status[ndw->def_nr] = changeto;
+                                       total_valid--;
+                               } else if(ndw->weight + change < 0) {
+                                       totchange -= ndw->weight;
+                                       ndw->weight = 0;
+                                       change_status[ndw->def_nr] = changeto;
+                                       total_valid--;
                                } else {
-                                       dw->weight += change;
+                                       totchange -= change;
+                                       ndw->weight += change;
                                }
-                               if(dw->weight >= 1.0f) {
-
-                                       change_left += dw->weight-1.0f;
-                                       dw->weight = 1.0f;
-                                       groups_left_that_can_change--;
-                                       change_status[dw->def_nr] = FALSE;
-
-                               }else if(dw->weight <= 0.0f) {
-
-                                       change_left += dw->weight;
-                                       dw->weight = 0.0f;
-                                       groups_left_that_can_change--;
-                                       change_status[dw->def_nr] = FALSE;
+                               if(oldval != ndw->weight) {
+                                       was_change = TRUE;
                                }
-                               /* if it was too small, don't get stuck in an 
infinite loop! */
-                               if(old_change_left != change_left) {
-                                       was_a_change = TRUE;
-                               }
                        }
-               } while(groups_left_that_can_change > 0 && change_left != 0.0f 
&& was_a_change);
-       }
-       // now it should never have any left, unless there are precision 
problems
-       // add any remaining change back to the original weight
-       if(change_left > 0) {
-               if(multipaint) {
-                       for(i = 0; i < defcnt; i++) {
-                               if(selection[i]) {
-                                       defvert_find_index(dvert, i)->weight += 
change_left/selected;
-                               }
-                       }
-               } else {
-                       defvert_find_index(dvert, def_nr)->weight += 
change_left;
                }
-       }
-       MEM_freeN(change_status);
+       }while(was_change && total_valid && totchange);
+       return totchange;
 }
-/* Jason */
-/* get the change that is needed to get a valid multipaint (if it can)*/
-static float get_valid_multipaint_change(MDeformVert *dvert, float neww, float 
oldw, float allowed_totchange, char* validmap, char* bone_groups, char* 
selection, int defcnt) {
-       int i;
+/*Jason*/
+static void enforce_locks(MDeformVert *odv, MDeformVert *ndv, int defcnt, char 
*flags, char *bone_groups, char *validmap) {
+       float totchange = 0.0f;
+       float totchange_allowed = 0.0f;
+       float left_over;
        float change;
-       float tchange;
-       MDeformWeight *w;
-       float val;
-       // see if you need to do anything (if it is normalized)
-       float sumw = 0.0f;
-       if(allowed_totchange == 0 || oldw == 0 || !selection) {
-               return FALSE;
+       int total_valid = 0;
+       int total_changed = 0;
+       int i;
+       MDeformWeight *ndw;
+       MDeformWeight *odw;
+       MDeformWeight *ndw2;
+       MDeformWeight *odw2;
+       int designatedw = -1;
+       int designatedw_changed = FALSE;
+       float storedw;
+       char *change_status;
+       char new_weight_has_zero = FALSE;
+
+       if(!flags || !has_locked_group(ndv, flags)) {
+               return;
        }
-       change = neww/oldw;
-       if(change == 1 || !change) {
-               return FALSE;
-       }
-       // see if all changes are valid before doing any
+
+       change_status = MEM_callocN(sizeof(char)*defcnt, "unlocked_unchanged");
+
        for(i = 0; i < defcnt; i++) {
-               if(!selection[i] || !bone_groups[i]) {
+               ndw = defvert_find_index(ndv, i);
+               odw = defvert_find_index(odv, i);
+               if(!ndw || !odw) {
+                       if (!flags[i] && bone_groups[i]){
+                               defvert_verify_index(odv, i);
+                               defvert_verify_index(ndv, i);
+                               total_valid++;
+                               change_status[i] = 1; // can be altered while 
redistributing
+                       }
                        continue;
                }
-               w = defvert_verify_index(dvert, i);
-               // already reached the cap
-               if(change > 1 && w->weight==1) {
-                       return FALSE;
-               }
-               if(w->weight == 0) {
-                       if(selection[i]) {
-                               return FALSE;
+               if(flags[i]) {
+                       ndw->weight = odw->weight;
+               } else if(ndw->weight != odw->weight) {
+                       totchange += ndw->weight-odw->weight;
+                       change_status[i] = 2; // was altered already
+                       total_changed++;
+                       if(ndw->weight == 0) {
+                               new_weight_has_zero = TRUE;
+                       } else if(!designatedw){
+                               designatedw = i;
                        }
-                       continue;
+               } else if (bone_groups[i]){
+                       totchange_allowed += ndw->weight;
+                       total_valid++;
+                       change_status[i] = 1; // can be altered while 
redistributing
                }
-               val = w->weight*change;
-               // no success here-I'm not going to force it to try to be just 
above 0 by changing 'change'
-               if(val <= 0) {
-                       return FALSE;
-               }
-               if (validmap){
-                       sumw += w->weight;
-               }else if(val > 1) {
-                       // use the transitive property to make magic, all of 
the others
-                       // will still end up within the boundaries if the worst 
case does
-                       change = 1.0f/w->weight;
-               }
        }
-       if(validmap && sumw == 1.0f) {
-               return FALSE;
-       }
-       if(allowed_totchange>0) {
-               for(i = 0; i < defcnt; i++) {
-                       w = defvert_find_index(dvert, i);
-                       if(w && selection[i] && bone_groups[i]) {
-                               tchange += w->weight*change;
+       if(total_changed) {
+               if(totchange_allowed) {
+                       if(totchange < 0) {
+                               totchange_allowed = total_valid - 
totchange_allowed;
+                       } else {
+                               totchange_allowed *= -1;
                        }
+                       left_over = 0;
+                       if(fabs(totchange_allowed) < fabs(totchange)) {

@@ 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