From c7961fbc287f9c99e67689eecf3288fa9864708c Mon Sep 17 00:00:00 2001 From: Sergey Lipskiy Date: Wed, 5 Nov 2014 18:41:58 +0600 Subject: [PATCH] Fix gSPModifyVertex for texture coordinates. Remove st_scaled vertex attribute. Fixed South Park - Chef's Luv Shack --- GLSLCombiner.cpp | 1 - OpenGL.cpp | 8 -------- Shaders.h | 4 +--- ZSort.cpp | 1 - gSP.cpp | 17 ++--------------- gSP.h | 4 +--- 6 files changed, 4 insertions(+), 31 deletions(-) diff --git a/GLSLCombiner.cpp b/GLSLCombiner.cpp index 46b02e3e..f8b5d833 100644 --- a/GLSLCombiner.cpp +++ b/GLSLCombiner.cpp @@ -591,7 +591,6 @@ void ShaderCombiner::_locate_attributes() const { glBindAttribLocation(m_program, SC_COLOR, "aColor"); glBindAttribLocation(m_program, SC_TEXCOORD0, "aTexCoord0"); glBindAttribLocation(m_program, SC_TEXCOORD1, "aTexCoord1"); - glBindAttribLocation(m_program, SC_STSCALED, "aSTScaled"); glBindAttribLocation(m_program, SC_NUMLIGHTS, "aNumLights"); } diff --git a/OpenGL.cpp b/OpenGL.cpp index 8f694c19..10111f06 100644 --- a/OpenGL.cpp +++ b/OpenGL.cpp @@ -632,11 +632,6 @@ void OGLRender::_setTexCoordArrays() const glEnableVertexAttribArray(SC_TEXCOORD1); else glDisableVertexAttribArray(SC_TEXCOORD1); - - if (m_renderState == rsTriangle && (currentCombiner()->usesT0() || currentCombiner()->usesT1())) - glEnableVertexAttribArray(SC_STSCALED); - else - glDisableVertexAttribArray(SC_STSCALED); } void OGLRender::_prepareDrawTriangle(bool _dma) @@ -662,7 +657,6 @@ void OGLRender::_prepareDrawTriangle(bool _dma) glVertexAttribPointer(SC_POSITION, 4, GL_FLOAT, GL_FALSE, sizeof(SPVertex), &pVtx->x); glVertexAttribPointer(SC_COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(SPVertex), &pVtx->r); glVertexAttribPointer(SC_TEXCOORD0, 2, GL_FLOAT, GL_FALSE, sizeof(SPVertex), &pVtx->s); - glVertexAttribPointer(SC_STSCALED, 1, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(SPVertex), &pVtx->st_scaled); if (config.enableHWLighting) { glEnableVertexAttribArray(SC_NUMLIGHTS); glVertexAttribPointer(SC_NUMLIGHTS, 1, GL_BYTE, GL_FALSE, sizeof(SPVertex), &pVtx->HWLight); @@ -699,7 +693,6 @@ void OGLRender::drawLLETriangle(u32 _numVtx) for (u32 i = 0; i < _numVtx; ++i) { triangles.vertices[i].HWLight = 0; - triangles.vertices[i].st_scaled = 0; triangles.vertices[i].x = triangles.vertices[i].x * (2.0f * scaleX) - 1.0f; triangles.vertices[i].x *= triangles.vertices[i].w; triangles.vertices[i].y = triangles.vertices[i].y * (-2.0f * scaleY) + 1.0f; @@ -774,7 +767,6 @@ void OGLRender::drawRect(int _ulx, int _uly, int _lrx, int _lry, float *_pColor) glDisableVertexAttribArray(SC_COLOR); glDisableVertexAttribArray(SC_TEXCOORD0); glDisableVertexAttribArray(SC_TEXCOORD1); - glDisableVertexAttribArray(SC_STSCALED); } if (updateArrays) { diff --git a/Shaders.h b/Shaders.h index 505e6eda..6ea1c6bd 100644 --- a/Shaders.h +++ b/Shaders.h @@ -7,7 +7,6 @@ static const char* vertex_shader = "in lowp vec4 aColor; \n" "in highp vec2 aTexCoord0; \n" "in highp vec2 aTexCoord1; \n" -"in lowp float aSTScaled; \n" "in lowp float aNumLights; \n" " \n" "uniform int uRenderState; \n" @@ -39,7 +38,6 @@ static const char* vertex_shader = "in vec4 aColor; \n" "in vec2 aTexCoord0; \n" "in vec2 aTexCoord1; \n" -"in float aSTScaled; \n" "in float aNumLights; \n" " \n" "uniform int uRenderState; \n" @@ -73,7 +71,7 @@ static const char* vertex_shader = " vShadeColor = aColor; \n" " if (uRenderState == 1) { \n" " vec2 texCoord = aTexCoord0; \n" -" if (aSTScaled == 0.0) texCoord *= uTexScale; \n" +" texCoord *= uTexScale; \n" " if (uTexturePersp == 0) texCoord *= 0.5; \n" " vec2 texCoord0 = texCoord*uCacheShiftScale[0]; \n" " if (uCacheFrameBuffer[0] != 0) { \n" diff --git a/ZSort.cpp b/ZSort.cpp index 40c5fa14..cf1ec91d 100644 --- a/ZSort.cpp +++ b/ZSort.cpp @@ -145,7 +145,6 @@ void ZSort_DrawObject (u8 * _addr, u32 _type) vtx.flag = 0; vtx.HWLight = 0; vtx.clip = 0; - vtx.st_scaled = 0; if (textured != 0) { vtx.s = _FIXED2FLOAT(((s16*)_addr)[4^1], 5 ); vtx.t = _FIXED2FLOAT(((s16*)_addr)[5^1], 5 ); diff --git a/gSP.cpp b/gSP.cpp index 3dee52a1..f0661224 100644 --- a/gSP.cpp +++ b/gSP.cpp @@ -937,7 +937,6 @@ void gSPVertex( u32 a, u32 n, u32 v0 ) //vtx.flag = vertex->flag; vtx.s = _FIXED2FLOAT( vertex->s, 5 ); vtx.t = _FIXED2FLOAT( vertex->t, 5 ); - vtx.st_scaled = 0; if (gSP.geometryMode & G_LIGHTING) { vtx.nx = vertex->normal.x; vtx.ny = vertex->normal.y; @@ -965,7 +964,6 @@ void gSPVertex( u32 a, u32 n, u32 v0 ) vtx.z = vertex->z; vtx.s = _FIXED2FLOAT( vertex->s, 5 ); vtx.t = _FIXED2FLOAT( vertex->t, 5 ); - vtx.st_scaled = 0; if (gSP.geometryMode & G_LIGHTING) { vtx.nx = vertex->normal.x; vtx.ny = vertex->normal.y; @@ -1015,7 +1013,6 @@ void gSPCIVertex( u32 a, u32 n, u32 v0 ) vtx.z = vertex->z; vtx.s = _FIXED2FLOAT( vertex->s, 5 ); vtx.t = _FIXED2FLOAT( vertex->t, 5 ); - vtx.st_scaled = 0; u8 *color = &RDRAM[gSP.vertexColorBase + (vertex->ci & 0xff)]; if (gSP.geometryMode & G_LIGHTING) { @@ -1045,7 +1042,6 @@ void gSPCIVertex( u32 a, u32 n, u32 v0 ) vtx.z = vertex->z; vtx.s = _FIXED2FLOAT( vertex->s, 5 ); vtx.t = _FIXED2FLOAT( vertex->t, 5 ); - vtx.st_scaled = 0; u8 *color = &RDRAM[gSP.vertexColorBase + (vertex->ci & 0xff)]; if (gSP.geometryMode & G_LIGHTING) { @@ -1128,7 +1124,6 @@ void gSPDMAVertex( u32 a, u32 n, u32 v0 ) vtx.b = *(u8*)&RDRAM[(address + 8) ^ 3] * 0.0039215689f; vtx.a = *(u8*)&RDRAM[(address + 9) ^ 3] * 0.0039215689f; } - vtx.st_scaled = 0; gSPProcessVertex(v); address += 10; @@ -1168,7 +1163,6 @@ void gSPCBFDVertex( u32 a, u32 n, u32 v0 ) vtx.z = vertex->z; vtx.s = _FIXED2FLOAT( vertex->s, 5 ); vtx.t = _FIXED2FLOAT( vertex->t, 5 ); - vtx.st_scaled = 0; if (gSP.geometryMode & G_LIGHTING) { const u32 normaleAddrOffset = ((v0+v+j)<<1); vtx.nx = (float)(((s8*)RDRAM)[(gSP.vertexNormalBase + normaleAddrOffset + 0)^3]); @@ -1196,7 +1190,6 @@ void gSPCBFDVertex( u32 a, u32 n, u32 v0 ) vtx.z = vertex->z; vtx.s = _FIXED2FLOAT( vertex->s, 5 ); vtx.t = _FIXED2FLOAT( vertex->t, 5 ); - vtx.st_scaled = 0; if (gSP.geometryMode & G_LIGHTING) { const u32 normaleAddrOffset = (v<<1); vtx.nx = (float)(((s8*)RDRAM)[(gSP.vertexNormalBase + normaleAddrOffset + 0)^3]); @@ -1596,14 +1589,8 @@ void gSPModifyVertex( u32 _vtx, u32 _where, u32 _val ) vtx0.a = _SHIFTR( _val, 0, 8 ) * 0.0039215689f; break; case G_MWO_POINT_ST: - if (gDP.otherMode.texturePersp != 0) { - vtx0.s = _FIXED2FLOAT( (s16)_SHIFTR( _val, 16, 16 ), 5 ); - vtx0.t = _FIXED2FLOAT( (s16)_SHIFTR( _val, 0, 16 ), 5 ); - } else { - vtx0.s = _FIXED2FLOAT( (s16)_SHIFTR( _val, 16, 16 ), 6 ); - vtx0.t = _FIXED2FLOAT( (s16)_SHIFTR( _val, 0, 16 ), 6 ); - } - vtx0.st_scaled = 1; + vtx0.s = _FIXED2FLOAT( (s16)_SHIFTR( _val, 16, 16 ), 5 ) / gSP.texture.scales; + vtx0.t = _FIXED2FLOAT((s16)_SHIFTR(_val, 0, 16), 5) / gSP.texture.scalet; break; case G_MWO_POINT_XYSCREEN: { diff --git a/gSP.h b/gSP.h index 88e1c64d..a7e7f676 100644 --- a/gSP.h +++ b/gSP.h @@ -62,8 +62,7 @@ if \ #define SC_COLOR 2 #define SC_TEXCOORD0 3 #define SC_TEXCOORD1 4 -#define SC_STSCALED 5 -#define SC_NUMLIGHTS 6 +#define SC_NUMLIGHTS 5 struct SPVertex { @@ -71,7 +70,6 @@ struct SPVertex f32 nx, ny, nz, __pad0; f32 r, g, b, a; f32 s, t; - u8 st_scaled; u8 HWLight; s16 flag; u32 clip;