diff --git a/RDP.cpp b/RDP.cpp index ce14606a..7336e3a2 100644 --- a/RDP.cpp +++ b/RDP.cpp @@ -1,3 +1,4 @@ +#include #include #include "N64.h" #include "RSP.h" @@ -223,52 +224,84 @@ void RDP_LoadSync( u32 w0, u32 w1 ) gDPLoadSync(); } -void RDP_TexRectFlip( u32 w0, u32 w1 ) +static +void _getTexRectParams(u32 & w2, u32 & w3) { - u32 w2, w3; if (RSP.bLLE) { w2 = RDP.w2; w3 = RDP.w3; - } else { + return; + } + + enum { + gspTexRect, + gdpTexRect, + halfTexRect + } texRectMode = gdpTexRect; + + const u32 cmd1 = (*(u32*)&RDRAM[RSP.PC[RSP.PCi] + 0]) >> 24; + const u32 cmd2 = (*(u32*)&RDRAM[RSP.PC[RSP.PCi] + 8]) >> 24; + if (cmd1 == G_RDPHALF_1) { + if (cmd2 == G_RDPHALF_2) + texRectMode = gspTexRect; + } else if (cmd1 == 0xB3) { + if (cmd2 == 0xB2) + texRectMode = gspTexRect; + else + texRectMode = halfTexRect; + } + + switch (texRectMode) { + case gspTexRect: w2 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4]; RSP.PC[RSP.PCi] += 8; w3 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4]; RSP.PC[RSP.PCi] += 8; + break; + case gdpTexRect: + w2 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 0]; + w3 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4]; + RSP.PC[RSP.PCi] += 8; + break; + case halfTexRect: + w2 = 0; + w3 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4]; + RSP.PC[RSP.PCi] += 8; + break; + default: + assert(false && "Unknown texrect mode"); } - gDPTextureRectangleFlip( _FIXED2FLOAT( _SHIFTR( w1, 12, 12 ), 2 ), // ulx - _FIXED2FLOAT( _SHIFTR( w1, 0, 12 ), 2 ), // uly - _FIXED2FLOAT( _SHIFTR( w0, 12, 12 ), 2 ), // lrx - _FIXED2FLOAT( _SHIFTR( w0, 0, 12 ), 2 ), // lry - _SHIFTR( w1, 24, 3 ), // tile - _FIXED2FLOAT( (s16)_SHIFTR( w2, 16, 16 ), 5 ), // s - _FIXED2FLOAT( (s16)_SHIFTR( w2, 0, 16 ), 5 ), // t - _FIXED2FLOAT( (s16)_SHIFTR( w3, 16, 16 ), 10 ), // dsdx - _FIXED2FLOAT( (s16)_SHIFTR( w3, 0, 16 ), 10 ) ); // dsdy +} + +void RDP_TexRectFlip( u32 w0, u32 w1 ) +{ + u32 w2, w3; + _getTexRectParams(w2, w3); + gDPTextureRectangleFlip(_FIXED2FLOAT(_SHIFTR(w1, 12, 12), 2),// ulx + _FIXED2FLOAT(_SHIFTR(w1, 0, 12), 2), // uly + _FIXED2FLOAT(_SHIFTR(w0, 12, 12), 2), // lrx + _FIXED2FLOAT(_SHIFTR(w0, 0, 12), 2), // lry + _SHIFTR(w1, 24, 3), // tile + _FIXED2FLOAT((s16)_SHIFTR(w2, 16, 16), 5), // s + _FIXED2FLOAT((s16)_SHIFTR(w2, 0, 16), 5), // t + _FIXED2FLOAT((s16)_SHIFTR(w3, 16, 16), 10), // dsdx + _FIXED2FLOAT((s16)_SHIFTR(w3, 0, 16), 10)); // dsdy } void RDP_TexRect( u32 w0, u32 w1 ) { u32 w2, w3; - if (RSP.bLLE) { - w2 = RDP.w2; - w3 = RDP.w3; - } else { - w2 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4]; - RSP.PC[RSP.PCi] += 8; - - w3 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4]; - RSP.PC[RSP.PCi] += 8; - } - gDPTextureRectangle( _FIXED2FLOAT( _SHIFTR( w1, 12, 12 ), 2 ), // ulx - _FIXED2FLOAT( _SHIFTR( w1, 0, 12 ), 2 ), // uly - _FIXED2FLOAT( _SHIFTR( w0, 12, 12 ), 2 ), // lrx - _FIXED2FLOAT( _SHIFTR( w0, 0, 12 ), 2 ), // lry - _SHIFTR( w1, 24, 3 ), // tile - _FIXED2FLOAT( (s16)_SHIFTR( w2, 16, 16 ), 5 ), // s - _FIXED2FLOAT( (s16)_SHIFTR( w2, 0, 16 ), 5 ), // t - _FIXED2FLOAT( (s16)_SHIFTR( w3, 16, 16 ), 10 ), // dsdx - _FIXED2FLOAT( (s16)_SHIFTR( w3, 0, 16 ), 10 ) ); // dsdy + _getTexRectParams(w2, w3); + gDPTextureRectangle(_FIXED2FLOAT(_SHIFTR(w1, 12, 12), 2),// ulx + _FIXED2FLOAT(_SHIFTR(w1, 0, 12), 2), // uly + _FIXED2FLOAT(_SHIFTR(w0, 12, 12), 2), // lrx + _FIXED2FLOAT(_SHIFTR(w0, 0, 12), 2), // lry + _SHIFTR(w1, 24, 3), // tile + _FIXED2FLOAT((s16)_SHIFTR(w2, 16, 16), 5), // s + _FIXED2FLOAT((s16)_SHIFTR(w2, 0, 16), 5), // t + _FIXED2FLOAT((s16)_SHIFTR(w3, 16, 16), 10), // dsdx + _FIXED2FLOAT((s16)_SHIFTR(w3, 0, 16), 10)); // dsdy } void RDP_TriFill( u32 _w0, u32 _w1 )