diff --git a/D3D11Engine/D3D11PFX_HeightFog.cpp b/D3D11Engine/D3D11PFX_HeightFog.cpp index 1a3f6a5a..8bca5283 100644 --- a/D3D11Engine/D3D11PFX_HeightFog.cpp +++ b/D3D11Engine/D3D11PFX_HeightFog.cpp @@ -59,6 +59,14 @@ XRESULT D3D11PFX_HeightFog::Render( RenderToTextureBuffer* fxbuffer ) { cb.HF_WeightZFar = std::min( cb.HF_WeightZFar, atmoMax ); cb.HF_WeightZNear = std::min( cb.HF_WeightZNear, atmoMin ); +#ifndef BUILD_GOTHIC_1_08k + float fogDensityFactor = 2; + float fogDensityFactorRain = (1.0f - Engine::GAPI->GetFogOverride()); +#else + float fogDensityFactor = pow( 15000.0f / Engine::GAPI->GetFarZ(), 4.0f ); + float fogDensityFactorRain = 1.0f; +#endif + if ( Engine::GAPI->GetFogOverride() > 0.0f ) { // Make sure the camera is inside the fog when in fog zone height = Toolbox::lerp( height, Engine::GAPI->GetCameraPosition().y + 10000, Engine::GAPI->GetFogOverride() ); // TODO: Get this from the actual fog-distance in the fogzone! @@ -66,16 +74,20 @@ XRESULT D3D11PFX_HeightFog::Render( RenderToTextureBuffer* fxbuffer ) { // Override fog color when in fog zone color = Engine::GAPI->GetFogColor(); +#ifndef BUILD_GOTHIC_1_08k // Make it z-Fog cb.HF_HeightFalloff = Toolbox::lerp( cb.HF_HeightFalloff, 0.000001f, Engine::GAPI->GetFogOverride() ); +#endif // Turn up density - cb.HF_GlobalDensity = Toolbox::lerp( cb.HF_GlobalDensity, cb.HF_GlobalDensity * 2, Engine::GAPI->GetFogOverride() ); + cb.HF_GlobalDensity = Toolbox::lerp( cb.HF_GlobalDensity, cb.HF_GlobalDensity * fogDensityFactor, Engine::GAPI->GetFogOverride() ); +#ifndef BUILD_GOTHIC_1_08k // Use other fog-values for fog-zones float distNear = WORLD_SECTION_SIZE * ((ffar - fnear) / ffar); cb.HF_WeightZNear = Toolbox::lerp( cb.HF_WeightZNear, WORLD_SECTION_SIZE * 0.09f, Engine::GAPI->GetFogOverride() ); cb.HF_WeightZFar = Toolbox::lerp( cb.HF_WeightZFar, WORLD_SECTION_SIZE * 0.8, Engine::GAPI->GetFogOverride() ); +#endif } //Engine::GAPI->GetRendererState().RendererSettings.FogColorMod; @@ -94,7 +106,7 @@ XRESULT D3D11PFX_HeightFog::Render( RenderToTextureBuffer* fxbuffer ) { XMStoreFloat3( &FogColorMod, XMVectorLerpV( color, XMLoadFloat3( &Engine::GAPI->GetRendererState().RendererSettings.RainFogColor ), XMVectorSet( std::min( 1.0f, rain * 2.0f ), std::min( 1.0f, rain * 2.0f ), std::min( 1.0f, rain * 2.0f ), 0 ) ) ); // Scale color faster here, so it looks better on light rain cb.HF_FogColorMod = FogColorMod; // Raining Density, only when not in fogzone - cb.HF_GlobalDensity = Toolbox::lerp( cb.HF_GlobalDensity, Engine::GAPI->GetRendererState().RendererSettings.RainFogDensity, rain * (1.0f - Engine::GAPI->GetFogOverride()) ); + cb.HF_GlobalDensity = Toolbox::lerp( cb.HF_GlobalDensity, Engine::GAPI->GetRendererState().RendererSettings.RainFogDensity, rain * fogDensityFactorRain ); hfPS->GetConstantBuffer()[0]->UpdateBuffer( &cb ); diff --git a/D3D11Engine/GothicAPI.cpp b/D3D11Engine/GothicAPI.cpp index 0e9c40a7..19752561 100644 --- a/D3D11Engine/GothicAPI.cpp +++ b/D3D11Engine/GothicAPI.cpp @@ -2720,6 +2720,12 @@ GInventory* GothicAPI::GetInventory() { return Inventory.get(); } +/** Returns the far Z */ +float GothicAPI::GetFarZ() { + zCSkyController_Outdoor* sc = oCGame::GetGame()->_zCSession_world->GetSkyControllerOutdoor(); + return sc->GetFarZ(); +} + /** Returns the fog-color */ FXMVECTOR GothicAPI::GetFogColor() { zCSkyController_Outdoor* sc = oCGame::GetGame()->_zCSession_world->GetSkyControllerOutdoor(); diff --git a/D3D11Engine/GothicAPI.h b/D3D11Engine/GothicAPI.h index 94954bb2..19208ea8 100644 --- a/D3D11Engine/GothicAPI.h +++ b/D3D11Engine/GothicAPI.h @@ -403,6 +403,9 @@ class GothicAPI { /** Returns the GSky-Object */ GSky* GetSky() const; + /** Returns the far Z */ + float GetFarZ(); + /** Returns the fog-color */ FXMVECTOR GetFogColor(); diff --git a/D3D11Engine/GothicMemoryLocations1_08k.h b/D3D11Engine/GothicMemoryLocations1_08k.h index f67a52e5..0a9662d6 100644 --- a/D3D11Engine/GothicMemoryLocations1_08k.h +++ b/D3D11Engine/GothicMemoryLocations1_08k.h @@ -123,8 +123,8 @@ struct GothicMemoryLocations { static const unsigned int Init = 0x005E6A00;*/ static const unsigned int GetUnderwaterFX = 0x5baaa0; - static const unsigned int Offset_OverrideColor = 0x558; - static const unsigned int Offset_OverrideFlag = 0x564; + static const unsigned int Offset_FarZ = 0x56C; + static const unsigned int Offset_Color = 0x580; static const unsigned int SetCameraLocationHint = 0x005BC7D0; diff --git a/D3D11Engine/GothicMemoryLocations2_6_fix.h b/D3D11Engine/GothicMemoryLocations2_6_fix.h index bb37b124..c05c4bc7 100644 --- a/D3D11Engine/GothicMemoryLocations2_6_fix.h +++ b/D3D11Engine/GothicMemoryLocations2_6_fix.h @@ -191,6 +191,8 @@ struct GothicMemoryLocations { static const unsigned int Offset_SkyLayerState1 = 0x124; static const unsigned int Offset_OverrideColor = 0x558; static const unsigned int Offset_OverrideFlag = 0x564; + static const unsigned int Offset_FarZ = 0x580; + static const unsigned int Offset_Color = 0x594; static const unsigned int Interpolate = 0x005E8C20; static const unsigned int Offset_InitDone = 0x7C; static const unsigned int Init = 0x005E6A00; diff --git a/D3D11Engine/zCSkyController_Outdoor.h b/D3D11Engine/zCSkyController_Outdoor.h index 2c4733ea..58b54494 100644 --- a/D3D11Engine/zCSkyController_Outdoor.h +++ b/D3D11Engine/zCSkyController_Outdoor.h @@ -208,13 +208,22 @@ class zCSkyController_Outdoor : public zCSkyController { #ifndef BUILD_GOTHIC_1_08k return *reinterpret_cast(THISPTR_OFFSET( GothicMemoryLocations::zCSkyController_Outdoor::Offset_OverrideColor )); #else - return XMFLOAT3( 0, 0, 0 ); + zColor color = *reinterpret_castTHISPTR_OFFSET( GothicMemoryLocations::zCSkyController_Outdoor::Offset_Color ); + return XMFLOAT3( color.bgra.r / 255.0f, color.bgra.g / 255.0f, color.bgra.b / 255.0f ); #endif } bool GetOverrideFlag() { #ifndef BUILD_GOTHIC_1_08k return *reinterpret_cast(THISPTR_OFFSET( GothicMemoryLocations::zCSkyController_Outdoor::Offset_OverrideFlag )) != 0; +#else + return 1; +#endif + } + + float GetFarZ() { +#if defined(BUILD_GOTHIC_1_08k) || defined(BUILD_GOTHIC_2_6_fix) + return *reinterpret_castTHISPTR_OFFSET( GothicMemoryLocations::zCSkyController_Outdoor::Offset_FarZ ); #else return 0; #endif