weight paint without depth buffer option, works with vertex selection mode.

This commit is contained in:
Campbell Barton 2012-12-25 14:03:28 +00:00
parent f1270153e1
commit 7e580ed906

@ -2185,6 +2185,13 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
float alpha;
float mval[2];
int use_vert_sel;
int use_zbuf;
MDeformWeight *(*dw_func)(MDeformVert *, const int) =
(brush->vertexpaint_tool == PAINT_BLEND_BLUR) ?
((wp->flag & VP_ONLYVGROUP) ?
(MDeformWeight *(*)(MDeformVert *, const int))defvert_find_index :
defvert_verify_index) : NULL;
const float pressure = RNA_float_get(itemptr, "pressure");
const float brush_size_pressure = BKE_brush_size_get(scene, brush) * (BKE_brush_use_size_pressure(scene, brush) ? pressure : 1.0f);
@ -2242,31 +2249,37 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
swap_m4m4(wpd->vc.rv3d->persmat, mat);
use_vert_sel = (me->editflag & ME_EDIT_PAINT_VERT_SEL) != 0;
use_zbuf = use_vert_sel && (vc->v3d->flag & V3D_ZBUF_SELECT);
/* which faces are involved */
if (wp->flag & VP_AREA) {
/* Ugly hack, to avoid drawing vertex index when getting the face index buffer - campbell */
me->editflag &= ~ME_EDIT_PAINT_VERT_SEL;
totindex = sample_backbuf_area(vc, indexar, me->totpoly, mval[0], mval[1], brush_size_pressure);
me->editflag |= use_vert_sel ? ME_EDIT_PAINT_VERT_SEL : 0;
}
else {
indexar[0] = view3d_sample_backbuf(vc, mval[0], mval[1]);
if (indexar[0]) totindex = 1;
else totindex = 0;
}
if (use_zbuf) {
if (wp->flag & VP_AREA) {
/* Ugly hack, to avoid drawing vertex index when getting the face index buffer - campbell */
me->editflag &= ~ME_EDIT_PAINT_VERT_SEL;
totindex = sample_backbuf_area(vc, indexar, me->totpoly, mval[0], mval[1], brush_size_pressure);
me->editflag |= use_vert_sel ? ME_EDIT_PAINT_VERT_SEL : 0;
}
else {
indexar[0] = view3d_sample_backbuf(vc, mval[0], mval[1]);
if (indexar[0]) totindex = 1;
else totindex = 0;
}
if ((me->editflag & ME_EDIT_PAINT_FACE_SEL) && me->mpoly) {
for (index = 0; index < totindex; index++) {
if (indexar[index] && indexar[index] <= me->totpoly) {
MPoly *mpoly = ((MPoly *)me->mpoly) + (indexar[index] - 1);
if ((mpoly->flag & ME_FACE_SEL) == 0) {
indexar[index] = 0;
if ((me->editflag & ME_EDIT_PAINT_FACE_SEL) && me->mpoly) {
for (index = 0; index < totindex; index++) {
if (indexar[index] && indexar[index] <= me->totpoly) {
MPoly *mpoly = ((MPoly *)me->mpoly) + (indexar[index] - 1);
if ((mpoly->flag & ME_FACE_SEL) == 0) {
indexar[index] = 0;
}
}
}
}
}
else {
indexar = NULL;
}
/* make sure each vertex gets treated only once */
/* and calculate filter weight */
@ -2275,80 +2288,113 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
paintweight = 0.0f;
else
paintweight = BKE_brush_weight_get(scene, brush);
for (index = 0; index < totindex; index++) {
if (indexar[index] && indexar[index] <= me->totpoly) {
MPoly *mpoly = me->mpoly + (indexar[index] - 1);
MLoop *ml = me->mloop + mpoly->loopstart;
int i;
if (use_vert_sel) {
for (i = 0; i < mpoly->totloop; i++, ml++) {
me->dvert[ml->v].flag = (me->mvert[ml->v].flag & SELECT);
#define WP_BLUR_ACCUM(v_idx_var) \
{ \
const unsigned int vidx = v_idx_var; \
const float fac = calc_vp_strength_dl(wp, vc, wpd->vertexcosnos[vidx].co, mval, brush_size_pressure); \
if (fac > 0.0f) { \
MDeformWeight *dw = dw_func(&me->dvert[vidx], wpi.vgroup_active); \
paintweight += dw ? (dw->weight * fac) : 0.0f; \
totw += fac; \
} \
} (void)0
if (use_zbuf) {
for (index = 0; index < totindex; index++) {
if (indexar[index] && indexar[index] <= me->totpoly) {
MPoly *mpoly = me->mpoly + (indexar[index] - 1);
MLoop *ml = me->mloop + mpoly->loopstart;
int i;
if (use_vert_sel) {
for (i = 0; i < mpoly->totloop; i++, ml++) {
me->dvert[ml->v].flag = (me->mvert[ml->v].flag & SELECT);
}
}
}
else {
for (i = 0; i < mpoly->totloop; i++, ml++) {
me->dvert[ml->v].flag = 1;
else {
for (i = 0; i < mpoly->totloop; i++, ml++) {
me->dvert[ml->v].flag = 1;
}
}
}
if (brush->vertexpaint_tool == PAINT_BLEND_BLUR) {
MDeformWeight *dw, *(*dw_func)(MDeformVert *, const int);
if (wp->flag & VP_ONLYVGROUP)
dw_func = (MDeformWeight *(*)(MDeformVert *, const int))defvert_find_index;
else
dw_func = defvert_verify_index;
ml = me->mloop + mpoly->loopstart;
for (i = 0; i < mpoly->totloop; i++, ml++) {
unsigned int vidx = ml->v;
const float fac = calc_vp_strength_dl(wp, vc, wpd->vertexcosnos[vidx].co, mval, brush_size_pressure);
if (fac > 0.0f) {
dw = dw_func(&me->dvert[vidx], wpi.vgroup_active);
paintweight += dw ? (dw->weight * fac) : 0.0f;
totw += fac;
if (brush->vertexpaint_tool == PAINT_BLEND_BLUR) {
ml = me->mloop + mpoly->loopstart;
for (i = 0; i < mpoly->totloop; i++, ml++) {
WP_BLUR_ACCUM(ml->v);
}
}
}
}
}
else {
const unsigned int totvert = me->totvert;
unsigned int i;
for (i = 0; i < totvert; i++) {
me->dvert[i].flag = (me->mvert[i].flag & SELECT);
}
if (brush->vertexpaint_tool == PAINT_BLEND_BLUR) {
for (i = 0; i < totvert; i++) {
WP_BLUR_ACCUM(i);
}
}
}
#undef WP_BLUR_ACCUM
if (brush->vertexpaint_tool == PAINT_BLEND_BLUR) {
paintweight /= totw;
}
for (index = 0; index < totindex; index++) {
#define WP_PAINT(v_idx_var) \
{ \
unsigned int vidx = v_idx_var; \
if (me->dvert[vidx].flag) { \
alpha = calc_vp_alpha_dl(wp, vc, wpd->wpimat, &wpd->vertexcosnos[vidx], \
mval, brush_size_pressure, brush_alpha_pressure); \
if (alpha) { \
do_weight_paint_vertex(wp, ob, &wpi, vidx, alpha, paintweight); \
} \
me->dvert[vidx].flag = 0; \
} \
} (void)0
if (indexar[index] && indexar[index] <= me->totpoly) {
MPoly *mpoly = me->mpoly + (indexar[index] - 1);
MLoop *ml = me->mloop + mpoly->loopstart;
int i;
if (use_zbuf) {
for (index = 0; index < totindex; index++) {
for (i = 0; i < mpoly->totloop; i++, ml++) {
unsigned int vidx = ml->v;
if (indexar[index] && indexar[index] <= me->totpoly) {
MPoly *mpoly = me->mpoly + (indexar[index] - 1);
MLoop *ml = me->mloop + mpoly->loopstart;
int i;
if (me->dvert[vidx].flag) {
alpha = calc_vp_alpha_dl(wp, vc, wpd->wpimat, &wpd->vertexcosnos[vidx],
mval, brush_size_pressure, brush_alpha_pressure);
if (alpha) {
do_weight_paint_vertex(wp, ob, &wpi, vidx, alpha, paintweight);
}
me->dvert[vidx].flag = 0;
for (i = 0; i < mpoly->totloop; i++, ml++) {
WP_PAINT(ml->v);
}
}
}
}
else {
const unsigned int totvert = me->totvert;
unsigned int i;
for (i = 0; i < totvert; i++) {
WP_PAINT(i);
}
}
#undef WP_PAINT
/* *** free wpi members */
MEM_freeN((void *)wpi.defbase_sel);
/* *** don't freeing wpi members */
/* *** done freeing wpi members */
swap_m4m4(vc->rv3d->persmat, mat);
DAG_id_tag_update(ob->data, 0);
ED_region_tag_redraw(vc->ar);
}