Fix graphics settings
This commit is contained in:
parent
20654327c0
commit
a21bb37dcd
BIN
UnrealProject/Lost_Edge/Content/UI/Blueprints/MainMenu/Pages/UI_MainMenu_Page_Options_Graphics.uasset
(Stored with Git LFS)
BIN
UnrealProject/Lost_Edge/Content/UI/Blueprints/MainMenu/Pages/UI_MainMenu_Page_Options_Graphics.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
UnrealProject/Lost_Edge/Content/UI/Blueprints/Overlays/UI_Crosshair.uasset
(Stored with Git LFS)
BIN
UnrealProject/Lost_Edge/Content/UI/Blueprints/Overlays/UI_Crosshair.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
UnrealProject/Lost_Edge/Content/UI/Blueprints/Overlays/UI_FpsCounter.uasset
(Stored with Git LFS)
BIN
UnrealProject/Lost_Edge/Content/UI/Blueprints/Overlays/UI_FpsCounter.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
UnrealProject/Lost_Edge/Content/UI/Blueprints/UI_Journal.uasset
(Stored with Git LFS)
BIN
UnrealProject/Lost_Edge/Content/UI/Blueprints/UI_Journal.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
UnrealProject/Lost_Edge/Content/UI/Components/UIC_ComboBox.uasset
(Stored with Git LFS)
BIN
UnrealProject/Lost_Edge/Content/UI/Components/UIC_ComboBox.uasset
(Stored with Git LFS)
Binary file not shown.
@ -117,7 +117,9 @@ public:
|
|||||||
static TArray<int32> GetRandomIntArray(int32 size = 16, int32 min = 0, int32 max = 16);
|
static TArray<int32> GetRandomIntArray(int32 size = 16, int32 min = 0, int32 max = 16);
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static TArray<T> ArrayDiff(const TArray<T>& a, const TArray<T>& b);
|
static TArray<T> ArraySymmetricDiff(const TArray<T>& a, const TArray<T>& b);
|
||||||
|
template<typename T>
|
||||||
|
static TArray<T> ArrayIntersection(const TArray<T>& a, const TArray<T>& b);
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static void ArrayRemoveFirstFromEnd(TArray<T>& array, T element);
|
static void ArrayRemoveFirstFromEnd(TArray<T>& array, T element);
|
||||||
|
|
||||||
@ -134,15 +136,15 @@ namespace SlowMotion
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline TArray<T> UCommonFunctions::ArrayDiff(const TArray<T>& a, const TArray<T>& b)
|
inline TArray<T> UCommonFunctions::ArraySymmetricDiff(const TArray<T>& a, const TArray<T>& b)
|
||||||
{
|
{
|
||||||
TSet<T> result;
|
|
||||||
|
|
||||||
if(a.Num() == 0)
|
if(a.Num() == 0)
|
||||||
return b;
|
return b;
|
||||||
else if(b.Num() == 0)
|
else if(b.Num() == 0)
|
||||||
return a;
|
return a;
|
||||||
|
|
||||||
|
TSet<T> result;
|
||||||
|
|
||||||
for(auto& i : a)
|
for(auto& i : a)
|
||||||
if(!b.Contains(i))
|
if(!b.Contains(i))
|
||||||
result.Add(i);
|
result.Add(i);
|
||||||
@ -154,6 +156,32 @@ inline TArray<T> UCommonFunctions::ArrayDiff(const TArray<T>& a, const TArray<T>
|
|||||||
return result.Array();
|
return result.Array();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline TArray<T> UCommonFunctions::ArrayIntersection(const TArray<T>& a, const TArray<T>& b)
|
||||||
|
{
|
||||||
|
if(a.Num() == 0)
|
||||||
|
return {};
|
||||||
|
else if(b.Num() == 0)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
TSet<T> result;
|
||||||
|
|
||||||
|
if(a.Num() < b.Num())
|
||||||
|
{
|
||||||
|
for(auto& i : a)
|
||||||
|
if(b.Contains(i))
|
||||||
|
result.Add(i);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(auto& i : b)
|
||||||
|
if(a.Contains(i))
|
||||||
|
result.Add(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.Array();
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline void UCommonFunctions::ArrayRemoveFirstFromEnd(TArray<T>& array, T element)
|
inline void UCommonFunctions::ArrayRemoveFirstFromEnd(TArray<T>& array, T element)
|
||||||
{
|
{
|
||||||
|
@ -8,10 +8,14 @@
|
|||||||
#include "CommonTexts.h"
|
#include "CommonTexts.h"
|
||||||
#include "CustomGameSettings.h"
|
#include "CustomGameSettings.h"
|
||||||
|
|
||||||
|
#include <Kismet/KismetSystemLibrary.h>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
// some 16:9 resolutions (eg. 1366x768) are nonmathematical bullshit, therefore we try parse them with tolerance
|
||||||
|
constexpr float aspectRatioTolerance = 0.01f;
|
||||||
|
|
||||||
const FIntPoint ipDefaultWindowPosition = { 0, 0 };
|
const FIntPoint ipDefaultWindowPosition = { 0, 0 };
|
||||||
std::optional<FIntPoint> ipPreviousWindowPosition;
|
std::optional<FIntPoint> ipPreviousWindowPosition;
|
||||||
constexpr int32 iDefaultMonitorId = 0;
|
constexpr int32 iDefaultMonitorId = 0;
|
||||||
@ -19,7 +23,7 @@ namespace
|
|||||||
std::optional<FIntPoint> ipPreviousResolution;
|
std::optional<FIntPoint> ipPreviousResolution;
|
||||||
constexpr float fDefaultResolutionScale = 100.0f;
|
constexpr float fDefaultResolutionScale = 100.0f;
|
||||||
constexpr int32 iDefaultFrameRateLimit = 120;
|
constexpr int32 iDefaultFrameRateLimit = 120;
|
||||||
constexpr EDisplayMode eDefaultDisplayMode = EDisplayMode::Fullscreen;
|
constexpr EDisplayMode eDefaultDisplayMode = EDisplayMode::Borderless;
|
||||||
std::optional<EDisplayMode> ePreviousDisplayMode;
|
std::optional<EDisplayMode> ePreviousDisplayMode;
|
||||||
constexpr bool bDefaultVSyncEnabled = false;
|
constexpr bool bDefaultVSyncEnabled = false;
|
||||||
constexpr int32 eDefaultAntiAliasingMethod = static_cast<int32>(ELostEdgeAntiAliasingMethod::FXAA);
|
constexpr int32 eDefaultAntiAliasingMethod = static_cast<int32>(ELostEdgeAntiAliasingMethod::FXAA);
|
||||||
@ -54,7 +58,7 @@ void UGraphicsSettingsHelper::SetDefaults(UCustomGameSettings* settings)
|
|||||||
settings->ResolutionSizeX = res.X;
|
settings->ResolutionSizeX = res.X;
|
||||||
settings->ResolutionSizeY = res.Y;
|
settings->ResolutionSizeY = res.Y;
|
||||||
}
|
}
|
||||||
settings->bUseDynamicResolution = true;
|
settings->SetDynamicResolutionEnabled(true);
|
||||||
settings->FrameRateLimit = GetDefaultFrameRateLimit(settings);
|
settings->FrameRateLimit = GetDefaultFrameRateLimit(settings);
|
||||||
settings->SetResolutionScaleValueEx(fDefaultResolutionScale);
|
settings->SetResolutionScaleValueEx(fDefaultResolutionScale);
|
||||||
settings->FullscreenMode = DisplayToWindowMode(GetDefaultDisplayMode(settings));
|
settings->FullscreenMode = DisplayToWindowMode(GetDefaultDisplayMode(settings));
|
||||||
@ -66,6 +70,7 @@ void UGraphicsSettingsHelper::ApplySettings(UCustomGameSettings* settings)
|
|||||||
if(!settings)
|
if(!settings)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
CenterWindowPosition(settings);
|
||||||
if(GEngine && GEngine->GameViewport)
|
if(GEngine && GEngine->GameViewport)
|
||||||
if(auto window = GEngine->GameViewport->GetWindow())
|
if(auto window = GEngine->GameViewport->GetWindow())
|
||||||
window->MoveWindowTo(settings->GetWindowPosition());
|
window->MoveWindowTo(settings->GetWindowPosition());
|
||||||
@ -94,15 +99,41 @@ FIntPoint UGraphicsSettingsHelper::GetWindowPosition([[maybe_unused]] UCustomGam
|
|||||||
|
|
||||||
void UGraphicsSettingsHelper::SetWindowPosition(UCustomGameSettings* settings, const FIntPoint& pos)
|
void UGraphicsSettingsHelper::SetWindowPosition(UCustomGameSettings* settings, const FIntPoint& pos)
|
||||||
{
|
{
|
||||||
if(settings)
|
if(!settings)
|
||||||
{
|
return;
|
||||||
|
|
||||||
if(ipPreviousWindowPosition == pos)
|
if(ipPreviousWindowPosition == pos)
|
||||||
ipPreviousWindowPosition.reset();
|
ipPreviousWindowPosition.reset();
|
||||||
else
|
else
|
||||||
ipPreviousWindowPosition = GetWindowPosition(settings);
|
ipPreviousWindowPosition = GetWindowPosition(settings);
|
||||||
|
|
||||||
settings->SetWindowPosition(pos.X, pos.Y);
|
settings->SetWindowPosition(std::max(0, pos.X), std::max(0, pos.Y));
|
||||||
|
}
|
||||||
|
|
||||||
|
void UGraphicsSettingsHelper::CenterWindowPosition(UCustomGameSettings* settings)
|
||||||
|
{
|
||||||
|
if(!settings)
|
||||||
|
return;
|
||||||
|
|
||||||
|
FIntPoint position;
|
||||||
|
if(GetDisplayMode(settings) == EDisplayMode::Fullscreen)
|
||||||
|
{
|
||||||
|
position = { 0, 0 };
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto monitors = GetAvailableMonitors();
|
||||||
|
int32 monitorId = GetMonitorId(settings);
|
||||||
|
int32 offset = 0.0f;
|
||||||
|
for(int32 i = 0; i < monitorId; ++i)
|
||||||
|
offset += monitors[i].NativeWidth;
|
||||||
|
|
||||||
|
FIntPoint monitor = GetNativeResolutionByMonitorId(monitorId);
|
||||||
|
FIntPoint window = GetResolution(settings);
|
||||||
|
position = { offset + (monitor.X - window.X) / 2, (monitor.Y - window.Y) / 2 };
|
||||||
|
}
|
||||||
|
|
||||||
|
SetWindowPosition(settings, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UGraphicsSettingsHelper::RestoreWindowPosition(UCustomGameSettings* settings)
|
void UGraphicsSettingsHelper::RestoreWindowPosition(UCustomGameSettings* settings)
|
||||||
@ -278,6 +309,10 @@ TArray<FIntPoint> UGraphicsSettingsHelper::GetAllAvailableResolutions()
|
|||||||
|
|
||||||
TArray<FIntPoint> UGraphicsSettingsHelper::GetAvailableResolutionsByMonitorId(const int32 id)
|
TArray<FIntPoint> UGraphicsSettingsHelper::GetAvailableResolutionsByMonitorId(const int32 id)
|
||||||
{
|
{
|
||||||
|
if(auto settings = UCustomGameSettings::Get())
|
||||||
|
if(GetDisplayMode(settings) == EDisplayMode::Fullscreen)
|
||||||
|
return { GetNativeResolutionByMonitorId(GetMonitorId(settings)) };
|
||||||
|
|
||||||
auto resolutions = GetAllAvailableResolutions();
|
auto resolutions = GetAllAvailableResolutions();
|
||||||
FIntPoint nativeRes = GetNativeResolutionByMonitorId(id);
|
FIntPoint nativeRes = GetNativeResolutionByMonitorId(id);
|
||||||
TArray<FIntPoint> result;
|
TArray<FIntPoint> result;
|
||||||
@ -306,13 +341,37 @@ TArray<FIntPoint> UGraphicsSettingsHelper::FilterResolutionsViaAspectRatio(const
|
|||||||
{
|
{
|
||||||
float resRatio = static_cast<float>(i.X) / i.Y;
|
float resRatio = static_cast<float>(i.X) / i.Y;
|
||||||
float aspRatio = static_cast<float>(aspectRatio.X) / aspectRatio.Y;
|
float aspRatio = static_cast<float>(aspectRatio.X) / aspectRatio.Y;
|
||||||
if(UCommonFunctions::FloatIsZero(resRatio - aspRatio))
|
if(std::abs(resRatio - aspRatio) < aspectRatioTolerance)
|
||||||
result.Add(i);
|
result.Add(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
return MoveTemp(result);
|
return MoveTemp(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FIntPoint UGraphicsSettingsHelper::FilterClosestResolution(const TArray<FIntPoint>& resolutions, const FIntPoint& target)
|
||||||
|
{
|
||||||
|
if(resolutions.IsEmpty() || target.X == 0)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
int32 resultId = 0;
|
||||||
|
float coefficient = resolutions[resultId].X / (float)target.X;
|
||||||
|
if(UCommonFunctions::FloatIsZero(coefficient - 1))
|
||||||
|
return resultId;
|
||||||
|
|
||||||
|
for(int32 i = 1; i < resolutions.Num(); ++i)
|
||||||
|
{
|
||||||
|
float c = resolutions[i].X / (float)target.X;
|
||||||
|
if((coefficient > 1 && c < coefficient)
|
||||||
|
|| (coefficient < 1 && c > coefficient && c < 1))
|
||||||
|
{
|
||||||
|
coefficient = c;
|
||||||
|
resultId = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return resolutions[resultId];
|
||||||
|
}
|
||||||
|
|
||||||
void UGraphicsSettingsHelper::SetResolution(UCustomGameSettings* settings, const FIntPoint& resolution)
|
void UGraphicsSettingsHelper::SetResolution(UCustomGameSettings* settings, const FIntPoint& resolution)
|
||||||
{
|
{
|
||||||
if(!settings)
|
if(!settings)
|
||||||
@ -382,6 +441,9 @@ FIntPoint UGraphicsSettingsHelper::GetAspectRatio([[maybe_unused]] UCustomGameSe
|
|||||||
|
|
||||||
FIntPoint UGraphicsSettingsHelper::GetAspectRatioFromResolution(const FIntPoint& resolution)
|
FIntPoint UGraphicsSettingsHelper::GetAspectRatioFromResolution(const FIntPoint& resolution)
|
||||||
{
|
{
|
||||||
|
if(std::abs(resolution.X / (float)resolution.Y - 16 / 9.0f) < aspectRatioTolerance)
|
||||||
|
return { 16, 9 };
|
||||||
|
|
||||||
int32 gcd = UCommonFunctions::GreatestCommonDivisor(resolution.X, resolution.Y);
|
int32 gcd = UCommonFunctions::GreatestCommonDivisor(resolution.X, resolution.Y);
|
||||||
return { resolution.X / gcd, resolution.Y / gcd };
|
return { resolution.X / gcd, resolution.Y / gcd };
|
||||||
}
|
}
|
||||||
@ -393,6 +455,10 @@ FIntPoint UGraphicsSettingsHelper::GetAspectRatioOfMonitor(const int32 monitor)
|
|||||||
|
|
||||||
TArray<FIntPoint> UGraphicsSettingsHelper::GetAvailableAspectRatiousOfMonitor(const int32 monitor)
|
TArray<FIntPoint> UGraphicsSettingsHelper::GetAvailableAspectRatiousOfMonitor(const int32 monitor)
|
||||||
{
|
{
|
||||||
|
if(auto settings = UCustomGameSettings::Get())
|
||||||
|
if(GetMonitorId(settings) == monitor && GetDisplayMode(settings) == EDisplayMode::Fullscreen)
|
||||||
|
return { GetAspectRatioFromResolution(GetNativeResolutionByMonitorId(monitor)) };
|
||||||
|
|
||||||
TArray<FIntPoint> resolutions = GetAvailableResolutionsByMonitorId(monitor);
|
TArray<FIntPoint> resolutions = GetAvailableResolutionsByMonitorId(monitor);
|
||||||
if(resolutions.Num() == 0)
|
if(resolutions.Num() == 0)
|
||||||
return { GetAspectRatio(nullptr) };
|
return { GetAspectRatio(nullptr) };
|
||||||
|
@ -65,6 +65,8 @@ protected: // Window position setting is on the thin edge of user safeness, ther
|
|||||||
UFUNCTION(BlueprintCallable, Category = "Settings|Graphics|Window")
|
UFUNCTION(BlueprintCallable, Category = "Settings|Graphics|Window")
|
||||||
static void SetWindowPosition(class UCustomGameSettings* settings, const FIntPoint& pos);
|
static void SetWindowPosition(class UCustomGameSettings* settings, const FIntPoint& pos);
|
||||||
UFUNCTION(BlueprintCallable, Category = "Settings|Graphics|Window")
|
UFUNCTION(BlueprintCallable, Category = "Settings|Graphics|Window")
|
||||||
|
static void CenterWindowPosition(class UCustomGameSettings* settings);
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "Settings|Graphics|Window")
|
||||||
static void RestoreWindowPosition(class UCustomGameSettings* settings);
|
static void RestoreWindowPosition(class UCustomGameSettings* settings);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -96,6 +98,8 @@ public:
|
|||||||
static TArray<FIntPoint> GetAvailableResolutionsByMonitorId(const int32 id);
|
static TArray<FIntPoint> GetAvailableResolutionsByMonitorId(const int32 id);
|
||||||
UFUNCTION(BlueprintPure, Category = "Settings|Graphics|Resolution")
|
UFUNCTION(BlueprintPure, Category = "Settings|Graphics|Resolution")
|
||||||
static TArray<FIntPoint> FilterResolutionsViaAspectRatio(const TArray<FIntPoint>& resolutions, const FIntPoint& aspectRatio);
|
static TArray<FIntPoint> FilterResolutionsViaAspectRatio(const TArray<FIntPoint>& resolutions, const FIntPoint& aspectRatio);
|
||||||
|
UFUNCTION(BlueprintPure, Category = "Settings|Graphics|Resolution")
|
||||||
|
static FIntPoint FilterClosestResolution(const TArray<FIntPoint>& resolutions, const FIntPoint& target);
|
||||||
UFUNCTION(BlueprintCallable, Category = "Settings|Graphics|Resolution")
|
UFUNCTION(BlueprintCallable, Category = "Settings|Graphics|Resolution")
|
||||||
static void SetResolution(class UCustomGameSettings* settings, const FIntPoint& resolution);
|
static void SetResolution(class UCustomGameSettings* settings, const FIntPoint& resolution);
|
||||||
UFUNCTION(BlueprintCallable, Category = "Settings|Graphics|Resolution")
|
UFUNCTION(BlueprintCallable, Category = "Settings|Graphics|Resolution")
|
||||||
|
Loading…
Reference in New Issue
Block a user