diff --git a/src/FrameBuffer.cpp b/src/FrameBuffer.cpp index d11fae34..1f185f17 100644 --- a/src/FrameBuffer.cpp +++ b/src/FrameBuffer.cpp @@ -932,7 +932,7 @@ void FrameBufferList::renderBuffer(u32 _address) glBindFramebuffer(GL_FRAMEBUFFER, 0); - OGLRender::TexturedRectParams params(0.0f, 0.0f, width, height, 0.0f, 0.0f, width - 1.0f, height - 1.0f, false, false, pFilteredBuffer); + OGLRender::TexturedRectParams params(0.0f, 0.0f, width, height, 0.0f, 0.0f, width - 1.0f, height - 1.0f, 1.0f, 1.0f, false, false, pFilteredBuffer); ogl.getRender().drawTexturedRect(params); glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); @@ -1782,7 +1782,7 @@ void RDRAMtoFrameBuffer::CopyFromRDRAM(u32 _address, bool _bCFB) glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_pCurBuffer->m_FBO); OGLRender::TexturedRectParams params((float)x0, (float)y0, (float)width, (float)height, - 0.0f, 0.0f, width - 1.0f, height - 1.0f, + 0.0f, 0.0f, width - 1.0f, height - 1.0f, 1.0f, 1.0f, false, true, m_pCurBuffer); video().getRender().drawTexturedRect(params); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, frameBufferList().getCurrent()->m_FBO); diff --git a/src/OpenGL.cpp b/src/OpenGL.cpp index a46ad5d1..d4761b2f 100644 --- a/src/OpenGL.cpp +++ b/src/OpenGL.cpp @@ -1147,18 +1147,18 @@ void OGLRender::drawTexturedRect(const TexturedRectParams & _params) f32 shiftScaleT = 1.0f; getTextureShiftScale(t, cache, shiftScaleS, shiftScaleT); if (_params.uls > _params.lrs) { - texST[t].s0 = (_params.uls + 1.0f) * shiftScaleS - gSP.textureTile[t]->fuls; + texST[t].s0 = (_params.uls + _params.dsdx) * shiftScaleS - gSP.textureTile[t]->fuls; texST[t].s1 = _params.lrs * shiftScaleS - gSP.textureTile[t]->fuls; } else { texST[t].s0 = _params.uls * shiftScaleS - gSP.textureTile[t]->fuls; - texST[t].s1 = (_params.lrs + 1.0f) * shiftScaleS - gSP.textureTile[t]->fuls; + texST[t].s1 = (_params.lrs + _params.dsdx) * shiftScaleS - gSP.textureTile[t]->fuls; } if (_params.ult > _params.lrt) { - texST[t].t0 = (_params.ult + 1.0f) * shiftScaleT - gSP.textureTile[t]->fult; + texST[t].t0 = (_params.ult + _params.dtdy) * shiftScaleT - gSP.textureTile[t]->fult; texST[t].t1 = _params.lrt * shiftScaleT - gSP.textureTile[t]->fult; } else { texST[t].t0 = _params.ult * shiftScaleT - gSP.textureTile[t]->fult; - texST[t].t1 = (_params.lrt + 1.0f) * shiftScaleT - gSP.textureTile[t]->fult; + texST[t].t1 = (_params.lrt + _params.dtdy) * shiftScaleT - gSP.textureTile[t]->fult; } if (cache.current[t]->frameBufferTexture) { diff --git a/src/OpenGL.h b/src/OpenGL.h index 081c2d3f..fba15d26 100644 --- a/src/OpenGL.h +++ b/src/OpenGL.h @@ -86,13 +86,16 @@ public: { float ulx, uly, lrx, lry; float uls, ult, lrs, lrt; + float dsdx, dtdy; bool flip, forceAjustScale; const FrameBuffer * pBuffer; TexturedRectParams(float _ulx, float _uly, float _lrx, float _lry, float _uls, float _ult, float _lrs, float _lrt, + float _dsdx, float _dtdy, bool _flip, bool _forceAjustScale, const FrameBuffer * _pBuffer) : ulx(_ulx), uly(_uly), lrx(_lrx), lry(_lry), uls(_uls), ult(_ult), lrs(_lrs), lrt(_lrt), + dsdx(_dsdx), dtdy(_dtdy), flip(_flip), forceAjustScale(_forceAjustScale), pBuffer(_pBuffer) {} }; diff --git a/src/gDP.cpp b/src/gDP.cpp index bde26b81..ecd90ffc 100644 --- a/src/gDP.cpp +++ b/src/gDP.cpp @@ -867,7 +867,8 @@ void gDPTextureRectangle( f32 ulx, f32 uly, f32 lrx, f32 lry, s32 tile, f32 s, f lrt = t + (lry - uly - 1) * dtdy; } - OGLRender::TexturedRectParams params(ulx, uly, lrx, lry, s, t, lrs, lrt, (RSP.cmd == G_TEXRECTFLIP), false, frameBufferList().getCurrent()); + OGLRender::TexturedRectParams params(ulx, uly, lrx, lry, s, t, lrs, lrt, fabsf(dsdx), fabsf(dtdy), + (RSP.cmd == G_TEXRECTFLIP), false, frameBufferList().getCurrent()); video().getRender().drawTexturedRect(params); gSP.textureTile[0] = textureTileOrg[0];