RealtimeStyleTransferRuntime/Source/LyraGame/Settings/LyraGameSettingRegistry_Mou...

247 lines
12 KiB
C++
Raw Permalink Normal View History

2022-05-23 18:41:30 +00:00
// Copyright Epic Games, Inc. All Rights Reserved.
2022-09-13 07:18:28 +00:00
#include "CommonInputBaseTypes.h"
#include "Containers/Array.h"
#include "Containers/Map.h"
#include "Containers/Set.h"
#include "Containers/UnrealString.h"
#include "CustomSettings/LyraSettingKeyboardInput.h"
#include "DataSource/GameSettingDataSourceDynamic.h"
#include "EditCondition/WhenCondition.h"
#include "Engine/PlatformSettingsManager.h"
#include "EnhancedActionKeyMapping.h"
2022-05-23 18:41:30 +00:00
#include "GameSetting.h"
2022-09-13 07:18:28 +00:00
#include "GameSettingCollection.h"
#include "GameSettingFilterState.h"
2022-05-23 18:41:30 +00:00
#include "GameSettingValueDiscreteDynamic.h"
#include "GameSettingValueScalarDynamic.h"
2022-09-13 07:18:28 +00:00
#include "HAL/Platform.h"
#include "Input/LyraMappableConfigPair.h"
#include "InputCoreTypes.h"
#include "Internationalization/Internationalization.h"
#include "Internationalization/Text.h"
#include "Logging/LogCategory.h"
#include "Logging/LogMacros.h"
#include "LyraGameSettingRegistry.h"
2022-05-23 18:41:30 +00:00
#include "LyraSettingsLocal.h"
#include "LyraSettingsShared.h"
2022-09-13 07:18:28 +00:00
#include "Math/Range.h"
#include "Misc/AssertionMacros.h"
#include "Player/LyraLocalPlayer.h"
2022-05-23 18:41:30 +00:00
#include "PlayerMappableInputConfig.h"
2022-09-13 07:18:28 +00:00
#include "Templates/Casts.h"
#include "Templates/SharedPointer.h"
#include "Trace/Detail/Channel.h"
#include "UObject/NameTypes.h"
#include "UObject/UObjectGlobals.h"
#include "UObject/UnrealNames.h"
class ULocalPlayer;
2022-05-23 18:41:30 +00:00
#define LOCTEXT_NAMESPACE "Lyra"
UGameSettingCollection* ULyraGameSettingRegistry::InitializeMouseAndKeyboardSettings(ULyraLocalPlayer* InLocalPlayer)
{
UGameSettingCollection* Screen = NewObject<UGameSettingCollection>();
Screen->SetDevName(TEXT("MouseAndKeyboardCollection"));
Screen->SetDisplayName(LOCTEXT("MouseAndKeyboardCollection_Name", "Mouse & Keyboard"));
Screen->Initialize(InLocalPlayer);
const TSharedRef<FWhenCondition> WhenPlatformSupportsMouseAndKeyboard = MakeShared<FWhenCondition>(
[](const ULocalPlayer*, FGameSettingEditableState& InOutEditState)
{
const UCommonInputPlatformSettings* PlatformInput = UPlatformSettingsManager::Get().GetSettingsForPlatform<UCommonInputPlatformSettings>();
if (!PlatformInput->SupportsInputType(ECommonInputType::MouseAndKeyboard))
{
InOutEditState.Kill(TEXT("Platform does not support mouse and keyboard"));
}
});
// Mouse Sensitivity
////////////////////////////////////////////////////////////////////////////////////
{
UGameSettingCollection* Sensitivity = NewObject<UGameSettingCollection>();
Sensitivity->SetDevName(TEXT("MouseSensitivityCollection"));
Sensitivity->SetDisplayName(LOCTEXT("MouseSensitivityCollection_Name", "Sensitivity"));
Screen->AddSetting(Sensitivity);
//----------------------------------------------------------------------------------
{
UGameSettingValueScalarDynamic* Setting = NewObject<UGameSettingValueScalarDynamic>();
Setting->SetDevName(TEXT("MouseSensitivityYaw"));
Setting->SetDisplayName(LOCTEXT("MouseSensitivityYaw_Name", "X-Axis Sensitivity"));
Setting->SetDescriptionRichText(LOCTEXT("MouseSensitivityYaw_Description", "Sets the sensitivity of the mouse's horizontal (x) axis. With higher settings the camera will move faster when looking left and right with the mouse."));
Setting->SetDynamicGetter(GET_SHARED_SETTINGS_FUNCTION_PATH(GetMouseSensitivityX));
Setting->SetDynamicSetter(GET_SHARED_SETTINGS_FUNCTION_PATH(SetMouseSensitivityX));
Setting->SetDefaultValue(GetDefault<ULyraSettingsShared>()->GetMouseSensitivityX());
Setting->SetDisplayFormat(UGameSettingValueScalarDynamic::RawTwoDecimals);
Setting->SetSourceRangeAndStep(TRange<double>(0, 10), 0.01);
Setting->SetMinimumLimit(0.01);
Setting->AddEditCondition(WhenPlatformSupportsMouseAndKeyboard);
Sensitivity->AddSetting(Setting);
}
//----------------------------------------------------------------------------------
{
UGameSettingValueScalarDynamic* Setting = NewObject<UGameSettingValueScalarDynamic>();
Setting->SetDevName(TEXT("MouseSensitivityPitch"));
Setting->SetDisplayName(LOCTEXT("MouseSensitivityPitch_Name", "Y-Axis Sensitivity"));
Setting->SetDescriptionRichText(LOCTEXT("MouseSensitivityPitch_Description", "Sets the sensitivity of the mouse's vertical (y) axis. With higher settings the camera will move faster when looking up and down with the mouse."));
Setting->SetDynamicGetter(GET_SHARED_SETTINGS_FUNCTION_PATH(GetMouseSensitivityY));
Setting->SetDynamicSetter(GET_SHARED_SETTINGS_FUNCTION_PATH(SetMouseSensitivityY));
Setting->SetDefaultValue(GetDefault<ULyraSettingsShared>()->GetMouseSensitivityY());
Setting->SetDisplayFormat(UGameSettingValueScalarDynamic::RawTwoDecimals);
Setting->SetSourceRangeAndStep(TRange<double>(0, 10), 0.01);
Setting->SetMinimumLimit(0.01);
Setting->AddEditCondition(WhenPlatformSupportsMouseAndKeyboard);
Sensitivity->AddSetting(Setting);
}
//----------------------------------------------------------------------------------
{
UGameSettingValueScalarDynamic* Setting = NewObject<UGameSettingValueScalarDynamic>();
Setting->SetDevName(TEXT("MouseTargetingMultiplier"));
Setting->SetDisplayName(LOCTEXT("MouseTargetingMultiplier_Name", "Targeting Sensitivity"));
Setting->SetDescriptionRichText(LOCTEXT("MouseTargetingMultiplier_Description", "Sets the modifier for reducing mouse sensitivity when targeting. 100% will have no slow down when targeting. Lower settings will have more slow down when targeting."));
Setting->SetDynamicGetter(GET_SHARED_SETTINGS_FUNCTION_PATH(GetTargetingMultiplier));
Setting->SetDynamicSetter(GET_SHARED_SETTINGS_FUNCTION_PATH(SetTargetingMultiplier));
Setting->SetDefaultValue(GetDefault<ULyraSettingsShared>()->GetTargetingMultiplier());
Setting->SetDisplayFormat(UGameSettingValueScalarDynamic::RawTwoDecimals);
Setting->SetSourceRangeAndStep(TRange<double>(0, 10), 0.01);
Setting->SetMinimumLimit(0.01);
Setting->AddEditCondition(WhenPlatformSupportsMouseAndKeyboard);
Sensitivity->AddSetting(Setting);
}
//----------------------------------------------------------------------------------
{
UGameSettingValueDiscreteDynamic_Bool* Setting = NewObject<UGameSettingValueDiscreteDynamic_Bool>();
Setting->SetDevName(TEXT("InvertVerticalAxis"));
Setting->SetDisplayName(LOCTEXT("InvertVerticalAxis_Name", "Invert Vertical Axis"));
Setting->SetDescriptionRichText(LOCTEXT("InvertVerticalAxis_Description", "Enable the inversion of the vertical look axis."));
Setting->SetDynamicGetter(GET_SHARED_SETTINGS_FUNCTION_PATH(GetInvertVerticalAxis));
Setting->SetDynamicSetter(GET_SHARED_SETTINGS_FUNCTION_PATH(SetInvertVerticalAxis));
Setting->SetDefaultValue(GetDefault<ULyraSettingsShared>()->GetInvertVerticalAxis());
Setting->AddEditCondition(WhenPlatformSupportsMouseAndKeyboard);
Sensitivity->AddSetting(Setting);
}
//----------------------------------------------------------------------------------
{
UGameSettingValueDiscreteDynamic_Bool* Setting = NewObject<UGameSettingValueDiscreteDynamic_Bool>();
Setting->SetDevName(TEXT("InvertHorizontalAxis"));
Setting->SetDisplayName(LOCTEXT("InvertHorizontalAxis_Name", "Invert Horizontal Axis"));
Setting->SetDescriptionRichText(LOCTEXT("InvertHorizontalAxis_Description", "Enable the inversion of the Horizontal look axis."));
Setting->SetDynamicGetter(GET_SHARED_SETTINGS_FUNCTION_PATH(GetInvertHorizontalAxis));
Setting->SetDynamicSetter(GET_SHARED_SETTINGS_FUNCTION_PATH(SetInvertHorizontalAxis));
Setting->SetDefaultValue(GetDefault<ULyraSettingsShared>()->GetInvertHorizontalAxis());
Setting->AddEditCondition(WhenPlatformSupportsMouseAndKeyboard);
Sensitivity->AddSetting(Setting);
}
//----------------------------------------------------------------------------------
}
// Bindings for Mouse & Keyboard - Automatically Generated
////////////////////////////////////////////////////////////////////////////////////
{
UGameSettingCollection* KeyBinding = NewObject<UGameSettingCollection>();
KeyBinding->SetDevName(TEXT("KeyBindingCollection"));
KeyBinding->SetDisplayName(LOCTEXT("KeyBindingCollection_Name", "Keyboard & Mouse"));
Screen->AddSetting(KeyBinding);
static TSet<FName> AddedSettings;
AddedSettings.Reset();
//----------------------------------------------------------------------------------
{
const TArray<FLoadedMappableConfigPair>& RegisteredConfigs = InLocalPlayer->GetLocalSettings()->GetAllRegisteredInputConfigs();
const TMap<FName, FKey>& CustomKeyMap = InLocalPlayer->GetLocalSettings()->GetCustomPlayerInputConfig();
for (const FLoadedMappableConfigPair& InputConfigPair : RegisteredConfigs)
{
if (InputConfigPair.Type != ECommonInputType::MouseAndKeyboard)
{
continue;
}
TArray<FEnhancedActionKeyMapping> ConfigMappings = InputConfigPair.Config->GetPlayerMappableKeys();
if (ConfigMappings.IsEmpty())
{
UE_LOG(LogLyraGameSettingRegistry, Warning, TEXT("PlayerMappableInputConfig '%s' has no player mappable keys in it! Skipping it in the setting registry..."), *InputConfigPair.Config->GetConfigName().ToString());
continue;
}
UGameSettingCollection* ConfigSettingCollection = NewObject<UGameSettingCollection>();
ConfigSettingCollection->SetDevName(InputConfigPair.Config->GetConfigName());
ConfigSettingCollection->SetDisplayName(InputConfigPair.Config->GetDisplayName());
Screen->AddSetting(ConfigSettingCollection);
// Add each player mappable key to the settings screen!
for (FEnhancedActionKeyMapping& Mapping : ConfigMappings)
{
ULyraSettingKeyboardInput* ExistingSetting = nullptr;
// Make sure that we cannot add two settings with the same FName for saving purposes
if (AddedSettings.Contains(Mapping.PlayerMappableOptions.Name))
{
UE_LOG(LogLyraGameSettingRegistry, Warning, TEXT("A setting with the name '%s' from config '%s' has already been added! Please remove duplicate name."), *Mapping.PlayerMappableOptions.Name.ToString(), *InputConfigPair.Config->GetConfigName().ToString());
continue;
}
for (UGameSetting* Setting : ConfigSettingCollection->GetChildSettings())
{
ULyraSettingKeyboardInput* LyraKeyboardSetting = Cast<ULyraSettingKeyboardInput>(Setting);
if (LyraKeyboardSetting->GetSettingDisplayName().EqualToCaseIgnored(Mapping.PlayerMappableOptions.DisplayName))
{
ExistingSetting = LyraKeyboardSetting;
break;
}
}
FEnhancedActionKeyMapping MappingSynthesized(Mapping);
// If the player has bound a custom key to this action, then set it to that
if (const FKey* PlayerBoundKey = CustomKeyMap.Find(Mapping.PlayerMappableOptions.Name))
{
MappingSynthesized.Key = *PlayerBoundKey;
}
if (MappingSynthesized.PlayerMappableOptions.Name != NAME_None && !MappingSynthesized.PlayerMappableOptions.DisplayName.IsEmpty())
{
// Create the settings widget and initialize it, adding it to this config's section
ULyraSettingKeyboardInput* InputBinding = ExistingSetting ? ExistingSetting : NewObject<ULyraSettingKeyboardInput>();
InputBinding->SetInputData(MappingSynthesized, InputConfigPair.Config, !ExistingSetting ? 0 : 1);
InputBinding->AddEditCondition(WhenPlatformSupportsMouseAndKeyboard);
if (!ExistingSetting)
{
ConfigSettingCollection->AddSetting(InputBinding);
}
AddedSettings.Add(MappingSynthesized.PlayerMappableOptions.Name);
}
else
{
UE_LOG(LogLyraGameSettingRegistry, Warning, TEXT("A setting with the name '%s' from config '%s' could not be added, one of its names is empty!"), *Mapping.PlayerMappableOptions.Name.ToString(), *InputConfigPair.Config->GetConfigName().ToString());
ensure(false);
}
}
}
}
}
return Screen;
}
#undef LOCTEXT_NAMESPACE