From 7ffa94d417a95b17bc2a33ebc405d4e203a81f22 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 23 Oct 2022 22:52:05 +0200 Subject: [PATCH] - move the clip object collection loop into its own function. --- source/build/src/clip.cpp | 38 +-------------------------- source/core/gamefuncs.cpp | 55 +++++++++++++++++++++++++++++++++++---- source/core/gamefuncs.h | 7 +---- 3 files changed, 52 insertions(+), 48 deletions(-) diff --git a/source/build/src/clip.cpp b/source/build/src/clip.cpp index 06d22e009..711ebb1f6 100644 --- a/source/build/src/clip.cpp +++ b/source/build/src/clip.cpp @@ -111,8 +111,6 @@ CollisionBase clipmove_(vec3_t * const pos, int * const sectnum, int32_t xvect, int const initialsectnum = *sectnum; - int32_t const dasprclipmask = (cliptype >> 16); // CLIPMASK1 = 0x01000040 - vec2_t const move = { xvect, yvect }; vec2_t goal = { pos->X + (xvect >> 14), pos->Y + (yvect >> 14) }; vec2_t const cent = { (pos->X + goal.X) >> 1, (pos->Y + goal.Y) >> 1 }; @@ -137,41 +135,7 @@ 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; - while (auto sect = clip.search.GetNext()) - { - processClipWalls(clip, sect); - - if (dasprclipmask==0) - continue; - - TSectIterator it(sect); - while (auto actor = it.Next()) - { - int cstat = actor->spr.cstat; - - if (actor->spr.cstat2 & CSTAT2_SPRITE_NOFIND) continue; - if ((cstat & dasprclipmask) == 0) - continue; - - switch (cstat & (CSTAT_SPRITE_ALIGNMENT_MASK)) - { - case CSTAT_SPRITE_ALIGNMENT_FACING: - processClipFaceSprite(clip, actor); - break; - - case CSTAT_SPRITE_ALIGNMENT_WALL: - processClipWallSprite(clip, actor); - break; - - case CSTAT_SPRITE_ALIGNMENT_FLOOR: - processClipFloorSprite(clip, actor); - break; - - case CSTAT_SPRITE_ALIGNMENT_SLOPE: - processClipSlopeSprite(clip, actor); - } - } - } + collectClipObjects(clip, (cliptype >> 16)); int32_t hitwalls[4], hitwall; CollisionBase clipReturn{}; diff --git a/source/core/gamefuncs.cpp b/source/core/gamefuncs.cpp index de7ebabeb..dcc0e2ab3 100644 --- a/source/core/gamefuncs.cpp +++ b/source/core/gamefuncs.cpp @@ -1362,7 +1362,7 @@ static void addWallToClipSet(MoveClipper& clip, walltype* wal) // //========================================================================== -void processClipWalls(MoveClipper& clip, sectortype* sec) +static void processClipWalls(MoveClipper& clip, sectortype* sec) { for(auto& wal : wallsofsector(sec)) { @@ -1385,7 +1385,7 @@ void processClipWalls(MoveClipper& clip, sectortype* sec) // //========================================================================== -void processClipFaceSprite(MoveClipper& clip, DCoreActor* actor) +static void processClipFaceSprite(MoveClipper& clip, DCoreActor* actor) { auto spos = actor->spr.pos; if (!PointInRect(spos.XY(), clip.rect.min, clip.rect.max)) return; // are we outside this sprite's bounding box? @@ -1409,7 +1409,7 @@ void processClipFaceSprite(MoveClipper& clip, DCoreActor* actor) // //========================================================================== -void processClipWallSprite(MoveClipper& clip, DCoreActor* actor) +static void processClipWallSprite(MoveClipper& clip, DCoreActor* actor) { auto spos = actor->spr.pos; double height, z = spos.Z + actor->GetOffsetAndHeight(height); @@ -1456,7 +1456,7 @@ void processClipWallSprite(MoveClipper& clip, DCoreActor* actor) // //========================================================================== -bool processClipFloorSprite(MoveClipper& clip, DCoreActor* actor, DVector2* points, double* heights) +static bool processClipFloorSprite(MoveClipper& clip, DCoreActor* actor, DVector2* points, double* heights) { int heinum = spriteGetSlope(actor); double sprz = spriteGetZOfSlopef(&actor->spr, actor->spr.pos, heinum); @@ -1511,7 +1511,7 @@ bool processClipFloorSprite(MoveClipper& clip, DCoreActor* actor, DVector2* poin // //========================================================================== -void processClipSlopeSprite(MoveClipper& clip, DCoreActor* actor) +static void processClipSlopeSprite(MoveClipper& clip, DCoreActor* actor) { auto spos = actor->spr.pos; DVector2 points[4]; @@ -1559,6 +1559,51 @@ void processClipSlopeSprite(MoveClipper& clip, DCoreActor* actor) // //========================================================================== +void collectClipObjects(MoveClipper& clip, int spritemask) +{ + while (auto sect = clip.search.GetNext()) + { + processClipWalls(clip, sect); + + if (spritemask == 0) + continue; + + TSectIterator it(sect); + while (auto actor = it.Next()) + { + int cstat = actor->spr.cstat; + + if (actor->spr.cstat2 & CSTAT2_SPRITE_NOFIND) continue; + if ((cstat & spritemask) == 0) + continue; + + switch (cstat & (CSTAT_SPRITE_ALIGNMENT_MASK)) + { + case CSTAT_SPRITE_ALIGNMENT_FACING: + processClipFaceSprite(clip, actor); + break; + + case CSTAT_SPRITE_ALIGNMENT_WALL: + processClipWallSprite(clip, actor); + break; + + case CSTAT_SPRITE_ALIGNMENT_FLOOR: + processClipFloorSprite(clip, actor, nullptr, nullptr); + break; + + case CSTAT_SPRITE_ALIGNMENT_SLOPE: + processClipSlopeSprite(clip, actor); + } + } + } +} + +//========================================================================== +// +// +// +//========================================================================== + bool isAwayFromWall(DCoreActor* ac, double delta) { sectortype* s1; diff --git a/source/core/gamefuncs.h b/source/core/gamefuncs.h index a1717f252..1e0bcc4cb 100644 --- a/source/core/gamefuncs.h +++ b/source/core/gamefuncs.h @@ -308,15 +308,10 @@ struct MoveClipper MoveClipper(sectortype* start) : search(start) {} }; -void processClipWalls(MoveClipper& clip, sectortype* sec); +void collectClipObjects(MoveClipper& clip, int spritemask); -void processClipFaceSprite(MoveClipper& clip, DCoreActor* actor); -void processClipWallSprite(MoveClipper& clip, DCoreActor* actor); -bool processClipFloorSprite(MoveClipper& clip, DCoreActor* actor, DVector2* points = nullptr, double* heights = nullptr); -void processClipSlopeSprite(MoveClipper& clip, DCoreActor* actor); int FindBestSector(const DVector3& pos); - tspritetype* renderAddTsprite(tspriteArray& tsprites, DCoreActor* actor); void setWallSectors();