diff --git a/include/SFML/Graphics/BlendMode.hpp b/include/SFML/Graphics/BlendMode.hpp index 60bbd1f07..1acdd06c5 100644 --- a/include/SFML/Graphics/BlendMode.hpp +++ b/include/SFML/Graphics/BlendMode.hpp @@ -68,9 +68,11 @@ struct SFML_GRAPHICS_API BlendMode //////////////////////////////////////////////////////// enum Equation { - Add, //!< Pixel = Src * SrcFactor + Dst * DstFactor - Subtract, //!< Pixel = Src * SrcFactor - Dst * DstFactor - ReverseSubtract //!< Pixel = Dst * DstFactor - Src * SrcFactor + Add, //!< Pixel = Src * SrcFactor + Dst * DstFactor + Subtract, //!< Pixel = Src * SrcFactor - Dst * DstFactor + ReverseSubtract, //!< Pixel = Dst * DstFactor - Src * SrcFactor + Min, //!< Pixel = min(Dst, Src) + Max //!< Pixel = max(Dst, Src) }; //////////////////////////////////////////////////////////// @@ -150,6 +152,8 @@ SFML_GRAPHICS_API bool operator !=(const BlendMode& left, const BlendMode& right SFML_GRAPHICS_API extern const BlendMode BlendAlpha; //!< Blend source and dest according to dest alpha SFML_GRAPHICS_API extern const BlendMode BlendAdd; //!< Add source to dest SFML_GRAPHICS_API extern const BlendMode BlendMultiply; //!< Multiply source and dest +SFML_GRAPHICS_API extern const BlendMode BlendMin; //!< Take minimum between source and dest +SFML_GRAPHICS_API extern const BlendMode BlendMax; //!< Take maximum between source and dest SFML_GRAPHICS_API extern const BlendMode BlendNone; //!< Overwrite dest with source } // namespace sf diff --git a/src/SFML/Graphics/BlendMode.cpp b/src/SFML/Graphics/BlendMode.cpp index 2f062b648..292a346ec 100644 --- a/src/SFML/Graphics/BlendMode.cpp +++ b/src/SFML/Graphics/BlendMode.cpp @@ -37,8 +37,10 @@ const BlendMode BlendAlpha(BlendMode::SrcAlpha, BlendMode::OneMinusSrcAlpha, Ble BlendMode::One, BlendMode::OneMinusSrcAlpha, BlendMode::Add); const BlendMode BlendAdd(BlendMode::SrcAlpha, BlendMode::One, BlendMode::Add, BlendMode::One, BlendMode::One, BlendMode::Add); -const BlendMode BlendMultiply(BlendMode::DstColor, BlendMode::Zero); -const BlendMode BlendNone(BlendMode::One, BlendMode::Zero); +const BlendMode BlendMultiply(BlendMode::DstColor, BlendMode::Zero, BlendMode::Add); +const BlendMode BlendMin(BlendMode::One, BlendMode::One, BlendMode::Min); +const BlendMode BlendMax(BlendMode::One, BlendMode::One, BlendMode::Max); +const BlendMode BlendNone(BlendMode::One, BlendMode::Zero, BlendMode::Add); //////////////////////////////////////////////////////////// diff --git a/src/SFML/Graphics/GLExtensions.hpp b/src/SFML/Graphics/GLExtensions.hpp index cd05678ef..fb4fb3c88 100644 --- a/src/SFML/Graphics/GLExtensions.hpp +++ b/src/SFML/Graphics/GLExtensions.hpp @@ -45,7 +45,6 @@ #define GLEXT_multitexture true #define GLEXT_texture_edge_clamp true #define GLEXT_EXT_texture_edge_clamp true - #define GLEXT_blend_minmax true #define GLEXT_glClientActiveTexture glClientActiveTexture #define GLEXT_glActiveTexture glActiveTexture #define GLEXT_GL_TEXTURE0 GL_TEXTURE0 @@ -140,6 +139,11 @@ #define GLEXT_texture_sRGB false #define GLEXT_GL_SRGB8_ALPHA8 0 + // Core since 3.0 - EXT_blend_minmax + #define GLEXT_blend_minmax SF_GLAD_GL_EXT_blend_minmax + #define GLEXT_GL_MIN GL_MIN_EXT + #define GLEXT_GL_MAX GL_MAX_EXT + #else // SFML requires at a bare minimum OpenGL 1.1 capability @@ -164,6 +168,8 @@ #define GLEXT_blend_minmax SF_GLAD_GL_EXT_blend_minmax #define GLEXT_glBlendEquation glBlendEquationEXT #define GLEXT_GL_FUNC_ADD GL_FUNC_ADD_EXT + #define GLEXT_GL_MIN GL_MIN_EXT + #define GLEXT_GL_MAX GL_MAX_EXT // Core since 1.2 - EXT_blend_subtract #define GLEXT_blend_subtract SF_GLAD_GL_EXT_blend_subtract diff --git a/src/SFML/Graphics/RenderTarget.cpp b/src/SFML/Graphics/RenderTarget.cpp index e332eb99b..4576946da 100644 --- a/src/SFML/Graphics/RenderTarget.cpp +++ b/src/SFML/Graphics/RenderTarget.cpp @@ -110,13 +110,36 @@ namespace { switch (blendEquation) { - case sf::BlendMode::Add: return GLEXT_GL_FUNC_ADD; - case sf::BlendMode::Subtract: return GLEXT_GL_FUNC_SUBTRACT; - case sf::BlendMode::ReverseSubtract: return GLEXT_GL_FUNC_REVERSE_SUBTRACT; + case sf::BlendMode::Add: + return GLEXT_GL_FUNC_ADD; + case sf::BlendMode::Subtract: + if (GLEXT_blend_subtract) + return GLEXT_GL_FUNC_SUBTRACT; + break; + case sf::BlendMode::ReverseSubtract: + if (GLEXT_blend_subtract) + return GLEXT_GL_FUNC_REVERSE_SUBTRACT; + break; + case sf::BlendMode::Min: + if (GLEXT_blend_minmax) + return GLEXT_GL_MIN; + break; + case sf::BlendMode::Max: + if (GLEXT_blend_minmax) + return GLEXT_GL_MAX; + break; + } + + static bool warned = false; + if (!warned) + { + sf::err() << "OpenGL extension EXT_blend_minmax or EXT_blend_subtract unavailable" << std::endl; + sf::err() << "Some blending equations will fallback to sf::BlendMode::Add" << std::endl; + sf::err() << "Ensure that hardware acceleration is enabled if available" << std::endl; + + warned = true; } - sf::err() << "Invalid value for sf::BlendMode::Equation! Fallback to sf::BlendMode::Add." << std::endl; - assert(false); return GLEXT_GL_FUNC_ADD; } } @@ -591,7 +614,7 @@ void RenderTarget::applyBlendMode(const BlendMode& mode) factorToGlConstant(mode.colorDstFactor))); } - if (GLEXT_blend_minmax && GLEXT_blend_subtract) + if (GLEXT_blend_minmax || GLEXT_blend_subtract) { if (GLEXT_blend_equation_separate) { @@ -610,7 +633,11 @@ void RenderTarget::applyBlendMode(const BlendMode& mode) if (!warned) { - err() << "OpenGL extension EXT_blend_minmax and/or EXT_blend_subtract unavailable" << std::endl; +#ifdef SFML_OPENGL_ES + err() << "OpenGL ES extension OES_blend_subtract unavailable" << std::endl; +#else + err() << "OpenGL extension EXT_blend_minmax and EXT_blend_subtract unavailable" << std::endl; +#endif err() << "Selecting a blend equation not possible" << std::endl; err() << "Ensure that hardware acceleration is enabled if available" << std::endl;