mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-28 15:02:01 +00:00
- move stencil recursion counter to render state.
This commit is contained in:
parent
a97d71a3c3
commit
acad8315d0
5 changed files with 30 additions and 19 deletions
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue