diff --git a/source/blender/include/BDR_vpaint.h b/source/blender/include/BDR_vpaint.h index d375949c9d3..b7dd38707c3 100644 --- a/source/blender/include/BDR_vpaint.h +++ b/source/blender/include/BDR_vpaint.h @@ -51,6 +51,7 @@ void vertex_paint(void); void set_vpaint(void); void set_wpaint(void); +void clear_wpaint_selectedfaces(void); void weight_paint(void); void wpaint_undo (void); void copy_wpaint_undo (struct MDeformVert *dverts, int dcount); diff --git a/source/blender/src/header_view3d.c b/source/blender/src/header_view3d.c index 3acdaa7fccf..c499716c751 100644 --- a/source/blender/src/header_view3d.c +++ b/source/blender/src/header_view3d.c @@ -3537,8 +3537,14 @@ static void do_view3d_paintmenu(void *arg, int event) case 1: /* undo weight painting */ wpaint_undo(); break; - case 2: /* clear vertex colors */ - clear_vpaint(); + case 2: /* set vertex colors/weight */ + if(G.f & G_FACESELECT) + clear_vpaint_selectedfaces(); + else /* we know were in vertex paint mode */ + clear_vpaint(); + break; + case 3: /* set vertex colors/weight */ + clear_wpaint_selectedfaces(); break; } allqueue(REDRAWVIEW3D, 0); @@ -3558,10 +3564,12 @@ static uiBlock *view3d_paintmenu(void *arg_unused) if (G.f & G_VERTEXPAINT) { uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Vertex Colors|Shift K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Vertex Colors|Shift K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); + } else if (G.f & G_WEIGHTPAINT && G.f & G_FACESELECT) { + uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Weight|Shift K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, ""); } - + if(curarea->headertype==HEADERTOP) { uiBlockSetDirection(block, UI_DOWN); } @@ -3766,7 +3774,7 @@ static void do_view3d_faceselmenu(void *arg, int event) do_shared_vertexcol(me); } break; - case 3: /* clear vertex colors */ + case 3: /* set vertex colors */ clear_vpaint_selectedfaces(); break; case 8: /* uv calculation */ @@ -3810,7 +3818,7 @@ static uiBlock *view3d_faceselmenu(void *arg_unused) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Copy UVs & Textures", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Copy Vertex Colors", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Vertex Colors|Shift K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, ""); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Vertex Colors|Shift K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); diff --git a/source/blender/src/space.c b/source/blender/src/space.c index 715c8a60271..df21bd8d9b6 100644 --- a/source/blender/src/space.c +++ b/source/blender/src/space.c @@ -1467,7 +1467,10 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt) else { if((G.qual==LR_SHIFTKEY)) { if(G.f & G_FACESELECT) - clear_vpaint_selectedfaces(); + if (G.f & G_WEIGHTPAINT) + clear_wpaint_selectedfaces(); + else + clear_vpaint_selectedfaces(); else if(G.f & G_VERTEXPAINT) clear_vpaint(); else diff --git a/source/blender/src/vpaint.c b/source/blender/src/vpaint.c index f11205a6fd2..63995aa5214 100644 --- a/source/blender/src/vpaint.c +++ b/source/blender/src/vpaint.c @@ -360,6 +360,94 @@ void clear_vpaint_selectedfaces() allqueue(REDRAWVIEW3D, 0); } + +void clear_wpaint_selectedfaces() +{ + extern float editbutvweight; + float paintweight= editbutvweight; + Mesh *me; + TFace *tface; + MFace *mface; + Object *ob; + int index, vgroup; + MDeformWeight *dw, *uw; + + ob= OBACT; + me= ob->data; + if(me==0 || me->totface==0 || me->dvert==0 || !me->tface) return; + + if(indexar==NULL) init_vertexpaint(); + for(index=0, tface=me->tface; indextotface; index++) { + if((tface->flag & TF_SELECT)==0) { + indexar[index]= 0; + } else { + indexar[index]= index+1; + } + tface++; + } + + copy_wpaint_undo(me->dvert, me->totvert); + vgroup= ob->actdef-1; + + for(index=0; indextotface; index++) { + if(indexar[index] && indexar[index]<=me->totface) { + mface= me->mface + (indexar[index]-1); + if(!((me->dvert+mface->v1)->flag)) { + dw= verify_defweight(me->dvert+mface->v1, vgroup); + if(dw) { + uw= verify_defweight(wpaintundobuf+mface->v1, vgroup); + uw->weight= dw->weight; + dw->weight= paintweight; + } + (me->dvert+mface->v1)->flag= 1; + } + + if(!((me->dvert+mface->v2)->flag)) { + dw= verify_defweight(me->dvert+mface->v2, vgroup); + if(dw) { + uw= verify_defweight(wpaintundobuf+mface->v2, vgroup); + uw->weight= dw->weight; + dw->weight= paintweight; + } + (me->dvert+mface->v2)->flag= 1; + } + + if(!((me->dvert+mface->v3)->flag)) { + dw= verify_defweight(me->dvert+mface->v3, vgroup); + if(dw) { + uw= verify_defweight(wpaintundobuf+mface->v3, vgroup); + uw->weight= dw->weight; + dw->weight= paintweight; + } + (me->dvert+mface->v3)->flag= 1; + } + + if(mface->v4) { + if(!((me->dvert+mface->v4)->flag)) { + dw= verify_defweight(me->dvert+mface->v4, vgroup); + if(dw) { + uw= verify_defweight(wpaintundobuf+mface->v4, vgroup); + uw->weight= dw->weight; + dw->weight= paintweight; + } + } + (me->dvert+mface->v4)->flag= 1; + } + } + } + + index=0; + while (indextotvert) { + (me->dvert+index)->flag= 0; + index++; + } + + DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); + BIF_undo_push("Set vertex weight"); + allqueue(REDRAWVIEW3D, 0); +} + + void vpaint_dogamma() { Mesh *me;