mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-11 15:22:16 +00:00
Distance sort sprites
This commit is contained in:
parent
83b3169ed5
commit
dc0e6d40a4
2 changed files with 51 additions and 1 deletions
|
@ -47,6 +47,10 @@ void RenderPolyBsp::Render()
|
|||
SolidSegments.push_back({ -0x7fff, 0 });
|
||||
SolidSegments.push_back({ viewwidth, 0x7fff });
|
||||
|
||||
SectorSpriteRanges.clear();
|
||||
SectorSpriteRanges.resize(numsectors);
|
||||
SortedSprites.clear();
|
||||
|
||||
// Perspective correct:
|
||||
float ratio = WidescreenRatio;
|
||||
float fovratio = (WidescreenRatio >= 1.3f) ? 1.333333f : ratio;
|
||||
|
@ -174,8 +178,10 @@ void RenderPolyBsp::RenderSubsector(subsector_t *sub)
|
|||
PolyTriangleDrawer::draw(uniforms, vertices, sub->numlines, TriangleDrawMode::Fan, true, 0, viewwidth, 0, viewheight, ceiltex);
|
||||
}
|
||||
|
||||
for (AActor *thing = sub->sector->thinglist; thing != nullptr; thing = thing->snext)
|
||||
SpriteRange sprites = GetSpritesForSector(sub->sector);
|
||||
for (int i = 0; i < sprites.Count; i++)
|
||||
{
|
||||
AActor *thing = SortedSprites[sprites.Start + i].Thing;
|
||||
if ((thing->renderflags & RF_SPRITETYPEMASK) == RF_WALLSPRITE)
|
||||
AddWallSprite(thing, sub);
|
||||
else
|
||||
|
@ -183,6 +189,26 @@ void RenderPolyBsp::RenderSubsector(subsector_t *sub)
|
|||
}
|
||||
}
|
||||
|
||||
SpriteRange RenderPolyBsp::GetSpritesForSector(sector_t *sector)
|
||||
{
|
||||
if (SectorSpriteRanges.size() < sector->sectornum || sector->sectornum < 0)
|
||||
return SpriteRange();
|
||||
|
||||
auto &range = SectorSpriteRanges[sector->sectornum];
|
||||
if (range.Start == -1)
|
||||
{
|
||||
range.Start = (int)SortedSprites.size();
|
||||
range.Count = 0;
|
||||
for (AActor *thing = sector->thinglist; thing != nullptr; thing = thing->snext)
|
||||
{
|
||||
SortedSprites.push_back({ thing, (thing->Pos() - ViewPos).LengthSquared() });
|
||||
range.Count++;
|
||||
}
|
||||
std::stable_sort(SortedSprites.begin() + range.Start, SortedSprites.begin() + range.Start + range.Count);
|
||||
}
|
||||
return range;
|
||||
}
|
||||
|
||||
void RenderPolyBsp::AddLine(seg_t *line, sector_t *frontsector)
|
||||
{
|
||||
// Reject lines not facing viewer
|
||||
|
|
24
src/r_poly.h
24
src/r_poly.h
|
@ -49,6 +49,26 @@ public:
|
|||
FDynamicColormap *Colormap = nullptr;
|
||||
};
|
||||
|
||||
// Used for sorting things by distance to the camera
|
||||
class PolySortedSprite
|
||||
{
|
||||
public:
|
||||
PolySortedSprite(AActor *thing, double distanceSquared) : Thing(thing), DistanceSquared(distanceSquared) { }
|
||||
bool operator<(const PolySortedSprite &other) const { return DistanceSquared > other.DistanceSquared; }
|
||||
|
||||
AActor *Thing;
|
||||
double DistanceSquared;
|
||||
};
|
||||
|
||||
class SpriteRange
|
||||
{
|
||||
public:
|
||||
SpriteRange() = default;
|
||||
SpriteRange(int start, int count) : Start(start), Count(count) { }
|
||||
int Start = -1;
|
||||
int Count = 0;
|
||||
};
|
||||
|
||||
// Renders a GL BSP tree in a scene
|
||||
class RenderPolyBsp
|
||||
{
|
||||
|
@ -67,6 +87,7 @@ private:
|
|||
bool IsThingCulled(AActor *thing);
|
||||
visstyle_t GetSpriteVisStyle(AActor *thing, double z);
|
||||
FTexture *GetSpriteTexture(AActor *thing, /*out*/ bool &flipX);
|
||||
SpriteRange GetSpritesForSector(sector_t *sector);
|
||||
|
||||
void RenderPlayerSprites();
|
||||
void RenderPlayerSprite(DPSprite *sprite, AActor *owner, float bobx, float boby, double wx, double wy, double ticfrac);
|
||||
|
@ -85,6 +106,9 @@ private:
|
|||
std::vector<subsector_t *> PvsSectors;
|
||||
TriMatrix worldToClip;
|
||||
|
||||
std::vector<SpriteRange> SectorSpriteRanges;
|
||||
std::vector<PolySortedSprite> SortedSprites;
|
||||
|
||||
std::vector<PolyScreenSprite> ScreenSprites;
|
||||
|
||||
const int BaseXCenter = 160;
|
||||
|
|
Loading…
Reference in a new issue