- move the clip object collection loop into its own function.

This commit is contained in:
Christoph Oelckers 2022-10-23 22:52:05 +02:00
parent 8baf4b539c
commit 7ffa94d417
3 changed files with 52 additions and 48 deletions

View file

@ -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<DCoreActor> 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{};

View file

@ -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<DCoreActor> 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;

View file

@ -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();