Vertex/Weight Paint now uses the regular global Undo.

Also cleaned up bad global variable stuff in vpaint.c, now only need a
good place to store the paint settings in file still...
This commit is contained in:
Ton Roosendaal 2006-11-20 12:08:06 +00:00
parent f7c24e1b11
commit 33f79ebd89
6 changed files with 111 additions and 183 deletions

@ -35,17 +35,16 @@
struct Mesh;
struct MDeformVert; /* __NLA */
unsigned int vpaint_get_current_col(void);
unsigned int rgba_to_mcol(float r, float g, float b, float a);
void do_shared_vertexcol(struct Mesh *me);
void make_vertexcol(int shade);
void copy_vpaint_undo(unsigned int *mcol, int tot);
void vpaint_undo(void);
void clear_vpaint(void);
void clear_vpaint_selectedfaces(void);
void vpaint_dogamma(void);
void sample_vpaint(void);
void init_vertexpaint(void);
void free_vertexpaint(void);
void vertex_paint(void);
void set_vpaint(void);
@ -53,8 +52,7 @@ 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);
#endif /* BDR_VPAINT_H */

@ -34,10 +34,7 @@
#define BSE_TRANS_TYPES_H
struct Object;
/* struct EditFace; */
/* struct EditEdge; */
/* struct EditVert; */
/* struct ListBase; */
struct MDeformVert;
typedef struct TransOb {
float *loc;
@ -80,9 +77,12 @@ typedef struct TransVert {
typedef struct VPaint {
float r, g, b, a;
float size; /* van brush */
float size; /* of brush */
float gamma, mul;
short mode, flag;
int tot, pad; /* allocation size of prev buffers */
unsigned int *vpaint_prev; /* previous mesh colors */
struct MDeformVert *wpaint_prev; /* previous vertex weights */
} VPaint;
#endif /* BSE_TRANS_TYPES_H */

@ -2191,7 +2191,6 @@ void special_editmenu(void)
nr= pupmenu("Specials%t|Shared VertexCol%x1");
if(nr==1) {
copy_vpaint_undo( (unsigned int *)me->mcol, me->totface);
do_shared_vertexcol(me);
BIF_undo_push("Shared VertexCol");
@ -2204,9 +2203,8 @@ void special_editmenu(void)
if(par && (par->flag & OB_POSEMODE)) {
nr= pupmenu("Specials%t|Apply Bone Envelopes to VertexGroups %x1");
if(nr==1) {
Mesh *me= ob->data;
if(me->dvert) copy_wpaint_undo(me->dvert, me->totvert);
pose_adds_vgroups(ob);
BIF_undo_push("Apply Bone Envelopes to VertexGroups");
}
}
}

@ -3798,7 +3798,7 @@ static void do_view3d_vpaintmenu(void *arg, int event)
switch(event) {
case 0: /* undo vertex painting */
vpaint_undo();
BIF_undo();
break;
case 1: /* set vertex colors/weight */
if(G.f & G_FACESELECT)
@ -3888,7 +3888,7 @@ static void do_view3d_wpaintmenu(void *arg, int event)
switch(event) {
case 0: /* undo weight painting */
wpaint_undo();
BIF_undo();
break;
case 1: /* set vertex colors/weight */
clear_wpaint_selectedfaces();

@ -797,11 +797,7 @@ void BIF_undo(void)
undo_editmode_step(1);
}
else {
if(G.f & G_WEIGHTPAINT)
wpaint_undo();
else if(G.f & G_VERTEXPAINT)
vpaint_undo();
else if(G.f & G_TEXTUREPAINT)
if(G.f & G_TEXTUREPAINT)
imagepaint_undo();
else if(G.f & G_SCULPTMODE)
sculptmode_undo();
@ -827,11 +823,7 @@ void BIF_redo(void)
undo_editmode_step(-1);
}
else {
if(G.f & G_WEIGHTPAINT)
wpaint_undo();
else if(G.f & G_VERTEXPAINT)
vpaint_undo();
else if(G.f & G_TEXTUREPAINT)
if(G.f & G_TEXTUREPAINT)
imagepaint_undo();
else if(G.f & G_SCULPTMODE)
sculptmode_redo();
@ -855,11 +847,7 @@ void BIF_undo_menu(void)
allqueue(REDRAWALL, 0);
}
else {
if(G.f & G_WEIGHTPAINT)
;
else if(G.f & G_VERTEXPAINT)
;
else if(G.f & G_SCULPTMODE)
if(G.f & G_SCULPTMODE)
sculptmode_undo_menu();
else {
if(U.uiflag & USER_GLOBALUNDO) {
@ -1933,9 +1921,9 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
else if((G.qual==0)) {
if(G.f & G_WEIGHTPAINT)
wpaint_undo();
BIF_undo();
else if(G.f & G_VERTEXPAINT)
vpaint_undo();
BIF_undo();
else if(G.f & G_TEXTUREPAINT)
imagepaint_undo();
else if (G.f & G_FACESELECT)

@ -107,15 +107,22 @@
#define MAXINDEX 512000
VPaint Gvp= {1.0, 1.0, 1.0, 0.2, 25.0, 1.0, 1.0, 0, VP_AREA+VP_SOFT+VP_SPRAY};
VPaint Gwp= {1.0, 1.0, 1.0, 0.2, 25.0, 1.0, 1.0, 0, VP_AREA+VP_SOFT};
float vpimat[3][3];
unsigned int *vpaintundobuf= NULL;
int totvpaintundo;
int *indexar= NULL;
VPaint Gvp= {1.0, 1.0, 1.0, 0.2, 25.0, 1.0, 1.0, 0, VP_AREA+VP_SOFT+VP_SPRAY, NULL};
VPaint Gwp= {1.0, 1.0, 1.0, 0.2, 25.0, 1.0, 1.0, 0, VP_AREA+VP_SOFT, NULL};
int totwpaintundo;
MDeformVert *wpaintundobuf=NULL;
static int *get_indexarray(void)
{
return MEM_mallocN(sizeof(int)*MAXINDEX + 2, "vertexpaint");
}
void free_vertexpaint()
{
if(Gvp.vpaint_prev) MEM_freeN(Gvp.vpaint_prev);
Gvp.vpaint_prev= NULL;
mesh_octree_table(NULL, NULL, 'e');
}
/* in contradiction to cpack drawing colors, the MCOL colors (vpaint colors) are per byte!
so not endian sensitive. Mcol = ABGR!!! so be cautious with cpack calls */
@ -145,9 +152,9 @@ unsigned int rgba_to_mcol(float r, float g, float b, float a)
}
unsigned int vpaint_get_current_col(void)
static unsigned int vpaint_get_current_col(VPaint *vp)
{
return rgba_to_mcol(Gvp.r, Gvp.g, Gvp.b, 1.0);
return rgba_to_mcol(vp->r, vp->g, vp->b, 1.0f);
}
void do_shared_vertexcol(Mesh *me)
@ -246,46 +253,19 @@ void make_vertexcol(int shade) /* single ob */
allqueue(REDRAWVIEW3D, 0);
}
void copy_vpaint_undo(unsigned int *mcol, int tot)
static void copy_vpaint_prev(VPaint *vp, unsigned int *mcol, int tot)
{
if(vpaintundobuf) MEM_freeN(vpaintundobuf);
vpaintundobuf= 0;
totvpaintundo= tot; /* because of return, it is used by weightpaint */
if(mcol==0 || tot==0) return;
vpaintundobuf= MEM_mallocN(4*sizeof(int)*tot, "vpaintundobuf");
memcpy(vpaintundobuf, mcol, 4*sizeof(int)*tot);
}
void vpaint_undo()
{
Mesh *me;
Object *ob;
unsigned int temp, *from, *to;
int a;
if((G.f & G_VERTEXPAINT)==0) return;
if(vpaintundobuf==0) return;
ob= OBACT;
me= get_mesh(ob);
if(me==0 || me->mcol==0 || me->totface==0) return;
a= MIN2(me->totface, totvpaintundo);
from= vpaintundobuf;
to= (unsigned int *)me->mcol;
a*= 4;
while(a--) {
temp= *to;
*to= *from;
*from= temp;
to++; from++;
if(vp->vpaint_prev) {
MEM_freeN(vp->vpaint_prev);
vp->vpaint_prev= NULL;
}
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
vp->tot= tot;
if(mcol==NULL || tot==0) return;
vp->vpaint_prev= MEM_mallocN(4*sizeof(int)*tot, "vpaint_prev");
memcpy(vp->vpaint_prev, mcol, 4*sizeof(int)*tot);
allqueue(REDRAWVIEW3D, 0);
}
void clear_vpaint()
@ -303,10 +283,9 @@ void clear_vpaint()
if(me==0 || me->mcol==0 || me->totface==0) return;
paintcol= vpaint_get_current_col();
paintcol= vpaint_get_current_col(&Gvp);
to= (unsigned int *)me->mcol;
copy_vpaint_undo(to, me->totface);
a= 4*me->totface;
while(a--) {
*to= paintcol;
@ -333,7 +312,7 @@ void clear_vpaint_selectedfaces()
if(!me->mcol)
make_vertexcol(0);
paintcol= vpaint_get_current_col();
paintcol= vpaint_get_current_col(&Gvp);
tf = me->mtface;
mcol = (unsigned int*)me->mcol;
@ -361,8 +340,9 @@ void clear_wpaint_selectedfaces()
MTFace *tface;
MFace *mface;
Object *ob;
int index, vgroup;
MDeformWeight *dw, *uw;
int *indexar;
int index, vgroup;
unsigned int faceverts[5]={0,0,0,0,0};
unsigned char i;
int vgroup_mirror= -1;
@ -371,7 +351,7 @@ void clear_wpaint_selectedfaces()
me= ob->data;
if(me==0 || me->totface==0 || me->dvert==0 || !me->mtface) return;
if(indexar==NULL) init_vertexpaint();
indexar= get_indexarray();
for(index=0, tface=me->mtface; index<me->totface; index++, tface++) {
if((tface->flag & TF_SELECT)==0)
indexar[index]= 0;
@ -379,7 +359,6 @@ void clear_wpaint_selectedfaces()
indexar[index]= index+1;
}
copy_wpaint_undo(me->dvert, me->totvert);
vgroup= ob->actdef-1;
/* directly copied from weight_paint, should probaby split into a seperate function */
@ -422,7 +401,7 @@ void clear_wpaint_selectedfaces()
if(!((me->dvert+faceverts[i])->flag)) {
dw= verify_defweight(me->dvert+faceverts[i], vgroup);
if(dw) {
uw= verify_defweight(wpaintundobuf+faceverts[i], vgroup);
uw= verify_defweight(Gwp.wpaint_prev+faceverts[i], vgroup);
uw->weight= dw->weight; /* set the undio weight */
dw->weight= paintweight;
@ -432,10 +411,10 @@ void clear_wpaint_selectedfaces()
/* copy, not paint again */
if(vgroup_mirror != -1) {
dw= verify_defweight(me->dvert+j, vgroup_mirror);
uw= verify_defweight(wpaintundobuf+j, vgroup_mirror);
uw= verify_defweight(Gwp.wpaint_prev+j, vgroup_mirror);
} else {
dw= verify_defweight(me->dvert+j, vgroup);
uw= verify_defweight(wpaintundobuf+j, vgroup);
uw= verify_defweight(Gwp.wpaint_prev+j, vgroup);
}
uw->weight= dw->weight; /* set the undo weight */
dw->weight= paintweight;
@ -454,6 +433,8 @@ void clear_wpaint_selectedfaces()
index++;
}
MEM_freeN(indexar);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
BIF_undo_push("Set vertex weight");
allqueue(REDRAWVIEW3D, 0);
@ -474,8 +455,6 @@ void vpaint_dogamma()
me= get_mesh(ob);
if(me==0 || me->mcol==0 || me->totface==0) return;
copy_vpaint_undo((unsigned int *)me->mcol, me->totface);
igam= 1.0/Gvp.gamma;
for(a=0; a<256; a++) {
@ -547,28 +526,6 @@ void sample_vpaint() /* frontbuf */
addqueue(curarea->win, REDRAW, 1); /* needed for when panel is open... */
}
void init_vertexpaint()
{
indexar= MEM_mallocN(sizeof(int)*MAXINDEX + 2, "vertexpaint");
}
void free_vertexpaint()
{
if(indexar) MEM_freeN(indexar);
indexar= NULL;
if(vpaintundobuf) MEM_freeN(vpaintundobuf);
vpaintundobuf= NULL;
if(wpaintundobuf)
free_dverts(wpaintundobuf, totwpaintundo);
wpaintundobuf= NULL;
mesh_octree_table(NULL, NULL, 'e');
}
static unsigned int mcol_blend(unsigned int col1, unsigned int col2, int fac)
{
char *cp1, *cp2, *cp;
@ -759,13 +716,13 @@ static void vpaint_blend( unsigned int *col, unsigned int *colorig, unsigned int
}
static int sample_backbuf_area(int x, int y, float size)
static int sample_backbuf_area(VPaint *vp, int *indexar, int x, int y, float size)
{
unsigned int *rt;
struct ImBuf *ibuf;
int x1, y1, x2, y2, a, tot=0, index;
if(totvpaintundo>=MAXINDEX) return 0;
if(vp->tot>=MAXINDEX) return 0;
if(size>64.0) size= 64.0;
@ -795,20 +752,20 @@ static int sample_backbuf_area(int x, int y, float size)
size= (y2-y1)*(x2-x1);
if(size<=0) return 0;
memset(indexar, 0, sizeof(int)*totvpaintundo+2); /* plus 2! first element is total */
memset(indexar, 0, sizeof(int)*vp->tot+2); /* plus 2! first element is total */
while(size--) {
if(*rt) {
index= framebuffer_to_index(*rt);
if(index>0 && index<=totvpaintundo)
if(index>0 && index<=vp->tot)
indexar[index] = 1;
}
rt++;
}
for(a=1; a<=totvpaintundo; a++) {
for(a=1; a<=vp->tot; a++) {
if(indexar[a]) indexar[tot++]= a;
}
@ -817,7 +774,7 @@ static int sample_backbuf_area(int x, int y, float size)
return tot;
}
static int calc_vp_alpha_dl(VPaint *vp, float *vert_nor, short *mval)
static int calc_vp_alpha_dl(VPaint *vp, float vpimat[][3], float *vert_nor, short *mval)
{
float fac, dx, dy;
int alpha;
@ -856,42 +813,19 @@ static int calc_vp_alpha_dl(VPaint *vp, float *vert_nor, short *mval)
return alpha;
}
void wpaint_undo (void)
void copy_wpaint_prev (VPaint *vp, MDeformVert *dverts, int dcount)
{
Object *ob= OBACT;
Mesh *me;
me = get_mesh(ob);
if (!me) return;
if (!wpaintundobuf)
return;
if (!me->dvert)
return;
if (totwpaintundo != me->totvert)
return;
/* simply swap pointers, and update the pointer in CustomData too */
SWAP(MDeformVert*, me->dvert, wpaintundobuf);
CustomData_set_layer(&me->vdata, CD_MDEFORMVERT, me->dvert);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
DAG_object_flush_update(G.scene, modifiers_isDeformedByArmature(ob), OB_RECALC_DATA);
scrarea_do_windraw(curarea);
if (vp->wpaint_prev) {
free_dverts(vp->wpaint_prev, vp->tot);
vp->wpaint_prev= NULL;
}
}
void copy_wpaint_undo (MDeformVert *dverts, int dcount)
{
if (wpaintundobuf)
free_dverts(wpaintundobuf, totwpaintundo);
wpaintundobuf = MEM_mallocN (sizeof(MDeformVert)*dcount, "wpaintundo");
totwpaintundo = dcount;
copy_dverts (wpaintundobuf, dverts, dcount);
if(dverts && dcount) {
vp->wpaint_prev = MEM_mallocN (sizeof(MDeformVert)*dcount, "wpaint prev");
vp->tot = dcount;
copy_dverts (vp->wpaint_prev, dverts, dcount);
}
}
static void wpaint_blend(MDeformWeight *dw, MDeformWeight *uw, float alpha, float paintval)
@ -1112,11 +1046,11 @@ static void do_weight_paint_vertex(Object *ob, int index, int alpha, float paint
if(Gwp.flag & VP_ONLYVGROUP) {
dw= get_defweight(me->dvert+index, vgroup);
uw= get_defweight(wpaintundobuf+index, vgroup);
uw= get_defweight(Gwp.wpaint_prev+index, vgroup);
}
else {
dw= verify_defweight(me->dvert+index, vgroup);
uw= verify_defweight(wpaintundobuf+index, vgroup);
uw= verify_defweight(Gwp.wpaint_prev+index, vgroup);
}
if(dw==NULL || uw==NULL)
return;
@ -1145,15 +1079,14 @@ void weight_paint(void)
MFace *mface;
MTFace *tface;
float mat[4][4], imat[4][4], paintweight, *vertexcosnos;
int index, totindex, alpha, totw;
float vpimat[3][3];
int *indexar, index, totindex, alpha, totw;
int vgroup_mirror= -1;
short mval[2], mvalo[2], firsttime=1, mousebut;
if((G.f & G_WEIGHTPAINT)==0) return;
if(G.obedit) return;
if(indexar==NULL) init_vertexpaint();
ob= OBACT;
if(!ob || ob->id.lib) return;
@ -1173,9 +1106,12 @@ void weight_paint(void)
return;
}
/* painting on subsurfs should give correct points too, this returns me->totvert amount */
/* ALLOCATIONS! no return after this line */
/* painting on subsurfs should give correct points too, this returns me->totvert amount */
vertexcosnos= mesh_get_mapped_verts_nors(ob);
indexar= get_indexarray();
copy_wpaint_prev(&Gwp, me->dvert, me->totvert);
/* this happens on a Bone select, when no vgroup existed yet */
if(ob->actdef<=0) {
Object *modob;
@ -1214,9 +1150,6 @@ void weight_paint(void)
getmouseco_areawin(mvalo);
copy_vpaint_undo( (unsigned int *)me->mcol, me->totface);
copy_wpaint_undo(me->dvert, me->totvert);
getmouseco_areawin(mval);
mvalo[0]= mval[0];
mvalo[1]= mval[1];
@ -1257,7 +1190,7 @@ void weight_paint(void)
/* which faces are involved */
if(Gwp.flag & VP_AREA) {
totindex= sample_backbuf_area(mval[0], mval[1], Gwp.size);
totindex= sample_backbuf_area(&Gwp, indexar, mval[0], mval[1], Gwp.size);
}
else {
indexar[0]= sample_backbuf(mval[0], mval[1]);
@ -1339,7 +1272,7 @@ void weight_paint(void)
mface= me->mface + (indexar[index]-1);
if((me->dvert+mface->v1)->flag) {
alpha= calc_vp_alpha_dl(&Gwp, vertexcosnos+6*mface->v1, mval);
alpha= calc_vp_alpha_dl(&Gwp, vpimat, vertexcosnos+6*mface->v1, mval);
if(alpha) {
do_weight_paint_vertex(ob, mface->v1, alpha, paintweight, vgroup_mirror);
}
@ -1347,7 +1280,7 @@ void weight_paint(void)
}
if((me->dvert+mface->v2)->flag) {
alpha= calc_vp_alpha_dl(&Gwp, vertexcosnos+6*mface->v2, mval);
alpha= calc_vp_alpha_dl(&Gwp, vpimat, vertexcosnos+6*mface->v2, mval);
if(alpha) {
do_weight_paint_vertex(ob, mface->v2, alpha, paintweight, vgroup_mirror);
}
@ -1355,7 +1288,7 @@ void weight_paint(void)
}
if((me->dvert+mface->v3)->flag) {
alpha= calc_vp_alpha_dl(&Gwp, vertexcosnos+6*mface->v3, mval);
alpha= calc_vp_alpha_dl(&Gwp, vpimat, vertexcosnos+6*mface->v3, mval);
if(alpha) {
do_weight_paint_vertex(ob, mface->v3, alpha, paintweight, vgroup_mirror);
}
@ -1364,7 +1297,7 @@ void weight_paint(void)
if((me->dvert+mface->v4)->flag) {
if(mface->v4) {
alpha= calc_vp_alpha_dl(&Gwp, vertexcosnos+6*mface->v4, mval);
alpha= calc_vp_alpha_dl(&Gwp, vpimat, vertexcosnos+6*mface->v4, mval);
if(alpha) {
do_weight_paint_vertex(ob, mface->v4, alpha, paintweight, vgroup_mirror);
}
@ -1401,11 +1334,14 @@ void weight_paint(void)
if(vertexcosnos)
MEM_freeN(vertexcosnos);
MEM_freeN(indexar);
copy_wpaint_prev(&Gwp, NULL, 0);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
/* this flag is event for softbody to refresh weightpaint values */
if(ob->soft) ob->softflag |= OB_SB_REDO;
BIF_undo_push("Weight Paint");
allqueue(REDRAWVIEW3D, 0);
}
@ -1416,15 +1352,14 @@ void vertex_paint()
MFace *mface;
MTFace *tface;
float mat[4][4], imat[4][4], *vertexcosnos;
float vpimat[3][3];
unsigned int paintcol=0, *mcol, *mcolorig, fcol1, fcol2;
int index, alpha, totindex;
int *indexar, index, alpha, totindex;
short mval[2], mvalo[2], firsttime=1, mousebut;
if((G.f & G_VERTEXPAINT)==0) return;
if(G.obedit) return;
if(indexar==NULL) init_vertexpaint();
ob= OBACT;
if(!ob || ob->id.lib) return;
@ -1436,9 +1371,14 @@ void vertex_paint()
if(me->mtface==NULL && me->mcol==NULL) return;
/* painting on subsurfs should give correct points too, this returns me->totvert amount */
vertexcosnos= mesh_get_mapped_verts_nors(ob);
/* ALLOCATIONS! No return after his line */
/* painting on subsurfs should give correct points too, this returns me->totvert amount */
vertexcosnos= mesh_get_mapped_verts_nors(ob);
indexar= get_indexarray();
copy_vpaint_prev(&Gvp, (unsigned int *)me->mcol, me->totface);
/* opengl/matrix stuff */
persp(PERSP_VIEW);
/* imat for normals */
Mat4MulMat4(mat, ob->obmat, G.vd->viewmat);
@ -1450,12 +1390,10 @@ void vertex_paint()
mygetsingmatrix(mat);
myloadmatrix(G.vd->viewmat);
paintcol= vpaint_get_current_col();
paintcol= vpaint_get_current_col(&Gvp);
getmouseco_areawin(mvalo);
copy_vpaint_undo( (unsigned int *)me->mcol, me->totface);
getmouseco_areawin(mval);
mvalo[0]= mval[0];
mvalo[1]= mval[1];
@ -1472,7 +1410,7 @@ void vertex_paint()
/* which faces are involved */
if(Gvp.flag & VP_AREA) {
totindex= sample_backbuf_area(mval[0], mval[1], Gvp.size);
totindex= sample_backbuf_area(&Gvp, indexar, mval[0], mval[1], Gvp.size);
}
else {
indexar[0]= sample_backbuf(mval[0], mval[1]);
@ -1511,7 +1449,7 @@ void vertex_paint()
mface= ((MFace *)me->mface) + (indexar[index]-1);
mcol= ( (unsigned int *)me->mcol) + 4*(indexar[index]-1);
mcolorig= ( (unsigned int *)vpaintundobuf) + 4*(indexar[index]-1);
mcolorig= ( (unsigned int *)Gvp.vpaint_prev) + 4*(indexar[index]-1);
if(Gvp.mode==VP_FILT) {
fcol1= mcol_blend( mcol[0], mcol[1], 128);
@ -1525,17 +1463,17 @@ void vertex_paint()
}
alpha= calc_vp_alpha_dl(&Gvp, vertexcosnos+6*mface->v1, mval);
alpha= calc_vp_alpha_dl(&Gvp, vpimat, vertexcosnos+6*mface->v1, mval);
if(alpha) vpaint_blend( mcol, mcolorig, paintcol, alpha);
alpha= calc_vp_alpha_dl(&Gvp, vertexcosnos+6*mface->v2, mval);
alpha= calc_vp_alpha_dl(&Gvp, vpimat, vertexcosnos+6*mface->v2, mval);
if(alpha) vpaint_blend( mcol+1, mcolorig+1, paintcol, alpha);
alpha= calc_vp_alpha_dl(&Gvp, vertexcosnos+6*mface->v3, mval);
alpha= calc_vp_alpha_dl(&Gvp, vpimat, vertexcosnos+6*mface->v3, mval);
if(alpha) vpaint_blend( mcol+2, mcolorig+2, paintcol, alpha);
if(mface->v4) {
alpha= calc_vp_alpha_dl(&Gvp, vertexcosnos+6*mface->v4, mval);
alpha= calc_vp_alpha_dl(&Gvp, vpimat, vertexcosnos+6*mface->v4, mval);
if(alpha) vpaint_blend( mcol+3, mcolorig+3, paintcol, alpha);
}
}
@ -1565,7 +1503,13 @@ void vertex_paint()
if(vertexcosnos)
MEM_freeN(vertexcosnos);
MEM_freeN(indexar);
/* frees prev buffer */
copy_vpaint_prev(&Gvp, NULL, 0);
BIF_undo_push("Vertex Paint");
allqueue(REDRAWVIEW3D, 0);
}