Sanitize drawing sprites at different levels with TROR/classic. This should fix

most problems where sprites appear to be drawn through walls.

git-svn-id: https://svn.eduke32.com/eduke32@2046 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2011-09-28 20:30:41 +00:00
parent bb72f803c4
commit 58fc90f77d
1 changed files with 54 additions and 33 deletions

View File

@ -275,7 +275,8 @@ int32_t yax_globalbunch = -1;
// i<MAXDRAWS: MAXDRAWS-i-1 is level towards ceiling // i<MAXDRAWS: MAXDRAWS-i-1 is level towards ceiling
// i>MAXDRAWS: i-MAXDRAWS-1 is level towards floor // i>MAXDRAWS: i-MAXDRAWS-1 is level towards floor
static int16_t yax_spritesortcnt[1 + 2*YAX_MAXDRAWS]; static int16_t yax_spritesortcnt[1 + 2*YAX_MAXDRAWS];
static int16_t yax_tsprite[1 + 2*YAX_MAXDRAWS][MAXSPRITESONSCREEN]; static uint16_t yax_tsprite[1 + 2*YAX_MAXDRAWS][MAXSPRITESONSCREEN];
static uint8_t yax_tsprfrombunch[1 + 2*YAX_MAXDRAWS][MAXSPRITESONSCREEN];
// drawn sectors // drawn sectors
uint8_t yax_gotsector[MAXSECTORS>>3]; // engine internal uint8_t yax_gotsector[MAXSECTORS>>3]; // engine internal
@ -683,41 +684,47 @@ static void yax_tweakpicnums(int32_t bunchnum, int32_t cf, int32_t restore)
} }
} }
static void yax_copytsprite(int32_t curbunchnum, int32_t resetsortcnt) static void yax_copytsprites()
{ {
int32_t i, spritenum, gotthrough, sectnum, cf; int32_t i, spritenum, gotthrough, sectnum;
int32_t sortcnt = yax_spritesortcnt[yax_globallev]; int32_t sortcnt = yax_spritesortcnt[yax_globallev];
const spritetype *spr; const spritetype *spr;
if (resetsortcnt)
spritesortcnt = 0;
for (i=0; i<sortcnt; i++) for (i=0; i<sortcnt; i++)
{ {
spritenum = yax_tsprite[yax_globallev][i]; spritenum = yax_tsprite[yax_globallev][i];
gotthrough = spritenum&((MAXSPRITES<<1)+MAXSPRITES); gotthrough = spritenum&(MAXSPRITES|(MAXSPRITES<<1));
spritenum &= MAXSPRITES-1; spritenum &= MAXSPRITES-1;
spr = &sprite[spritenum]; spr = &sprite[spritenum];
sectnum = spr->sectnum; sectnum = spr->sectnum;
cf = -1; if (gotthrough == (MAXSPRITES|(MAXSPRITES<<1)))
if (gotthrough & MAXSPRITES) {
if (yax_globalbunch != yax_tsprfrombunch[yax_globallev][i])
continue;
}
else
{
int32_t cf = -1;
if (gotthrough == MAXSPRITES)
cf = YAX_CEILING; // sprite got here through the ceiling of lower sector cf = YAX_CEILING; // sprite got here through the ceiling of lower sector
else if (gotthrough & (MAXSPRITES<<1)) else if (gotthrough == (MAXSPRITES<<1))
cf = YAX_FLOOR; // sprite got here through the floor of upper sector cf = YAX_FLOOR; // sprite got here through the floor of upper sector
if (cf != -1) if (cf != -1)
{ {
if ((yax_globallev-YAX_MAXDRAWS)*(-1 + 2*cf) > 0) if ((yax_globallev-YAX_MAXDRAWS)*(-1 + 2*cf) > 0)
if (yax_getbunch(sectnum, cf) != curbunchnum) if (yax_getbunch(sectnum, cf) != yax_globalbunch)
continue; continue;
sectnum = yax_getneighborsect(spr->x, spr->y, sectnum, cf, NULL); sectnum = yax_getneighborsect(spr->x, spr->y, sectnum, cf, NULL);
if (sectnum < 0) if (sectnum < 0)
continue; continue;
} }
}
if (spritesortcnt >= MAXSPRITESONSCREEN) if (spritesortcnt >= MAXSPRITESONSCREEN)
break; break;
@ -726,7 +733,7 @@ static void yax_copytsprite(int32_t curbunchnum, int32_t resetsortcnt)
spriteext[spritenum].tspr = &tsprite[spritesortcnt]; spriteext[spritenum].tspr = &tsprite[spritesortcnt];
tsprite[spritesortcnt].owner = spritenum; tsprite[spritesortcnt].owner = spritenum;
tsprite[spritesortcnt].sectnum = sectnum; // tweak sectnum! tsprite[spritesortcnt].sectnum = sectnum; // potentially tweak sectnum!
spritesortcnt++; spritesortcnt++;
} }
} }
@ -861,14 +868,17 @@ void yax_drawrooms(void (*ExtAnalyzeSprites)(void), int32_t horiz, int16_t sectn
if (lev != YAX_MAXDRAWS-1) if (lev != YAX_MAXDRAWS-1)
{ {
#ifdef YAX_DEBUG
int32_t odsprcnt = yax_spritesortcnt[yax_globallev];
#endif
// +MAXSECTORS: force // +MAXSECTORS: force
drawrooms(globalposx,globalposy,globalposz,globalang,horiz,k+MAXSECTORS); drawrooms(globalposx,globalposy,globalposz,globalang,horiz,k+MAXSECTORS);
if (numhere > 1) if (numhere > 1)
for (i=0; i<(numsectors+7)>>3; i++) for (i=0; i<(numsectors+7)>>3; i++)
lgotsector[i] |= gotsector[i]; lgotsector[i] |= gotsector[i];
yaxdebug("l%d: faked sec %3d (bunch %2d),%3d dspr, ob=[%2d,%2d], sn=%3d, %.3f ms", yaxdebug("l%d: faked (bn %2d) sec %4d,%3d dspr, ob=[%2d,%2d], sn=%4d, %.3f ms",
yax_globallev-YAX_MAXDRAWS, k, j, yax_spritesortcnt[yax_globallev], yax_globallev-YAX_MAXDRAWS, j, k, yax_spritesortcnt[yax_globallev]-odsprcnt,
ourbunch[0],ourbunch[1],sectnum, ourbunch[0],ourbunch[1],sectnum,
(double)(1000*(gethiticks()-t))/hitickspersec); (double)(1000*(gethiticks()-t))/hitickspersec);
} }
@ -950,12 +960,12 @@ void yax_drawrooms(void (*ExtAnalyzeSprites)(void), int32_t horiz, int16_t sectn
yax_nomaskpass = nmp; yax_nomaskpass = nmp;
drawrooms(globalposx,globalposy,globalposz,globalang,horiz,k+MAXSECTORS); // +MAXSECTORS: force drawrooms(globalposx,globalposy,globalposz,globalang,horiz,k+MAXSECTORS); // +MAXSECTORS: force
yaxdebug("l%d nm%d: DRAWN sec %3d (bn %2d),%3d tspr, %.3f ms",
yax_globallev-YAX_MAXDRAWS, nmp, k, j, spritesortcnt,
(double)(1000*(gethiticks()-t))/hitickspersec);
if (nmp==1) if (nmp==1)
{ {
yaxdebug("nm1 l%d: DRAWN (bn %2d) sec %4d, %.3f ms",
yax_globallev-YAX_MAXDRAWS, j, k,
(double)(1000*(gethiticks()-t))/hitickspersec);
if (!yax_nomaskdidit) if (!yax_nomaskdidit)
{ {
yax_nomaskpass = 0; yax_nomaskpass = 0;
@ -965,7 +975,12 @@ void yax_drawrooms(void (*ExtAnalyzeSprites)(void), int32_t horiz, int16_t sectn
} }
} }
yax_copytsprite(j, !scansector_collectsprites); if (!scansector_collectsprites)
spritesortcnt = 0;
yax_copytsprites();
yaxdebug("nm0 l%d: DRAWN (bn %2d) sec %4d,%3d tspr, %.3f ms",
yax_globallev-YAX_MAXDRAWS, j, k, spritesortcnt,
(double)(1000*(gethiticks()-t))/hitickspersec);
ExtAnalyzeSprites(); ExtAnalyzeSprites();
drawmasks(); drawmasks();
@ -987,10 +1002,11 @@ void yax_drawrooms(void (*ExtAnalyzeSprites)(void), int32_t horiz, int16_t sectn
// draw base level // draw base level
drawrooms(globalposx,globalposy,globalposz,globalang,horiz,osectnum); drawrooms(globalposx,globalposy,globalposz,globalang,horiz,osectnum);
yaxdebug("DRAWN base level sec %d, %.3f ms", osectnum, // if (scansector_collectsprites)
(double)(1000*(gethiticks()-t))/hitickspersec); // spritesortcnt = 0;
yax_copytsprites();
yax_copytsprite(-1, scansector_collectsprites); yaxdebug("DRAWN base level sec %d,%3d tspr, %.3f ms", osectnum,
spritesortcnt, (double)(1000*(gethiticks()-t))/hitickspersec);
scansector_collectsprites = 1; scansector_collectsprites = 1;
for (cf=0; cf<2; cf++) for (cf=0; cf<2; cf++)
@ -2245,6 +2261,11 @@ int32_t engine_addtsprite(int16_t z, int16_t sectnum)
return 0; return 0;
yax_tsprite[yax_globallev][*sortcnt] = z; yax_tsprite[yax_globallev][*sortcnt] = z;
if (yax_globalbunch >= 0)
{
yax_tsprite[yax_globallev][*sortcnt] |= (MAXSPRITES|(MAXSPRITES<<1));
yax_tsprfrombunch[yax_globallev][*sortcnt] = yax_globalbunch;
}
(*sortcnt)++; (*sortcnt)++;
// now check whether the tsprite needs duplication into another level // now check whether the tsprite needs duplication into another level