From c6a6ae23a6209467c6417c38230aa25673d44ca5 Mon Sep 17 00:00:00 2001 From: "Dileep V. Reddy" Date: Wed, 14 May 2025 21:34:36 -0600 Subject: [PATCH] ThickFogDistance and ThickFogMultiplier MAPINFO variables adds thicker fog (Vulkan and OpenGL only) beyond ThickFogDistance, as long as it is possible. But default it is -1.f (disabled). --- src/common/rendering/gl/gl_shader.cpp | 3 ++ .../rendering/gles/gles_renderstate.cpp | 2 ++ src/common/rendering/gles/gles_shader.cpp | 5 ++++ src/common/rendering/gles/gles_shader.h | 3 ++ .../hwrenderer/data/hw_viewpointuniforms.h | 3 ++ .../rendering/vulkan/shaders/vk_shader.cpp | 3 ++ src/console/c_cmds.cpp | 30 +++++++++++++++++++ src/g_dumpinfo.cpp | 1 + src/g_level.cpp | 3 ++ src/g_levellocals.h | 2 ++ src/gamedata/g_mapinfo.cpp | 16 ++++++++++ src/gamedata/g_mapinfo.h | 2 ++ src/p_saveg.cpp | 2 ++ .../hwrenderer/scene/hw_drawinfo.cpp | 2 ++ src/scripting/vmthunks.cpp | 4 +++ wadsrc/static/shaders/glsl/main.fp | 7 +++++ wadsrc/static/zscript/doombase.zs | 4 +++ 17 files changed, 92 insertions(+) diff --git a/src/common/rendering/gl/gl_shader.cpp b/src/common/rendering/gl/gl_shader.cpp index b891a1440..ccc255b8d 100644 --- a/src/common/rendering/gl/gl_shader.cpp +++ b/src/common/rendering/gl/gl_shader.cpp @@ -330,6 +330,9 @@ bool FShader::Load(const char * name, const char * vert_prog_lump, const char * int uShadowmapFilter; int uLightBlendMode; + + float uThickFogDistance; + float uThickFogMultiplier; }; uniform int uTextureMode; diff --git a/src/common/rendering/gles/gles_renderstate.cpp b/src/common/rendering/gles/gles_renderstate.cpp index 5995fd3b6..33d213d23 100644 --- a/src/common/rendering/gles/gles_renderstate.cpp +++ b/src/common/rendering/gles/gles_renderstate.cpp @@ -231,6 +231,8 @@ bool FGLRenderState::ApplyShader() activeShader->cur->muClipHeight.Set(mHwUniforms->mClipHeight); activeShader->cur->muClipHeightDirection.Set(mHwUniforms->mClipHeightDirection); //activeShader->cur->muShadowmapFilter.Set(mHwUniforms->mShadowmapFilter); + activeShader->cur->muThickFogDistance.Set(mHwUniforms->mThickFogDistance); + activeShader->cur->muThickFogMultiplier.Set(mHwUniforms->mThickFogMultiplier); } glVertexAttrib4fv(VATTR_COLOR, &mStreamData.uVertexColor.X); diff --git a/src/common/rendering/gles/gles_shader.cpp b/src/common/rendering/gles/gles_shader.cpp index dba9a233a..eb76ee78c 100644 --- a/src/common/rendering/gles/gles_shader.cpp +++ b/src/common/rendering/gles/gles_shader.cpp @@ -284,6 +284,9 @@ bool FShader::Load(const char * name, const char * vert_prog_lump_, const char * uniform float uClipHeightDirection; uniform int uShadowmapFilter; + uniform float uThickFogDistance; + uniform float uThickFogMultiplier; + uniform int uTextureMode; uniform vec2 uClipSplit; uniform float uAlphaThreshold; @@ -582,6 +585,8 @@ bool FShader::Load(const char * name, const char * vert_prog_lump_, const char * shaderData->muClipHeightDirection.Init(shaderData->hShader, "uClipHeightDirection"); shaderData->muShadowmapFilter.Init(shaderData->hShader, "uShadowmapFilter"); + shaderData->muThickFogDistance.Init(shaderData->hShader, "uThickFogDistance"); + shaderData->muThickFogMultiplier.Init(shaderData->hShader, "uThickFogMultiplier"); //// shaderData->muDesaturation.Init(shaderData->hShader, "uDesaturationFactor"); diff --git a/src/common/rendering/gles/gles_shader.h b/src/common/rendering/gles/gles_shader.h index 31ebffa39..3a2979cce 100644 --- a/src/common/rendering/gles/gles_shader.h +++ b/src/common/rendering/gles/gles_shader.h @@ -319,6 +319,9 @@ public: class ShaderVariantData FBufferedUniform1f muClipHeight; FBufferedUniform1f muClipHeightDirection; FBufferedUniform1i muShadowmapFilter; + + FBufferedUniform1f muThickFogDistance; + FBufferedUniform1f muThickFogMultiplier; ///// FBufferedUniform1f muDesaturation; diff --git a/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h b/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h index def3b4808..b21a692fb 100644 --- a/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h +++ b/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h @@ -30,6 +30,9 @@ struct HWViewpointUniforms int mLightBlendMode = 0; + float mThickFogDistance = -1.f; + float mThickFogMultiplier = 30.f; + void CalcDependencies() { mNormalViewMatrix.computeNormalMatrix(mViewMatrix); diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index 8206e4137..3ce26512e 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -204,6 +204,9 @@ static const char *shaderBindings = R"( int uShadowmapFilter; int uLightBlendMode; + + float uThickFogDistance; + float uThickFogMultiplier; }; layout(set = 1, binding = 1, std140) uniform MatricesUBO { diff --git a/src/console/c_cmds.cpp b/src/console/c_cmds.cpp index f92415477..9b5e8f612 100644 --- a/src/console/c_cmds.cpp +++ b/src/console/c_cmds.cpp @@ -952,6 +952,36 @@ CCMD(skymisttoggle) primaryLevel->flags3 ^= LEVEL3_SKYMIST; } +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- +CCMD(thickfogdistance) +{ + if (argv.argc() > 1) + { + // Do this only on the primary level. + primaryLevel->thickfogdistance = (float)strtod(argv[1], NULL); + } + Printf("%f (positive means enabled)\n", primaryLevel->thickfogdistance); +} + +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- +CCMD(thickfogmultiplier) +{ + if (argv.argc() > 1) + { + // Do this only on the primary level. + primaryLevel->thickfogmultiplier = max(0.f, (float)strtod(argv[1], NULL)); + } + Printf("%f\n", primaryLevel->thickfogmultiplier); +} + //----------------------------------------------------------------------------- // // diff --git a/src/g_dumpinfo.cpp b/src/g_dumpinfo.cpp index 99c4b6adf..84dc50b7b 100644 --- a/src/g_dumpinfo.cpp +++ b/src/g_dumpinfo.cpp @@ -430,6 +430,7 @@ CCMD(skyfog) // Do this only on the primary level. primaryLevel->skyfog = max(0, (int)strtoull(argv[1], NULL, 0)); } + Printf("%d\n", primaryLevel->skyfog); } diff --git a/src/g_level.cpp b/src/g_level.cpp index 69a4c9af2..4367d4b1c 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1903,6 +1903,9 @@ void FLevelLocals::Init() skyfog = info->skyfog; deathsequence = info->deathsequence; + thickfogdistance = info->thickfogdistance; + thickfogmultiplier = info->thickfogmultiplier; + pixelstretch = info->pixelstretch; compatflags->Callback(); diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 01c95dac1..9764ebb39 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -753,6 +753,8 @@ public: bool lightadditivesurfaces; bool notexturefill; int ImpactDecalCount; + float thickfogdistance; + float thickfogmultiplier; FGlobalDLightLists lightlists; diff --git a/src/gamedata/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp index 3f72be352..8ee694878 100644 --- a/src/gamedata/g_mapinfo.cpp +++ b/src/gamedata/g_mapinfo.cpp @@ -313,6 +313,8 @@ void level_info_t::Reset() fogdensity = 0; outsidefogdensity = 0; skyfog = 0; + thickfogdistance = -1.0f; + thickfogmultiplier = 30.0f; pixelstretch = 1.2f; specialactions.Clear(); @@ -1575,6 +1577,20 @@ DEFINE_MAP_OPTION(skyfog, false) info->skyfog = parse.sc.Number; } +DEFINE_MAP_OPTION(thickfogdistance, false) +{ + parse.ParseAssign(); + parse.sc.MustGetFloat(); + info->thickfogdistance = (float)parse.sc.Float; +} + +DEFINE_MAP_OPTION(thickfogmultiplier, false) +{ + parse.ParseAssign(); + parse.sc.MustGetFloat(); + info->thickfogmultiplier = (float)parse.sc.Float; +} + DEFINE_MAP_OPTION(pixelratio, false) { parse.ParseAssign(); diff --git a/src/gamedata/g_mapinfo.h b/src/gamedata/g_mapinfo.h index 4c3d6a18a..d08fc5a27 100644 --- a/src/gamedata/g_mapinfo.h +++ b/src/gamedata/g_mapinfo.h @@ -382,6 +382,8 @@ struct level_info_t int fogdensity; int outsidefogdensity; int skyfog; + float thickfogdistance; + float thickfogmultiplier; float pixelstretch; // Redirection: If any player is carrying the specified item, then diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 6248f2329..99c77b1aa 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -982,6 +982,8 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) ("fogdensity", fogdensity) ("outsidefogdensity", outsidefogdensity) ("skyfog", skyfog) + ("thickfogdistance", thickfogdistance) + ("thickfogmultiplier", thickfogmultiplier) ("deathsequence", deathsequence) ("bodyqueslot", bodyqueslot) ("spawnindex", spawnindex) diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index e16a549d9..a9f866a5c 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -175,6 +175,8 @@ void HWDrawInfo::StartScene(FRenderViewpoint &parentvp, HWViewpointUniforms *uni VPUniforms.mClipLine.X = -10000000.0f; VPUniforms.mShadowmapFilter = gl_shadowmap_filter; VPUniforms.mLightBlendMode = (level.info ? (int)level.info->lightblendmode : 0); + VPUniforms.mThickFogDistance = Level->thickfogdistance; + VPUniforms.mThickFogMultiplier = Level->thickfogmultiplier; } mClipper->SetViewpoint(Viewpoint); vClipper->SetViewpoint(Viewpoint); diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index 8388b8f9c..17b44a27d 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -2838,6 +2838,8 @@ DEFINE_FIELD_X(LevelInfo, level_info_t, deathsequence) DEFINE_FIELD_X(LevelInfo, level_info_t, fogdensity) DEFINE_FIELD_X(LevelInfo, level_info_t, outsidefogdensity) DEFINE_FIELD_X(LevelInfo, level_info_t, skyfog) +DEFINE_FIELD_X(LevelInfo, level_info_t, thickfogdistance) +DEFINE_FIELD_X(LevelInfo, level_info_t, thickfogmultiplier) DEFINE_FIELD_X(LevelInfo, level_info_t, pixelstretch) DEFINE_FIELD_X(LevelInfo, level_info_t, RedirectType) DEFINE_FIELD_X(LevelInfo, level_info_t, RedirectMapName) @@ -2889,6 +2891,8 @@ DEFINE_FIELD(FLevelLocals, teamdamage) DEFINE_FIELD(FLevelLocals, fogdensity) DEFINE_FIELD(FLevelLocals, outsidefogdensity) DEFINE_FIELD(FLevelLocals, skyfog) +DEFINE_FIELD(FLevelLocals, thickfogdistance) +DEFINE_FIELD(FLevelLocals, thickfogmultiplier) DEFINE_FIELD(FLevelLocals, pixelstretch) DEFINE_FIELD(FLevelLocals, MusicVolume) DEFINE_FIELD(FLevelLocals, deathsequence) diff --git a/wadsrc/static/shaders/glsl/main.fp b/wadsrc/static/shaders/glsl/main.fp index eb4685084..3d3f0da5f 100644 --- a/wadsrc/static/shaders/glsl/main.fp +++ b/wadsrc/static/shaders/glsl/main.fp @@ -855,6 +855,13 @@ void main() { fogdist = max(16.0, distance(pixelpos.xyz, uCameraPos.xyz)); } + if (uThickFogDistance > 0.0) + { + if (fogdist > uThickFogDistance) + { + fogdist = fogdist + uThickFogMultiplier * (fogdist - uThickFogDistance); + } + } fogfactor = exp2 (uFogDensity * fogdist); } diff --git a/wadsrc/static/zscript/doombase.zs b/wadsrc/static/zscript/doombase.zs index ffebf625f..91c06ff48 100644 --- a/wadsrc/static/zscript/doombase.zs +++ b/wadsrc/static/zscript/doombase.zs @@ -414,6 +414,8 @@ struct LevelInfo native native readonly int fogdensity; native readonly int outsidefogdensity; native readonly int skyfog; + native readonly float thickfogdistance; + native readonly float thickfogmultiplier; native readonly float pixelstretch; native readonly name RedirectType; native readonly String RedirectMapName; @@ -527,6 +529,8 @@ struct LevelLocals native native readonly int fogdensity; native readonly int outsidefogdensity; native readonly int skyfog; + native readonly float thickfogdistance; + native readonly float thickfogmultiplier; native readonly float pixelstretch; native readonly float MusicVolume; native name deathsequence;