Ticket #2421: colorAdd_TextureMaskMode_v2.patch

File colorAdd_TextureMaskMode_v2.patch, 6.5 KB (added by Michael, 10 years ago)

Replaced seperator, changed shader (use texture only as mask in maskMode)

  • binaries/data/mods/public/gui/common/colorFades.js

     
    8484    var rgb = data.rgb;
    8585    overlay.sprite="colour: " + rgb.r + " " + rgb.g + " " + rgb.b + " " + rgb.o;
    8686
     87    // check, if color mask mode is used and add the filename in this case
     88    if (overlay.addColorMask)
     89        overlay.sprite += ":" + overlay.addColorMask;
     90       
    8791    // recusive call, if duration is positive
    8892    if (!data.stopFade && (data.justStopAtExternCall || data.duration - (data.tickInterval * data.tickCounter) > 0))
    8993    {
  • binaries/data/mods/public/gui/gui.dtd

     
    2727<!-- Defaults are not put in here, because it ruins the concept of styles -->
    2828
    2929<!ENTITY % ex_settings
    30  "buffer_zone               CDATA #IMPLIED
     30 "addColorMask              CDATA #IMPLIED
     31  buffer_zone               CDATA #IMPLIED
    3132  button_width              CDATA #IMPLIED
    3233  checked                   %bool; #IMPLIED
    3334  dropdown_size             CDATA #IMPLIED
     
    201202<!ATTLIST effect
    202203  add_color             CDATA #IMPLIED
    203204  multiply_color        CDATA #IMPLIED
     205  textureMaskMode       %bool; #IMPLIED
    204206  grayscale             CDATA #IMPLIED
    205207>
  • binaries/data/mods/public/shaders/effects/gui_add.xml

     
    22<effect>
    33
    44    <technique>
     5        <require context="!TEXTURE_MASK_MODE"/>
    56        <require shaders="fixed"/>
    67        <pass shader="fixed:gui_add"/>
    78    </technique>
  • binaries/data/mods/public/shaders/glsl/gui_add.fs

     
    77
    88void main()
    99{
    10   gl_FragColor = texture2D(tex, v_tex) + color;
     10    vec4 t = texture2D(tex, v_tex);
     11
     12    #if TEXTURE_MASK_MODE
     13        gl_FragColor.rgb = color.rgb;
     14        gl_FragColor.a = min(t.a, color.a);
     15    #else
     16        gl_FragColor = t + color;
     17    #endif
    1118}
  • source/gui/CGUI.cpp

     
    16171617        {
    16181618            effects.m_Greyscale = true;
    16191619        }
     1620        else if (attr_name == "textureMaskMode")
     1621        {
     1622            effects.m_TextureMaskMode = true;
     1623        }
    16201624        else
    16211625        {
    16221626            debug_warn(L"Invalid data - DTD shouldn't allow this");
  • source/gui/CGUISprite.h

     
    6464
    6565struct SGUIImageEffects
    6666{
    67     SGUIImageEffects() : m_Greyscale(false) {}
     67    SGUIImageEffects() : m_Greyscale(false), m_TextureMaskMode(false) {}
    6868    CColor m_AddColor;
    6969    bool m_Greyscale;
     70    bool m_TextureMaskMode;
    7071};
    7172
    7273/**
  • source/gui/CImage.cpp

     
    3535    AddSetting(GUIST_int,                   "cell_id");
    3636    AddSetting(GUIST_CStrW,                 "tooltip");
    3737    AddSetting(GUIST_CStr,                  "tooltip_style");
     38    AddSetting(GUIST_CStr,                  "addColorMask");
    3839}
    3940
    4041CImage::~CImage()
  • source/gui/GUIRenderer.cpp

     
    7979        //     "stretched:grayscale:filename.ext" - stretched grayscale image
    8080        //     "cropped:(0.5, 0.25)"    - stretch this ratio (x,y) of the top left of the image
    8181        //     "colour:r g b a"         - solid colour
     82        //     "colour:r g b a:filenameMask.ext"  - solid colour with textureMask
    8283        //
    8384        // and if so, try to create it as a new sprite.
    8485        if (SpriteName.substr(0, 10) == "stretched:")
     
    137138        }
    138139        else if (SpriteName.substr(0, 7) == "colour:")
    139140        {
     141            SGUIImage* Image = new SGUIImage;
     142
     143            // check, if there is a sprite for defining of opacity values
     144            int splitIndex = SpriteName.substr(7).find_first_of(":");
    140145            CStrW value = wstring_from_utf8(SpriteName.substr(7));
     146            CStrW textureMask;
    141147            CColor color;
    142148
     149            // trim the color value and the name of the textureMask
     150            if(splitIndex != std::basic_string<char>::npos)
     151            {
     152                textureMask = value.substr(splitIndex + 1);
     153                value = value.substr(0, splitIndex);
     154            }
     155
    143156            // Check colour is valid
    144157            if (!GUI<CColor>::ParseString(value, color))
    145158            {
     
    147160                return;
    148161            }
    149162
    150             SGUIImage* Image = new SGUIImage;
     163            // set background color or add color effect if textureMask is set
     164            if(splitIndex != std::basic_string<char>::npos)
     165            {
     166                // TODO: Should check (nicely) that this is a valid file?
     167                Image->m_TextureName = VfsPath("art/textures/ui") / textureMask;
     168                Image->m_Effects = new SGUIImageEffects;
     169                Image->m_Effects->m_AddColor = color;
     170                Image->m_Effects->m_TextureMaskMode = true;
     171            }
     172            else
     173                Image->m_BackColor = color;
    151174
    152             Image->m_BackColor = color;
    153 
    154175            CClientArea ca(CRect(0, 0, 0, 0), CRect(0, 0, 100, 100));
    155176            Image->m_Size = ca;
    156177            Image->m_TextureSize = ca;
     
    231252        {
    232253            if ((*cit)->m_Effects->m_AddColor != CColor())
    233254            {
    234                 Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_add);
     255                CShaderDefines defines;
     256                // enable texture mask mode
     257                if ((*cit)->m_Effects->m_TextureMaskMode)
     258                    defines.Add(str_TEXTURE_MASK_MODE, str_1);
     259               
     260                Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_add, g_Renderer.GetSystemShaderDefines(), defines);
    235261                Call.m_ShaderColorParameter = (*cit)->m_Effects->m_AddColor;
    236262                // Always enable blending if something's being subtracted from
    237263                // the alpha channel
  • source/ps/CStrInternStatic.h

     
    6464X(USE_SHADOW_PCF)
    6565X(USE_SHADOW_SAMPLER)
    6666X(USE_WAVES)
     67X(TEXTURE_MASK_MODE)
    6768X2(_emptystring, "")
    6869X(a_skinJoints)
    6970X(a_skinWeights)