RealtimeStyleTransferRuntime/Source/LyraGame/Settings/LyraSettingsShared.cpp

237 lines
7.1 KiB
C++
Raw Permalink Normal View History

2022-05-23 18:41:30 +00:00
// Copyright Epic Games, Inc. All Rights Reserved.
#include "LyraSettingsShared.h"
2022-09-13 07:18:28 +00:00
#include "CoreGlobals.h"
2022-05-23 18:41:30 +00:00
#include "Framework/Application/SlateApplication.h"
2022-09-13 07:18:28 +00:00
#include "HAL/IConsoleManager.h"
#include "Internationalization/Culture.h"
#include "Internationalization/CulturePointer.h"
#include "Internationalization/Internationalization.h"
2022-05-23 18:41:30 +00:00
#include "Kismet/GameplayStatics.h"
2022-09-13 07:18:28 +00:00
#include "Math/UnrealMathSSE.h"
#include "Misc/App.h"
#include "Misc/AssertionMacros.h"
#include "Misc/ConfigCacheIni.h"
2022-05-23 18:41:30 +00:00
#include "Player/LyraLocalPlayer.h"
2022-09-13 07:18:28 +00:00
#include "Rendering/RenderingCommon.h"
#include "Rendering/SlateRenderer.h"
#include "SubtitleDisplaySubsystem.h"
#include "Templates/Casts.h"
2022-05-23 18:41:30 +00:00
static FString SHARED_SETTINGS_SLOT_NAME = TEXT("SharedGameSettings");
namespace LyraSettingsSharedCVars
{
static float DefaultGamepadLeftStickInnerDeadZone = 0.25f;
static FAutoConsoleVariableRef CVarGamepadLeftStickInnerDeadZone(
TEXT("gpad.DefaultLeftStickInnerDeadZone"),
DefaultGamepadLeftStickInnerDeadZone,
TEXT("Gamepad left stick inner deadzone")
);
static float DefaultGamepadRightStickInnerDeadZone = 0.25f;
static FAutoConsoleVariableRef CVarGamepadRightStickInnerDeadZone(
TEXT("gpad.DefaultRightStickInnerDeadZone"),
DefaultGamepadRightStickInnerDeadZone,
TEXT("Gamepad right stick inner deadzone")
);
}
ULyraSettingsShared::ULyraSettingsShared()
{
FInternationalization::Get().OnCultureChanged().AddUObject(this, &ThisClass::OnCultureChanged);
GamepadMoveStickDeadZone = LyraSettingsSharedCVars::DefaultGamepadLeftStickInnerDeadZone;
GamepadLookStickDeadZone = LyraSettingsSharedCVars::DefaultGamepadRightStickInnerDeadZone;
}
void ULyraSettingsShared::Initialize(ULyraLocalPlayer* LocalPlayer)
{
check(LocalPlayer);
OwningPlayer = LocalPlayer;
}
void ULyraSettingsShared::SaveSettings()
{
check(OwningPlayer);
UGameplayStatics::SaveGameToSlot(this, SHARED_SETTINGS_SLOT_NAME, OwningPlayer->GetLocalPlayerIndex());
}
/*static*/ ULyraSettingsShared* ULyraSettingsShared::LoadOrCreateSettings(const ULyraLocalPlayer* LocalPlayer)
{
ULyraSettingsShared* SharedSettings = nullptr;
// If the save game exists, load it.
if (UGameplayStatics::DoesSaveGameExist(SHARED_SETTINGS_SLOT_NAME, LocalPlayer->GetLocalPlayerIndex()))
{
USaveGame* Slot = UGameplayStatics::LoadGameFromSlot(SHARED_SETTINGS_SLOT_NAME, LocalPlayer->GetLocalPlayerIndex());
SharedSettings = Cast<ULyraSettingsShared>(Slot);
}
if (SharedSettings == nullptr)
{
SharedSettings = Cast<ULyraSettingsShared>(UGameplayStatics::CreateSaveGameObject(ULyraSettingsShared::StaticClass()));
}
SharedSettings->Initialize(const_cast<ULyraLocalPlayer*>(LocalPlayer));
SharedSettings->ApplySettings();
return SharedSettings;
}
void ULyraSettingsShared::ApplySettings()
{
ApplySubtitleOptions();
ApplyBackgroundAudioSettings();
ApplyCultureSettings();
}
void ULyraSettingsShared::SetColorBlindStrength(int32 InColorBlindStrength)
{
InColorBlindStrength = FMath::Clamp(InColorBlindStrength, 0, 10);
if (ColorBlindStrength != InColorBlindStrength)
{
ColorBlindStrength = InColorBlindStrength;
FSlateApplication::Get().GetRenderer()->SetColorVisionDeficiencyType(
(EColorVisionDeficiency)(int32)ColorBlindMode, (int32)ColorBlindStrength, true, false);
}
}
int32 ULyraSettingsShared::GetColorBlindStrength() const
{
return ColorBlindStrength;
}
void ULyraSettingsShared::SetColorBlindMode(EColorBlindMode InMode)
{
if (ColorBlindMode != InMode)
{
ColorBlindMode = InMode;
FSlateApplication::Get().GetRenderer()->SetColorVisionDeficiencyType(
(EColorVisionDeficiency)(int32)ColorBlindMode, (int32)ColorBlindStrength, true, false);
}
}
EColorBlindMode ULyraSettingsShared::GetColorBlindMode() const
{
return ColorBlindMode;
}
void ULyraSettingsShared::ApplySubtitleOptions()
{
if (USubtitleDisplaySubsystem* SubtitleSystem = USubtitleDisplaySubsystem::Get(OwningPlayer))
{
FSubtitleFormat SubtitleFormat;
SubtitleFormat.SubtitleTextSize = SubtitleTextSize;
SubtitleFormat.SubtitleTextColor = SubtitleTextColor;
SubtitleFormat.SubtitleTextBorder = SubtitleTextBorder;
SubtitleFormat.SubtitleBackgroundOpacity = SubtitleBackgroundOpacity;
SubtitleSystem->SetSubtitleDisplayOptions(SubtitleFormat);
}
}
//////////////////////////////////////////////////////////////////////
void ULyraSettingsShared::SetAllowAudioInBackgroundSetting(ELyraAllowBackgroundAudioSetting NewValue)
{
if (ChangeValueAndDirty(AllowAudioInBackground, NewValue))
{
ApplyBackgroundAudioSettings();
}
}
void ULyraSettingsShared::ApplyBackgroundAudioSettings()
{
if (OwningPlayer && OwningPlayer->IsPrimaryPlayer())
{
FApp::SetUnfocusedVolumeMultiplier((AllowAudioInBackground != ELyraAllowBackgroundAudioSetting::Off) ? 1.0f : 0.0f);
}
}
//////////////////////////////////////////////////////////////////////
void ULyraSettingsShared::ApplyCultureSettings()
{
if (bResetToDefaultCulture)
{
const FCulturePtr SystemDefaultCulture = FInternationalization::Get().GetDefaultCulture();
check(SystemDefaultCulture.IsValid());
const FString CultureToApply = SystemDefaultCulture->GetName();
if (FInternationalization::Get().SetCurrentCulture(CultureToApply))
{
// Clear this string
GConfig->RemoveKey(TEXT("Internationalization"), TEXT("Culture"), GGameUserSettingsIni);
GConfig->Flush(false, GGameUserSettingsIni);
}
bResetToDefaultCulture = false;
}
else if (!PendingCulture.IsEmpty())
{
// SetCurrentCulture may trigger PendingCulture to be cleared (if a culture change is broadcast) so we take a copy of it to work with
const FString CultureToApply = PendingCulture;
if (FInternationalization::Get().SetCurrentCulture(CultureToApply))
{
// Note: This is intentionally saved to the users config
// We need to localize text before the player logs in and very early in the loading screen
GConfig->SetString(TEXT("Internationalization"), TEXT("Culture"), *CultureToApply, GGameUserSettingsIni);
GConfig->Flush(false, GGameUserSettingsIni);
}
ClearPendingCulture();
}
}
void ULyraSettingsShared::ResetCultureToCurrentSettings()
{
ClearPendingCulture();
bResetToDefaultCulture = false;
}
const FString& ULyraSettingsShared::GetPendingCulture() const
{
return PendingCulture;
}
void ULyraSettingsShared::SetPendingCulture(const FString& NewCulture)
{
PendingCulture = NewCulture;
bResetToDefaultCulture = false;
bIsDirty = true;
}
void ULyraSettingsShared::OnCultureChanged()
{
ClearPendingCulture();
bResetToDefaultCulture = false;
}
void ULyraSettingsShared::ClearPendingCulture()
{
PendingCulture.Reset();
}
bool ULyraSettingsShared::IsUsingDefaultCulture() const
{
FString Culture;
GConfig->GetString(TEXT("Internationalization"), TEXT("Culture"), Culture, GGameUserSettingsIni);
return Culture.IsEmpty();
}
void ULyraSettingsShared::ResetToDefaultCulture()
{
ClearPendingCulture();
bResetToDefaultCulture = true;
bIsDirty = true;
}
//////////////////////////////////////////////////////////////////////
void ULyraSettingsShared::ApplyInputSensitivity()
{
}