mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-04 10:03:36 +00:00
Add support for non-gsSPTextureRectangle.
This commit is contained in:
parent
90020ee4bf
commit
625e439992
95
RDP.cpp
95
RDP.cpp
|
@ -1,3 +1,4 @@
|
|||
#include <assert.h>
|
||||
#include <memory.h>
|
||||
#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 )
|
||||
|
|
Loading…
Reference in New Issue
Block a user