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) {


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to