mirror of
https://github.com/ZDoom/Raze.git
synced 2024-11-15 08:51:24 +00:00
- replaced sectordist with a floating point variant with better precision.
This commit is contained in:
parent
b31e6c0bdf
commit
e1eb54ecda
3 changed files with 19 additions and 43 deletions
|
@ -172,7 +172,6 @@ inline void updatesectorz(int32_t const x, int32_t const y, int32_t const z, sec
|
||||||
void updatesectorneighbor(int32_t const x, int32_t const y, int * const sectnum, int32_t maxDistance = MAXUPDATESECTORDIST) ATTRIBUTE((nonnull(3)));
|
void updatesectorneighbor(int32_t const x, int32_t const y, int * const sectnum, int32_t maxDistance = MAXUPDATESECTORDIST) ATTRIBUTE((nonnull(3)));
|
||||||
|
|
||||||
|
|
||||||
int32_t getsectordist(vec2_t const in, int const sectnum, vec2_t * const out = nullptr);
|
|
||||||
extern const int16_t *chsecptr_onextwall;
|
extern const int16_t *chsecptr_onextwall;
|
||||||
|
|
||||||
inline int32_t krand(void)
|
inline int32_t krand(void)
|
||||||
|
|
|
@ -413,11 +413,11 @@ static void clipupdatesector(vec2_t const pos, int * const sectnum, int walldist
|
||||||
if (inside_p(pos.X, pos.Y, *sectnum))
|
if (inside_p(pos.X, pos.Y, *sectnum))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int16_t nsecs = min<int16_t>(getsectordist(pos, *sectnum), INT16_MAX);
|
double nsecs = SquareDistToSector(pos.X * inttoworld, pos.Y * inttoworld, §or[*sectnum]);
|
||||||
|
|
||||||
if (nsecs > (walldist + 8))
|
double wd = (walldist + 8) * inttoworld; wd *= wd;
|
||||||
|
if (nsecs > wd)
|
||||||
{
|
{
|
||||||
Printf("%s(): initial position (%d, %d) not within initial sector %d; shortest distance %d.\n", __func__, pos.X, pos.Y, *sectnum, nsecs);
|
|
||||||
walldist = 0x7fff;
|
walldist = 0x7fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1057,9 +1057,13 @@ void getzrange(const vec3_t& pos, sectortype* sect, int32_t* ceilz, CollisionBas
|
||||||
vec2_t closest = pos.vec2;
|
vec2_t closest = pos.vec2;
|
||||||
int sectnum = ::sectnum(sect);
|
int sectnum = ::sectnum(sect);
|
||||||
if (enginecompatibility_mode == ENGINECOMPATIBILITY_NONE)
|
if (enginecompatibility_mode == ENGINECOMPATIBILITY_NONE)
|
||||||
getsectordist(closest, sectnum, &closest);
|
{
|
||||||
else
|
DVector2 v;
|
||||||
getzsofslopeptr(sect,closest.X,closest.Y,ceilz,florz);
|
SquareDistToSector(closest.X * inttoworld, closest.Y * inttoworld, §or[sectnum], &v);
|
||||||
|
closest = { int(v.X * worldtoint), int(v.Y * worldtoint) };
|
||||||
|
}
|
||||||
|
|
||||||
|
getzsofslopeptr(sect,closest.X,closest.Y,ceilz,florz);
|
||||||
ceilhit.setSector(sect);
|
ceilhit.setSector(sect);
|
||||||
florhit.setSector(sect);
|
florhit.setSector(sect);
|
||||||
|
|
||||||
|
@ -1119,9 +1123,13 @@ void getzrange(const vec3_t& pos, sectortype* sect, int32_t* ceilz, CollisionBas
|
||||||
int32_t daz = 0, daz2 = 0;
|
int32_t daz = 0, daz2 = 0;
|
||||||
closest = pos.vec2;
|
closest = pos.vec2;
|
||||||
if (enginecompatibility_mode == ENGINECOMPATIBILITY_NONE)
|
if (enginecompatibility_mode == ENGINECOMPATIBILITY_NONE)
|
||||||
getsectordist(closest, nextsectno, &closest);
|
{
|
||||||
else
|
DVector2 v;
|
||||||
getzsofslopeptr(nextsect, closest.X,closest.Y, &daz,&daz2);
|
SquareDistToSector(closest.X * inttoworld, closest.Y * inttoworld, §or[nextsectno], &v);
|
||||||
|
closest = { int(v.X * worldtoint), int(v.Y * worldtoint) };
|
||||||
|
}
|
||||||
|
|
||||||
|
getzsofslopeptr(nextsect, closest.X,closest.Y, &daz,&daz2);
|
||||||
|
|
||||||
{
|
{
|
||||||
if (daz > *ceilz)
|
if (daz > *ceilz)
|
||||||
|
|
|
@ -471,42 +471,11 @@ int32_t getwalldist(vec2_t const in, int const wallnum, vec2_t * const out)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t getsectordist(vec2_t const in, int const sectnum, vec2_t * const out /*= nullptr*/)
|
|
||||||
{
|
|
||||||
if (inside_p(in.X, in.Y, sectnum))
|
|
||||||
{
|
|
||||||
if (out)
|
|
||||||
*out = in;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t distance = INT32_MAX;
|
|
||||||
|
|
||||||
vec2_t closest = {};
|
|
||||||
|
|
||||||
for (auto& wal : wallsofsector(sectnum))
|
|
||||||
{
|
|
||||||
vec2_t p;
|
|
||||||
int32_t const walldist = getwalldist(in, wallnum(&wal), &p);
|
|
||||||
|
|
||||||
if (walldist < distance)
|
|
||||||
{
|
|
||||||
distance = walldist;
|
|
||||||
closest = p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (out)
|
|
||||||
*out = closest;
|
|
||||||
|
|
||||||
return distance;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<class Inside>
|
template<class Inside>
|
||||||
void updatesectorneighborz(int32_t const x, int32_t const y, int32_t const z, int* const sectnum, int32_t maxDistance, Inside checker)
|
void updatesectorneighborz(int32_t const x, int32_t const y, int32_t const z, int* const sectnum, int32_t maxDistance, Inside checker)
|
||||||
{
|
{
|
||||||
int const initialsectnum = *sectnum;
|
int const initialsectnum = *sectnum;
|
||||||
|
double maxDist = maxDistance * inttoworld; maxDist *= maxDist;
|
||||||
|
|
||||||
if ((validSectorIndex(initialsectnum)))
|
if ((validSectorIndex(initialsectnum)))
|
||||||
{
|
{
|
||||||
|
@ -526,7 +495,7 @@ void updatesectorneighborz(int32_t const x, int32_t const y, int32_t const z, in
|
||||||
|
|
||||||
for (auto& wal : wallsofsector(listsectnum))
|
for (auto& wal : wallsofsector(listsectnum))
|
||||||
{
|
{
|
||||||
if (wal.nextsector >= 0 && (iter == 0 || getsectordist({ x, y }, wal.nextsector) <= maxDistance))
|
if (wal.nextsector >= 0 && (iter == 0 || SquareDistToSector(x * inttoworld, y * inttoworld, wal.nextSector()) <= maxDist))
|
||||||
search.Add(wal.nextsector);
|
search.Add(wal.nextsector);
|
||||||
}
|
}
|
||||||
iter++;
|
iter++;
|
||||||
|
|
Loading…
Reference in a new issue