support for brush blend modes (Mix, Multiply, Darken etc)

This commit is contained in:
Campbell Barton
2008-11-05 23:24:52 +00:00
parent 769a43d3c0
commit 5b6708c278

View File

@@ -793,7 +793,6 @@ static int check_seam(ProjectPaintState *ps, int orig_face, int orig_i1_fidx, in
return 1;
}
if ( cmp_uv(orig_tf->uv[orig_i1_fidx], tf->uv[i1_fidx]) &&
cmp_uv(orig_tf->uv[orig_i2_fidx], tf->uv[i2_fidx]) )
{
@@ -2307,14 +2306,19 @@ static int imapaint_paint_sub_stroke_project(ProjectPaintState *ps, BrushPainter
int redraw = 0;
int last_index = -1;
float rgba[4], alpha, dist, dist_nosqrt;
char rgba_ub[4];
float brush_size_sqared;
float min[2], max[2]; /* brush bounds in screenspace */
int bucket_min[2], bucket_max[2]; /* brush bounds in bucket grid space */
int bucket_index;
int a;
short blend= ps->blend;
char *cp;
int bucket_x, bucket_y;
mval_f[0] = mval[0]; mval_f[1] = mval[1];
min[0] = mval_f[0] - (ps->brush->size/2);
@@ -2373,48 +2377,34 @@ static int imapaint_paint_sub_stroke_project(ProjectPaintState *ps, BrushPainter
dist = (float)sqrt(dist_nosqrt);
if (ps->tool==PAINT_TOOL_CLONE) { //&& ((ProjectPixelClone*)projPixel)->source ) {
if (ps->tool==PAINT_TOOL_CLONE && ((char *)((ProjectPixelClone*)projPixel)->clonebuf)[3]) { //&& ((ProjectPixelClone*)projPixel)->source ) {
alpha = brush_sample_falloff(ps->brush, dist);
if (((char *)((ProjectPixelClone*)projPixel)->clonebuf)[3]) {
projPixel->pixel[0] = FTOCHAR((((((char *)((ProjectPixelClone*)projPixel)->clonebuf)[0]/255.0) * alpha) + (((projPixel->pixel[0])/255.0)*(1.0-alpha))));
projPixel->pixel[1] = FTOCHAR((((((char *)((ProjectPixelClone*)projPixel)->clonebuf)[1]/255.0) * alpha) + (((projPixel->pixel[1])/255.0)*(1.0-alpha))));
projPixel->pixel[2] = FTOCHAR((((((char *)((ProjectPixelClone*)projPixel)->clonebuf)[2]/255.0) * alpha) + (((projPixel->pixel[2])/255.0)*(1.0-alpha))));
}
#if 0
if (alpha <= 0.0) {
/* do nothing */
} else {
cp = (char *)((ProjectPixelClone*)projPixel)->clonebuf;
if (alpha >= 1.0) {
projPixel->pixel[0] = FTOCHAR(rgba[0]*ps->brush->rgb[0]);
projPixel->pixel[1] = FTOCHAR(rgba[1]*ps->brush->rgb[1]);
projPixel->pixel[2] = FTOCHAR(rgba[2]*ps->brush->rgb[2]);
projPixel->pixel[0] = FTOCHAR( cp[0] );
projPixel->pixel[1] = FTOCHAR( cp[1] );
projPixel->pixel[2] = FTOCHAR( cp[2] );
} else {
projPixel->pixel[0] = FTOCHAR(((rgba[0]*ps->brush->rgb[0])*alpha) + (((projPixel->pixel[0])/255.0)*(1.0-alpha)));
projPixel->pixel[1] = FTOCHAR(((rgba[1]*ps->brush->rgb[1])*alpha) + (((projPixel->pixel[1])/255.0)*(1.0-alpha)));
projPixel->pixel[2] = FTOCHAR(((rgba[2]*ps->brush->rgb[2])*alpha) + (((projPixel->pixel[2])/255.0)*(1.0-alpha)));
projPixel->pixel[0] = FTOCHAR( (((cp[0]/255.0) * alpha) + (((projPixel->pixel[0])/255.0)*(1.0-alpha))) );
projPixel->pixel[1] = FTOCHAR( (((cp[1]/255.0) * alpha) + (((projPixel->pixel[1])/255.0)*(1.0-alpha))) );
projPixel->pixel[2] = FTOCHAR( (((cp[2]/255.0) * alpha) + (((projPixel->pixel[2])/255.0)*(1.0-alpha))) );
}
}
#endif
}
} else {
brush_sample_tex(ps->brush, projPixel->projCo2D, rgba);
alpha = rgba[3]*brush_sample_falloff(ps->brush, dist);
if (alpha <= 0.0) {
/* do nothing */
} else {
if (alpha >= 1.0) {
projPixel->pixel[0] = FTOCHAR(rgba[0]*ps->brush->rgb[0]);
projPixel->pixel[1] = FTOCHAR(rgba[1]*ps->brush->rgb[1]);
projPixel->pixel[2] = FTOCHAR(rgba[2]*ps->brush->rgb[2]);
} else {
projPixel->pixel[0] = FTOCHAR(((rgba[0]*ps->brush->rgb[0])*alpha) + (((projPixel->pixel[0])/255.0)*(1.0-alpha)));
projPixel->pixel[1] = FTOCHAR(((rgba[1]*ps->brush->rgb[1])*alpha) + (((projPixel->pixel[1])/255.0)*(1.0-alpha)));
projPixel->pixel[2] = FTOCHAR(((rgba[2]*ps->brush->rgb[2])*alpha) + (((projPixel->pixel[2])/255.0)*(1.0-alpha)));
}
}
if (alpha > 0.0) {
rgba_ub[0] = FTOCHAR(rgba[0] * ps->brush->rgb[0]);
rgba_ub[1] = FTOCHAR(rgba[1] * ps->brush->rgb[1]);
rgba_ub[2] = FTOCHAR(rgba[2] * ps->brush->rgb[2]);
rgba_ub[3] = FTOCHAR(rgba[3]);
*((unsigned int *)projPixel->pixel) = IMB_blend_color( *((unsigned int *)projPixel->pixel), *((unsigned int *)rgba_ub), (int)(alpha*255), blend);
}
}
if (last_index != projPixel->image_index) {