aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStapleButter <thetotalworm@gmail.com>2017-03-06 18:25:20 +0100
committerStapleButter <thetotalworm@gmail.com>2017-03-06 18:25:20 +0100
commitfe31ec297c5d84108eed2bccf736dd59734b60d0 (patch)
tree6c7ddeb40ffff45e6a230cd55bd4b8e348938ad5
parent383093c5fffde7b29649ca4f452e892299b337c6 (diff)
* direct color textures.
* texture wrap modes.
-rw-r--r--GPU3D_Soft.cpp48
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);