[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17341] branches/projection-paint/source/ blender/src/imagepaint.c: support for brush blend modes (Mix, Multiply, Darken etc)

Campbell Barton ideasman42 at gmail.com
Thu Nov 6 00:24:52 CET 2008


Revision: 17341
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17341
Author:   campbellbarton
Date:     2008-11-06 00:24:52 +0100 (Thu, 06 Nov 2008)

Log Message:
-----------
support for brush blend modes (Mix, Multiply, Darken etc)

Modified Paths:
--------------
    branches/projection-paint/source/blender/src/imagepaint.c

Modified: branches/projection-paint/source/blender/src/imagepaint.c
===================================================================
--- branches/projection-paint/source/blender/src/imagepaint.c	2008-11-05 23:23:04 UTC (rev 17340)
+++ branches/projection-paint/source/blender/src/imagepaint.c	2008-11-05 23:24:52 UTC (rev 17341)
@@ -793,7 +793,6 @@
 					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 @@
 	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 @@
 							
 							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) {





More information about the Bf-blender-cvs mailing list