From ba01909088ae0ef0957c1467c936e67532171e6d Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Fri, 1 Jun 2012 20:21:45 -0300 Subject: [PATCH] fix alpha blending issues --- modules/core_lib/core_lib.otmod | 1 - modules/core_lib/ext/string.lua | 22 ++++++++++++++++++++++ modules/core_lib/string.lua | 21 --------------------- src/framework/graphics/framebuffer.cpp | 1 + src/framework/graphics/graphics.cpp | 11 +++++++++++ src/framework/graphics/graphics.h | 1 + src/framework/graphics/painter.cpp | 6 +++++- src/framework/platform/win32window.cpp | 2 +- src/otclient/core/mapview.cpp | 6 ++---- 9 files changed, 43 insertions(+), 28 deletions(-) delete mode 100644 modules/core_lib/string.lua diff --git a/modules/core_lib/core_lib.otmod b/modules/core_lib/core_lib.otmod index eaf473a3..ab005700 100644 --- a/modules/core_lib/core_lib.otmod +++ b/modules/core_lib/core_lib.otmod @@ -17,7 +17,6 @@ Module dofile 'settings' dofile 'keyboard' dofile 'mouse' - dofile 'string' dofiles 'ui' dofiles 'widgets' diff --git a/modules/core_lib/ext/string.lua b/modules/core_lib/ext/string.lua index 39192be7..4b2fbb89 100644 --- a/modules/core_lib/ext/string.lua +++ b/modules/core_lib/ext/string.lua @@ -21,3 +21,25 @@ end function string.trim(s) return string.match(s, '^%s*(.*%S)') or '' end + +function string.explode(str, sep, limit) + if(type(sep) ~= 'string' or tostring(str):len() == 0 or sep:len() == 0) then + return {} + end + + local i, pos, tmp, t = 0, 1, "", {} + for s, e in function() return string.find(str, sep, pos) end do + tmp = str:sub(pos, s - 1):trim() + table.insert(t, tmp) + pos = e + 1 + + i = i + 1 + if(limit ~= nil and i == limit) then + break + end + end + + tmp = str:sub(pos):trim() + table.insert(t, tmp) + return t +end diff --git a/modules/core_lib/string.lua b/modules/core_lib/string.lua deleted file mode 100644 index 41000e78..00000000 --- a/modules/core_lib/string.lua +++ /dev/null @@ -1,21 +0,0 @@ -string.explode = function (str, sep, limit) - if(type(sep) ~= 'string' or tostring(str):len() == 0 or sep:len() == 0) then - return {} - end - - local i, pos, tmp, t = 0, 1, "", {} - for s, e in function() return string.find(str, sep, pos) end do - tmp = str:sub(pos, s - 1):trim() - table.insert(t, tmp) - pos = e + 1 - - i = i + 1 - if(limit ~= nil and i == limit) then - break - end - end - - tmp = str:sub(pos):trim() - table.insert(t, tmp) - return t -end \ No newline at end of file diff --git a/src/framework/graphics/framebuffer.cpp b/src/framework/graphics/framebuffer.cpp index 9963a9a7..0c8364b7 100644 --- a/src/framework/graphics/framebuffer.cpp +++ b/src/framework/graphics/framebuffer.cpp @@ -157,6 +157,7 @@ void FrameBuffer::internalRelease() // restore screen original content g_painter->setCompositionMode(Painter::CompositionMode_Replace); g_painter->drawTexturedRect(screenRect, m_screenBackup, screenRect); + g_painter->resetCompositionMode(); } } diff --git a/src/framework/graphics/graphics.cpp b/src/framework/graphics/graphics.cpp index 117d0dff..9702641f 100644 --- a/src/framework/graphics/graphics.cpp +++ b/src/framework/graphics/graphics.cpp @@ -330,3 +330,14 @@ bool Graphics::canUseClampToEdge() return m_useClampToEdge; #endif } + +bool Graphics::canUseBlendFuncSeparate() +{ +#ifdef OPENGL_ES + return true; +#else + if(!GLEW_VERSION_1_4) + return false; + return true; +#endif +} diff --git a/src/framework/graphics/graphics.h b/src/framework/graphics/graphics.h index 872cbee0..f1f28d20 100644 --- a/src/framework/graphics/graphics.h +++ b/src/framework/graphics/graphics.h @@ -63,6 +63,7 @@ public: bool canUseMipmaps(); bool canUseHardwareMipmaps(); bool canUseClampToEdge(); + bool canUseBlendFuncSeparate(); private: Size m_viewportSize; diff --git a/src/framework/graphics/painter.cpp b/src/framework/graphics/painter.cpp index 41eaa905..2f45b078 100644 --- a/src/framework/graphics/painter.cpp +++ b/src/framework/graphics/painter.cpp @@ -132,7 +132,11 @@ void Painter::updateGlCompositionMode() { switch(m_compositionMode) { case CompositionMode_Normal: - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + if(g_graphics.canUseBlendFuncSeparate()) + glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE); + else { + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } break; case CompositionMode_Multiply: glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); diff --git a/src/framework/platform/win32window.cpp b/src/framework/platform/win32window.cpp index 6bc95e76..487e0e5c 100644 --- a/src/framework/platform/win32window.cpp +++ b/src/framework/platform/win32window.cpp @@ -304,7 +304,7 @@ void WIN32Window::internalChooseGLVisual() PFD_TYPE_RGBA, 32, // Select Our Color Depth 0, 0, 0, 0, 0, 0, // Color Bits Ignored - 1, // Alpha Buffer Bits + 8, // Alpha Buffer Bits 0, // Shift Bit Ignored 0, // No Accumulation Buffer 0, 0, 0, 0, // Accumulation Bits Ignored diff --git a/src/otclient/core/mapview.cpp b/src/otclient/core/mapview.cpp index 1c66a093..7b383ee9 100644 --- a/src/otclient/core/mapview.cpp +++ b/src/otclient/core/mapview.cpp @@ -77,13 +77,11 @@ void MapView::draw(const Rect& rect) Rect clearRect = Rect(0, 0, m_drawDimension * m_tileSize); // drawing a black rect is actually faster than FrameBuffer::clear() - /* g_painter->setColor(Color::black); g_painter->drawFilledRect(clearRect); g_painter->setColor(Color::white); - */ - m_framebuffer->clear(Color::black); + //m_framebuffer->clear(Color::black); } auto it = m_cachedVisibleTiles.begin(); @@ -148,8 +146,8 @@ void MapView::draw(const Rect& rect) #else m_framebuffer->draw(rect, srcRect); #endif - g_painter->restoreSavedState(); + //g_painter->resetShaderProgram(); // this could happen if the player position is not known yet