From 1e9c134e6733169961df32181b2ab68e2155d6b6 Mon Sep 17 00:00:00 2001 From: SkrubbySkrubInAShrub Date: Sun, 15 Mar 2026 23:42:33 +0100 Subject: [PATCH] fix(weather): improve feature transition handling and restore user settings --- src/WeatherManager.cpp | 46 ++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/src/WeatherManager.cpp b/src/WeatherManager.cpp index 6c6bb0fed4..ca893cd7ea 100644 --- a/src/WeatherManager.cpp +++ b/src/WeatherManager.cpp @@ -2,6 +2,26 @@ #include "State.h" +namespace +{ + void RestoreFeatureUserSettings(WeatherVariables::GlobalWeatherRegistry* registry, const std::string& featureName) + { + if (!registry) { + return; + } + + registry->EndFeatureTransition(featureName); + auto* featureRegistry = registry->GetFeatureRegistry(featureName); + if (!featureRegistry) { + return; + } + + for (const auto& var : featureRegistry->GetVariables()) { + var->SetToUserSettings(); + } + } +} + WeatherManager::CurrentWeathers WeatherManager::GetCurrentWeathers() { CurrentWeathers result; @@ -100,33 +120,37 @@ void WeatherManager::UpdateFeatures() if (globalRegistry->HasWeatherSupport(featureName)) { json currWeatherSettings; json nextWeatherSettings; + bool hasCurrOverride = false; + bool hasNextOverride = false; // Load settings for last weather (from) if (currentWeathers.lastWeather && currentWeathers.lerpFactor < 1.0f) { - LoadSettingsFromWeather(currentWeathers.lastWeather, featureName, currWeatherSettings); + hasCurrOverride = LoadSettingsFromWeather(currentWeathers.lastWeather, featureName, currWeatherSettings); } // Load settings for current weather (to) if (currentWeathers.currentWeather) { - LoadSettingsFromWeather(currentWeathers.currentWeather, featureName, nextWeatherSettings); + hasNextOverride = LoadSettingsFromWeather(currentWeathers.currentWeather, featureName, nextWeatherSettings); } + const bool hasAnyWeatherOverride = hasCurrOverride || hasNextOverride; + // Handle transition lifecycle - if (transitionStarting) { + if (transitionStarting && hasAnyWeatherOverride) { // Begin new transition - cache the "from" values globalRegistry->BeginFeatureTransition(featureName, currWeatherSettings); } + // No weather overrides on either side: keep in-memory settings unchanged + if (!hasAnyWeatherOverride) { + globalRegistry->EndFeatureTransition(featureName); + continue; + } + // Update feature variables - if (currentWeathers.lerpFactor >= 1.0f && nextWeatherSettings.empty()) { + if (currentWeathers.lerpFactor >= 1.0f && !hasNextOverride) { // Transition complete, no override on destination - reset to user settings - globalRegistry->EndFeatureTransition(featureName); - auto* featureRegistry = globalRegistry->GetFeatureRegistry(featureName); - if (featureRegistry) { - for (const auto& var : featureRegistry->GetVariables()) { - var->SetToUserSettings(); - } - } + RestoreFeatureUserSettings(globalRegistry, featureName); } else { // In transition or has override - interpolate globalRegistry->UpdateFeatureFromWeathers(featureName, currWeatherSettings, nextWeatherSettings, currentWeathers.lerpFactor);