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