From 3f8a664c2c4295fc9c91e1cfb47274487e58271c Mon Sep 17 00:00:00 2001 From: rtw1x1 Date: Thu, 19 Feb 2026 18:51:43 +0000 Subject: [PATCH] fix: SpeedTree fog fix --- src/EterLib/SkyBox.cpp | 5 +++++ src/GameLib/MapManager.cpp | 6 +++++- src/GameLib/MapOutdoor.cpp | 4 ---- src/GameLib/MapOutdoorRenderHTP.cpp | 3 +++ src/GameLib/MapOutdoorRenderSTP.cpp | 3 +++ 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/EterLib/SkyBox.cpp b/src/EterLib/SkyBox.cpp index 1ca5052..82c5d18 100644 --- a/src/EterLib/SkyBox.cpp +++ b/src/EterLib/SkyBox.cpp @@ -270,6 +270,8 @@ void CSkyBox::SetCloudTexture(const char * c_szFileName) m_FaceCloud.m_strfacename = c_szFileName; CGraphicImageInstance * pGraphicImageInstance = GenerateTexture(c_szFileName); + if (!pGraphicImageInstance) + TraceError("CSkyBox::SetCloudTexture - Failed to load cloud texture: %s", c_szFileName); m_GraphicImageInstanceMap.insert(TGraphicImageInstanceMap::value_type(m_FaceCloud.m_strfacename, pGraphicImageInstance)); // 이거 안쓰는거 같은데요? [cronan] @@ -868,6 +870,9 @@ void CSkyBox::Render() void CSkyBox::RenderCloud() { + if (m_FaceCloud.m_strfacename.empty()) + return; + CGraphicImageInstance * pCloudGraphicImageInstance = m_GraphicImageInstanceMap[m_FaceCloud.m_strfacename]; if (!pCloudGraphicImageInstance) return; diff --git a/src/GameLib/MapManager.cpp b/src/GameLib/MapManager.cpp index acec17a..57b8f9e 100644 --- a/src/GameLib/MapManager.cpp +++ b/src/GameLib/MapManager.cpp @@ -281,11 +281,15 @@ void CMapManager::BeginEnvironment() if (mc_pcurEnvironmentData->bDensityFog && mc_pcurEnvironmentData->bFogLevel != 0) { - const float fFogDensityLevel[3] = { 0.000020f, 0.000010f, 0.000005f }; + const float fFogDensityLevel[3] = { 0.000006f, 0.000004f, 0.000002f }; float fDensity = mc_pcurEnvironmentData->bFogLevel * fFogDensityLevel[CPythonSystem::Instance().GetFogLevel()]; STATEMANAGER.SetRenderState(D3DRS_FOGVERTEXMODE, D3DFOG_EXP); // pixel fog STATEMANAGER.SetRenderState(D3DRS_FOGDENSITY, *((DWORD *) &fDensity)); // vertex fog + + float fApproxFogFar = 2.3f / fDensity; + CSpeedTreeForestDirectX& rkForest = CSpeedTreeForestDirectX::Instance(); + rkForest.SetFog(0.0f, fApproxFogFar); } // MR-14: -- END OF -- Fog update by Alaric else diff --git a/src/GameLib/MapOutdoor.cpp b/src/GameLib/MapOutdoor.cpp index 45e5762..4238b0a 100644 --- a/src/GameLib/MapOutdoor.cpp +++ b/src/GameLib/MapOutdoor.cpp @@ -240,10 +240,6 @@ void CMapOutdoor::OnBeginEnvironment() return; CSpeedTreeForestDirectX& rkForest=CSpeedTreeForestDirectX::Instance(); - rkForest.SetFog( - mc_pEnvironmentData->GetFogNearDistance(), - mc_pEnvironmentData->GetFogFarDistance() - ); const D3DLIGHT9& c_rkLight = mc_pEnvironmentData->DirLights[ENV_DIRLIGHT_CHARACTER]; rkForest.SetLight( diff --git a/src/GameLib/MapOutdoorRenderHTP.cpp b/src/GameLib/MapOutdoorRenderHTP.cpp index 1b9bf76..3be03b9 100644 --- a/src/GameLib/MapOutdoorRenderHTP.cpp +++ b/src/GameLib/MapOutdoorRenderHTP.cpp @@ -75,6 +75,9 @@ void CMapOutdoor::__RenderTerrain_RenderHardwareTransformPatch() std::pair fog_far(fFogFarDistance+1600.0f, 0); std::pair fog_near(fFogNearDistance-3200.0f, 0); + if (mc_pEnvironmentData && mc_pEnvironmentData->bDensityFog) + fog_far.first = 1e10f; + std::vector >::iterator far_it = std::upper_bound(m_PatchVector.begin(),m_PatchVector.end(),fog_far); std::vector >::iterator near_it = std::upper_bound(m_PatchVector.begin(),m_PatchVector.end(),fog_near); diff --git a/src/GameLib/MapOutdoorRenderSTP.cpp b/src/GameLib/MapOutdoorRenderSTP.cpp index 5d359ac..bfd1b8d 100644 --- a/src/GameLib/MapOutdoorRenderSTP.cpp +++ b/src/GameLib/MapOutdoorRenderSTP.cpp @@ -30,6 +30,9 @@ void CMapOutdoor::__RenderTerrain_RenderSoftwareTransformPatch() std::pair fog_far(kTPRS.m_fFogFarDistance+800.0f, 0); std::pair fog_near(kTPRS.m_fFogNearDistance-3200.0f, 0); + if (mc_pEnvironmentData && mc_pEnvironmentData->bDensityFog) + fog_far.first = 1e10f; + std::vector >::iterator far_it = std::upper_bound(m_PatchVector.begin(),m_PatchVector.end(),fog_far); std::vector >::iterator near_it = std::upper_bound(m_PatchVector.begin(),m_PatchVector.end(),fog_near);