[Bf-blender-cvs] [076b351b2c8] soc-2017-vertex_paint: now alpha blends same as the rgb colors

Darshan Kadu noreply at git.blender.org
Thu Jul 20 16:17:47 CEST 2017


Commit: 076b351b2c805d153c242c58fdf61aaffa9338e4
Author: Darshan Kadu
Date:   Thu Jul 20 19:46:12 2017 +0530
Branches: soc-2017-vertex_paint
https://developer.blender.org/rB076b351b2c805d153c242c58fdf61aaffa9338e4

now alpha blends same as the rgb colors

===================================================================

M	source/blender/editors/sculpt_paint/paint_vertex.c

===================================================================

diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index 4e01de3246e..e01c7499463 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -597,15 +597,17 @@ BLI_INLINE unsigned int mcol_blend(unsigned int col1, unsigned int col2, int fac
 	int r1 = cp1[0] * cp1[0];
 	int g1 = cp1[1] * cp1[1];
 	int b1 = cp1[2] * cp1[2];
+	int a1 = cp1[3] * cp1[3];
 
 	int r2 = cp2[0] * cp2[0];
 	int g2 = cp2[1] * cp2[1];
 	int b2 = cp2[2] * cp2[2];
+	int a2 = cp2[3] * cp2[3];
 
 	cp[0] = (unsigned char)round(sqrt(divide_round_i((mfac * r1 + fac * r2), 255)));
 	cp[1] = (unsigned char)round(sqrt(divide_round_i((mfac * g1 + fac * g2), 255)));
 	cp[2] = (unsigned char)round(sqrt(divide_round_i((mfac * b1 + fac * b2), 255)));
-	cp[3] = use_alpha ? alpha_value : 255;
+	cp[3] = (unsigned char)round(sqrt(divide_round_i((mfac * a1 + fac * a2), 255)));
 
 	return col;
 }
@@ -633,7 +635,8 @@ BLI_INLINE unsigned int mcol_add(unsigned int col1, unsigned int col2, int fac,
 	cp[1] = (temp > 254) ? 255 : temp;
 	temp = cp1[2] + divide_round_i((fac * cp2[2]), 255);
 	cp[2] = (temp > 254) ? 255 : temp;
-	cp[3] = use_alpha ? alpha_value : 255;
+	temp = cp1[3] + divide_round_i((fac * cp2[3]), 255);
+	cp[3] = (temp > 254) ? 255 : temp;
 	
 	return col;
 }
@@ -661,7 +664,8 @@ BLI_INLINE unsigned int mcol_sub(unsigned int col1, unsigned int col2, int fac,
 	cp[1] = (temp < 0) ? 0 : temp;
 	temp = cp1[2] - divide_round_i((fac * cp2[2]), 255);
 	cp[2] = (temp < 0) ? 0 : temp;
-	cp[3] = use_alpha ? alpha_value : 255;
+	temp = cp1[3] - divide_round_i((fac * cp2[3]), 255);
+	cp[3] = (temp < 0) ? 0 : temp;
 
 	return col;
 }
@@ -689,7 +693,7 @@ BLI_INLINE unsigned int mcol_mul(unsigned int col1, unsigned int col2, int fac,
 	cp[0] = divide_round_i(mfac * cp1[0] * 255 + fac * cp2[0] * cp1[0], 255 * 255);
 	cp[1] = divide_round_i(mfac * cp1[1] * 255 + fac * cp2[1] * cp1[1], 255 * 255);
 	cp[2] = divide_round_i(mfac * cp1[2] * 255 + fac * cp2[2] * cp1[2], 255 * 255);
-	cp[3] = use_alpha ? alpha_value : 255;
+	cp[3] = divide_round_i(mfac * cp1[3] * 255 + fac * cp2[3] * cp1[3], 255 * 255);
 
 	return col;
 }
@@ -727,7 +731,7 @@ BLI_INLINE unsigned int mcol_lighten(unsigned int col1, unsigned int col2, int f
 	cp[0] = divide_round_i(mfac * cp1[0] + fac * cp2[0], 255);
 	cp[1] = divide_round_i(mfac * cp1[1] + fac * cp2[1], 255);
 	cp[2] = divide_round_i(mfac * cp1[2] + fac * cp2[2], 255);
-	cp[3] = use_alpha ? alpha_value : 255;
+	cp[3] = divide_round_i(mfac * cp1[3] + fac * cp2[3], 255);
 
 	return col;
 }
@@ -765,7 +769,7 @@ BLI_INLINE unsigned int mcol_darken(unsigned int col1, unsigned int col2, int fa
 	cp[0] = divide_round_i((mfac * cp1[0] + fac * cp2[0]), 255);
 	cp[1] = divide_round_i((mfac * cp1[1] + fac * cp2[1]), 255);
 	cp[2] = divide_round_i((mfac * cp1[2] + fac * cp2[2]), 255);
-	cp[3] = use_alpha ? alpha_value : 255;
+	cp[3] = divide_round_i((mfac * cp1[3] + fac * cp2[3]), 255);
 	return col;
 }
 
@@ -794,7 +798,8 @@ BLI_INLINE unsigned int mcol_colordodge(unsigned int col1, unsigned int col2, in
 	cp[1] = (mfac * cp1[1] + temp * fac) / 255;
 	temp = (cp2[2] == 255) ? 255 : min_ii((cp1[2] * 225 )/ (255 - cp2[2]), 255);
 	cp[2] = (mfac * cp1[2] + temp * fac) / 255;
-	cp[3] = use_alpha ? alpha_value : 255;
+	temp = (cp2[3] == 255) ? 255 : min_ii((cp1[3] * 225) / (255 - cp2[3]), 255);
+	cp[3] = (mfac * cp1[3] + temp * fac) / 255;
 	return col;
 }
 
@@ -823,7 +828,8 @@ BLI_INLINE unsigned int mcol_difference(unsigned int col1, unsigned int col2, in
 	cp[1] = (mfac * cp1[1] + temp * fac) / 255;
 	temp = abs(cp1[2] - cp2[2]);
 	cp[2] = (mfac * cp1[2] + temp * fac) / 255;
-	cp[3] = use_alpha ? alpha_value : 255;
+	temp = abs(cp1[3] - cp2[3]);
+	cp[3] = (mfac * cp1[3] + temp * fac) / 255;
 	return col;
 }
 
@@ -852,7 +858,8 @@ BLI_INLINE unsigned int mcol_screen(unsigned int col1, unsigned int col2, int fa
 	cp[1] = (mfac * cp1[1] + temp * fac) / 255;
 	temp = max_ii(255 - (((255 - cp1[2]) * (255 - cp2[2])) / 255), 0);
 	cp[2] = (mfac * cp1[2] + temp * fac) / 255;
-	cp[3] = use_alpha ? alpha_value : 255;
+	temp = max_ii(255 - (((255 - cp1[3]) * (255 - cp2[3])) / 255), 0);
+	cp[3] = (mfac * cp1[3] + temp * fac) / 255;
 	return col;
 }
 
@@ -877,7 +884,7 @@ BLI_INLINE unsigned int mcol_hardlight(unsigned int col1, unsigned int col2, int
 
 	int i = 0;
 
-	for (i = 0; i < 3; i++) {
+	for (i = 0; i < 4; i++) {
 		
 		if (cp2[i] > 127) {
 			temp = 255 - ((255 - 2 * (cp2[i] - 127)) * (255 - cp1[i]) / 255);
@@ -887,7 +894,6 @@ BLI_INLINE unsigned int mcol_hardlight(unsigned int col1, unsigned int col2, int
 		}
 		cp[i] = min_ii((mfac * cp1[i] + temp * fac) / 255, 255);
 	}
-	cp[3] = use_alpha ? alpha_value : 255;
 	return col;
 }
 
@@ -912,7 +918,7 @@ BLI_INLINE unsigned int mcol_overlay(unsigned int col1, unsigned int col2, int f
 
 	int i = 0;
 
-	for (i = 0; i < 3; i++) {
+	for (i = 0; i < 4; i++) {
 
 		if (cp1[i] > 127) {
 			temp = 255 - ((255 - 2 * (cp1[i] - 127)) * (255 - cp2[i]) / 255);
@@ -922,7 +928,6 @@ BLI_INLINE unsigned int mcol_overlay(unsigned int col1, unsigned int col2, int f
 		}
 		cp[i] = min_ii((mfac * cp1[i] + temp * fac) / 255, 255);
 	}
-	cp[3] = use_alpha ? alpha_value : 255;
 	return col;
 }
 
@@ -947,7 +952,7 @@ BLI_INLINE unsigned int mcol_softlight(unsigned int col1, unsigned int col2, int
 
 	int i = 0;
 
-	for (i = 0; i < 3; i++) {
+	for (i = 0; i < 4; i++) {
 
 		if (cp1[i] < 127) {
 			temp = ((2 * ((cp2[i] / 2) + 64)) * cp1[i]) / 255;
@@ -957,7 +962,6 @@ BLI_INLINE unsigned int mcol_softlight(unsigned int col1, unsigned int col2, int
 		}
 		cp[i] = (temp * fac + cp1[i] * mfac) / 255;
 	}
-	cp[3] = use_alpha ? alpha_value : 255;
 	return col;
 }
 
@@ -982,11 +986,10 @@ BLI_INLINE unsigned int mcol_exclusion(unsigned int col1, unsigned int col2, int
 
 	int i = 0;
 
-	for (i = 0; i < 3; i++) {
+	for (i = 0; i < 4; i++) {
 		temp = 127 - ((2 * (cp1[i] - 127) * (cp2[i] - 127)) / 255);
 		cp[i] = (temp * fac + cp1[i] * mfac) / 255;
 	}
-	cp[3] = use_alpha ? alpha_value : 255;
 	return col;
 }
 
@@ -1022,7 +1025,7 @@ BLI_INLINE unsigned int mcol_luminocity(unsigned int col1, unsigned int col2, in
 	cp[0] = ((int)(r * 255.0f) * fac + mfac * cp1[0]) / 255;
 	cp[1] = ((int)(g * 255.0f) * fac + mfac * cp1[1]) / 255;
 	cp[2] = ((int)(b * 255.0f) * fac + mfac * cp1[2]) / 255;
-	cp[3] = use_alpha ? alpha_value : 255;
+	cp[3] = ((int)(cp2[3]) * fac + mfac * cp1[3]) / 255;
 	return col;
 }
 
@@ -1060,7 +1063,7 @@ BLI_INLINE unsigned int mcol_saturation(unsigned int col1, unsigned int col2, in
 	cp[0] = ((int)(r * 255.0f) * fac + mfac * cp1[0]) / 255;
 	cp[1] = ((int)(g * 255.0f) * fac + mfac * cp1[1]) / 255;
 	cp[2] = ((int)(b * 255.0f) * fac + mfac * cp1[2]) / 255;
-	cp[3] = use_alpha ? alpha_value : 255;
+	cp[3] = ((int)(cp2[3]) * fac + mfac * cp1[3]) / 255;
 	return col;
 }
 
@@ -1096,7 +1099,7 @@ BLI_INLINE unsigned int mcol_hue(unsigned int col1, unsigned int col2, int fac,
 	cp[0] = ((int)(r * 255.0f) * fac + mfac * cp1[0]) / 255;
 	cp[1] = ((int)(g * 255.0f) * fac + mfac * cp1[1]) / 255;
 	cp[2] = ((int)(b * 255.0f) * fac + mfac * cp1[2]) / 255;
-	cp[3] = use_alpha ? alpha_value : 255;
+	cp[3] = ((int)(cp2[3]) * fac + mfac * cp1[3]) / 255;
 	return col;
 }
 
@@ -1142,6 +1145,8 @@ static unsigned int vpaint_blend(
 	Brush *brush = BKE_paint_brush(&vp->paint);
 	const int tool = brush->vertexpaint_tool;
 
+	unsigned char *cp = (unsigned char *)&paintcol;
+	cp[3] = use_alpha ? alpha_value : 255;
 	col = vpaint_blend_tool(tool, col, paintcol, alpha_i, use_alpha, alpha_value);
 
 	/* if no spray, clip color adding with colorig & orig alpha */




More information about the Bf-blender-cvs mailing list