Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 35 additions & 11 deletions src/WeatherManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
Loading