- move stencil recursion counter to render state.

This commit is contained in:
Christoph Oelckers 2018-10-21 10:58:11 +02:00
parent a97d71a3c3
commit acad8315d0
5 changed files with 30 additions and 19 deletions

View file

@ -240,8 +240,7 @@ void FGLRenderState::Apply()
if (mStencil.mChanged) if (mStencil.mChanged)
{ {
int recursion = GLRenderer->mPortalState.GetRecursion(); glStencilFunc(GL_EQUAL, mStencil.mBaseVal + mStencil.mOffsVal, ~0); // draw sky into stencil
glStencilFunc(GL_EQUAL, recursion + mStencil.mOffsVal, ~0); // draw sky into stencil
glStencilOp(GL_KEEP, GL_KEEP, op2gl[mStencil.mOperation]); // this stage doesn't modify the stencil glStencilOp(GL_KEEP, GL_KEEP, op2gl[mStencil.mOperation]); // this stage doesn't modify the stencil
bool cmon = !(mStencil.mFlags & SF_ColorMaskOff); bool cmon = !(mStencil.mFlags & SF_ColorMaskOff);

View file

@ -201,6 +201,12 @@ public:
return mPassType == GBUFFER_PASS ? 3 : 1; return mPassType == GBUFFER_PASS ? 3 : 1;
} }
// Temporary helper.
int GetStencilCounter()
{
return mStencil.mBaseVal;
}
}; };
extern FGLRenderState gl_RenderState; extern FGLRenderState gl_RenderState;

View file

@ -133,7 +133,7 @@ bool GLPortal::Start(bool usestencil, bool doquery, HWDrawInfo *outer_di, HWDraw
} }
// Create stencil // Create stencil
glStencilFunc(GL_EQUAL, mState->recursion, ~0); // create stencil glStencilFunc(GL_EQUAL, gl_RenderState.GetStencilCounter(), ~0); // create stencil
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); // increment stencil of valid pixels glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); // increment stencil of valid pixels
{ {
glColorMask(0,0,0,0); // don't write to the graphics buffer glColorMask(0,0,0,0); // don't write to the graphics buffer
@ -157,7 +157,7 @@ bool GLPortal::Start(bool usestencil, bool doquery, HWDrawInfo *outer_di, HWDraw
if (doquery) glEndQuery(GL_SAMPLES_PASSED); if (doquery) glEndQuery(GL_SAMPLES_PASSED);
// Clear Z-buffer // Clear Z-buffer
glStencilFunc(GL_EQUAL, mState->recursion + 1, ~0); // draw sky into stencil glStencilFunc(GL_EQUAL, gl_RenderState.GetStencilCounter() + 1, ~0); // draw sky into stencil
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // this stage doesn't modify the stencil glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // this stage doesn't modify the stencil
glDepthMask(true); // enable z-buffer again glDepthMask(true); // enable z-buffer again
glDepthRange(1, 1); glDepthRange(1, 1);
@ -179,7 +179,7 @@ bool GLPortal::Start(bool usestencil, bool doquery, HWDrawInfo *outer_di, HWDraw
{ {
// restore default stencil op. // restore default stencil op.
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glStencilFunc(GL_EQUAL, mState->recursion, ~0); // draw sky into stencil glStencilFunc(GL_EQUAL, gl_RenderState.GetStencilCounter(), ~0); // draw sky into stencil
return false; return false;
} }
} }
@ -192,7 +192,7 @@ bool GLPortal::Start(bool usestencil, bool doquery, HWDrawInfo *outer_di, HWDraw
glDepthMask(true); glDepthMask(true);
DrawPortalStencil(STP_AllInOne); DrawPortalStencil(STP_AllInOne);
glStencilFunc(GL_EQUAL, mState->recursion + 1, ~0); // draw sky into stencil glStencilFunc(GL_EQUAL, gl_RenderState.GetStencilCounter() + 1, ~0); // draw sky into stencil
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // this stage doesn't modify the stencil glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // this stage doesn't modify the stencil
gl_RenderState.EnableTexture(true); gl_RenderState.EnableTexture(true);
glColorMask(1,1,1,1); glColorMask(1,1,1,1);
@ -201,9 +201,7 @@ bool GLPortal::Start(bool usestencil, bool doquery, HWDrawInfo *outer_di, HWDraw
glDepthMask(false); // don't write to Z-buffer! glDepthMask(false); // don't write to Z-buffer!
} }
} }
mState->recursion++; gl_RenderState.IncStencilValue();
} }
else else
{ {
@ -265,7 +263,7 @@ void GLPortal::End(HWDrawInfo *di, bool usestencil)
glDepthFunc(GL_LEQUAL); glDepthFunc(GL_LEQUAL);
glDepthRange(0, 1); glDepthRange(0, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_DECR); glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);
glStencilFunc(GL_EQUAL, mState->recursion, ~0); // draw sky into stencil glStencilFunc(GL_EQUAL, gl_RenderState.GetStencilCounter(), ~0); // draw sky into stencil
DrawPortalStencil(STP_DepthRestore); DrawPortalStencil(STP_DepthRestore);
glDepthFunc(GL_LESS); glDepthFunc(GL_LESS);
@ -273,11 +271,11 @@ void GLPortal::End(HWDrawInfo *di, bool usestencil)
gl_RenderState.EnableTexture(true); gl_RenderState.EnableTexture(true);
gl_RenderState.SetEffect(EFF_NONE); gl_RenderState.SetEffect(EFF_NONE);
glColorMask(1, 1, 1, 1); glColorMask(1, 1, 1, 1);
mState->recursion--; gl_RenderState.DecStencilValue();
// restore old stencil op. // restore old stencil op.
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glStencilFunc(GL_EQUAL, mState->recursion, ~0); // draw sky into stencil glStencilFunc(GL_EQUAL, gl_RenderState.GetStencilCounter(), ~0); // draw sky into stencil
} }
else else
{ {

View file

@ -79,8 +79,6 @@ public:
struct FPortalSceneState struct FPortalSceneState
{ {
int recursion = 0;
int MirrorFlag = 0; int MirrorFlag = 0;
int PlaneMirrorFlag = 0; int PlaneMirrorFlag = 0;
int renderdepth = 0; int renderdepth = 0;
@ -101,11 +99,6 @@ struct FPortalSceneState
UniquePlaneMirrors.Clear(); UniquePlaneMirrors.Clear();
} }
int GetRecursion() const
{
return recursion;
}
bool isMirrored() const bool isMirrored() const
{ {
return !!((MirrorFlag ^ PlaneMirrorFlag) & 1); return !!((MirrorFlag ^ PlaneMirrorFlag) & 1);

View file

@ -74,6 +74,7 @@ struct FMaterialState
struct FStencilState struct FStencilState
{ {
int mBaseVal;
int mOffsVal; int mOffsVal;
int mOperation; int mOperation;
int mFlags; int mFlags;
@ -81,6 +82,7 @@ struct FStencilState
void Reset() void Reset()
{ {
mBaseVal = 0;
mOffsVal = 0; mOffsVal = 0;
mOperation = SOP_Keep; mOperation = SOP_Keep;
mFlags = SF_AllOn; mFlags = SF_AllOn;
@ -402,6 +404,19 @@ public:
mStencil.mChanged = true; mStencil.mChanged = true;
} }
void IncStencilValue()
{
mStencil.mBaseVal++;
mStencil.mChanged = true;
}
void DecStencilValue()
{
mStencil.mBaseVal--;
mStencil.mChanged = true;
}
void SetColor(int sectorlightlevel, int rellight, bool fullbright, const FColormap &cm, float alpha, bool weapon = false); void SetColor(int sectorlightlevel, int rellight, bool fullbright, const FColormap &cm, float alpha, bool weapon = false);
void SetFog(int lightlevel, int rellight, bool fullbright, const FColormap *cmap, bool isadditive); void SetFog(int lightlevel, int rellight, bool fullbright, const FColormap *cmap, bool isadditive);