From 8baf4b539c69d4d87226eca3264cf563e176ff17 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 | 66 ++++++------------------------------ 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(+), 71 deletions(-) diff --git a/source/build/include/build.h b/source/build/include/build.h index 4577e8e67..915c5721c 100644 --- a/source/build/include/build.h +++ b/source/build/include/build.h @@ -27,7 +27,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 242fb9010..06d22e009 100644 --- a/source/build/src/clip.cpp +++ b/source/build/src/clip.cpp @@ -7,24 +7,12 @@ // by the EDuke32 team (development@voidpoint.com) #include "build.h" -#include "clip.h" #include "printf.h" #include "gamefuncs.h" #include "coreactor.h" enum { MAXCLIPDIST = 1024 }; -static int32_t clipsectnum, origclipsectnum, clipspritenum; -int clipsectorlist[MAXCLIPSECTORS]; -static int origclipsectorlist[MAXCLIPSECTORS]; - -BitArray clipsectormap; - -int32_t quickloadboard=0; - -////////// CLIPMOVE ////////// -inline uint8_t bitmap_test(uint8_t const* const ptr, int const n) { return ptr[n >> 3] & (1 << (n & 7)); } - // // clipinsideboxline // @@ -34,24 +22,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) // @@ -141,7 +111,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 }; @@ -154,12 +123,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; @@ -168,30 +137,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; @@ -218,7 +171,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{}; @@ -309,10 +262,11 @@ CollisionBase clipmove_(vec3_t * const pos, int * const sectnum, int32_t xvect, { DVector3 fpos(pos->X* inttoworld, pos->Y* inttoworld, pos->Z* inttoworld); - 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 66e639f7d..c67d9ef5e 100644 --- a/source/core/maploader.cpp +++ b/source/core/maploader.cpp @@ -49,8 +49,6 @@ #include "interpolate.h" #include "games/blood/src/mapstructs.h" -extern BitArray clipsectormap; - TArray sector; TArray wall; @@ -408,7 +406,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);