feat(world): implement CWorldParam::FarClipCallback

This commit is contained in:
fallenoak 2026-02-17 19:37:19 -06:00
parent 09c016c935
commit 703dc26df7
No known key found for this signature in database
GPG Key ID: 7628F8E61AEA070D
4 changed files with 45 additions and 2 deletions

View File

@ -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 <storm/Memory.hpp>
@ -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);

View File

@ -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;

View File

@ -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;
}

View File

@ -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: