mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-11-11 07:11:39 +00:00
clipmove() improvements
This fixes an issue with clipmove() caused by sectors behind walls which were candidates for clipping not being added to the list of sectors that definitely clip the player, forcing the function to fall back to a slow, sector-by-sector brute force approach. This brute force approach has also been removed in favor of something more efficient. git-svn-id: https://svn.eduke32.com/eduke32@7398 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
00cac93851
commit
6190fbb4f2
1 changed files with 19 additions and 33 deletions
|
@ -1054,7 +1054,8 @@ int32_t clipmove(vec3_t *pos, int16_t *sectnum,
|
||||||
day = walldist; if (dx < 0) day = -day;
|
day = walldist; if (dx < 0) day = -day;
|
||||||
addclipline(x1+dax, y1+day, x2+dax, y2+day, objtype);
|
addclipline(x1+dax, y1+day, x2+dax, y2+day, objtype);
|
||||||
}
|
}
|
||||||
else if (wal->nextsector>=0)
|
|
||||||
|
if (wal->nextsector>=0)
|
||||||
{
|
{
|
||||||
for (i=clipsectnum-1; i>=0; i--)
|
for (i=clipsectnum-1; i>=0; i--)
|
||||||
if (wal->nextsector == clipsectorlist[i]) break;
|
if (wal->nextsector == clipsectorlist[i]) break;
|
||||||
|
@ -1253,40 +1254,25 @@ int32_t clipmove(vec3_t *pos, int16_t *sectnum,
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
*sectnum = -1; tempint1 = INT32_MAX;
|
updatesector(pos->x, pos->y, sectnum);
|
||||||
for (j=numsectors-1; j>=0; j--)
|
|
||||||
if (inside(pos->x, pos->y, j) == 1)
|
|
||||||
{
|
|
||||||
if (sector[j].ceilingstat&2)
|
|
||||||
tempint2 = getceilzofslope(j, pos->x, pos->y) - pos->z;
|
|
||||||
else
|
|
||||||
tempint2 = sector[j].ceilingz - pos->z;
|
|
||||||
|
|
||||||
if (tempint2 > 0)
|
j = *sectnum;
|
||||||
{
|
tempint1 = 0;
|
||||||
if (tempint2 < tempint1)
|
|
||||||
{
|
|
||||||
*sectnum = j; tempint1 = tempint2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (sector[j].floorstat&2)
|
|
||||||
tempint2 = pos->z - getflorzofslope(j, pos->x, pos->y);
|
|
||||||
else
|
|
||||||
tempint2 = pos->z - sector[j].floorz;
|
|
||||||
|
|
||||||
if (tempint2 <= 0)
|
int const floorz = (sector[j].floorstat & 2) ? getflorzofslope(j, pos->x, pos->y) : sector[j].floorz;
|
||||||
{
|
|
||||||
*sectnum = j;
|
if (pos->z + flordist - floorz <= 0)
|
||||||
return retval;
|
tempint1++;
|
||||||
}
|
else
|
||||||
if (tempint2 < tempint1)
|
{
|
||||||
{
|
int const ceilz = (sector[j].ceilingstat & 2) ? getceilzofslope(j, pos->x, pos->y) : sector[j].ceilingz;
|
||||||
*sectnum = j; tempint1 = tempint2;
|
|
||||||
}
|
if (pos->z - ceildist - ceilz > 0)
|
||||||
}
|
tempint1++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tempint1)
|
||||||
|
*sectnum = j;
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue