diff --git a/src/gl/data/gl_viewpointbuffer.cpp b/src/gl/data/gl_viewpointbuffer.cpp index eb4d8c92e..611db9e40 100644 --- a/src/gl/data/gl_viewpointbuffer.cpp +++ b/src/gl/data/gl_viewpointbuffer.cpp @@ -144,7 +144,6 @@ void GLViewpointBuffer::Set2D(int width, int height) HWViewpointUniforms matrices; matrices.SetDefaults(); matrices.mProjectionMatrix.ortho(0, width, height, 0, -1.0f, 1.0f); - matrices.mFogEnabled = 3; matrices.CalcDependencies(); Map(); memcpy(mBufferPointer, &matrices, sizeof(matrices)); diff --git a/src/gl/renderer/gl_renderstate.cpp b/src/gl/renderer/gl_renderstate.cpp index a5de63896..e585296f6 100644 --- a/src/gl/renderer/gl_renderstate.cpp +++ b/src/gl/renderer/gl_renderstate.cpp @@ -119,7 +119,7 @@ bool FRenderState::ApplyShader() static uint64_t firstFrame = 0; // if firstFrame is not yet initialized, initialize it to current time // if we're going to overflow a float (after ~4.6 hours, or 24 bits), re-init to regain precision - if ((firstFrame == 0) || (screen->FrameTime - firstFrame >= 1 << 24) || level.ShaderStartTime >= firstFrame) + if ((firstFrame == 0) || (screen->FrameTime - firstFrame >= 1<<24) || level.ShaderStartTime >= firstFrame) firstFrame = screen->FrameTime; static const float nulvec[] = { 0.f, 0.f, 0.f, 0.f }; @@ -133,15 +133,31 @@ bool FRenderState::ApplyShader() activeShader->Bind(); } + int fogset = 0; + + if (mFogEnabled) + { + if (mFogEnabled == 2) + { + fogset = -3; // 2D rendering with 'foggy' overlay. + } + else if ((mFogColor & 0xffffff) == 0) + { + fogset = gl_fogmode; + } + else + { + fogset = -gl_fogmode; + } + } + glVertexAttrib4fv(VATTR_COLOR, mColor.vec); glVertexAttrib4fv(VATTR_NORMAL, mNormal.vec); activeShader->muDesaturation.Set(mDesaturation / 255.f); + activeShader->muFogEnabled.Set(fogset); activeShader->muTextureMode.Set(mTextureMode == TM_MODULATE && mTempTM == TM_OPAQUE ? TM_OPAQUE : mTextureMode); - float fds = mLightParms[2]; - if (!mFogEnabled) mLightParms[2] = 0; activeShader->muLightParms.Set(mLightParms); - mLightParms[2] = fds; activeShader->muFogColor.Set(mFogColor); activeShader->muObjectColor.Set(mObjectColor); activeShader->muObjectColor2.Set(mObjectColor2); diff --git a/src/gl/scene/gl_scene.cpp b/src/gl/scene/gl_scene.cpp index 3044d4bd6..1a83521f1 100644 --- a/src/gl/scene/gl_scene.cpp +++ b/src/gl/scene/gl_scene.cpp @@ -375,7 +375,6 @@ void FDrawInfo::DrawEndScene2D(sector_t * viewsector) HWViewpointUniforms vp = VPUniforms; vp.mViewMatrix.loadIdentity(); vp.mProjectionMatrix = vrmode->GetHUDSpriteProjection(); - vp.mFogEnabled = 0; GLRenderer->mViewpoints->SetViewpoint(&vp); glDisable(GL_DEPTH_TEST); glDisable(GL_MULTISAMPLE); diff --git a/src/gl/shaders/gl_shader.cpp b/src/gl/shaders/gl_shader.cpp index 19d30ed47..e0d656038 100644 --- a/src/gl/shaders/gl_shader.cpp +++ b/src/gl/shaders/gl_shader.cpp @@ -68,8 +68,6 @@ bool FShader::Load(const char * name, const char * vert_prog_lump, const char * int uViewHeight; // Software fuzz scaling float uClipHeight; float uClipHeightDirection; - int uFogEnabled; - }; )"; @@ -100,6 +98,7 @@ bool FShader::Load(const char * name, const char * vert_prog_lump, const char * i_data += "#define uFogDensity uLightAttr.b\n"; i_data += "#define uLightFactor uLightAttr.g\n"; i_data += "#define uLightDist uLightAttr.r\n"; + i_data += "uniform int uFogEnabled;\n"; // dynamic lights i_data += "uniform int uLightIndex;\n"; @@ -331,6 +330,7 @@ bool FShader::Load(const char * name, const char * vert_prog_lump, const char * muDesaturation.Init(hShader, "uDesaturationFactor"); + muFogEnabled.Init(hShader, "uFogEnabled"); muTextureMode.Init(hShader, "uTextureMode"); muLightParms.Init(hShader, "uLightAttr"); muClipSplit.Init(hShader, "uClipSplit"); diff --git a/src/gl/shaders/gl_shader.h b/src/gl/shaders/gl_shader.h index 2d1d28f76..46ba3c793 100644 --- a/src/gl/shaders/gl_shader.h +++ b/src/gl/shaders/gl_shader.h @@ -242,6 +242,7 @@ class FShader FName mName; FBufferedUniform1f muDesaturation; + FBufferedUniform1i muFogEnabled; FBufferedUniform1i muTextureMode; FBufferedUniform4f muLightParms; FBufferedUniform2f muClipSplit; diff --git a/src/hwrenderer/scene/hw_drawinfo.cpp b/src/hwrenderer/scene/hw_drawinfo.cpp index bf04aef6c..b5dce2247 100644 --- a/src/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/hwrenderer/scene/hw_drawinfo.cpp @@ -280,6 +280,5 @@ void HWViewpointUniforms::SetDefaults() mGlobVis = (float)R_GetGlobVis(r_viewwindow, r_visibility) / 32.f; mPalLightLevels = static_cast(gl_bandedswlight) | (static_cast(gl_fogmode) << 8); mClipLine.X = -10000000.0f; - mFogEnabled = gl_fogmode; } diff --git a/src/hwrenderer/scene/hw_viewpointuniforms.h b/src/hwrenderer/scene/hw_viewpointuniforms.h index 675ee71eb..27a78aef4 100644 --- a/src/hwrenderer/scene/hw_viewpointuniforms.h +++ b/src/hwrenderer/scene/hw_viewpointuniforms.h @@ -16,7 +16,6 @@ struct HWViewpointUniforms int mViewHeight = 0; float mClipHeight = 0.f; float mClipHeightDirection = 0.f; - int mFogEnabled = 0; void CalcDependencies() { diff --git a/wadsrc/static/shaders/glsl/fogboundary.fp b/wadsrc/static/shaders/glsl/fogboundary.fp index 81880f984..9dcdb4850 100644 --- a/wadsrc/static/shaders/glsl/fogboundary.fp +++ b/wadsrc/static/shaders/glsl/fogboundary.fp @@ -15,7 +15,7 @@ void main() // // calculate fog factor // - if (uFogEnabled == 1) + if (uFogEnabled == -1) { fogdist = pixelpos.w; } diff --git a/wadsrc/static/shaders/glsl/main.fp b/wadsrc/static/shaders/glsl/main.fp index c4caa785e..d5283b26c 100644 --- a/wadsrc/static/shaders/glsl/main.fp +++ b/wadsrc/static/shaders/glsl/main.fp @@ -358,7 +358,7 @@ vec4 getLightColor(Material material, float fogdist, float fogfactor) float newlightlevel = 1.0 - R_DoomLightingEquation(uLightLevel); color.rgb *= newlightlevel; } - else if (uFogColor.rgb == vec3(0.0)) + else if (uFogEnabled > 0) { // brightening around the player for light mode 2 if (fogdist < uLightDist) @@ -421,7 +421,7 @@ vec3 AmbientOcclusionColor() // // calculate fog factor // - if (uFogEnabled == 1) + if (uFogEnabled == -1) { fogdist = pixelpos.w; } @@ -449,17 +449,17 @@ void main() if (frag.a <= uAlphaThreshold) discard; #endif - if (uFogEnabled != 3) // check for special 2D 'fog' mode. + if (uFogEnabled != -3) // check for special 2D 'fog' mode. { float fogdist = 0.0; - float fogfactor = 1.0; + float fogfactor = 0.0; // // calculate fog factor // - if (uFogEnabled != 0 && uFogDensity != 0) + if (uFogEnabled != 0) { - if (uFogEnabled == 1) + if (uFogEnabled == 1 || uFogEnabled == -1) { fogdist = pixelpos.w; } @@ -476,7 +476,7 @@ void main() // // colored fog // - if (uFogColor.rgb != vec3(0.0)) + if (uFogEnabled < 0) { frag = applyFog(frag, fogfactor); } @@ -494,7 +494,7 @@ void main() vec4 cm = (uObjectColor + gray * (uObjectColor2 - uObjectColor)) * 2; frag = vec4(clamp(cm.rgb, 0.0, 1.0), frag.a); } - frag = frag * ProcessLight(material, vColor); + frag = frag * ProcessLight(material, vColor); frag.rgb = frag.rgb + uFogColor.rgb; } FragColor = frag;