diff --git a/source/build/include/build.h b/source/build/include/build.h index 674c1784c..17f9d4897 100644 --- a/source/build/include/build.h +++ b/source/build/include/build.h @@ -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))); diff --git a/source/build/src/clip.cpp b/source/build/src/clip.cpp index 8d59329af..54c8b731a 100644 --- a/source/build/src/clip.cpp +++ b/source/build/src/clip.cpp @@ -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 = §or[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 diff --git a/source/build/src/engine.cpp b/source/build/src/engine.cpp index df0ef583d..764352042 100644 --- a/source/build/src/engine.cpp +++ b/source/build/src/engine.cpp @@ -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] //