diff --git a/source/build/include/build.h b/source/build/include/build.h index 3810042e7..8e37a42e2 100644 --- a/source/build/include/build.h +++ b/source/build/include/build.h @@ -1157,9 +1157,6 @@ static FORCE_INLINE void rotatesprite_win(int32_t sx, int32_t sy, int32_t z, int rotatesprite_(sx, sy, z, a, picnum, dashade, dapalnum, dastat, 0, 0, windowxy1.x,windowxy1.y,windowxy2.x,windowxy2.y); } -void bfirst_search_init(int16_t * const list, uint8_t * const bitmap, int32_t * const eltnumptr, int const maxelts, int const firstelt); -void bfirst_search_try(int16_t * const list, uint8_t * const bitmap, int32_t * const eltnumptr, int const elt); - void getzrange(const vec3_t *pos, int16_t sectnum, int32_t *ceilz, int32_t *ceilhit, int32_t *florz, int32_t *florhit, int32_t walldist, uint32_t cliptype) ATTRIBUTE((nonnull(1,3,4,5,6))); int32_t hitscan(const vec3_t *sv, int16_t sectnum, int32_t vx, int32_t vy, int32_t vz, diff --git a/source/build/include/compat.h b/source/build/include/compat.h index a45d3160f..b5186304d 100644 --- a/source/build/include/compat.h +++ b/source/build/include/compat.h @@ -1138,9 +1138,35 @@ CONSTEXPR size_t logbasenegative(T n) #endif +////////// Bitfield manipulation ////////// + +static FORCE_INLINE void bitmap_set(uint8_t *const ptr, int const n) { ptr[n >> 3] |= 1 << (n & 7); } +static FORCE_INLINE void bitmap_clear(uint8_t *const ptr, int const n) { ptr[n >> 3] &= ~(1 << (n & 7)); } +static FORCE_INLINE CONSTEXPR char bitmap_test(uint8_t const *const ptr, int const n) { return ptr[n >> 3] & (1 << (n & 7)); } ////////// Utility functions ////////// +// breadth-first search helpers +template +void bfirst_search_init(T *const list, uint8_t *const bitmap, T *const eltnumptr, int const maxelts, int const firstelt) +{ + Bmemset(bitmap, 0, (maxelts+7)>>3); + + list[0] = firstelt; + bitmap_set(bitmap, firstelt); + *eltnumptr = 1; +} + +template +void bfirst_search_try(T *const list, uint8_t *const bitmap, T *const eltnumptr, int const elt) +{ + if (!bitmap_test(bitmap, elt)) + { + bitmap_set(bitmap, elt); + list[(*eltnumptr)++] = elt; + } +} + #if RAND_MAX == 32767 static FORCE_INLINE uint16_t system_15bit_rand(void) { return (uint16_t)rand(); } #else // RAND_MAX > 32767, assumed to be of the form 2^k - 1 @@ -1168,12 +1194,6 @@ static inline void append_ext_UNSAFE(char *outbuf, const char *ext) Bstrcpy(p, ext); } -////////// Bitfield manipulation ////////// - -static FORCE_INLINE void bitmap_set(uint8_t *const ptr, int const n) { ptr[n >> 3] |= 1 << (n & 7); } -static FORCE_INLINE void bitmap_clear(uint8_t *const ptr, int const n) { ptr[n >> 3] &= ~(1 << (n & 7)); } -static FORCE_INLINE CONSTEXPR char bitmap_test(uint8_t const *const ptr, int const n) { return ptr[n >> 3] & (1 << (n & 7)); } - /* Begin dependence on compat.o object. */ diff --git a/source/build/src/clip.cpp b/source/build/src/clip.cpp index 0b469dcff..cdce22535 100644 --- a/source/build/src/clip.cpp +++ b/source/build/src/clip.cpp @@ -933,7 +933,7 @@ static void clipupdatesector(vec2_t const &pos, int16_t * const sectnum, int con static int16_t sectlist[MAXSECTORS]; static uint8_t sectbitmap[(MAXSECTORS+7)>>3]; - int32_t nsecs; + int16_t nsecs; bfirst_search_init(sectlist, sectbitmap, &nsecs, MAXCLIPSECTORS, *sectnum); diff --git a/source/build/src/engine.cpp b/source/build/src/engine.cpp index 9d1261b80..9e24d6eaa 100644 --- a/source/build/src/engine.cpp +++ b/source/build/src/engine.cpp @@ -11007,25 +11007,6 @@ int32_t lastwall(int16_t point) return point; } -// breadth-first search helpers -void bfirst_search_init(int16_t * const list, uint8_t * const bitmap, int32_t * const eltnumptr, int const maxelts, int const firstelt) -{ - Bmemset(bitmap, 0, (maxelts+7)>>3); - - list[0] = firstelt; - bitmap_set(bitmap, firstelt); - *eltnumptr = 1; -} - -void bfirst_search_try(int16_t * const list, uint8_t * const bitmap, int32_t * const eltnumptr, int const elt) -{ - if (elt >= 0 && bitmap_test(bitmap, elt)==0) - { - bitmap_set(bitmap, elt); - list[(*eltnumptr)++] = elt; - } -} - ////////// UPDATESECTOR* FAMILY OF FUNCTIONS ////////// /* Different "is inside" predicates. @@ -11121,7 +11102,7 @@ void updatesector(int32_t const x, int32_t const y, int16_t * const sectnum) static int16_t sectlist[MAXSECTORS]; static uint8_t sectbitmap[(MAXSECTORS+7)>>3]; - int32_t nsecs; + int16_t nsecs; bfirst_search_init(sectlist, sectbitmap, &nsecs, MAXSECTORS, initialsectnum); @@ -11220,7 +11201,7 @@ void updatesectorz(int32_t const x, int32_t const y, int32_t const z, int16_t * static int16_t sectlist[MAXSECTORS]; static uint8_t sectbitmap[(MAXSECTORS+7)>>3]; - int32_t nsecs; + int16_t nsecs; bfirst_search_init(sectlist, sectbitmap, &nsecs, MAXSECTORS, correctedsectnum); diff --git a/source/duke3d/src/astub.cpp b/source/duke3d/src/astub.cpp index d901d248d..687b1e2d6 100644 --- a/source/duke3d/src/astub.cpp +++ b/source/duke3d/src/astub.cpp @@ -6718,7 +6718,7 @@ static void Keys3d(void) static int16_t sectlist[MAXSECTORS]; static uint8_t sectbitmap[(MAXSECTORS+7)>>3]; - int32_t sectcnt, sectnum; + int16_t sectcnt, sectnum; i = searchsector; if (CEILINGFLOOR(i, stat)&1) diff --git a/source/duke3d/src/m32exec.cpp b/source/duke3d/src/m32exec.cpp index fc2797cc0..7b56e1aab 100644 --- a/source/duke3d/src/m32exec.cpp +++ b/source/duke3d/src/m32exec.cpp @@ -1235,7 +1235,7 @@ skip_check: const int32_t o_g_st=vm.g_st, arsize = gar->size; instype *const end=insptr; - int32_t sectcnt, numsects=0; + int16_t sectcnt, numsects=0; // XXX: relies on -fno-strict-aliasing int16_t *const sectlist = (int16_t *)gar->vals; // actually an int32_t array