- optimized the wall drawer a bit to avoid repeated calls to the render API's deoth bias function.

The setters in FRenderState should check if the value actually changes and the wall drawer should only call it for non-translucent wall sprites.
This commit is contained in:
Christoph Oelckers 2021-05-21 19:07:22 +02:00
parent 4bb57cfab5
commit 264d42179e
2 changed files with 19 additions and 5 deletions

View file

@ -555,18 +555,28 @@ public:
mRenderStyle = rs; mRenderStyle = rs;
} }
auto GetDepthBias()
{
return mBias;
}
void SetDepthBias(float a, float b) void SetDepthBias(float a, float b)
{ {
mBias.mChanged = mBias.mFactor != a || mBias.mUnits != b;
mBias.mFactor = a; mBias.mFactor = a;
mBias.mUnits = b; mBias.mUnits = b;
mBias.mChanged = true; }
void SetDepthBias(FDepthBiasState& bias)
{
SetDepthBias(bias.mFactor, bias.mUnits);
} }
void ClearDepthBias() void ClearDepthBias()
{ {
mBias.mChanged = mBias.mFactor != 0 || mBias.mUnits != 0;
mBias.mFactor = 0; mBias.mFactor = 0;
mBias.mUnits = 0; mBias.mUnits = 0;
mBias.mChanged = true;
} }
private: private:

View file

@ -260,16 +260,20 @@ void HWWall::RenderTexturedWall(HWDrawInfo *di, FRenderState &state, int rflags)
float xOffset = 1.f / texture->GetDisplayWidth(); float xOffset = 1.f / texture->GetDisplayWidth();
state.SetNpotEmulation(float(h2) / h, xOffset); state.SetNpotEmulation(float(h2) / h, xOffset);
} }
RenderWall(di, state, rflags);
} }
else if (!(rflags & RWF_TRANS)) else if (!(rflags & RWF_TRANS))
{ {
auto oldbias = state.GetDepthBias();
if (walldist >= 0) state.SetDepthBias(-1, glseg.x1 == glseg.x2 || glseg.y1 == glseg.y2? -128 : -192); if (walldist >= 0) state.SetDepthBias(-1, glseg.x1 == glseg.x2 || glseg.y1 == glseg.y2? -128 : -192);
else state.ClearDepthBias(); else state.ClearDepthBias();
} RenderWall(di, state, rflags);
state.SetDepthBias(oldbias);
}
else
RenderWall(di, state, rflags); RenderWall(di, state, rflags);
if (!(rflags && RWF_TRANS)) state.ClearDepthBias();
state.SetNpotEmulation(0.f, 0.f); state.SetNpotEmulation(0.f, 0.f);
state.SetObjectColor(0xffffffff); state.SetObjectColor(0xffffffff);
/* none of these functions is in use. /* none of these functions is in use.