diff --git a/src/Config.cpp b/src/Config.cpp index 8535213b..0836977f 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -35,6 +35,7 @@ void Config::resetToDefaults() generalEmulation.enableHWLighting = 0; generalEmulation.enableCustomSettings = 1; generalEmulation.enableShadersStorage = 1; + generalEmulation.correctTexrectCoords = tcDisable; generalEmulation.hacks = 0; #ifdef ANDROID generalEmulation.forcePolygonOffset = 0; diff --git a/src/Config.h b/src/Config.h index 621d81d2..a882385d 100644 --- a/src/Config.h +++ b/src/Config.h @@ -35,13 +35,20 @@ struct Config u32 screenShotFormat; } texture; - struct { + enum TexrectCorrectionMode { + tcDisable = 0, + tcSmart, + tcForce + }; + + struct { u32 enableFog; u32 enableNoise; u32 enableLOD; u32 enableHWLighting; u32 enableCustomSettings; u32 enableShadersStorage; + u32 correctTexrectCoords; u32 hacks; #ifdef ANDROID u32 forcePolygonOffset; diff --git a/src/OpenGL.cpp b/src/OpenGL.cpp index 1cb82563..2b31eb3f 100644 --- a/src/OpenGL.cpp +++ b/src/OpenGL.cpp @@ -1261,6 +1261,28 @@ void OGLRender::drawTexturedRect(const TexturedRectParams & _params) gSP.changed |= CHANGED_GEOMETRYMODE | CHANGED_VIEWPORT; } +void OGLRender::correctTexturedRectParams(TexturedRectParams & _params) +{ + if (config.generalEmulation.correctTexrectCoords == Config::tcSmart) { + if (_params.ulx == m_texrectParams.ulx && _params.lrx == m_texrectParams.lrx) { + if (fabsf(_params.uly - m_texrectParams.lry) < 0.51f) + _params.uly = m_texrectParams.lry; + else if (fabsf(_params.lry - m_texrectParams.uly) < 0.51f) + _params.lry = m_texrectParams.uly; + } else if (_params.uly == m_texrectParams.uly && _params.lry == m_texrectParams.lry) { + if (fabsf(_params.ulx - m_texrectParams.lrx) < 0.51f) + _params.ulx = m_texrectParams.lrx; + else if (fabsf(_params.lrx - m_texrectParams.ulx) < 0.51f) + _params.lrx = m_texrectParams.ulx; + } + } else if (config.generalEmulation.correctTexrectCoords == Config::tcForce) { + _params.lrx += 0.25f; + _params.lry += 0.25f; + } + + m_texrectParams = _params; +} + void OGLRender::drawText(const char *_pText, float x, float y) { m_renderState = rsNone; diff --git a/src/OpenGL.h b/src/OpenGL.h index 1f8485a2..bffb1e87 100644 --- a/src/OpenGL.h +++ b/src/OpenGL.h @@ -100,7 +100,13 @@ public: flip(_flip), forceAjustScale(_forceAjustScale), texrectCmd(_texrectCmd), pBuffer(_pBuffer) {} + private: + friend class OGLRender; + TexturedRectParams() : + ulx(0), uly(0), lrx(0), lry(0) + {}; }; + void correctTexturedRectParams(TexturedRectParams & _params); void drawTexturedRect(const TexturedRectParams & _params); void drawText(const char *_pText, float x, float y); void clearDepthBuffer(u32 _uly, u32 _lry); @@ -181,6 +187,7 @@ private: RENDER_STATE m_renderState; OGL_RENDERER m_oglRenderer; + TexturedRectParams m_texrectParams; GLVertex m_rect[4]; u32 m_modifyVertices; bool m_bImageTexture; diff --git a/src/gDP.cpp b/src/gDP.cpp index e39ab820..01e7b5b8 100644 --- a/src/gDP.cpp +++ b/src/gDP.cpp @@ -867,8 +867,11 @@ void gDPTextureRectangle(f32 ulx, f32 uly, f32 lrx, f32 lry, s32 tile, f32 s, f3 } OGLRender::TexturedRectParams params(ulx, uly, lrx, lry, s, t, lrs, lrt, fabsf(dsdx), fabsf(dtdy), - flip, false, true, frameBufferList().getCurrent()); - video().getRender().drawTexturedRect(params); + flip, false, true, frameBufferList().getCurrent()); + OGLRender & render = video().getRender(); + if (config.generalEmulation.correctTexrectCoords != Config::tcDisable) + render.correctTexturedRectParams(params); + render.drawTexturedRect(params); gSP.textureTile[0] = textureTileOrg[0]; gSP.textureTile[1] = textureTileOrg[1];