mirror of
https://github.com/ZDoom/Raze.git
synced 2025-03-23 01:11:30 +00:00
- added sorting for wall sprites attached to non-orthogonal walls.
This commit is contained in:
parent
ecb2732629
commit
9375750a17
5 changed files with 36 additions and 2 deletions
|
@ -520,12 +520,20 @@ void HWDrawInfo::RenderScene(FRenderState &state)
|
|||
drawlists[GLDL_MASKEDFLATS].SortFlats(this);
|
||||
drawlists[GLDL_MASKEDWALLSV].SortWallsHorz(this);
|
||||
drawlists[GLDL_MASKEDWALLSH].SortWallsVert(this);
|
||||
drawlists[GLDL_MASKEDWALLSD].SortWallsDiag(this);
|
||||
|
||||
|
||||
// these lists are only wall and floor sprites - often attached to walls and floors - so they need to be offset from the plane they may be attached to.
|
||||
drawlists[GLDL_MASKEDWALLSS].DrawWalls(this, state, false);
|
||||
|
||||
// Each list must draw both its passes before the next one to ensure proper depth buffer contents.
|
||||
state.SetDepthMask(false);
|
||||
drawlists[GLDL_MASKEDWALLSD].DrawWalls(this, state, false);
|
||||
state.SetDepthMask(true);
|
||||
state.SetColorMask(false);
|
||||
drawlists[GLDL_MASKEDWALLSD].DrawWalls(this, state, false);
|
||||
state.SetColorMask(true);
|
||||
|
||||
state.SetDepthMask(false);
|
||||
drawlists[GLDL_MASKEDWALLSV].DrawWalls(this, state, false);
|
||||
state.SetDepthMask(true);
|
||||
|
|
|
@ -75,7 +75,8 @@ enum DrawListType
|
|||
GLDL_PLAINWALLS,
|
||||
GLDL_PLAINFLATS,
|
||||
GLDL_MASKEDWALLS,
|
||||
GLDL_MASKEDWALLSS, // arbitrary wall sprites.
|
||||
GLDL_MASKEDWALLSS, // arbitrary wall sprites, not attached to walls
|
||||
GLDL_MASKEDWALLSD, // arbitrary wall sprites, attached to walls.
|
||||
GLDL_MASKEDWALLSV, // vertical wall sprites
|
||||
GLDL_MASKEDWALLSH, // horizontal wall sprites. These two lists merely exist for easier sorting.
|
||||
GLDL_MASKEDFLATS,
|
||||
|
|
|
@ -910,6 +910,30 @@ void HWDrawList::SortWallsHorz(HWDrawInfo* di)
|
|||
}
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// all we need to do here is to group the sprites by wall.
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
void HWDrawList::SortWallsDiag(HWDrawInfo* di)
|
||||
{
|
||||
auto viewx = di->Viewpoint.Pos.X;
|
||||
if (drawitems.Size() > 1)
|
||||
{
|
||||
std::sort(drawitems.begin(), drawitems.end(), [=](const HWDrawItem& a, const HWDrawItem& b)
|
||||
{
|
||||
HWWall* w1 = walls[a.index];
|
||||
HWWall* w2 = walls[b.index];
|
||||
if (w1->walldist != w2->walldist) return w1->walldist < w2->walldist;
|
||||
int time1 = w1->Sprite ? w1->Sprite->time : -1;
|
||||
int time2 = w2->Sprite ? w2->Sprite->time : -1;
|
||||
return time1 < time2;
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
//
|
||||
|
|
|
@ -93,6 +93,7 @@ public:
|
|||
HWFlat *NewFlat(bool slopespr = false);
|
||||
HWSprite *NewSprite();
|
||||
void Reset();
|
||||
void SortWallsDiag(HWDrawInfo* di);
|
||||
void SortWallsHorz(HWDrawInfo* di);
|
||||
void SortWallsVert(HWDrawInfo* di);
|
||||
void SortFlats(HWDrawInfo* di);
|
||||
|
|
|
@ -53,7 +53,7 @@ void HWDrawInfo::AddWall(HWWall *wall)
|
|||
else if (wall->Sprite == nullptr) list = GLDL_MASKEDWALLS;
|
||||
else if (wall->glseg.x1 == wall->glseg.x2) list = GLDL_MASKEDWALLSV;
|
||||
else if (wall->glseg.y1 == wall->glseg.y2) list = GLDL_MASKEDWALLSH;
|
||||
else list = GLDL_MASKEDWALLSS;
|
||||
else list = wall->walldist? GLDL_MASKEDWALLSD : GLDL_MASKEDWALLSS;
|
||||
auto newwall = drawlists[list].NewWall();
|
||||
*newwall = *wall;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue