Add clipupdatesector(), a special version of updatesector() that only searches and returns results that are already in clipsectorlist[]

git-svn-id: https://svn.eduke32.com/eduke32@7546 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2019-04-09 19:21:22 +00:00 committed by Christoph Oelckers
parent 556d2ccd83
commit 7abfcd28be
3 changed files with 47 additions and 14 deletions

View file

@ -1473,6 +1473,15 @@ extern const int32_t engine_v8;
int32_t Mulscale(int32_t a, int32_t b, int32_t sh);
#endif
static inline bool inside_p(int32_t const x, int32_t const y, int const sectnum) { return (sectnum >= 0 && inside(x, y, sectnum) == 1); }
#define SET_AND_RETURN(Lval, Rval) \
do \
{ \
(Lval) = (Rval); \
return; \
} while (0)
static inline int32_t clipmove_old(int32_t *x, int32_t *y, int32_t *z, int16_t *sectnum, int32_t xvect, int32_t yvect, int32_t walldist,
int32_t ceildist, int32_t flordist, uint32_t cliptype) ATTRIBUTE((nonnull(1,2,3,4)));

View file

@ -921,6 +921,41 @@ int sectoradjacent(int sect1, int sect2)
return 0;
}
static void clipupdatesector(int32_t const x, int32_t const y, int16_t *const sectnum)
{
if (inside_p(x, y, *sectnum))
return;
static int16_t sectlist[MAXCLIPSECTORS];
static uint8_t sectbitmap[MAXCLIPSECTORS >> 3];
int32_t nsecs;
bfirst_search_init(sectlist, sectbitmap, &nsecs, numsectors, *sectnum);
for (int sectcnt = 0; sectcnt < nsecs; sectcnt++)
{
if (inside_p(x, y, sectlist[sectcnt]))
SET_AND_RETURN(*sectnum, sectlist[sectcnt]);
auto const sec = &sector[sectlist[sectcnt]];
int const startwall = sec->wallptr;
int const endwall = sec->wallptr + sec->wallnum;
for (int j = startwall; j < endwall; j++)
if (wall[j].nextsector >= 0)
{
for (int k = 0; k < clipsectnum; k++)
if (clipsectorlist[k] == wall[j].nextsector)
{
bfirst_search_try(sectlist, sectbitmap, &nsecs, wall[j].nextsector);
break;
}
}
}
*sectnum = -1;
}
//
// clipmove
//
@ -1283,7 +1318,7 @@ int32_t clipmove(vec3_t *pos, int16_t *sectnum, int32_t xvect, int32_t yvect,
if ((tempint1^tempint2) < 0)
{
updatesector(pos->x, pos->y, sectnum);
clipupdatesector(pos->x, pos->y, sectnum);
return clipReturn;
}
}
@ -1298,7 +1333,7 @@ int32_t clipmove(vec3_t *pos, int16_t *sectnum, int32_t xvect, int32_t yvect,
}
int const osectnum = *sectnum;
updatesector(vec.x, vec.y, sectnum);
clipupdatesector(vec.x, vec.y, sectnum);
if (*sectnum == osectnum || editstatus || (*sectnum != -1 && !check_floor_curb(osectnum, *sectnum, flordist, pos->z, vec.x, vec.y)))
{
@ -1433,7 +1468,7 @@ int32_t pushmove(vec3_t *vect, int16_t *sectnum,
} while (clipinsidebox((vec2_t *)vect, i, walldist-4) != 0);
bad = -1;
k--; if (k <= 0) return bad;
updatesector(vect->x, vect->y, sectnum);
clipupdatesector(vect->x, vect->y, sectnum);
if (*sectnum < 0) return -1;
}
else

View file

@ -10964,10 +10964,6 @@ void bfirst_search_try(int16_t * const list, uint8_t * const bitmap, int32_t * c
/* Different "is inside" predicates.
* NOTE: The redundant bound checks are expected to be optimized away in the
* inlined code. */
static inline bool inside_p(int32_t const x, int32_t const y, int const sectnum)
{
return (sectnum>=0 && inside(x, y, sectnum) == 1);
}
static inline bool inside_exclude_p(int32_t const x, int32_t const y, int const sectnum, const uint8_t *excludesectbitmap)
{
@ -10982,13 +10978,6 @@ static inline bool inside_z_p(int32_t const x, int32_t const y, int32_t const z,
return (z >= cz && z <= fz && inside_p(x, y, sectnum));
}
#define SET_AND_RETURN(Lval, Rval) \
do \
{ \
(Lval) = (Rval); \
return; \
} while (0)
//
// updatesector[z]
//