diff options
author | StapleButter <thetotalworm@gmail.com> | 2017-03-06 18:25:20 +0100 |
---|---|---|
committer | StapleButter <thetotalworm@gmail.com> | 2017-03-06 18:25:20 +0100 |
commit | fe31ec297c5d84108eed2bccf736dd59734b60d0 (patch) | |
tree | 6c7ddeb40ffff45e6a230cd55bd4b8e348938ad5 | |
parent | 383093c5fffde7b29649ca4f452e892299b337c6 (diff) |
* direct color textures.
* texture wrap modes.
-rw-r--r-- | GPU3D_Soft.cpp | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/GPU3D_Soft.cpp b/GPU3D_Soft.cpp index d796048..ff382ab 100644 --- a/GPU3D_Soft.cpp +++ b/GPU3D_Soft.cpp @@ -58,9 +58,40 @@ void TextureLookup(u32 texparam, u32 texpal, s16 s, s16 t, u8* r, u8* g, u8* b) s >>= 4; t >>= 4; - // TODO: wraparound modes - s &= width-1; - t &= height-1; + // texture wrapping + // TODO: optimize this somehow + + if (texparam & (1<<16)) + { + if (texparam & (1<<18)) + { + if (s & width) s = (width-1) - (s & (width-1)); + else s = (s & (width-1)); + } + else + s &= width-1; + } + else + { + if (s < 0) s = 0; + else if (s >= width) s = width-1; + } + + if (texparam & (1<<17)) + { + if (texparam & (1<<19)) + { + if (t & height) t = (height-1) - (t & (height-1)); + else t = (t & (height-1)); + } + else + t &= height-1; + } + else + { + if (t < 0) t = 0; + else if (t >= height) t = height-1; + } switch ((texparam >> 26) & 0x7) { @@ -94,6 +125,17 @@ void TextureLookup(u32 texparam, u32 texpal, s16 s, s16 t, u8* r, u8* g, u8* b) } break; + case 7: // direct color + { + vramaddr += (((t * width) + s) << 1); + u16 color = GPU::ReadVRAM_Texture<u16>(vramaddr); + + *r = (color << 1) & 0x3E; if (*r) *r++; + *g = (color >> 4) & 0x3E; if (*g) *g++; + *b = (color >> 9) & 0x3E; if (*b) *b++; + } + break; + case 5: // compressed { vramaddr += ((t & 0x3FC) * (width>>2)) + (s & 0x3FC); |