Support multiple microTextures, fixes crazy texturing in sega ski champ. I'm assuming microtextures are always located on the other memory bank to the base texture. This logic seems to work for all our games anyway.

This commit is contained in:
Ian Curtis 2016-10-06 01:37:29 +00:00
parent e21ea93319
commit c3581c9fe8
6 changed files with 31 additions and 3 deletions

View file

@ -39,6 +39,7 @@ struct Mesh
// texture // texture
int format, x, y, width, height = 0; int format, x, y, width, height = 0;
bool microTexture = false; bool microTexture = false;
int microTextureID = 0;
bool mirrorU = false; bool mirrorU = false;
bool mirrorV = false; bool mirrorV = false;

View file

@ -147,8 +147,11 @@ void CNew3D::RenderScene(int priority, bool alpha)
} }
if (mesh.microTexture) { if (mesh.microTexture) {
int mX, mY;
glActiveTexture(GL_TEXTURE1); glActiveTexture(GL_TEXTURE1);
auto tex2 = m_texSheet.BindTexture(m_textureRAM, 0, false, false, 0, 1024, 128, 128); m_texSheet.GetMicrotexPos(y / 1024, mesh.microTextureID, mX, mY);
auto tex2 = m_texSheet.BindTexture(m_textureRAM, 0, false, false, mX, mY, 128, 128);
if (tex2) { if (tex2) {
tex2->BindTexture(); tex2->BindTexture();
} }
@ -980,6 +983,7 @@ void CNew3D::CacheModel(Model *m, const UINT32 *data)
currentMesh->mirrorU = ph.TexUMirror(); currentMesh->mirrorU = ph.TexUMirror();
currentMesh->mirrorV = ph.TexVMirror(); currentMesh->mirrorV = ph.TexVMirror();
currentMesh->microTexture = ph.MicroTexture(); currentMesh->microTexture = ph.MicroTexture();
currentMesh->microTextureID = ph.MicroTextureID();
} }
} }

View file

@ -183,6 +183,11 @@ bool PolyHeader::MicroTexture()
return (header[2] & 0x10) > 0; return (header[2] & 0x10) > 0;
} }
int PolyHeader::MicroTextureID()
{
return (header[2] >> 5) & 3;
}
// //
// header 3 // header 3
@ -366,7 +371,8 @@ UINT64 PolyHeader::Hash()
hash |= (UINT64)DoubleSided() << 33; // bits 33 double sided hash |= (UINT64)DoubleSided() << 33; // bits 33 double sided
hash |= (UINT64)AlphaTest() << 34; // bits 34 contour processing hash |= (UINT64)AlphaTest() << 34; // bits 34 contour processing
hash |= (UINT64)PolyAlpha() << 35; // bits 35 poly alpha processing hash |= (UINT64)PolyAlpha() << 35; // bits 35 poly alpha processing
hash |= (UINT64)TextureAlpha() << 36; // bits 35 poly alpha processing hash |= (UINT64)TextureAlpha() << 36; // bits 35 texture alpha processing
hash |= (UINT64)MicroTexture() << 37; // bits 36 microtexture enable
//to do add the rest of the states //to do add the rest of the states

View file

@ -14,7 +14,7 @@ xxxxxx-- -------- -------- -------- Specular
-------- -------- -------- x------- Enable specular -------- -------- -------- x------- Enable specular
-------- -------- -------- -x------ 0 = Triangle, 1 = Quad -------- -------- -------- -x------ 0 = Triangle, 1 = Quad
-------- -------- -------- --x----- Poly is points -------- -------- -------- --x----- Poly is points
-------- -------- -------- ---x---- Smoothing ? -------- -------- -------- ---x---- Anti-aliasing
-------- -------- -------- ----x--- Vertex 3 shared from previous polygon -------- -------- -------- ----x--- Vertex 3 shared from previous polygon
-------- -------- -------- -----x-- Vertex 2 shared from previous polygon -------- -------- -------- -----x-- Vertex 2 shared from previous polygon
-------- -------- -------- ------x- Vertex 1 shared from previous polygon -------- -------- -------- ------x- Vertex 1 shared from previous polygon
@ -108,6 +108,7 @@ public:
bool TexUMirror(); bool TexUMirror();
bool TexVMirror(); bool TexVMirror();
bool MicroTexture(); bool MicroTexture();
int MicroTextureID();
// header 3 // header 3
int TexWidth(); int TexWidth();

View file

@ -120,4 +120,19 @@ int TextureSheet::GetTexFormat(int originalFormat, bool contour)
} }
} }
void TextureSheet::GetMicrotexPos(int basePage, int id, int& x, int& y)
{
int xCoords[8] = { 0, 128, 0, 128, 0, 128, 0, 128 };
int yCoords[8] = { 0, 0, 128, 128, 0, 0, 128, 128 };
// i'm assuming .. the micro texture map is always on the other memory bank to the base texture
// this logic works for all our current games
// the microtextures are always on the top left of each texture sheet
basePage = (basePage + 1) & 1; // wrap around base page
x = xCoords[id];
y = xCoords[id] + (basePage * 1024);
}
} // New3D } // New3D

View file

@ -18,6 +18,7 @@ public:
void Invalidate (int x, int y, int width, int height); // release parts of the memory void Invalidate (int x, int y, int width, int height); // release parts of the memory
void Release (); // release all texture objects and memory void Release (); // release all texture objects and memory
int GetTexFormat (int originalFormat, bool contour); int GetTexFormat (int originalFormat, bool contour);
void GetMicrotexPos (int basePage, int id, int& x, int& y);
private: private: