svn merge ^/trunk/blender/ -r41453:41458
This commit is contained in:
@@ -466,37 +466,16 @@ void vpaint_fill(Object *ob, unsigned int paintcol)
|
||||
/* fills in the selected faces with the current weight and vertex group */
|
||||
void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
|
||||
{
|
||||
Mesh *me;
|
||||
MFace *mface;
|
||||
Mesh *me= ob->data;
|
||||
MPoly *mf;
|
||||
MDeformWeight *dw, *uw;
|
||||
int *indexar;
|
||||
unsigned int index;
|
||||
int vgroup, vgroup_mirror= -1;
|
||||
int selected;
|
||||
|
||||
int use_vert_sel;
|
||||
unsigned int index;
|
||||
|
||||
me= ob->data;
|
||||
if(me==NULL || me->totface==0 || me->dvert==NULL || !me->mface) return;
|
||||
|
||||
selected= (me->editflag & ME_EDIT_PAINT_MASK);
|
||||
|
||||
use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
|
||||
/* mutually exclusive, could be made into a */
|
||||
const short paint_selmode= ME_EDIT_PAINT_SEL_MODE(me);
|
||||
|
||||
indexar= get_indexarray(me);
|
||||
|
||||
if(selected) {
|
||||
for(index=0, mface=me->mface; index<me->totface; index++, mface++) {
|
||||
if((mface->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;
|
||||
}
|
||||
if(me->totpoly==0 || me->dvert==NULL || !me->mpoly) return;
|
||||
|
||||
vgroup= ob->actdef-1;
|
||||
|
||||
@@ -507,47 +486,47 @@ void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
|
||||
|
||||
copy_wpaint_prev(wp, me->dvert, me->totvert);
|
||||
|
||||
for(index=0; index<me->totface; index++) {
|
||||
if(indexar[index] && indexar[index]<=me->totface) {
|
||||
MFace *mf= &me->mface[indexar[index]-1];
|
||||
unsigned int fidx= mf->v4 ? 3:2;
|
||||
for(index=0, mf= me->mpoly; index < me->totpoly; index++, mf++) {
|
||||
unsigned int fidx= mf->totloop - 1;
|
||||
|
||||
do {
|
||||
unsigned int vidx= *(&mf->v1 + fidx);
|
||||
if ((paint_selmode == SCE_SELECT_FACE) && !(mf->flag & ME_FACE_SEL)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!me->dvert[vidx].flag) {
|
||||
if(use_vert_sel && !(me->mvert[vidx].flag & SELECT)) {
|
||||
continue;
|
||||
}
|
||||
do {
|
||||
unsigned int vidx= me->mloop[mf->loopstart + fidx].v;
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
if(!me->dvert[vidx].flag) {
|
||||
if((paint_selmode == SCE_SELECT_VERTEX) && !(me->mvert[vidx].flag & SELECT)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
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--);
|
||||
}
|
||||
|
||||
{
|
||||
@@ -556,8 +535,7 @@ void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
|
||||
dv->flag= 0;
|
||||
}
|
||||
}
|
||||
|
||||
MEM_freeN(indexar);
|
||||
|
||||
copy_wpaint_prev(wp, NULL, 0);
|
||||
|
||||
DAG_id_tag_update(&me->id, 0);
|
||||
@@ -1000,7 +978,7 @@ static int weight_sample_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
||||
mval_f[0]= (float)event->mval[0];
|
||||
mval_f[1]= (float)event->mval[1];
|
||||
|
||||
fidx= mf->totloop;
|
||||
fidx= mf->totloop - 1;
|
||||
do {
|
||||
float co[3], sco[3], len;
|
||||
const int v_idx= me->mloop[mf->loopstart + fidx].v;
|
||||
@@ -1070,7 +1048,7 @@ static EnumPropertyItem *weight_paint_sample_enum_itemf(bContext *C, PointerRNA
|
||||
const int totgroup= BLI_countlist(&vc.obact->defbase);
|
||||
if(totgroup) {
|
||||
MPoly *mf= ((MPoly *)me->mpoly) + index-1;
|
||||
unsigned int fidx= mf->totloop;
|
||||
unsigned int fidx= mf->totloop - 1;
|
||||
int *groups= MEM_callocN(totgroup*sizeof(int), "groups");
|
||||
int found= FALSE;
|
||||
|
||||
|
||||
@@ -122,10 +122,22 @@ void setTransformViewMatrices(TransInfo *t)
|
||||
calculateCenter2D(t);
|
||||
}
|
||||
|
||||
static void convertViewVec2D(View2D *v2d, float *vec, int dx, int dy)
|
||||
{
|
||||
float divx, divy;
|
||||
|
||||
divx= v2d->mask.xmax - v2d->mask.xmin;
|
||||
divy= v2d->mask.ymax - v2d->mask.ymin;
|
||||
|
||||
vec[0]= (v2d->cur.xmax - v2d->cur.xmin) * dx / divx;
|
||||
vec[1]= (v2d->cur.ymax - v2d->cur.ymin) * dy / divy;
|
||||
vec[2]= 0.0f;
|
||||
}
|
||||
|
||||
void convertViewVec(TransInfo *t, float *vec, int dx, int dy)
|
||||
{
|
||||
if (t->spacetype==SPACE_VIEW3D) {
|
||||
if (t->ar->regiontype == RGN_TYPE_WINDOW) {
|
||||
if(t->spacetype==SPACE_VIEW3D) {
|
||||
if(t->ar->regiontype == RGN_TYPE_WINDOW) {
|
||||
float mval_f[2];
|
||||
mval_f[0]= dx;
|
||||
mval_f[1]= dy;
|
||||
@@ -133,50 +145,19 @@ void convertViewVec(TransInfo *t, float *vec, int dx, int dy)
|
||||
}
|
||||
}
|
||||
else if(t->spacetype==SPACE_IMAGE) {
|
||||
View2D *v2d = t->view;
|
||||
float divx, divy, aspx, aspy;
|
||||
float aspx, aspy;
|
||||
|
||||
convertViewVec2D(t->view, vec, dx, dy);
|
||||
|
||||
ED_space_image_uv_aspect(t->sa->spacedata.first, &aspx, &aspy);
|
||||
|
||||
divx= v2d->mask.xmax-v2d->mask.xmin;
|
||||
divy= v2d->mask.ymax-v2d->mask.ymin;
|
||||
|
||||
vec[0]= aspx*(v2d->cur.xmax-v2d->cur.xmin)*(dx)/divx;
|
||||
vec[1]= aspy*(v2d->cur.ymax-v2d->cur.ymin)*(dy)/divy;
|
||||
vec[2]= 0.0f;
|
||||
vec[0]*= aspx;
|
||||
vec[1]*= aspy;
|
||||
}
|
||||
else if(ELEM(t->spacetype, SPACE_IPO, SPACE_NLA)) {
|
||||
View2D *v2d = t->view;
|
||||
float divx, divy;
|
||||
|
||||
divx= v2d->mask.xmax-v2d->mask.xmin;
|
||||
divy= v2d->mask.ymax-v2d->mask.ymin;
|
||||
|
||||
vec[0]= (v2d->cur.xmax-v2d->cur.xmin)*(dx) / (divx);
|
||||
vec[1]= (v2d->cur.ymax-v2d->cur.ymin)*(dy) / (divy);
|
||||
vec[2]= 0.0f;
|
||||
convertViewVec2D(t->view, vec, dx, dy);
|
||||
}
|
||||
else if(t->spacetype==SPACE_NODE) {
|
||||
View2D *v2d = &t->ar->v2d;
|
||||
float divx, divy;
|
||||
|
||||
divx= v2d->mask.xmax-v2d->mask.xmin;
|
||||
divy= v2d->mask.ymax-v2d->mask.ymin;
|
||||
|
||||
vec[0]= (v2d->cur.xmax-v2d->cur.xmin)*(dx)/divx;
|
||||
vec[1]= (v2d->cur.ymax-v2d->cur.ymin)*(dy)/divy;
|
||||
vec[2]= 0.0f;
|
||||
}
|
||||
else if(t->spacetype==SPACE_SEQ) {
|
||||
View2D *v2d = &t->ar->v2d;
|
||||
float divx, divy;
|
||||
|
||||
divx= v2d->mask.xmax-v2d->mask.xmin;
|
||||
divy= v2d->mask.ymax-v2d->mask.ymin;
|
||||
|
||||
vec[0]= (v2d->cur.xmax-v2d->cur.xmin)*(dx)/divx;
|
||||
vec[1]= (v2d->cur.ymax-v2d->cur.ymin)*(dy)/divy;
|
||||
vec[2]= 0.0f;
|
||||
else if(ELEM(t->spacetype, SPACE_NODE, SPACE_SEQ)) {
|
||||
convertViewVec2D(&t->ar->v2d, vec, dx, dy);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -142,6 +142,14 @@ typedef struct TFace {
|
||||
#define ME_EDIT_MIRROR_TOPO (1 << 4)
|
||||
#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 */
|
||||
/* #define ME_ISDONE 1 */
|
||||
#define ME_DEPRECATED 2
|
||||
|
||||
Reference in New Issue
Block a user