1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-07 03:13:49 +00:00

Fix vertex st scaling, when gSPModifyVertex is used.

Fix st scaling when otherMode.texturePersp is off.
This commit is contained in:
Sergey Lipskiy 2013-06-29 22:50:03 +07:00
parent 1e4870e6b9
commit c8f83889a8
3 changed files with 32 additions and 13 deletions

View File

@ -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 ); 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 (combiner.usesT0)
{ {
if (cache.current[0]->frameBufferTexture) 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;*/ 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) 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 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) 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 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 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].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.texture.scalet - gSP.textureTile[0]->fult + cache.current[0]->offsetT) * cache.current[0]->scaleT; 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) 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].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.texture.scalet - gSP.textureTile[1]->fult)) * cache.current[1]->scaleT; 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 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].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.texture.scalet - gSP.textureTile[1]->fult + cache.current[1]->offsetT) * cache.current[1]->scaleT; 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++; OGL.numVertices++;

12
gSP.cpp
View File

@ -432,6 +432,7 @@ void gSPVertex( u32 v, u32 n, u32 v0 )
gSP.vertices[i].flag = vertex->flag; gSP.vertices[i].flag = vertex->flag;
gSP.vertices[i].s = _FIXED2FLOAT( vertex->s, 5 ); gSP.vertices[i].s = _FIXED2FLOAT( vertex->s, 5 );
gSP.vertices[i].t = _FIXED2FLOAT( vertex->t, 5 ); gSP.vertices[i].t = _FIXED2FLOAT( vertex->t, 5 );
gSP.vertices[i].st_scaled = 0;
if (gSP.geometryMode & G_LIGHTING) 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].flag = 0;
gSP.vertices[i].s = _FIXED2FLOAT( vertex->s, 5 ); gSP.vertices[i].s = _FIXED2FLOAT( vertex->s, 5 );
gSP.vertices[i].t = _FIXED2FLOAT( vertex->t, 5 ); gSP.vertices[i].t = _FIXED2FLOAT( vertex->t, 5 );
gSP.vertices[i].st_scaled = 0;
u8 *color = &RDRAM[gSP.vertexColorBase + (vertex->ci & 0xff)]; u8 *color = &RDRAM[gSP.vertexColorBase + (vertex->ci & 0xff)];
@ -1241,8 +1243,14 @@ void gSPModifyVertex( u32 vtx, u32 where, u32 val )
#endif #endif
break; break;
case G_MWO_POINT_ST: case G_MWO_POINT_ST:
gSP.vertices[vtx].s = _FIXED2FLOAT( (s16)_SHIFTR( val, 16, 16 ), 5 ); if (gDP.otherMode.texturePersp > 0) {
gSP.vertices[vtx].t = _FIXED2FLOAT( (s16)_SHIFTR( val, 0, 16 ), 5 ); 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 #ifdef DEBUG
DebugMsg( DEBUG_HIGH | DEBUG_HANDLED, "gSPModifyVertex( %i, %s, 0x%08X );\n", DebugMsg( DEBUG_HIGH | DEBUG_HANDLED, "gSPModifyVertex( %i, %s, 0x%08X );\n",
vtx, MWOPointText[(where - 0x10) >> 2], val ); vtx, MWOPointText[(where - 0x10) >> 2], val );

3
gSP.h
View File

@ -21,7 +21,8 @@ struct SPVertex
f32 s, t; f32 s, t;
f32 xClip, yClip, zClip; f32 xClip, yClip, zClip;
s16 flag; s16 flag;
int HWLight; u8 HWLight;
u8 st_scaled;
}; };
typedef SPVertex SPTriangle[3]; typedef SPVertex SPTriangle[3];