From 6c2547100881ecd80f3172ab346483bc82f40c5a Mon Sep 17 00:00:00 2001 From: notaz Date: Sat, 5 Apr 2008 19:49:15 +0000 Subject: [PATCH] sprite masking fixed according to Lordus expl. git-svn-id: file:///home/notaz/opt/svn/PicoDrive@414 be3aeb3a-fb24-0410-a615-afba39da0efa --- Pico/Draw.c | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/Pico/Draw.c b/Pico/Draw.c index 45727108..0d7f89be 100644 --- a/Pico/Draw.c +++ b/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) { -- 2.39.5