mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-24 10:40:46 +00:00
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:
parent
bb72f803c4
commit
58fc90f77d
1 changed files with 54 additions and 33 deletions
|
@ -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)
|
|
||||||
cf = YAX_CEILING; // sprite got here through the ceiling of lower sector
|
|
||||||
else if (gotthrough & (MAXSPRITES<<1))
|
|
||||||
cf = YAX_FLOOR; // sprite got here through the floor of upper sector
|
|
||||||
|
|
||||||
if (cf != -1)
|
|
||||||
{
|
{
|
||||||
if ((yax_globallev-YAX_MAXDRAWS)*(-1 + 2*cf) > 0)
|
if (yax_globalbunch != yax_tsprfrombunch[yax_globallev][i])
|
||||||
if (yax_getbunch(sectnum, cf) != curbunchnum)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
sectnum = yax_getneighborsect(spr->x, spr->y, sectnum, cf, NULL);
|
|
||||||
if (sectnum < 0)
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int32_t cf = -1;
|
||||||
|
|
||||||
|
if (gotthrough == MAXSPRITES)
|
||||||
|
cf = YAX_CEILING; // sprite got here through the ceiling of lower sector
|
||||||
|
else if (gotthrough == (MAXSPRITES<<1))
|
||||||
|
cf = YAX_FLOOR; // sprite got here through the floor of upper sector
|
||||||
|
|
||||||
|
if (cf != -1)
|
||||||
|
{
|
||||||
|
if ((yax_globallev-YAX_MAXDRAWS)*(-1 + 2*cf) > 0)
|
||||||
|
if (yax_getbunch(sectnum, cf) != yax_globalbunch)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
sectnum = yax_getneighborsect(spr->x, spr->y, sectnum, cf, NULL);
|
||||||
|
if (sectnum < 0)
|
||||||
|
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
|
||||||
|
|
Loading…
Reference in a new issue