Fix #34156: Spec. and Alpha Intensity OpenGL issue
authorSergey Sharybin <sergey.vfx@gmail.com>
Thu, 7 Feb 2013 15:36:59 +0000 (15:36 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Thu, 7 Feb 2013 15:36:59 +0000 (15:36 +0000)
Issue was caused by alpha pipeline cleanup: apparently depending on
use_alpha flag different channels for spec/alpha would be used.

Made it so talpha is computed from Image->ignore_alpha instead of
always considering to be TRUTH.

This is not so much trivial to understand what's going on here, but
it's not new issue. Anyway, if someone have got ideas how to improve
feedback here -- ideas are welcome! For now only regression is fixed.

source/blender/gpu/intern/gpu_material.c
source/blender/render/intern/source/imagetexture.c

index 9731d7a..b5ef27a 100644 (file)
@@ -1035,7 +1035,7 @@ static void do_material_tex(GPUShadeInput *shi)
                                GPU_link(mat, "mtex_image", texco, GPU_image(tex->ima, &tex->iuser, FALSE), &tin, &trgb);
                                rgbnor= TEX_RGB;
 
                                GPU_link(mat, "mtex_image", texco, GPU_image(tex->ima, &tex->iuser, FALSE), &tin, &trgb);
                                rgbnor= TEX_RGB;
 
-                               talpha= 1;
+                               talpha = (tex->ima->flag & IMA_IGNORE_ALPHA) == 0;
                        }
                        else {
                                continue;
                        }
                        else {
                                continue;
index 0a427d5..55dadc1 100644 (file)
@@ -224,8 +224,10 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], TexResul
        }
 
        /* keep this before interpolation [#29761] */
        }
 
        /* keep this before interpolation [#29761] */
-       if ((tex->imaflag & TEX_CALCALPHA) == 0) {
-               texres->talpha = TRUE;
+       if (tex->ima && (tex->ima->flag & IMA_IGNORE_ALPHA) == 0) {
+               if ((tex->imaflag & TEX_CALCALPHA) == 0) {
+                       texres->talpha = TRUE;
+               }
        }
 
        /* interpolate */
        }
 
        /* interpolate */
@@ -1092,8 +1094,10 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, const float tex
        /* mipmap test */
        image_mipmap_test(tex, ibuf);
        
        /* mipmap test */
        image_mipmap_test(tex, ibuf);
        
-       if ((tex->imaflag & TEX_CALCALPHA) == 0)
-               texres->talpha = 1;
+       if (tex->ima && (tex->ima->flag & IMA_IGNORE_ALPHA) == 0) {
+               if ((tex->imaflag & TEX_CALCALPHA) == 0)
+                       texres->talpha = 1;
+       }
        texr.talpha = texres->talpha;
 
        if (tex->imaflag & TEX_IMAROT) {
        texr.talpha = texres->talpha;
 
        if (tex->imaflag & TEX_IMAROT) {
@@ -1506,8 +1510,10 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
        /* mipmap test */
        image_mipmap_test(tex, ibuf);
 
        /* mipmap test */
        image_mipmap_test(tex, ibuf);
 
-       if ((tex->imaflag & TEX_CALCALPHA) == 0) {
-               texres->talpha = TRUE;
+       if (tex->ima && (tex->ima->flag & IMA_IGNORE_ALPHA) == 0) {
+               if ((tex->imaflag & TEX_CALCALPHA) == 0) {
+                       texres->talpha = TRUE;
+               }
        }
        
        texr.talpha= texres->talpha;
        }
        
        texr.talpha= texres->talpha;