From c8f83889a8fc54110192a8a09fe2a50fa2361d99 Mon Sep 17 00:00:00 2001 From: Sergey Lipskiy Date: Sat, 29 Jun 2013 22:50:03 +0700 Subject: [PATCH] Fix vertex st scaling, when gSPModifyVertex is used. Fix st scaling when otherMode.texturePersp is off. --- OpenGL.cpp | 30 ++++++++++++++++++++---------- gSP.cpp | 12 ++++++++++-- gSP.h | 3 ++- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/OpenGL.cpp b/OpenGL.cpp index 6e4d78c4..1e8c9d4c 100644 --- a/OpenGL.cpp +++ b/OpenGL.cpp @@ -812,6 +812,16 @@ void OGL_AddTriangle( SPVertex *vertices, int v0, int v1, int v2 ) OGL.vertices[OGL.numVertices].fog = max( 0.0f, vertices[v[i]].z / vertices[v[i]].w * (float)gSP.fog.multiplier + (float)gSP.fog.offset ); } + if (!vertices[v[i]].st_scaled) { + vertices[v[i]].s *= gSP.texture.scales; + vertices[v[i]].t *= gSP.texture.scalet; + if (gDP.otherMode.texturePersp == 0) { + vertices[v[i]].s *= 0.5f; + vertices[v[i]].t *= 0.5f; + } + vertices[v[i]].st_scaled = 1; + } + if (combiner.usesT0) { if (cache.current[0]->frameBufferTexture) @@ -820,19 +830,19 @@ void OGL_AddTriangle( SPVertex *vertices, int v0, int v1, int v2 ) OGL.vertices[OGL.numVertices].t0 = (cache.current[0]->offsetT - (vertices[v[i]].t * cache.current[0]->shiftScaleT * gSP.texture.scalet - gSP.textureTile[0]->fult)) * cache.current[0]->scaleT;*/ if (gSP.textureTile[0]->masks) - OGL.vertices[OGL.numVertices].s0 = (cache.current[0]->offsetS + (vertices[v[i]].s * cache.current[0]->shiftScaleS * gSP.texture.scales - fmod( gSP.textureTile[0]->fuls, 1 << gSP.textureTile[0]->masks ))) * cache.current[0]->scaleS; + OGL.vertices[OGL.numVertices].s0 = (cache.current[0]->offsetS + (vertices[v[i]].s * cache.current[0]->shiftScaleS - fmod( gSP.textureTile[0]->fuls, 1 << gSP.textureTile[0]->masks ))) * cache.current[0]->scaleS; else - OGL.vertices[OGL.numVertices].s0 = (cache.current[0]->offsetS + (vertices[v[i]].s * cache.current[0]->shiftScaleS * gSP.texture.scales - gSP.textureTile[0]->fuls)) * cache.current[0]->scaleS; + OGL.vertices[OGL.numVertices].s0 = (cache.current[0]->offsetS + (vertices[v[i]].s * cache.current[0]->shiftScaleS - gSP.textureTile[0]->fuls)) * cache.current[0]->scaleS; if (gSP.textureTile[0]->maskt) - OGL.vertices[OGL.numVertices].t0 = (cache.current[0]->offsetT - (vertices[v[i]].t * cache.current[0]->shiftScaleT * gSP.texture.scalet - fmod( gSP.textureTile[0]->fult, 1 << gSP.textureTile[0]->maskt ))) * cache.current[0]->scaleT; + OGL.vertices[OGL.numVertices].t0 = (cache.current[0]->offsetT - (vertices[v[i]].t * cache.current[0]->shiftScaleT - fmod( gSP.textureTile[0]->fult, 1 << gSP.textureTile[0]->maskt ))) * cache.current[0]->scaleT; else - OGL.vertices[OGL.numVertices].t0 = (cache.current[0]->offsetT - (vertices[v[i]].t * cache.current[0]->shiftScaleT * gSP.texture.scalet - gSP.textureTile[0]->fult)) * cache.current[0]->scaleT; + OGL.vertices[OGL.numVertices].t0 = (cache.current[0]->offsetT - (vertices[v[i]].t * cache.current[0]->shiftScaleT - gSP.textureTile[0]->fult)) * cache.current[0]->scaleT; } else { - OGL.vertices[OGL.numVertices].s0 = (vertices[v[i]].s * cache.current[0]->shiftScaleS * gSP.texture.scales - gSP.textureTile[0]->fuls + cache.current[0]->offsetS) * cache.current[0]->scaleS; - OGL.vertices[OGL.numVertices].t0 = (vertices[v[i]].t * cache.current[0]->shiftScaleT * gSP.texture.scalet - gSP.textureTile[0]->fult + cache.current[0]->offsetT) * cache.current[0]->scaleT; + OGL.vertices[OGL.numVertices].s0 = (vertices[v[i]].s * cache.current[0]->shiftScaleS - gSP.textureTile[0]->fuls + cache.current[0]->offsetS) * cache.current[0]->scaleS; + OGL.vertices[OGL.numVertices].t0 = (vertices[v[i]].t * cache.current[0]->shiftScaleT - gSP.textureTile[0]->fult + cache.current[0]->offsetT) * cache.current[0]->scaleT; } } @@ -840,13 +850,13 @@ void OGL_AddTriangle( SPVertex *vertices, int v0, int v1, int v2 ) { if (cache.current[1]->frameBufferTexture) { - OGL.vertices[OGL.numVertices].s1 = (cache.current[1]->offsetS + (vertices[v[i]].s * cache.current[1]->shiftScaleS * gSP.texture.scales - gSP.textureTile[1]->fuls)) * cache.current[1]->scaleS; - OGL.vertices[OGL.numVertices].t1 = (cache.current[1]->offsetT - (vertices[v[i]].t * cache.current[1]->shiftScaleT * gSP.texture.scalet - gSP.textureTile[1]->fult)) * cache.current[1]->scaleT; + OGL.vertices[OGL.numVertices].s1 = (cache.current[1]->offsetS + (vertices[v[i]].s * cache.current[1]->shiftScaleS - gSP.textureTile[1]->fuls)) * cache.current[1]->scaleS; + OGL.vertices[OGL.numVertices].t1 = (cache.current[1]->offsetT - (vertices[v[i]].t * cache.current[1]->shiftScaleT - gSP.textureTile[1]->fult)) * cache.current[1]->scaleT; } else { - OGL.vertices[OGL.numVertices].s1 = (vertices[v[i]].s * cache.current[1]->shiftScaleS * gSP.texture.scales - gSP.textureTile[1]->fuls + cache.current[1]->offsetS) * cache.current[1]->scaleS; - OGL.vertices[OGL.numVertices].t1 = (vertices[v[i]].t * cache.current[1]->shiftScaleT * gSP.texture.scalet - gSP.textureTile[1]->fult + cache.current[1]->offsetT) * cache.current[1]->scaleT; + OGL.vertices[OGL.numVertices].s1 = (vertices[v[i]].s * cache.current[1]->shiftScaleS - gSP.textureTile[1]->fuls + cache.current[1]->offsetS) * cache.current[1]->scaleS; + OGL.vertices[OGL.numVertices].t1 = (vertices[v[i]].t * cache.current[1]->shiftScaleT - gSP.textureTile[1]->fult + cache.current[1]->offsetT) * cache.current[1]->scaleT; } } OGL.numVertices++; diff --git a/gSP.cpp b/gSP.cpp index d7fe2b86..f3d5497f 100644 --- a/gSP.cpp +++ b/gSP.cpp @@ -432,6 +432,7 @@ void gSPVertex( u32 v, u32 n, u32 v0 ) gSP.vertices[i].flag = vertex->flag; gSP.vertices[i].s = _FIXED2FLOAT( vertex->s, 5 ); gSP.vertices[i].t = _FIXED2FLOAT( vertex->t, 5 ); + gSP.vertices[i].st_scaled = 0; if (gSP.geometryMode & G_LIGHTING) { @@ -508,6 +509,7 @@ void gSPCIVertex( u32 v, u32 n, u32 v0 ) gSP.vertices[i].flag = 0; gSP.vertices[i].s = _FIXED2FLOAT( vertex->s, 5 ); gSP.vertices[i].t = _FIXED2FLOAT( vertex->t, 5 ); + gSP.vertices[i].st_scaled = 0; u8 *color = &RDRAM[gSP.vertexColorBase + (vertex->ci & 0xff)]; @@ -1241,8 +1243,14 @@ void gSPModifyVertex( u32 vtx, u32 where, u32 val ) #endif break; case G_MWO_POINT_ST: - gSP.vertices[vtx].s = _FIXED2FLOAT( (s16)_SHIFTR( val, 16, 16 ), 5 ); - gSP.vertices[vtx].t = _FIXED2FLOAT( (s16)_SHIFTR( val, 0, 16 ), 5 ); + if (gDP.otherMode.texturePersp > 0) { + gSP.vertices[vtx].s = _FIXED2FLOAT( (s16)_SHIFTR( val, 16, 16 ), 5 ); + gSP.vertices[vtx].t = _FIXED2FLOAT( (s16)_SHIFTR( val, 0, 16 ), 5 ); + } else { + gSP.vertices[vtx].s = _FIXED2FLOAT( (s16)_SHIFTR( val, 16, 16 ), 6 ); + gSP.vertices[vtx].t = _FIXED2FLOAT( (s16)_SHIFTR( val, 0, 16 ), 6 ); + } + gSP.vertices[vtx].st_scaled = 1; #ifdef DEBUG DebugMsg( DEBUG_HIGH | DEBUG_HANDLED, "gSPModifyVertex( %i, %s, 0x%08X );\n", vtx, MWOPointText[(where - 0x10) >> 2], val ); diff --git a/gSP.h b/gSP.h index 4586ba4e..1aa9c580 100644 --- a/gSP.h +++ b/gSP.h @@ -21,7 +21,8 @@ struct SPVertex f32 s, t; f32 xClip, yClip, zClip; s16 flag; - int HWLight; + u8 HWLight; + u8 st_scaled; }; typedef SPVertex SPTriangle[3];