Revision: 37322
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37322
Author:   jason_hays22
Date:     2011-06-08 19:05:17 +0000 (Wed, 08 Jun 2011)
Log Message:
-----------
Heard that multi-bone selection would be better used for painting multiple 
bones; took out select lock.

Added a basic multiple bone group paint feature "Multi-Paint" and its 
corresponding checkbox next to "Auto Normalize," but I need to access the 
ToolSettings for it in armature to make bone selection function/draw correctly

When you multi-paint, it paints on selected bones while keeping the weight 
ratios on a vertex of the selected groups the same.  You can't currently 
multi-paint on a vertex with a locked deform group.

Modified Paths:
--------------
    
branches/soc-2011-radish/release/scripts/startup/bl_ui/space_view3d_toolbar.py
    branches/soc-2011-radish/source/blender/blenkernel/intern/DerivedMesh.c
    branches/soc-2011-radish/source/blender/editors/armature/editarmature.c
    branches/soc-2011-radish/source/blender/editors/sculpt_paint/paint_vertex.c
    branches/soc-2011-radish/source/blender/makesdna/DNA_scene_types.h
    branches/soc-2011-radish/source/blender/makesrna/intern/rna_scene.c

Modified: 
branches/soc-2011-radish/release/scripts/startup/bl_ui/space_view3d_toolbar.py
===================================================================
--- 
branches/soc-2011-radish/release/scripts/startup/bl_ui/space_view3d_toolbar.py  
    2011-06-08 17:59:24 UTC (rev 37321)
+++ 
branches/soc-2011-radish/release/scripts/startup/bl_ui/space_view3d_toolbar.py  
    2011-06-08 19:05:17 UTC (rev 37322)
@@ -639,6 +639,8 @@
         elif context.weight_paint_object and brush:
             layout.prop(context.tool_settings, "vertex_group_weight", 
text="Weight", slider=True)
             layout.prop(context.tool_settings, "use_auto_normalize", 
text="Auto Normalize")
+            # Jason was here
+            layout.prop(context.tool_settings, "use_multipaint", 
text="Multi-Paint")
 
             col = layout.column()
 

Modified: 
branches/soc-2011-radish/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/soc-2011-radish/source/blender/blenkernel/intern/DerivedMesh.c     
2011-06-08 17:59:24 UTC (rev 37321)
+++ branches/soc-2011-radish/source/blender/blenkernel/intern/DerivedMesh.c     
2011-06-08 19:05:17 UTC (rev 37322)
@@ -40,6 +40,9 @@
 #include "DNA_cloth_types.h"
 #include "DNA_key_types.h"
 #include "DNA_meshdata_types.h"
+// Jason
+#include "DNA_armature_types.h"
+
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h" // N_T
 
@@ -72,6 +75,8 @@
 #include "GPU_material.h"
 
 #include "ED_sculpt.h" /* for ED_sculpt_modifiers_changed */
+// Jason was here, this is for multi-paint
+#include "ED_armature.h"
 
 ///////////////////////////////////
 ///////////////////////////////////
@@ -1602,7 +1607,7 @@
        }
 }
 
-static void calc_weightpaint_vert_color(Object *ob, ColorBand *coba, int vert, 
unsigned char *col)
+static void calc_weightpaint_vert_color(Object *ob, ColorBand *coba, int vert, 
unsigned char *col, char *dg_flags, int selected)
 {
        Mesh *me = ob->data;
        float colf[4], input = 0.0f;
@@ -1610,9 +1615,15 @@
 
        if (me->dvert) {
                for (i=0; i<me->dvert[vert].totweight; i++)
-                       if (me->dvert[vert].dw[i].def_nr==ob->actdef-1)
-                               input+=me->dvert[vert].dw[i].weight;            
+                       // Jason was here
+                       if ((selected<=1 && 
me->dvert[vert].dw[i].def_nr==ob->actdef-1) || 
dg_flags[me->dvert[vert].dw[i].def_nr]) {//
+                               input+=me->dvert[vert].dw[i].weight;
+                       }
        }
+       // Jason was here
+       if(selected) {
+               input/=selected;
+       }
 
        CLAMP(input, 0.0f, 1.0f);
        
@@ -1633,7 +1644,44 @@
 {
        stored_cb= coba;
 }
+/* Jason was here */
+static char* get_selected_defgroups(Object *ob, int defcnt) {
+       bPoseChannel *chan;
+       bPose *pose;
+       bDeformGroup *defgroup;
+       //Bone *bone;
+       char was_selected = FALSE;
+       char *dg_flags = MEM_mallocN(defcnt*sizeof(char), "dg_selected_flags");
+       int i;
+       Object *armob = ED_object_pose_armature(ob);
 
+       if(armob) {
+               pose = armob->pose;
+               for (chan=pose->chanbase.first; chan; chan=chan->next) {
+                       for (i = 0, defgroup = ob->defbase.first; i < defcnt && 
defgroup; defgroup = defgroup->next, i++) {
+                               if(!strcmp(defgroup->name, chan->bone->name)) {
+                                       // TODO get BONE_SELECTED flag
+                                       dg_flags[i] = (chan->bone->flag & 1);
+                                       was_selected = TRUE;
+                               }
+                       }
+               }
+       }
+       
+       return dg_flags;
+}
+/* Jason was here */
+static int count_true(char *list, int len)
+{
+       int i;
+       int cnt = 0;
+       for(i = 0; i < len; i++) {
+               if (list[i]) {
+                       cnt++;
+               }
+       }
+       return cnt;
+}
 static void add_weight_mcol_dm(Object *ob, DerivedMesh *dm)
 {
        Mesh *me = ob->data;
@@ -1641,18 +1689,24 @@
        ColorBand *coba= stored_cb;     /* warning, not a local var */
        unsigned char *wtcol;
        int i;
-       
+       // Jason was here
+       int defcnt = BLI_countlist(&ob->defbase);
+       char *dg_flags = get_selected_defgroups(ob, defcnt);
+       int selected = count_true(dg_flags, defcnt);
+
        wtcol = MEM_callocN (sizeof (unsigned char) * me->totface*4*4, 
"weightmap");
        
        memset(wtcol, 0x55, sizeof (unsigned char) * me->totface*4*4);
        for (i=0; i<me->totface; i++, mf++) {
-               calc_weightpaint_vert_color(ob, coba, mf->v1, &wtcol[(i*4 + 
0)*4]); 
-               calc_weightpaint_vert_color(ob, coba, mf->v2, &wtcol[(i*4 + 
1)*4]); 
-               calc_weightpaint_vert_color(ob, coba, mf->v3, &wtcol[(i*4 + 
2)*4]); 
+               calc_weightpaint_vert_color(ob, coba, mf->v1, &wtcol[(i*4 + 
0)*4], dg_flags, selected); 
+               calc_weightpaint_vert_color(ob, coba, mf->v2, &wtcol[(i*4 + 
1)*4], dg_flags, selected); 
+               calc_weightpaint_vert_color(ob, coba, mf->v3, &wtcol[(i*4 + 
2)*4], dg_flags, selected); 
                if (mf->v4)
-                       calc_weightpaint_vert_color(ob, coba, mf->v4, 
&wtcol[(i*4 + 3)*4]); 
+                       calc_weightpaint_vert_color(ob, coba, mf->v4, 
&wtcol[(i*4 + 3)*4], dg_flags, selected); 
        }
-       
+       // Jason
+       MEM_freeN(dg_flags);
+
        CustomData_add_layer(&dm->faceData, CD_WEIGHT_MCOL, CD_ASSIGN, wtcol, 
dm->numFaceData);
 }
 

Modified: 
branches/soc-2011-radish/source/blender/editors/armature/editarmature.c
===================================================================
--- branches/soc-2011-radish/source/blender/editors/armature/editarmature.c     
2011-06-08 17:59:24 UTC (rev 37321)
+++ branches/soc-2011-radish/source/blender/editors/armature/editarmature.c     
2011-06-08 19:05:17 UTC (rev 37322)
@@ -4400,7 +4400,6 @@
 
        return NULL;
 }
-
 /* called from editview.c, for mode-less pose selection */
 /* assumes scene obact and basact is still on old situation */
 int ED_do_pose_selectbuffer(Scene *scene, Base *base, unsigned int *buffer, 
short hits, short extend)
@@ -4412,13 +4411,13 @@
        if (!ob || !ob->pose) return 0;
 
        nearBone= get_bone_from_selectbuffer(scene, base, buffer, hits, 1);
-       
+
        /* if the bone cannot be affected, don't do anything */
        if ((nearBone) && !(nearBone->flag & BONE_UNSELECTABLE)) {
                bArmature *arm= ob->data;
                
                /* since we do unified select, we don't shift+select a bone if 
the armature object was not active yet */
-               /* Jason was here, I'm doing a unified select for locking now */
+               /* Jason was here, I'm doing a select for multibone painting */
                if ((base != scene->basact)) {//if (!(extend) || (base != 
scene->basact)) {
                        /* Jason was here */
                        /* only deselect all if they aren't using 'shift' */
@@ -4427,28 +4426,27 @@
                                nearBone->flag |= 
(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
                                arm->act_bone= nearBone;
                                ED_vgroup_select_by_name(OBACT, nearBone->name);
-                               DAG_id_tag_update(&OBACT->id, OB_RECALC_DATA);
                        }
-                       // Jason deselect this bone specifically if it is 
selected already
                        else {
+                               // Jason deselect this bone specifically if it 
is selected already
                                if (nearBone->flag & BONE_SELECTED) {
                                        nearBone->flag &= 
~(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
                                        if(nearBone == arm->act_bone) {
                                                // make a different bone the 
active one if it exists
-                                               
                                                new_act_bone = 
get_other_selected_bone(ob);
                                                if(new_act_bone) {
                                                        new_act_bone->flag |= 
(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
                                                        arm->act_bone = 
new_act_bone;
                                                        
ED_vgroup_select_by_name(OBACT, new_act_bone->name);
-                                                       
DAG_id_tag_update(&OBACT->id, OB_RECALC_DATA);
                                                }
                                        }
+                               // or select the bone if they are using shift
                                } else {
                                        nearBone->flag |= 
(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
                                        arm->act_bone= nearBone;
                                }
                        } 
+                       DAG_id_tag_update(&OBACT->id, OB_RECALC_DATA);
                                // XXX old cruft! use notifiers instead
                        //select_actionchannel_by_name(ob->action, 
nearBone->name, 1);
                }

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-08 17:59:24 UTC (rev 37321)
+++ branches/soc-2011-radish/source/blender/editors/sculpt_paint/paint_vertex.c 
2011-06-08 19:05:17 UTC (rev 37322)
@@ -1153,8 +1153,6 @@
 /*Jason was here
 gen_lck_flags gets the status of "flag" for each bDeformGroup
 in ob->defbase and returns an array containing them
-
-if there are multiple bones selected, however, they are the only ones that are 
treated as "unlocked"
 */
 static char* gen_lck_flags(Object* ob, int defcnt, char *map)
 {
@@ -1163,41 +1161,14 @@
        //int defcnt = BLI_countlist(&ob->defbase);
        char *flags = MEM_mallocN(defcnt*sizeof(char), "defflags");
        bDeformGroup *defgroup;
-       char was_selected = FALSE;
        int selected = 0;
-       bPose *pose;
-       bPoseChannel *chan;
-       Bone *bone;
 
-       Object *armob = ED_object_pose_armature(ob);
-
-       if(armob) {
-               pose = armob->pose;
-               for (chan=pose->chanbase.first; chan; chan=chan->next) {
-                       bone = chan->bone;
-                       was_selected = FALSE;
-                       for (i = 0, defgroup = ob->defbase.first; i < defcnt && 
defgroup; defgroup = defgroup->next, i++) {
-                               if(!strcmp(defgroup->name, bone->name)) {
-                                       flags[i] = !(bone->flag & 
BONE_SELECTED);
-                                       if(flags[i]) {
-                                               is_locked = TRUE;
-                                       } else if(!was_selected){
-                                               selected++;
-                                               was_selected = TRUE;
-                                       }
-                               }
-                       }
+       for(i = 0, defgroup = ob->defbase.first; i < defcnt && defgroup; 
defgroup = defgroup->next, i++) {
+               flags[i] = defgroup->flag;
+               if(flags[i]) {
+                       is_locked = TRUE;
                }
        }
-       if(selected <= 1) {
-               is_locked = FALSE;
-               for(i = 0, defgroup = ob->defbase.first; i < defcnt && 
defgroup; defgroup = defgroup->next, i++) {
-                       flags[i] = defgroup->flag;
-                       if(flags[i]) {
-                               is_locked = TRUE;
-                       }
-               }
-       }
        if(is_locked){
                return flags;
        }
@@ -1332,10 +1303,60 @@
        MEM_freeN(change_status);
 }
 /* Jason */
-static void check_locks_and_normalize(Object *ob, Mesh *me, int index, int 
vgroup, MDeformWeight *dw, float oldw, char *validmap, char *flags, int defcnt, 
char *bone_groups)
+/* return TRUE on success, FALSE on failure
+failure occurs when zero elements exist in the selection,
+nonzero elements reach zero,
+and if they go above 1 if auto normalize is off */
+static int multipaint_vgroups(MDeformVert *dvert, MDeformWeight *dw, float 
oldw, char* validmap, char* bone_groups, char* selection, int defcnt) {
+       int i;
+       float change;
+       MDeformWeight *w;
+       float val;
+       if(oldw == 0 || !selection) {
+               return FALSE;
+       }
+       change = dw->weight/oldw;
+       if(change == 1 || !change) {
+               return FALSE;
+       }
+       dw->weight = oldw;
+       // make sure all selected dverts exist
+       for(i = 0; i < defcnt; i++) {
+               if(selection[i]){
+                       defvert_verify_index(dvert, i);
+               }
+       }
+       // see if all changes are valid before doing any
+       for(i = 0; i < dvert->totweight; i++) {
+               w = (dvert->dw+i);
+               if(!selection[w->def_nr] || !bone_groups[w->def_nr]) {
+                       continue;
+               }
+               if(w->weight == 0) {
+                       if(selection[w->def_nr]) {

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

Reply via email to