Fog opacity & density improved. Code refactoring

This commit is contained in:
2026-01-23 19:04:16 +01:00
parent 23f5003f79
commit 1961f88e5f

View File

@@ -57,7 +57,6 @@ static float g_Camera_In = 230.f;
static float g_Camera_Out = 230.f;
static float g_DefaultFogDensity = -1.f;
static float g_DefaultFogMaxOpacity = -1.f;
static bool g_Console_Enabled = false;
// AOB Scan pointers
static uint8_t* FOVaddress = nullptr;
@@ -279,64 +278,41 @@ static void CameraFixEnabled() {
}
}
static UExponentialHeightFogComponent* fogComponent = nullptr;
static void FogFixEnabled() {
if (g_fix_enabled && g_Fog_fix_enabled && FogDensityEngineaddress && FogOpacityEngineaddress) {
if (FogDensityEngineaddress && FogOpacityEngineaddress) {
if (!FogDensityHook) FogDensityHook = safetyhook::create_mid(FogDensityEngineaddress + 0x7, // Hook for fog density
[](SafetyHookContext& ctx) {
ctx.xmm1.f32[0] = g_FogDensity;
ctx.rflags &= ~(1ULL << 6);
if (ctx.rcx) fogComponent = reinterpret_cast<UExponentialHeightFogComponent*>(ctx.rcx);
ctx.xmm1.f32[0] = g_fix_enabled && g_Fog_fix_enabled ? g_FogDensity : ctx.xmm1.f32[0];
});
else FogDensityHook.enable();
if (!FogMaxOpacityHook) FogMaxOpacityHook = safetyhook::create_mid(FogOpacityEngineaddress + 0x7, // Hook for fog opacity
[](SafetyHookContext& ctx) {
ctx.xmm1.f32[0] = g_FogMaxOpacity;
ctx.rflags &= ~(1ULL << 6);
ctx.xmm1.f32[0] = g_fix_enabled && g_Fog_fix_enabled ? g_FogMaxOpacity : ctx.xmm1.f32[0];
});
else FogMaxOpacityHook.enable();
}
if (g_fix_enabled && g_Fog_fix_enabled && FogDensityEngineaddress && FogOpacityEngineaddress)
logger->info("Fog fix enabled");
}
if (!(g_fix_enabled && g_Fog_fix_enabled)) {
if (FogDensityHook) FogDensityHook.disable();
if (FogMaxOpacityHook) FogMaxOpacityHook.disable();
logger->info("Fog fix disabled");
}
if (g_fix_enabled && g_Fog_fix_enabled && Fogaddress) {
if (!(g_fix_enabled && g_Fog_fix_enabled) && FogDensityEngineaddress && FogOpacityEngineaddress)
logger->info("Fog fix disabled");
if (Fogaddress) {
if (!FogHook) FogHook = safetyhook::create_mid(Fogaddress + 0x5f, // Generic hook for fogs fixes
[](SafetyHookContext& ctx) {
UWorld* World = UWorld::GetWorld();
if (!World) return;
if (World != previousWorld) {
previousWorld = World;
previousLevel = World->PersistentLevel;
previousFogActor = nullptr;
UWorld* world = UWorld::GetWorld();
if (world != previousWorld) {
previousWorld = world;
fogComponent = nullptr;
g_DefaultFogDensity = -1.f;
g_DefaultFogMaxOpacity = -1.f;
}
if (!previousFogActor || !previousFogActor->Component) { // Dynamic search for fog actor if none is valid
if (previousLevel) {
for (AActor* Actor : previousLevel->Actors) {
if (!Actor || !Actor->Class) continue;
if (Actor->IsA(AExponentialHeightFog::StaticClass())) {
previousFogActor = reinterpret_cast<AExponentialHeightFog*>(Actor);
// Save default values
g_DefaultFogDensity = previousFogActor->Component->FogDensity;
g_DefaultFogMaxOpacity = previousFogActor->Component->FogMaxOpacity;
break;
}
}
}
}
if (previousFogActor && previousFogActor->Component) {
// Get default engine values
if (g_DefaultFogDensity == -1.f) g_DefaultFogDensity = previousFogActor->Component->FogDensity;
if (g_DefaultFogMaxOpacity == -1.f) g_DefaultFogMaxOpacity = previousFogActor->Component->FogMaxOpacity;
// Force fix values
previousFogActor->Component->SetFogDensity(g_fix_enabled && g_Fog_fix_enabled ? g_FogDensity : g_DefaultFogDensity);
previousFogActor->Component->SetFogMaxOpacity(g_fix_enabled && g_Fog_fix_enabled ? g_FogMaxOpacity : g_DefaultFogMaxOpacity);
if (fogComponent) {
if (g_DefaultFogDensity == -1.f) g_DefaultFogDensity = fogComponent->FogDensity;
if (g_DefaultFogMaxOpacity == -1.f) g_DefaultFogMaxOpacity = fogComponent->FogMaxOpacity;
fogComponent->SetFogDensity(g_fix_enabled && g_Fog_fix_enabled ? g_FogDensity : g_DefaultFogDensity);
fogComponent->SetFogMaxOpacity(g_fix_enabled && g_Fog_fix_enabled ? g_FogMaxOpacity : g_DefaultFogMaxOpacity);
}
});
}
@@ -569,49 +545,7 @@ static void EnableConsole() {
}
logger->info("-------------- Console re-enabling --------------");
std::thread([&]() {
auto start = std::chrono::high_resolution_clock::now(); // Measure the time to renable console
UEngine* Engine = nullptr;
for (int i = 0; i < 10; ++i) { // gives 10 seconds to find UE Engine
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
Engine = UEngine::GetEngine();
if (Engine && Engine->ConsoleClass && Engine->GameViewport)
break;
}
if (!Engine || !Engine->ConsoleClass || !Engine->GameViewport) {
logger->error("Console could not be found in engine.");
return;
}
logger->info("Console found in engine");
/* Creates a new UObject of class-type specified by Engine->ConsoleClass */
UObject* NewObject = UGameplayStatics::SpawnObject(Engine->ConsoleClass, Engine->GameViewport);
if (NewObject)
{
logger->info("Successfully spawned console object");
// Set the console viewport so that it will be displayed
Engine->GameViewport->ViewportConsole = static_cast<UConsole*>(NewObject);
// Compute console enabling duration
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = end - start;
// Set the all the console shortkey to F2
for (int i = 0; i < UInputSettings::GetDefaultObj()->ConsoleKeys.Num(); i++)
{
UInputSettings::GetDefaultObj()->ConsoleKeys[i].KeyName = UKismetStringLibrary::Conv_StringToName(L"F2");
}
logger->info("Console fully reactivated in {:.3f}s and bound to key F2", elapsed.count());
logger->info("------------------ User inputs ------------------");
g_Console_Enabled = true;
}
else {
logger->error("Could not spawn console object");
logger->info("------------------ User inputs ------------------");
}
}).detach();
ReactivateDevConsole(logger);
}
static void InitializeLogger() {