diff --git a/src/world/CWorld.cpp b/src/world/CWorld.cpp index a49ceaf..bb8726a 100644 --- a/src/world/CWorld.cpp +++ b/src/world/CWorld.cpp @@ -2,6 +2,7 @@ #include "gx/Gx.hpp" #include "gx/Shader.hpp" #include "model/Model2.hpp" +#include "world/CWorldParam.hpp" #include "world/Map.hpp" #include "world/Weather.hpp" #include @@ -15,11 +16,31 @@ uint32_t CWorld::s_gameTimeFixed; float CWorld::s_gameTimeSec; CM2Scene* CWorld::s_m2Scene; float CWorld::s_nearClip = 0.1f; +float CWorld::s_prevFarClip; uint32_t CWorld::s_tickTimeFixed; uint32_t CWorld::s_tickTimeMs; float CWorld::s_tickTimeSec; Weather* CWorld::s_weather; +namespace { + +float AdjustFarClip(float farClip, int32_t mapID) { + float minFarClip = 183.33333f; + float maxFarClip = 1583.3334f; + + if (mapID < 530 || mapID == 575 || mapID == 543) { + if (!CWorldParam::cvar_farClipOverride || CWorldParam::cvar_farClipOverride->GetInt() < 1) { + maxFarClip = 791.66669f; + } + } else if (false /* TODO OsGetPhysicalMemory() <= 1073741824 */) { + maxFarClip = 791.66669f; + } + + return std::min(std::max(farClip, minFarClip), maxFarClip); +} + +} + HWORLDOBJECT CWorld::AddObject(CM2Model* model, void* handler, void* handlerParam, uint64_t param64, uint32_t param32, uint32_t objFlags) { auto entity = CMap::AllocEntity(objFlags & 0x8 ? true : false); @@ -157,6 +178,24 @@ int32_t CWorld::OnTick(const EVENT_DATA_TICK* data, void* param) { return 1; } +void CWorld::SetFarClip(float farClip) { + farClip = AdjustFarClip(farClip, CMap::s_mapID); + + if (CWorld::s_farClip == farClip) { + return; + } + + CWorld::s_prevFarClip = CWorld::s_farClip; + CWorld::s_farClip = farClip; + + // TODO CMapRenderChunk::DirtyPools(); + + CWorld::s_nearClip = 0.2f; + + // TODO dword_D1C410 = 1; + // TODO dword_ADEEE0 = 1; +} + void CWorld::SetUpdateTime(float tickTimeSec, uint32_t curTimeMs) { auto tickTimeFixed = CWorld::GetFixedPrecisionTime(tickTimeSec); diff --git a/src/world/CWorld.hpp b/src/world/CWorld.hpp index f181a0e..94a3cdd 100644 --- a/src/world/CWorld.hpp +++ b/src/world/CWorld.hpp @@ -68,6 +68,7 @@ class CWorld { static void Initialize(); static void LoadMap(const char* mapName, const C3Vector& position, int32_t zoneID); static int32_t OnTick(const EVENT_DATA_TICK* data, void* param); + static void SetFarClip(float farClip); static void SetUpdateTime(float tickTimeSec, uint32_t curTimeMs); private: @@ -79,6 +80,7 @@ class CWorld { static float s_gameTimeSec; static CM2Scene* s_m2Scene; static float s_nearClip; + static float s_prevFarClip; static uint32_t s_tickTimeFixed; static uint32_t s_tickTimeMs; static float s_tickTimeSec; diff --git a/src/world/CWorldParam.cpp b/src/world/CWorldParam.cpp index 4b5d68a..6d4dda4 100644 --- a/src/world/CWorldParam.cpp +++ b/src/world/CWorldParam.cpp @@ -1,4 +1,5 @@ #include "world/CWorldParam.hpp" +#include "world/CWorld.hpp" #include "console/CVar.hpp" CVar* CWorldParam::cvar_baseMip; @@ -53,7 +54,8 @@ bool CWorldParam::ExtShadowQualityCallback(CVar* var, const char* oldValue, cons } bool CWorldParam::FarClipCallback(CVar* var, const char* oldValue, const char* value, void* arg) { - // TODO + CWorld::SetFarClip(SStrToFloat(value)); + return true; } diff --git a/src/world/CWorldParam.hpp b/src/world/CWorldParam.hpp index 6e94460..a078072 100644 --- a/src/world/CWorldParam.hpp +++ b/src/world/CWorldParam.hpp @@ -1,7 +1,7 @@ #ifndef WORLD_C_WORLD_PARAM_HPP #define WORLD_C_WORLD_PARAM_HPP -class CVar; +#include "console/CVar.hpp" class CWorldParam { public: