diff --git a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactoryAccurate.cpp b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactoryAccurate.cpp index 5ad40634..ef65b9f1 100644 --- a/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactoryAccurate.cpp +++ b/src/Graphics/OpenGLContext/GLSL/glsl_CombinerProgramUniformFactoryAccurate.cpp @@ -72,16 +72,10 @@ public: } float tcbounds[4] = {}; if (useTexCoordBounds) { - f32 S = _FIXED2FLOAT(gDP.lastTexRectInfo.s, 5); - f32 T = _FIXED2FLOAT(gDP.lastTexRectInfo.t, 5); - f32 uls = S + (ceilf(gDP.lastTexRectInfo.ulx) - gDP.lastTexRectInfo.ulx) * gDP.lastTexRectInfo.dsdx; - f32 lrs = S + (ceilf(gDP.lastTexRectInfo.lrx) - gDP.lastTexRectInfo.ulx - 1.0f) * gDP.lastTexRectInfo.dsdx; - f32 ult = T + (ceilf(gDP.lastTexRectInfo.uly) - gDP.lastTexRectInfo.uly) * gDP.lastTexRectInfo.dtdy; - f32 lrt = T + (ceilf(gDP.lastTexRectInfo.lry) - gDP.lastTexRectInfo.uly - 1.0f) * gDP.lastTexRectInfo.dtdy; - tcbounds[0] = fmin(uls, lrs); - tcbounds[1] = fmin(ult, lrt); - tcbounds[2] = fmax(uls, lrs); - tcbounds[3] = fmax(ult, lrt); + tcbounds[0] = gDP.m_texCoordBounds.uls; + tcbounds[1] = gDP.m_texCoordBounds.ult; + tcbounds[2] = gDP.m_texCoordBounds.lrs; + tcbounds[3] = gDP.m_texCoordBounds.lrt; } uVertexOffset.set(vertexOffset, vertexOffset, _force); diff --git a/src/gDP.cpp b/src/gDP.cpp index d8dff335..e999ed49 100644 --- a/src/gDP.cpp +++ b/src/gDP.cpp @@ -907,6 +907,21 @@ void gDPTextureRectangle(f32 ulx, f32 uly, f32 lrx, f32 lry, s32 tile, s16 s, s1 gDP.lastTexRectInfo.dsdx = !flip ? dsdx : dtdy; gDP.lastTexRectInfo.dtdy = !flip ? dtdy : dsdx; + f32 S = _FIXED2FLOAT(!flip ? s : t, 5); + f32 T = _FIXED2FLOAT(!flip ? t : s, 5); + f32 DSDX = !flip ? dsdx : dtdy; + f32 DTDY = !flip ? dtdy : dsdx; + f32 uls = S + (ceilf(ulx) - ulx) * DSDX; + f32 lrs = S + (ceilf(lrx) - ulx - 1.0f) * DSDX; + f32 ult = T + (ceilf(uly) - uly) * DTDY; + f32 lrt = T + (ceilf(lry) - uly - 1.0f) * DTDY; + + gDP.m_texCoordBounds.valid = true; + gDP.m_texCoordBounds.uls = fmin(uls, lrs); + gDP.m_texCoordBounds.ult = fmin(ult, lrt); + gDP.m_texCoordBounds.lrs = fmax(uls, lrs); + gDP.m_texCoordBounds.lrt = fmax(ult, lrt); + GraphicsDrawer & drawer = dwnd().getDrawer(); GraphicsDrawer::TexturedRectParams params(ulx, uly, lrx, lry, dsdx, dtdy, s, t, flip, false, true, frameBufferList().getCurrent()); diff --git a/src/gDP.h b/src/gDP.h index 8b2a509e..c38e51be 100644 --- a/src/gDP.h +++ b/src/gDP.h @@ -129,6 +129,11 @@ struct gDPTexrectInfo f32 dsdx, dtdy; }; +struct texCoordBounds { + bool valid; + f32 uls, lrs, ult, lrt; +}; + struct gDPInfo { struct OtherMode @@ -264,6 +269,7 @@ struct gDPInfo gDPLoadTileInfo loadInfo[512]; gDPTexrectInfo lastTexRectInfo; + texCoordBounds m_texCoordBounds; }; extern gDPInfo gDP;