mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
sprite masking fixed according to Lordus expl.
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@414 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
f9d3ee9d2f
commit
6c25471008
1 changed files with 11 additions and 19 deletions
30
Pico/Draw.c
30
Pico/Draw.c
|
@ -194,7 +194,7 @@ static int TileNormZ(int sx,int addr,int pal,int zval)
|
|||
|
||||
return 1; // Tile blank
|
||||
}
|
||||
|
||||
|
||||
static int TileFlipZ(int sx,int addr,int pal,int zval)
|
||||
{
|
||||
unsigned int pack=0; unsigned int t=0;
|
||||
|
@ -1096,8 +1096,6 @@ static void DrawAllSprites(int *hcache, int maxwidth, int prio, int sh)
|
|||
{
|
||||
int sx, sy, row, pack2;
|
||||
|
||||
elprintf(EL_ANOMALY, "x: %i y: %i %ix%i", pack2>>16, (pack<<16)>>16, (pack>>28)<<3, (pack>>21)&0x38);
|
||||
|
||||
if (pack & 0x00400000) continue;
|
||||
|
||||
// get sprite info
|
||||
|
@ -1106,11 +1104,20 @@ static void DrawAllSprites(int *hcache, int maxwidth, int prio, int sh)
|
|||
sy = (pack <<16)>>16;
|
||||
row = scan-sy;
|
||||
|
||||
// elprintf(EL_ANOMALY, "x: %4i y: %4i p %i %ix%i", sx, sy, (pack2>>15)&1, (pack>>28)<<3, (pack>>21)&0x38);
|
||||
|
||||
if (sx == -0x77) sx1seen|=1; // for masking mode 2
|
||||
|
||||
// check if it is on this line
|
||||
if (row < 0 || row >= ((pack>>21)&0x38)) continue; // no
|
||||
n++; // number of sprites on this line (both visible and hidden, max is 20)
|
||||
|
||||
// masking sprite?
|
||||
if (sx == -0x78) {
|
||||
if (n > 0) break; // masked
|
||||
continue;
|
||||
}
|
||||
|
||||
n++; // number of sprites on this line (both visible and hidden, except of x=0)
|
||||
|
||||
// sprite limit
|
||||
ntiles += pack>>28;
|
||||
|
@ -1118,21 +1125,6 @@ static void DrawAllSprites(int *hcache, int maxwidth, int prio, int sh)
|
|||
|
||||
if (pack & 0x00800000) continue;
|
||||
|
||||
// masking sprite?
|
||||
if (sx == -0x78) {
|
||||
if(!(sx1seen&1) || sx1seen==3) {
|
||||
break; // this sprite is not drawn and remaining sprites are masked
|
||||
}
|
||||
if((sx1seen>>8) == 0) sx1seen=(i+1)<<8;
|
||||
continue;
|
||||
}
|
||||
else if (sx == -0x77) {
|
||||
// masking mode2 (Outrun, Galaxy Force II, Shadow of the beast)
|
||||
if(sx1seen>>8) { i=(sx1seen>>8)-1; break; } // seen both 0 and 1
|
||||
sx1seen |= 2;
|
||||
continue;
|
||||
}
|
||||
|
||||
// accurate sprites
|
||||
//dprintf("P:%i",((sx>>15)&1));
|
||||
if (rs & PDRAW_ACC_SPRITES) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue