From 509d2e9c98d1566df63843cdd1b985873ad5c164 Mon Sep 17 00:00:00 2001 From: Oleg Petruny Date: Thu, 9 Jan 2025 18:17:39 +0100 Subject: [PATCH] graphics settings code --- .../Lost_Edge/Private/CameraModeBase.cpp | 8 - .../Source/Lost_Edge/Private/CommonTexts.h | 10 ++ .../Lost_Edge/Private/CustomGameSettings.cpp | 21 ++- .../Lost_Edge/Private/CustomGameSettings.h | 54 +++---- .../Private/GraphicsSettingsHelper.cpp | 145 +++++++++++++++++- .../Private/GraphicsSettingsHelper.h | 51 ++++-- .../Source/Lost_Edge/Private/PlayerBase.cpp | 6 - 7 files changed, 230 insertions(+), 65 deletions(-) create mode 100644 UnrealProject/Lost_Edge/Source/Lost_Edge/Private/CommonTexts.h diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/CameraModeBase.cpp b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/CameraModeBase.cpp index 1742346..648f9e4 100644 --- a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/CameraModeBase.cpp +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/CameraModeBase.cpp @@ -27,14 +27,6 @@ void ACameraModeBase::BeginPlay() Super::BeginPlay(); auto world = GetWorld(); - - if(auto gameSettings = UCustomGameSettings::Get()) - { - if(auto camera = FindComponentByClass()) - { - camera->PostProcessSettings.MotionBlurAmount = gameSettings->bUseMotionBlur ? 1.0f : 0.0f; - } - } } void ACameraModeBase::Tick(float DeltaTime) diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/CommonTexts.h b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/CommonTexts.h new file mode 100644 index 0000000..af603f0 --- /dev/null +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/CommonTexts.h @@ -0,0 +1,10 @@ +// Oleg Petruny proprietary. + +#pragma once + +#include "CoreMinimal.h" + +namespace CommonTexts +{ + const FText Default = NSLOCTEXT("CommonTexts", "Default", "Default"); +} \ No newline at end of file diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/CustomGameSettings.cpp b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/CustomGameSettings.cpp index 7584495..7692feb 100644 --- a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/CustomGameSettings.cpp +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/CustomGameSettings.cpp @@ -4,11 +4,12 @@ #include "Kismet/GameplayStatics.h" +#include "GraphicsSettingsHelper.h" + namespace { - /** Game */ - constexpr float fDefaultMouseSensetivity = 0.5f; - constexpr bool bDefaultMouseInverted = false; + /** Graphics */ + constexpr bool bDefaultShowFps = false; /** Audio */ constexpr float fDefaultMasterVolume = 0.4f; @@ -16,12 +17,17 @@ namespace constexpr float fDefaultEffectsVolume = 1.0f; constexpr float fDefaultVoicesVolume = 1.0f; constexpr float fDefaultMenuVolume = 1.0f; + + /** Game */ + constexpr float fDefaultMouseSensetivity = 0.5f; + constexpr bool bDefaultMouseInverted = false; } UCustomGameSettings::UCustomGameSettings(const FObjectInitializer& ObjectInitializer) :Super(ObjectInitializer) { - bUseMotionBlur = false; - bShowFps = false; + /** Graphics */ + bShowFps = GetDefaultShowFps(); + UGraphicsSettingsHelper::SetDefaults(this); /** Audio */ fMasterVolume = GetDefaultMasterVolume(); @@ -40,6 +46,11 @@ UCustomGameSettings* UCustomGameSettings::Get() return Cast(UGameUserSettings::GetGameUserSettings()); } +LOST_EDGE_API bool UCustomGameSettings::GetDefaultShowFps() const +{ + return bDefaultShowFps; +} + /** Audio */ diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/CustomGameSettings.h b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/CustomGameSettings.h index 239d687..c02f5c6 100644 --- a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/CustomGameSettings.h +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/CustomGameSettings.h @@ -15,78 +15,78 @@ class UCustomGameSettings : public UGameUserSettings { GENERATED_BODY() + friend class UGraphicsSettingsHelper; + public: // Is auto defined by UE but implementation is in cpp UCustomGameSettings(const FObjectInitializer& ObjectInitializer); - UFUNCTION(BlueprintPure, Category = Settings, meta = (DisplayName = "Get Custom Game Settings")) + UFUNCTION(BlueprintPure, Category = "Settings", meta = (DisplayName = "Get Custom Game Settings")) static UCustomGameSettings* Get(); + /** Graphics */ - UPROPERTY(Config, BlueprintReadWrite) - bool bUseMotionBlur; - - UPROPERTY(Config, BlueprintReadWrite) + UFUNCTION(BlueprintPure, Category = "Settings|Graphics") + LOST_EDGE_API inline bool GetDefaultShowFps() const; + UPROPERTY(Config, BlueprintReadWrite, Category = "Settings|Graphics") bool bShowFps; - - /** * Audio * All values are clamped in [0.0 - 1.0] */ - UFUNCTION(BlueprintPure, Category = Settings) + UFUNCTION(BlueprintPure, Category = "Settings|Audio") LOST_EDGE_API inline float GetDefaultMasterVolume() const; // UFUNCTION doesn't support constexpr functions - UFUNCTION(BlueprintPure, Category = Settings) + UFUNCTION(BlueprintPure, Category = "Settings|Audio") LOST_EDGE_API inline float GetDefaultMusicVolume() const; // UFUNCTION doesn't support constexpr functions - UFUNCTION(BlueprintPure, Category = Settings) + UFUNCTION(BlueprintPure, Category = "Settings|Audio") LOST_EDGE_API inline float GetDefaultEffectsVolume() const; // UFUNCTION doesn't support constexpr functions - UFUNCTION(BlueprintPure, Category = Settings) + UFUNCTION(BlueprintPure, Category = "Settings|Audio") LOST_EDGE_API inline float GetDefaultVoicesVolume() const; // UFUNCTION doesn't support constexpr functions - UFUNCTION(BlueprintPure, Category = Settings) + UFUNCTION(BlueprintPure, Category = "Settings|Audio") LOST_EDGE_API inline float GetDefaultMenuVolume() const; // UFUNCTION doesn't support constexpr functions - UFUNCTION(BlueprintPure, Category = Settings) + UFUNCTION(BlueprintPure, Category = "Settings|Audio") float GetMasterVolume() const; - UFUNCTION(BlueprintPure, Category = Settings) + UFUNCTION(BlueprintPure, Category = "Settings|Audio") float GetMusicVolume() const; - UFUNCTION(BlueprintPure, Category = Settings) + UFUNCTION(BlueprintPure, Category = "Settings|Audio") float GetEffectsVolume() const; - UFUNCTION(BlueprintPure, Category = Settings) + UFUNCTION(BlueprintPure, Category = "Settings|Audio") float GetVoicesVolume() const; - UFUNCTION(BlueprintPure, Category = Settings) + UFUNCTION(BlueprintPure, Category = "Settings|Audio") float GetMenuVolume() const; - UFUNCTION(BlueprintCallable, Category = Settings) + UFUNCTION(BlueprintCallable, Category = "Settings|Audio") void SetMasterVolume(float value); - UFUNCTION(BlueprintCallable, Category = Settings) + UFUNCTION(BlueprintCallable, Category = "Settings|Audio") void SetMusicVolume(float value); - UFUNCTION(BlueprintCallable, Category = Settings) + UFUNCTION(BlueprintCallable, Category = "Settings|Audio") void SetEffectsVolume(float value); - UFUNCTION(BlueprintCallable, Category = Settings) + UFUNCTION(BlueprintCallable, Category = "Settings|Audio") void SetVoicesVolume(float value); - UFUNCTION(BlueprintCallable, Category = Settings) + UFUNCTION(BlueprintCallable, Category = "Settings|Audio") void SetMenuVolume(float value); /** Game */ - UFUNCTION(BlueprintPure, Category = Settings) + UFUNCTION(BlueprintPure, Category = "Settings|Game") LOST_EDGE_API inline float GetDefaultMouseSensetivity() const; /** Returns mouse sensetivity multiplier in [0.1 - 2.0] */ - UFUNCTION(BlueprintPure, Category = Settings) + UFUNCTION(BlueprintPure, Category = "Settings|Game") float GetMouseSensetivity() const; /** * Sets mouse sensetivity multiplier * @param value [0.1 - 2.0] */ - UFUNCTION(BlueprintCallable, Category = Settings) + UFUNCTION(BlueprintCallable, Category = "Settings|Game") void SetMouseSensetivity(float value); - UFUNCTION(BlueprintPure, Category = Settings) + UFUNCTION(BlueprintPure, Category = "Settings|Game") LOST_EDGE_API inline bool GetDefaultMouseInverted() const; - UPROPERTY(Config, BlueprintReadWrite) + UPROPERTY(Config, BlueprintReadWrite, Category = "Settings|Game") bool bMouseInverted; diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/GraphicsSettingsHelper.cpp b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/GraphicsSettingsHelper.cpp index 7057683..76b2352 100644 --- a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/GraphicsSettingsHelper.cpp +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/GraphicsSettingsHelper.cpp @@ -5,15 +5,44 @@ #include "GenericPlatform/GenericApplication.h" #include "CommonFunctions.h" +#include "CommonTexts.h" #include "CustomGameSettings.h" +#include + namespace { const FIntPoint ipDefaultWindowPosition = { 0, 0 }; + std::optional ipPreviousWindowPosition; constexpr int32 iDefaultMonitorId = 0; const FIntPoint ipDefaultResolution = { 1920, 1080 }; + std::optional ipPreviousResolution; constexpr float fDefaultResolutionScale = 1.0f; constexpr int32 iDefaultFrameRateLimit = 120; + constexpr EDisplayMode eDefaultDisplayMode = EDisplayMode::Fullscreen; + std::optional ePreviousDisplayMode; +} + +bool UGraphicsSettingsHelper::AreSettingsRestorable(UCustomGameSettings* settings) +{ + return ipPreviousWindowPosition.has_value() + || ipPreviousResolution.has_value() + || ePreviousDisplayMode.has_value(); +} + +void UGraphicsSettingsHelper::SetDefaults(UCustomGameSettings* settings) +{ + { + FIntPoint pos = GetDefaultWindowPosition(settings); + settings->WindowPosX = pos.X; + settings->WindowPosY = pos.Y; + } + { + FIntPoint res = GetDefaultResolution(settings); + settings->ResolutionSizeX = res.X; + settings->ResolutionSizeY = res.Y; + } + settings->FullscreenMode = DisplayToWindowMode(GetDefaultDisplayMode(settings)); } FIntPoint UGraphicsSettingsHelper::GetDefaultWindowPosition([[maybe_unused]] UCustomGameSettings* settings) @@ -35,18 +64,29 @@ FIntPoint UGraphicsSettingsHelper::GetWindowPosition([[maybe_unused]] UCustomGam return GetDefaultWindowPosition(settings); } -void UGraphicsSettingsHelper::SetWindowPosition([[maybe_unused]] UCustomGameSettings* settings, const FIntPoint& pos) +void UGraphicsSettingsHelper::SetWindowPosition(UCustomGameSettings* settings, const FIntPoint& pos) { if(settings && GEngine && GEngine->GameViewport) { if(auto window = GEngine->GameViewport->GetWindow()) { + if(ipPreviousWindowPosition == pos) + ipPreviousWindowPosition.reset(); + else + ipPreviousWindowPosition = GetWindowPosition(settings); + window->MoveWindowTo(pos); settings->SetWindowPosition(pos.X, pos.Y); } } +} - return; +void UGraphicsSettingsHelper::RestoreWindowPosition(UCustomGameSettings* settings) +{ + if(!ipPreviousWindowPosition.has_value()) + return; + + SetWindowPosition(settings, ipPreviousWindowPosition.value()); } int32 UGraphicsSettingsHelper::GetDefaultMonitorId([[maybe_unused]] UCustomGameSettings* settings) @@ -120,6 +160,11 @@ void UGraphicsSettingsHelper::SetMonitor(UCustomGameSettings* settings, const in }); } +void UGraphicsSettingsHelper::RestoreMonitor(UCustomGameSettings* settings) +{ + RestoreWindowPosition(settings); +} + FIntPoint UGraphicsSettingsHelper::GetDefaultResolution([[maybe_unused]] UCustomGameSettings* settings) { return ipDefaultResolution; @@ -223,9 +268,23 @@ void UGraphicsSettingsHelper::SetResolution(UCustomGameSettings* settings, const return; settings->bUseDynamicResolution = true; + + if(ipPreviousResolution.has_value() && ipPreviousResolution == resolution) + ipPreviousResolution.reset(); + else + ipPreviousResolution = resolution; + settings->SetScreenResolution(resolution); } +void UGraphicsSettingsHelper::RestoreResolution(UCustomGameSettings* settings) +{ + if(!ipPreviousResolution.has_value()) + return; + + SetResolution(settings, ipPreviousResolution.value()); +} + float UGraphicsSettingsHelper::GetDefaultResolutionScale([[maybe_unused]] UCustomGameSettings* settings) { return fDefaultResolutionScale; @@ -295,3 +354,85 @@ TArray UGraphicsSettingsHelper::GetAvailableAspectRatiousOfMonitor(co return aspects.Array(); } +EDisplayMode UGraphicsSettingsHelper::GetDefaultDisplayMode([[maybe_unused]] UCustomGameSettings* settings) +{ + return eDefaultDisplayMode; +} + +EDisplayMode UGraphicsSettingsHelper::GetDisplayMode(UCustomGameSettings* settings) +{ + if(!settings) + return GetDefaultDisplayMode(settings); + + return WindowToDisplayMode(settings->GetFullscreenMode()); +} + +EDisplayMode UGraphicsSettingsHelper::TextToDisplayMode(const FText& in) +{ + static const UEnum* enumPtr = FindObject(ANY_PACKAGE, TEXT("EDisplayMode"), true); + if(!enumPtr) + return GetDefaultDisplayMode(nullptr); + + return static_cast(enumPtr->GetValueByName(FName{ *FTextInspector::GetSourceString(in) })); +} + +FText UGraphicsSettingsHelper::DisplayModeToText(const EDisplayMode mode) +{ + static const UEnum* enumPtr = FindObject(ANY_PACKAGE, TEXT("EDisplayMode"), true); + if(!enumPtr) + return CommonTexts::Default; + + return enumPtr->GetDisplayNameTextByIndex(static_cast(mode)); +} + +void UGraphicsSettingsHelper::SetDisplayMode(UCustomGameSettings* settings, const EDisplayMode mode) +{ + if(!settings) + return; + + if(ePreviousDisplayMode.has_value() && ePreviousDisplayMode == mode) + ePreviousDisplayMode.reset(); + else + ePreviousDisplayMode = mode; + + settings->SetFullscreenMode(DisplayToWindowMode(mode)); +} + +void UGraphicsSettingsHelper::RestoreDisplayMode(UCustomGameSettings* settings) +{ + if(!ePreviousDisplayMode.has_value()) + return; + + SetDisplayMode(settings, ePreviousDisplayMode.value()); +} + +inline constexpr EDisplayMode UGraphicsSettingsHelper::WindowToDisplayMode(const EWindowMode::Type mode) +{ + switch(mode) + { + case EWindowMode::Type::WindowedFullscreen: + return EDisplayMode::Borderless; + case EWindowMode::Type::Windowed: + return EDisplayMode::Windowed; + case EWindowMode::Type::Fullscreen: + default: + return EDisplayMode::Fullscreen; + } +} + +inline constexpr EWindowMode::Type UGraphicsSettingsHelper::DisplayToWindowMode(const EDisplayMode mode) +{ + switch(mode) + { + case EDisplayMode::Borderless: + return EWindowMode::Type::WindowedFullscreen; + case EDisplayMode::Windowed: + return EWindowMode::Type::Windowed; + case EDisplayMode::Fullscreen: + default: + return EWindowMode::Type::Fullscreen; + } +} + + + diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/GraphicsSettingsHelper.h b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/GraphicsSettingsHelper.h index f20185b..5d5f1d6 100644 --- a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/GraphicsSettingsHelper.h +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/GraphicsSettingsHelper.h @@ -18,19 +18,20 @@ public: TArray refreshRates; }; +/** Redefine of EWindowType, because it has duplicate without blueprint macro */ UENUM(BlueprintType, Category = "Settings|Graphics|Enums") enum class EDisplayMode : uint8 { - Fullscreen = 0, - Borderless = 1, - Windowed = 2 + Fullscreen = 0 UMETA(DisplayName = "Fullscreen"), + Borderless = 1 UMETA(DisplayName = "Borderless"), + Windowed = 2 UMETA(DisplayName = "Windowed") }; /** * Helper for trivial and complex graphic settings. * Most of functions work without settings pointer. It is there just for Blueprint call convinience. - * Helps with window position, monitor selection, resolution, resolution scale, frame rate limit, aspect ratio, - * display mode and gamma. + * Helps with window position, monitor selection, resolution, resolution scale, frame rate limit, aspect ratio, display mode. + * */ UCLASS() class UGraphicsSettingsHelper : public UBlueprintFunctionLibrary @@ -38,13 +39,22 @@ class UGraphicsSettingsHelper : public UBlueprintFunctionLibrary GENERATED_BODY() public: + UFUNCTION(BlueprintPure, Category = "Settings|Graphics", meta = (DisplayName = "AreGraphicsSettingsRestorable")) + static bool AreSettingsRestorable(class UCustomGameSettings* settings); + UFUNCTION(BlueprintCallable, Category = "Settings|Graphics", meta = (DisplayName = "SetGraphicsDefaults")) + static void SetDefaults(class UCustomGameSettings* settings); + +protected: // Window position setting is on the thin edge of user safeness, therefore protected. Please use SetMonitor(). UFUNCTION(BlueprintPure, Category = "Settings|Graphics|Window") static FIntPoint GetDefaultWindowPosition(class UCustomGameSettings* settings); // inline functions need API macro, but API macro with static inline function results in "no definition" UFUNCTION(BlueprintPure, Category = "Settings|Graphics|Window") static FIntPoint GetWindowPosition(class UCustomGameSettings* settings); UFUNCTION(BlueprintCallable, Category = "Settings|Graphics|Window") static void SetWindowPosition(class UCustomGameSettings* settings, const FIntPoint& pos); + UFUNCTION(BlueprintCallable, Category = "Settings|Graphics|Window") + static void RestoreWindowPosition(class UCustomGameSettings* settings); +public: UFUNCTION(BlueprintPure, Category = "Settings|Graphics|Monitor") static int32 GetDefaultMonitorId(class UCustomGameSettings* settings); UFUNCTION(BlueprintPure, Category = "Settings|Graphics|Monitor") @@ -56,6 +66,8 @@ public: static TArray GetAvailableMonitors(); UFUNCTION(BlueprintCallable, Category = "Settings|Graphics|Monitor") static void SetMonitor(class UCustomGameSettings* settings, const int32 id); + UFUNCTION(BlueprintCallable, Category = "Settings|Graphics|Monitor") + static void RestoreMonitor(class UCustomGameSettings* settings); UFUNCTION(BlueprintPure, Category = "Settings|Graphics|Resolution") static FIntPoint GetDefaultResolution(class UCustomGameSettings* settings); @@ -73,6 +85,8 @@ public: static TArray FilterResolutionsViaAspectRatio(const TArray& resolutions, const FIntPoint& aspectRatio); UFUNCTION(BlueprintCallable, Category = "Settings|Graphics|Resolution") static void SetResolution(class UCustomGameSettings* settings, const FIntPoint& resolution); + UFUNCTION(BlueprintCallable, Category = "Settings|Graphics|Resolution") + static void RestoreResolution(class UCustomGameSettings* settings); UFUNCTION(BlueprintPure, Category = "Settings|Graphics|Resolution Scale") static float GetDefaultResolutionScale(class UCustomGameSettings* settings); @@ -97,17 +111,20 @@ public: UFUNCTION(BlueprintPure, Category = "Settings|Graphics|Aspect Ratio") static TArray GetAvailableAspectRatiousOfMonitor(const int32 monitor); - //UFUNCTION(BlueprintPure, Category = "Settings Video|Display Mode") - //static EDisplayMode StringToDisplayMode(FString in); - //UFUNCTION(BlueprintPure, Category = "Settings Video|Display Mode") - //static FString DisplayModeToString(EDisplayMode mode); - //UFUNCTION(BlueprintPure, Category = "Settings Video|Display Mode") - //static void IntToDisplayMode(int in, EDisplayMode& mode); - //UFUNCTION(BlueprintPure, Category = "Settings Video|Display Mode") - //static void DisplayModeToInt(EDisplayMode mode, int& out); - //UFUNCTION(BlueprintPure, Category = "Settings Video|Display Mode") - //static void GetCurrentDisplayMode(EDisplayMode& mode); - //UFUNCTION(BlueprintCallable, Category = "Settings Video|Display Mode") - //static void SetDisplayMode(EDisplayMode mode); + UFUNCTION(BlueprintPure, Category = "Settings|Graphics|Display Mode") + static EDisplayMode GetDefaultDisplayMode(class UCustomGameSettings* settings); + UFUNCTION(BlueprintPure, Category = "Settings|Graphics|Display Mode") + static EDisplayMode GetDisplayMode(class UCustomGameSettings* settings); + UFUNCTION(BlueprintPure, Category = "Settings|Graphics|Display Mode") + static EDisplayMode TextToDisplayMode(const FText& in); + UFUNCTION(BlueprintPure, Category = "Settings|Graphics|Display Mode") + static FText DisplayModeToText(const EDisplayMode mode); + UFUNCTION(BlueprintCallable, Category = "Settings|Graphics|Display Mode") + static void SetDisplayMode(class UCustomGameSettings* settings, const EDisplayMode mode); + UFUNCTION(BlueprintCallable, Category = "Settings|Graphics|Display Mode") + static void RestoreDisplayMode(class UCustomGameSettings* settings); +private: + inline constexpr static EDisplayMode WindowToDisplayMode(const EWindowMode::Type mode); + inline constexpr static EWindowMode::Type DisplayToWindowMode(const EDisplayMode mode); }; diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/PlayerBase.cpp b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/PlayerBase.cpp index e841f08..d9ca437 100644 --- a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/PlayerBase.cpp +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/PlayerBase.cpp @@ -85,12 +85,6 @@ void APlayerBase::BeginPlay() cameraManager->ViewPitchMax = maxPitch; } - auto gameSettings = UCustomGameSettings::Get(); - if(gameSettings && camera) - { - camera->PostProcessSettings.MotionBlurAmount = gameSettings->bUseMotionBlur ? 1.0f : 0.0f; - } - LoadInteractablesActivators(); }