From cbb66f8e31ea29c8ac6882c56da404c7dcd39276 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 23 Oct 2022 22:44:23 +0200 Subject: [PATCH] - use BFSSectorSearch to drive the clipmove collection loop. This gets rid of another bunch of both code and data. --- source/build/include/build.h | 1 - source/build/include/clip.h | 6 --- source/build/src/clip.cpp | 76 +++++------------------------------- source/core/coreactor.h | 3 ++ source/core/gamefuncs.cpp | 4 +- source/core/gamefuncs.h | 6 +-- source/core/maploader.cpp | 3 -- 7 files changed, 18 insertions(+), 81 deletions(-) diff --git a/source/build/include/build.h b/source/build/include/build.h index b47056601..40f3d57ce 100644 --- a/source/build/include/build.h +++ b/source/build/include/build.h @@ -26,7 +26,6 @@ typedef int64_t coord_t; #include "maptypes.h" -#include "clip.h" enum { ENGINECOMPATIBILITY_NONE = 0, diff --git a/source/build/include/clip.h b/source/build/include/clip.h index 41ab65ee1..62a37c6a6 100644 --- a/source/build/include/clip.h +++ b/source/build/include/clip.h @@ -11,12 +11,6 @@ #ifndef clip_h_ #define clip_h_ -#define MAXCLIPSECTORS 512 -#define CLIPCURBHEIGHT (1) -struct CollisionBase; - -CollisionBase clipmove_(vec3_t *const pos, int *const sectnum, int32_t xvect, int32_t yvect, int32_t const walldist, int32_t const ceildist, - int32_t const flordist, uint32_t const cliptype, int clipmoveboxtracenum = 3) ATTRIBUTE((nonnull(1, 2))); #endif diff --git a/source/build/src/clip.cpp b/source/build/src/clip.cpp index 0f4ebd576..4ae75b40c 100644 --- a/source/build/src/clip.cpp +++ b/source/build/src/clip.cpp @@ -7,7 +7,6 @@ // by the EDuke32 team (development@voidpoint.com) #include "build.h" -#include "clip.h" #include "printf.h" #include "gamefuncs.h" #include "coreactor.h" @@ -16,27 +15,6 @@ enum { MAXCLIPDIST = 1024 }; -static int32_t clipsectnum, origclipsectnum, clipspritenum; -int clipsectorlist[MAXCLIPSECTORS]; -static int origclipsectorlist[MAXCLIPSECTORS]; - -BitArray clipsectormap; - -int32_t quickloadboard=0; - -static inline int bsin(const int ang) -{ - return int(g_sinbam(ang * (1 << 21)) * 16384); -} - -static inline int bcos(const int ang) -{ - return int(g_cosbam(ang * (1 << 21)) * 16384); -} - -////////// CLIPMOVE ////////// -inline uint8_t bitmap_test(uint8_t const* const ptr, int const n) { return ptr[n >> 3] & (1 << (n & 7)); } - // // clipinsideboxline // @@ -46,24 +24,6 @@ static int clipinsideboxline(int x, int y, int x1, int y1, int x2, int y2, int w } -static inline void addclipsect(int const sectnum) -{ - if (clipsectnum < MAXCLIPSECTORS) - { - clipsectormap.Set(sectnum); - clipsectorlist[clipsectnum++] = sectnum; - } -} - - -void addClipSect(MoveClipper& clip, int sec) -{ - if (!clipsectormap[sec]) - addclipsect(sec); -} - - - // // raytrace (internal) // @@ -153,7 +113,6 @@ CollisionBase clipmove_(vec3_t * const pos, int * const sectnum, int32_t xvect, int const initialsectnum = *sectnum; - int32_t const dawalclipmask = (cliptype & 65535); // CLIPMASK0 = 0x00010001 (in desperate need of getting fixed!) int32_t const dasprclipmask = (cliptype >> 16); // CLIPMASK1 = 0x01000040 vec2_t const move = { xvect, yvect }; @@ -166,12 +125,12 @@ CollisionBase clipmove_(vec3_t * const pos, int * const sectnum, int32_t xvect, vec2_t const clipMin = { cent.X - rad, cent.Y - rad }; vec2_t const clipMax = { cent.X + rad, cent.Y + rad }; - MoveClipper clip; + MoveClipper clip(§or[initialsectnum]); clip.moveDelta = { (xvect >> 14) * inttoworld, (yvect >> 14) * inttoworld }; // beware of excess precision here! clip.rect.min = { clipMin.X * inttoworld, clipMin.Y * inttoworld }; clip.rect.max = { clipMax.X * inttoworld, clipMax.Y * inttoworld }; - clip.wallflags = EWallFlags::FromInt(dawalclipmask); + clip.wallflags = EWallFlags::FromInt(cliptype & 65535); clip.ceilingdist = ceildist * zinttoworld; clip.floordist = flordist * zinttoworld; clip.walldist = walldist * inttoworld; @@ -180,30 +139,14 @@ CollisionBase clipmove_(vec3_t * const pos, int * const sectnum, int32_t xvect, clip.center = (clip.pos.XY() + clip.dest) * 0.5; clip.movedist = clip.moveDelta.Length() + clip.walldist + 0.5 + MAXCLIPDIST * inttoworld; - int clipsectcnt = 0; - int clipspritecnt = 0; - - clipsectorlist[0] = *sectnum; - - clipsectnum = 1; - clipspritenum = 0; - - clipsectormap.Zero(); - clipsectormap.Set(*sectnum); - - do + while (auto sect = clip.search.GetNext()) { - int const dasect = clipsectorlist[clipsectcnt++]; - - ////////// Walls ////////// - processClipWalls(clip, §or[dasect]); - - ////////// Sprites ////////// + processClipWalls(clip, sect); if (dasprclipmask==0) continue; - TSectIterator it(dasect); + TSectIterator it(sect); while (auto actor = it.Next()) { int cstat = actor->spr.cstat; @@ -230,7 +173,7 @@ CollisionBase clipmove_(vec3_t * const pos, int * const sectnum, int32_t xvect, processClipSlopeSprite(clip, actor); } } - } while (clipsectcnt < clipsectnum || clipspritecnt < clipspritenum); + } int32_t hitwalls[4], hitwall; CollisionBase clipReturn{}; @@ -321,10 +264,11 @@ CollisionBase clipmove_(vec3_t * const pos, int * const sectnum, int32_t xvect, { DVector3 fpos(pos->X* inttoworld, pos->Y* inttoworld, pos->Z* zinttoworld); - for (int j=0; j clipobjects; -}; + BFSSectorSearch search; -void addClipLine(MoveClipper& clip, const DVector2& start, const DVector2& end, const CollisionBase& daoval, int nofix = false); -void addClipSect(MoveClipper& clip, int sec); + MoveClipper(sectortype* start) : search(start) {} +}; void processClipWalls(MoveClipper& clip, sectortype* sec); diff --git a/source/core/maploader.cpp b/source/core/maploader.cpp index 653b6970c..6351e350d 100644 --- a/source/core/maploader.cpp +++ b/source/core/maploader.cpp @@ -52,8 +52,6 @@ #include "buildtiles.h" #include "m_swap.h" -extern BitArray clipsectormap; - TArray sector; TArray wall; @@ -418,7 +416,6 @@ void allocateMapArrays(int numwall, int numsector, int numsprites) show2dsector.Resize(numsector); show2dwall.Resize(numwall); gotsector.Resize(numsector); - clipsectormap.Resize(numsector); mapDataArena.FreeAll(); sector.Resize(numsector);