minor cleanup for weightpaint fill

- SCE_SELECT_FACE and SCE_SELECT_VERTEX are mutually exclusive, use a macro to get a single value from them.
- was allocating an array for no reason.
This commit is contained in:
Campbell Barton
2011-11-02 00:51:21 +00:00
parent b60f60453b
commit 43e297c0c0
2 changed files with 50 additions and 64 deletions

View File

@@ -387,37 +387,16 @@ void vpaint_fill(Object *ob, unsigned int paintcol)
/* fills in the selected faces with the current weight and vertex group */ /* fills in the selected faces with the current weight and vertex group */
void wpaint_fill(VPaint *wp, Object *ob, float paintweight) void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
{ {
Mesh *me; Mesh *me= ob->data;
MFace *mf;
MDeformWeight *dw, *uw; MDeformWeight *dw, *uw;
int *indexar;
unsigned int index;
int vgroup, vgroup_mirror= -1; int vgroup, vgroup_mirror= -1;
int selected; unsigned int index;
int use_vert_sel;
me= ob->data; /* mutually exclusive, could be made into a */
if(me==NULL || me->totface==0 || me->dvert==NULL || !me->mface) return; const short paint_selmode= ME_EDIT_PAINT_SEL_MODE(me);
selected= (me->editflag & ME_EDIT_PAINT_MASK);
use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
indexar= get_indexarray(me); if(me->totface==0 || me->dvert==NULL || !me->mface) return;
if(selected) {
MFace *mf;
for(index=0, mf= me->mface; index<me->totface; index++, mf++) {
if((mf->flag & ME_FACE_SEL)==0)
indexar[index]= 0;
else
indexar[index]= index+1;
}
}
else {
for(index=0; index<me->totface; index++)
indexar[index]= index+1;
}
vgroup= ob->actdef-1; vgroup= ob->actdef-1;
@@ -428,47 +407,47 @@ void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
copy_wpaint_prev(wp, me->dvert, me->totvert); copy_wpaint_prev(wp, me->dvert, me->totvert);
for(index=0; index<me->totface; index++) { for(index=0, mf= me->mface; index < me->totface; index++, mf++) {
if(indexar[index] && indexar[index]<=me->totface) { unsigned int fidx= mf->v4 ? 3:2;
MFace *mf= &me->mface[indexar[index]-1];
unsigned int fidx= mf->v4 ? 3:2;
do { if ((paint_selmode == SCE_SELECT_FACE) && !(mf->flag & ME_FACE_SEL)) {
unsigned int vidx= *(&mf->v1 + fidx); continue;
}
if(!me->dvert[vidx].flag) { do {
if(use_vert_sel && !(me->mvert[vidx].flag & SELECT)) { unsigned int vidx= *(&mf->v1 + fidx);
continue;
}
dw= defvert_verify_index(&me->dvert[vidx], vgroup); if(!me->dvert[vidx].flag) {
if(dw) { if((paint_selmode == SCE_SELECT_VERTEX) && !(me->mvert[vidx].flag & SELECT)) {
uw= defvert_verify_index(wp->wpaint_prev+vidx, vgroup); continue;
uw->weight= dw->weight; /* set the undo weight */
dw->weight= paintweight;
if(me->editflag & ME_EDIT_MIRROR_X) { /* x mirror painting */
int j= mesh_get_x_mirror_vert(ob, vidx);
if(j>=0) {
/* copy, not paint again */
if(vgroup_mirror != -1) {
dw= defvert_verify_index(me->dvert+j, vgroup_mirror);
uw= defvert_verify_index(wp->wpaint_prev+j, vgroup_mirror);
} else {
dw= defvert_verify_index(me->dvert+j, vgroup);
uw= defvert_verify_index(wp->wpaint_prev+j, vgroup);
}
uw->weight= dw->weight; /* set the undo weight */
dw->weight= paintweight;
}
}
}
me->dvert[vidx].flag= 1;
} }
dw= defvert_verify_index(&me->dvert[vidx], vgroup);
if(dw) {
uw= defvert_verify_index(wp->wpaint_prev+vidx, vgroup);
uw->weight= dw->weight; /* set the undo weight */
dw->weight= paintweight;
} while (fidx--); if(me->editflag & ME_EDIT_MIRROR_X) { /* x mirror painting */
} int j= mesh_get_x_mirror_vert(ob, vidx);
if(j>=0) {
/* copy, not paint again */
if(vgroup_mirror != -1) {
dw= defvert_verify_index(me->dvert+j, vgroup_mirror);
uw= defvert_verify_index(wp->wpaint_prev+j, vgroup_mirror);
} else {
dw= defvert_verify_index(me->dvert+j, vgroup);
uw= defvert_verify_index(wp->wpaint_prev+j, vgroup);
}
uw->weight= dw->weight; /* set the undo weight */
dw->weight= paintweight;
}
}
}
me->dvert[vidx].flag= 1;
}
} while (fidx--);
} }
{ {
@@ -477,8 +456,7 @@ void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
dv->flag= 0; dv->flag= 0;
} }
} }
MEM_freeN(indexar);
copy_wpaint_prev(wp, NULL, 0); copy_wpaint_prev(wp, NULL, 0);
DAG_id_tag_update(&me->id, 0); DAG_id_tag_update(&me->id, 0);

View File

@@ -125,6 +125,14 @@ typedef struct TFace {
#define ME_EDIT_MIRROR_TOPO (1 << 4) #define ME_EDIT_MIRROR_TOPO (1 << 4)
#define ME_EDIT_VERT_SEL (1 << 5) #define ME_EDIT_VERT_SEL (1 << 5)
/* we cant have both flags enabled at once,
* flags defined in DNA_scene_types.h */
#define ME_EDIT_PAINT_SEL_MODE(_me) ( \
(_me->editflag & ME_EDIT_PAINT_MASK) ? SCE_SELECT_FACE : \
(_me->editflag & ME_EDIT_VERT_SEL) ? SCE_SELECT_VERTEX : \
0 \
)
/* me->flag */ /* me->flag */
/* #define ME_ISDONE 1 */ /* #define ME_ISDONE 1 */
#define ME_DEPRECATED 2 #define ME_DEPRECATED 2