From ec627d94dd7016506c6b3983d7d57bbf7cdf020d Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 27 Nov 2014 12:26:52 +0100 Subject: [PATCH] - fixed: The depth clamp setting needs to be tracked per portal so that it can be properly restored afterward. Regular skies need it off but SkyViewpoints need it on - and all others need to use the parent's setting. So without engine side tracking we can end up rendering the sky with this setting off, resulting in omission of the fog layer. --- src/gl/renderer/gl_renderstate.cpp | 1 + src/gl/renderer/gl_renderstate.h | 11 +++++++++++ src/gl/scene/gl_portal.cpp | 5 ++--- src/gl/scene/gl_skydome.cpp | 2 ++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/gl/renderer/gl_renderstate.cpp b/src/gl/renderer/gl_renderstate.cpp index bdd0867b9..358c9fe7f 100644 --- a/src/gl/renderer/gl_renderstate.cpp +++ b/src/gl/renderer/gl_renderstate.cpp @@ -90,6 +90,7 @@ void FRenderState::Reset() stSrcBlend = stDstBlend = -1; stBlendEquation = -1; stAlphaThreshold = -1.f; + mLastDepthClamp = true; } //========================================================================== diff --git a/src/gl/renderer/gl_renderstate.h b/src/gl/renderer/gl_renderstate.h index b30d7920f..8c3b60772 100644 --- a/src/gl/renderer/gl_renderstate.h +++ b/src/gl/renderer/gl_renderstate.h @@ -63,6 +63,7 @@ class FRenderState float mInterpolationFactor; float mClipHeightTop, mClipHeightBottom; float mShaderTimer; + bool mLastDepthClamp; FVertexBuffer *mVertexBuffer, *mCurrentVertexBuffer; FStateVec4 mColor; @@ -309,6 +310,16 @@ public: } } + // This wraps the depth clamp setting because we frequently need to read it which OpenGL is not particularly performant at... + bool SetDepthClamp(bool on) + { + bool res = mLastDepthClamp; + if (!on) glDisable(GL_DEPTH_CLAMP); + else glEnable(GL_DEPTH_CLAMP); + mLastDepthClamp = on; + return res; + } + void Set2DMode(bool on) { m2D = on; diff --git a/src/gl/scene/gl_portal.cpp b/src/gl/scene/gl_portal.cpp index 02e7747bc..eba8b4d06 100644 --- a/src/gl/scene/gl_portal.cpp +++ b/src/gl/scene/gl_portal.cpp @@ -633,8 +633,7 @@ void GLSkyboxPortal::DrawContents() PlaneMirrorMode=0; - glDisable(GL_DEPTH_CLAMP); - + bool oldclamp = gl_RenderState.SetDepthClamp(false); viewx = origin->PrevX + FixedMul(r_TicFrac, origin->x - origin->PrevX); viewy = origin->PrevY + FixedMul(r_TicFrac, origin->y - origin->PrevY); viewz = origin->PrevZ + FixedMul(r_TicFrac, origin->z - origin->PrevZ); @@ -663,7 +662,7 @@ void GLSkyboxPortal::DrawContents() GLRenderer->DrawScene(); origin->flags&=~MF_JUSTHIT; inskybox=false; - glEnable(GL_DEPTH_CLAMP); + gl_RenderState.SetDepthClamp(oldclamp); skyboxrecursion--; PlaneMirrorMode=old_pm; diff --git a/src/gl/scene/gl_skydome.cpp b/src/gl/scene/gl_skydome.cpp index a6ee502d5..f431e06a6 100644 --- a/src/gl/scene/gl_skydome.cpp +++ b/src/gl/scene/gl_skydome.cpp @@ -475,6 +475,7 @@ void GLSkyPortal::DrawContents() gl_RenderState.EnableFog(false); gl_RenderState.AlphaFunc(GL_GEQUAL, 0.f); gl_RenderState.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + bool oldClamp = gl_RenderState.SetDepthClamp(true); gl_MatrixStack.Push(gl_RenderState.mViewMatrix); GLRenderer->SetupView(0, 0, 0, viewangle, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1)); @@ -519,5 +520,6 @@ void GLSkyPortal::DrawContents() gl_MatrixStack.Pop(gl_RenderState.mViewMatrix); gl_RenderState.ApplyMatrices(); glset.lightmode = oldlightmode; + gl_RenderState.SetDepthClamp(oldClamp); }