Files
UnrealEngineUWP/Engine/Source/Editor/UnrealEd/Private/SScalabilitySettings.cpp
Lauren Barnes 6248f8d412 Replacing legacy EditorStyle calls with AppStyle
#preflight 6272a74d2f6d177be3c6fdda
#rb Matt.Kuhlenschmidt

#ROBOMERGE-OWNER: Lauren.Barnes
#ROBOMERGE-AUTHOR: lauren.barnes
#ROBOMERGE-SOURCE: CL 20057269 via CL 20070159 via CL 20072035 via CL 20072203
#ROBOMERGE-BOT: UE5 (Release-Engine-Staging -> Main) (v943-19904690)
#ROBOMERGE-CONFLICT from-shelf

[CL 20105363 by Lauren Barnes in ue5-main branch]
2022-05-09 13:12:28 -04:00

327 lines
17 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "SScalabilitySettings.h"
#include "Widgets/SBoxPanel.h"
#include "Styling/SlateTypes.h"
#include "Widgets/Layout/SBorder.h"
#include "Widgets/Text/STextBlock.h"
#include "Widgets/Input/SButton.h"
#include "Widgets/Input/SCheckBox.h"
#include "Widgets/Input/SSlider.h"
#include "Styling/AppStyle.h"
#include "Editor.h"
#include "Settings/EditorSettings.h"
#include "Editor/EditorPerformanceSettings.h"
#define LOCTEXT_NAMESPACE "EngineScalabiltySettings"
ECheckBoxState SScalabilitySettings::IsGroupQualityLevelSelected(const TCHAR* InGroupName, int32 InQualityLevel) const
{
int32 QualityLevel = -1;
if (FCString::Strcmp(InGroupName, TEXT("ResolutionQuality")) == 0) { QualityLevel = CachedQualityLevels.ResolutionQuality; }
else if (FCString::Strcmp(InGroupName, TEXT("ViewDistanceQuality")) == 0) QualityLevel = CachedQualityLevels.ViewDistanceQuality;
else if (FCString::Strcmp(InGroupName, TEXT("AntiAliasingQuality")) == 0) QualityLevel = CachedQualityLevels.AntiAliasingQuality;
else if (FCString::Strcmp(InGroupName, TEXT("PostProcessQuality")) == 0) QualityLevel = CachedQualityLevels.PostProcessQuality;
else if (FCString::Strcmp(InGroupName, TEXT("ShadowQuality")) == 0) QualityLevel = CachedQualityLevels.ShadowQuality;
else if (FCString::Strcmp(InGroupName, TEXT("GlobalIlluminationQuality")) == 0) QualityLevel = CachedQualityLevels.GlobalIlluminationQuality;
else if (FCString::Strcmp(InGroupName, TEXT("ReflectionQuality")) == 0) QualityLevel = CachedQualityLevels.ReflectionQuality;
else if (FCString::Strcmp(InGroupName, TEXT("TextureQuality")) == 0) QualityLevel = CachedQualityLevels.TextureQuality;
else if (FCString::Strcmp(InGroupName, TEXT("EffectsQuality")) == 0) QualityLevel = CachedQualityLevels.EffectsQuality;
else if (FCString::Strcmp(InGroupName, TEXT("FoliageQuality")) == 0) QualityLevel = CachedQualityLevels.FoliageQuality;
else if (FCString::Strcmp(InGroupName, TEXT("ShadingQuality")) == 0) QualityLevel = CachedQualityLevels.ShadingQuality;
return (QualityLevel == InQualityLevel) ? ECheckBoxState::Checked : ECheckBoxState::Unchecked;
}
void SScalabilitySettings::OnGroupQualityLevelChanged(ECheckBoxState NewState, const TCHAR* InGroupName, int32 InQualityLevel)
{
if (FCString::Strcmp(InGroupName, TEXT("ResolutionQuality")) == 0) CachedQualityLevels.ResolutionQuality = InQualityLevel;
else if (FCString::Strcmp(InGroupName, TEXT("ViewDistanceQuality")) == 0) CachedQualityLevels.ViewDistanceQuality = InQualityLevel;
else if (FCString::Strcmp(InGroupName, TEXT("AntiAliasingQuality")) == 0) CachedQualityLevels.AntiAliasingQuality = InQualityLevel;
else if (FCString::Strcmp(InGroupName, TEXT("PostProcessQuality")) == 0) CachedQualityLevels.PostProcessQuality = InQualityLevel;
else if (FCString::Strcmp(InGroupName, TEXT("ShadowQuality")) == 0) CachedQualityLevels.ShadowQuality = InQualityLevel;
else if (FCString::Strcmp(InGroupName, TEXT("GlobalIlluminationQuality")) == 0) CachedQualityLevels.GlobalIlluminationQuality = InQualityLevel;
else if (FCString::Strcmp(InGroupName, TEXT("ReflectionQuality")) == 0) CachedQualityLevels.ReflectionQuality = InQualityLevel;
else if (FCString::Strcmp(InGroupName, TEXT("TextureQuality")) == 0) CachedQualityLevels.TextureQuality = InQualityLevel;
else if (FCString::Strcmp(InGroupName, TEXT("EffectsQuality")) == 0) CachedQualityLevels.EffectsQuality = InQualityLevel;
else if (FCString::Strcmp(InGroupName, TEXT("FoliageQuality")) == 0) CachedQualityLevels.FoliageQuality = InQualityLevel;
else if (FCString::Strcmp(InGroupName, TEXT("ShadingQuality")) == 0) CachedQualityLevels.ShadingQuality = InQualityLevel;
Scalability::SetQualityLevels(CachedQualityLevels);
Scalability::SaveState(GEditorSettingsIni);
GEditor->RedrawAllViewports();
}
void SScalabilitySettings::OnResolutionScaleChanged(float InValue)
{
CachedQualityLevels.ResolutionQuality = FMath::Lerp(Scalability::MinResolutionScale, Scalability::MaxResolutionScale, InValue);
Scalability::SetQualityLevels(CachedQualityLevels);
Scalability::SaveState(GEditorSettingsIni);
GEditor->RedrawAllViewports();
}
float SScalabilitySettings::GetResolutionScale() const
{
return (float)(CachedQualityLevels.ResolutionQuality - Scalability::MinResolutionScale) / (float)(Scalability::MaxResolutionScale - Scalability::MinResolutionScale);
}
FText SScalabilitySettings::GetResolutionScaleString() const
{
return FText::AsPercent(FMath::Square(CachedQualityLevels.ResolutionQuality / 100.0f));
}
TSharedRef<SWidget> SScalabilitySettings::MakeButtonWidget(const FText& InName, const TCHAR* InGroupName, int32 InQualityLevel, const FText& InToolTip)
{
return SNew(SCheckBox)
.Style(FAppStyle::Get(), "ToggleButtonCheckbox")
.OnCheckStateChanged(this, &SScalabilitySettings::OnGroupQualityLevelChanged, InGroupName, InQualityLevel)
.IsChecked(this, &SScalabilitySettings::IsGroupQualityLevelSelected, InGroupName, InQualityLevel)
.ToolTipText(InToolTip)
.Content()
[
SNew(STextBlock)
.Text(InName)
];
}
TSharedRef<SWidget> SScalabilitySettings::MakeHeaderButtonWidget(const FText& InName, int32 InQualityLevel, const FText& InToolTip, Scalability::EQualityLevelBehavior Behavior)
{
return SNew(SButton)
.OnClicked(this, &SScalabilitySettings::OnHeaderClicked, InQualityLevel, Behavior)
.ToolTipText(InToolTip)
.Content()
[
SNew(STextBlock)
.Text(InName)
];
}
TSharedRef<SWidget> SScalabilitySettings::MakeAutoButtonWidget()
{
return SNew(SButton)
.OnClicked(this, &SScalabilitySettings::OnAutoClicked)
.ToolTipText(LOCTEXT("AutoButtonTooltip", "We test your system and try to find the most suitable settings"))
.Content()
[
SNew(STextBlock)
.Text(LOCTEXT("AutoLabel", "Auto"))
];
}
FReply SScalabilitySettings::OnHeaderClicked(int32 InQualityLevel, Scalability::EQualityLevelBehavior Behavior)
{
Scalability::FQualityLevels LevelCounts = Scalability::GetQualityLevelCounts();
switch (Behavior)
{
case Scalability::EQualityLevelBehavior::ERelativeToMax:
CachedQualityLevels.SetFromSingleQualityLevelRelativeToMax(InQualityLevel);
break;
case Scalability::EQualityLevelBehavior::EAbsolute:
default:
CachedQualityLevels.SetFromSingleQualityLevel(InQualityLevel);
break;
}
Scalability::SetQualityLevels(CachedQualityLevels);
Scalability::SaveState(GEditorSettingsIni);
GEditor->RedrawAllViewports();
return FReply::Handled();
}
FReply SScalabilitySettings::OnAutoClicked()
{
auto* Settings = GetMutableDefault<UEditorSettings>();
Settings->AutoApplyScalabilityBenchmark();
Settings->LoadScalabilityBenchmark();
CachedQualityLevels = Settings->EngineBenchmarkResult;
GEditor->RedrawAllViewports();
return FReply::Handled();
}
SGridPanel::FSlot::FSlotArguments SScalabilitySettings::MakeGridSlot(int32 InCol, int32 InRow, int32 InColSpan /*= 1*/, int32 InRowSpan /*= 1*/)
{
float PaddingH = 2.0f;
float PaddingV = InRow == 0 ? 8.0f : 2.0f;
return MoveTemp(SGridPanel::Slot(InCol, InRow)
.Padding(PaddingH, PaddingV)
.RowSpan(InRowSpan)
.ColumnSpan(InColSpan));
}
ECheckBoxState SScalabilitySettings::IsMonitoringPerformance() const
{
const bool bMonitorEditorPerformance = GetDefault<UEditorPerformanceSettings>()->bMonitorEditorPerformance;
return bMonitorEditorPerformance ? ECheckBoxState::Checked : ECheckBoxState::Unchecked;
}
void SScalabilitySettings::OnMonitorPerformanceChanged(ECheckBoxState NewState)
{
const bool bNewEnabledState = ( NewState == ECheckBoxState::Checked );
auto* Settings = GetMutableDefault<UEditorPerformanceSettings>();
Settings->bMonitorEditorPerformance = bNewEnabledState;
Settings->PostEditChange();
Settings->SaveConfig();
}
void SScalabilitySettings::AddButtonsToGrid(int32 X0, int32 Y0, TSharedRef<SGridPanel> ButtonMatrix, const FText* FiveNameArray, int32 ButtonCount, const TCHAR* GroupName, const FText& TooltipShape)
{
const int32 ExpectedNamesSize = 5;
const bool bCanUseNameArray = (FiveNameArray != nullptr);
const bool bCanAllUseNameArray = (ButtonCount == ExpectedNamesSize) && bCanUseNameArray;
const int32 CineButtonName = ExpectedNamesSize - 1;
const int32 CineButtonIndex = ButtonCount - 1;
for (int32 ButtonIndex = 0; ButtonIndex < ButtonCount; ++ButtonIndex)
{
const bool bCineButton = ButtonIndex == CineButtonIndex;
const bool bUseNameArray = bCanUseNameArray && (bCanAllUseNameArray || bCineButton);
const int32 ButtonNameIndex = bCineButton ? CineButtonName : ButtonIndex;
const FText ButtonLabel = bUseNameArray ? FiveNameArray[ButtonNameIndex] : FText::AsNumber(ButtonIndex);
const FText ButtonTooltip = FText::Format(TooltipShape, ButtonLabel);
ButtonMatrix->AddSlot(X0 + ButtonIndex, Y0)
[
MakeButtonWidget(ButtonLabel, GroupName, ButtonIndex, ButtonTooltip)
];
}
}
void SScalabilitySettings::Construct( const FArguments& InArgs )
{
const FText NamesLow(LOCTEXT("QualityLowLabel", "Low"));
const FText NamesMedium(LOCTEXT("QualityMediumLabel", "Medium"));
const FText NamesHigh(LOCTEXT("QualityHighLabel", "High"));
const FText NamesEpic(LOCTEXT("QualityEpicLabel", "Epic"));
const FText NamesCine(LOCTEXT("QualityCineLabel", "Cinematic"));
const FText NamesAuto(LOCTEXT("QualityAutoLabel", "Auto"));
const FText DistanceNear = LOCTEXT("ViewDistanceLabel2", "Near");
const FText DistanceMedium = LOCTEXT("ViewDistanceLabel3", "Medium");
const FText DistanceFar = LOCTEXT("ViewDistanceLabel4", "Far");
const FText DistanceEpic = LOCTEXT("ViewDistanceLabel5", "Epic");
const FText DistanceCinematic = LOCTEXT("ViewDistanceLabel6", "Cinematic");
const FText FiveNames[5] = { NamesLow, NamesMedium, NamesHigh, NamesEpic, NamesCine };
const FText FiveDistanceNames[5] = { DistanceNear, DistanceMedium, DistanceFar, DistanceEpic, DistanceCinematic };
auto TitleFont = FAppStyle::GetFontStyle( FName( "Scalability.TitleFont" ) );
auto GroupFont = FAppStyle::GetFontStyle( FName( "Scalability.GroupFont" ) );
InitialQualityLevels = CachedQualityLevels = Scalability::GetQualityLevels();
static float Padding = 1.0f;
static float QualityColumnCoeff = 1.0f;
static float QualityLevelColumnCoeff = 0.2f;
Scalability::FQualityLevels LevelCounts = Scalability::GetQualityLevelCounts();
const int32 MaxLevelCount =
FMath::Max(LevelCounts.ShadowQuality,
FMath::Max(LevelCounts.GlobalIlluminationQuality,
FMath::Max(LevelCounts.ReflectionQuality,
FMath::Max(LevelCounts.TextureQuality,
FMath::Max(LevelCounts.ViewDistanceQuality,
FMath::Max(LevelCounts.EffectsQuality,
FMath::Max(LevelCounts.FoliageQuality,
FMath::Max(LevelCounts.ShadingQuality,
FMath::Max(LevelCounts.PostProcessQuality, LevelCounts.AntiAliasingQuality)
))))))));
const int32 TotalWidth = MaxLevelCount + 1;
TSharedRef<SGridPanel> ButtonMatrix =
SNew(SGridPanel)
.FillColumn(0, QualityColumnCoeff)
+MakeGridSlot(0,1,TotalWidth,1) [ SNew (SBorder).BorderImage(FAppStyle::GetBrush("Scalability.RowBackground")) ]
+MakeGridSlot(0,2,TotalWidth,1) [ SNew (SBorder).BorderImage(FAppStyle::GetBrush("Scalability.RowBackground")) ]
+MakeGridSlot(0,3,TotalWidth,1) [ SNew (SBorder).BorderImage(FAppStyle::GetBrush("Scalability.RowBackground")) ]
+MakeGridSlot(0,4,TotalWidth,1) [ SNew (SBorder).BorderImage(FAppStyle::GetBrush("Scalability.RowBackground")) ]
+MakeGridSlot(0,5,TotalWidth,1) [ SNew (SBorder).BorderImage(FAppStyle::GetBrush("Scalability.RowBackground")) ]
+MakeGridSlot(0,6,TotalWidth,1) [ SNew (SBorder).BorderImage(FAppStyle::GetBrush("Scalability.RowBackground")) ]
+MakeGridSlot(0,7,TotalWidth,1) [ SNew (SBorder).BorderImage(FAppStyle::GetBrush("Scalability.RowBackground")) ]
+MakeGridSlot(0,8,TotalWidth,1) [ SNew (SBorder).BorderImage(FAppStyle::GetBrush("Scalability.RowBackground")) ]
+MakeGridSlot(0,9,TotalWidth,1) [ SNew (SBorder).BorderImage(FAppStyle::GetBrush("Scalability.RowBackground")) ]
+MakeGridSlot(0,10,TotalWidth,1) [ SNew (SBorder).BorderImage(FAppStyle::GetBrush("Scalability.RowBackground")) ]
+MakeGridSlot(0,11,TotalWidth,1) [ SNew (SBorder).BorderImage(FAppStyle::GetBrush("Scalability.RowBackground")) ]
+MakeGridSlot(0,0).VAlign(VAlign_Center) [ SNew(STextBlock).Text(LOCTEXT("QualityLabel", "Quality")).Font(TitleFont) ]
+MakeGridSlot(1,0) [ MakeHeaderButtonWidget(NamesLow, 0, LOCTEXT("QualityLow", "Set all groups to low quality"), Scalability::EQualityLevelBehavior::EAbsolute) ]
+MakeGridSlot(2,0) [ MakeHeaderButtonWidget(NamesMedium, 3, LOCTEXT("QualityMedium", "Set all groups to medium quality"), Scalability::EQualityLevelBehavior::ERelativeToMax) ]
+MakeGridSlot(3,0) [ MakeHeaderButtonWidget(NamesHigh, 2, LOCTEXT("QualityHigh", "Set all groups to high quality"), Scalability::EQualityLevelBehavior::ERelativeToMax) ]
+MakeGridSlot(4,0) [ MakeHeaderButtonWidget(NamesEpic, 1, LOCTEXT("QualityEpic", "Set all groups to epic quality"), Scalability::EQualityLevelBehavior::ERelativeToMax) ]
+MakeGridSlot(5,0) [ MakeHeaderButtonWidget(NamesCine, 0, LOCTEXT("QualityCinematic", "Set all groups to offline cinematic quality"), Scalability::EQualityLevelBehavior::ERelativeToMax)]
+MakeGridSlot(6,0) [ MakeAutoButtonWidget() ]
+MakeGridSlot(0,1) [ SNew(STextBlock).Text(LOCTEXT("ResScaleLabel1", "Resolution Scale")).Font(GroupFont) ]
+MakeGridSlot(5,1) [ SNew(STextBlock).Text(this, &SScalabilitySettings::GetResolutionScaleString) ]
+MakeGridSlot(1,1,4,1) [ SNew(SSlider).OnValueChanged(this, &SScalabilitySettings::OnResolutionScaleChanged).Value(this, &SScalabilitySettings::GetResolutionScale) ]
+MakeGridSlot(0,2) [ SNew(STextBlock).Text(LOCTEXT("ViewDistanceLabel1", "View Distance")).Font(GroupFont) ]
+MakeGridSlot(0,3) [ SNew(STextBlock).Text(LOCTEXT("AntiAliasingQualityLabel1", "Anti-Aliasing")).Font(GroupFont) ]
+MakeGridSlot(0,4) [ SNew(STextBlock).Text(LOCTEXT("PostProcessQualityLabel1", "Post Processing")).Font(GroupFont) ]
+MakeGridSlot(0,5) [ SNew(STextBlock).Text(LOCTEXT("ShadowLabel1", "Shadows")).Font(GroupFont) ]
+MakeGridSlot(0,6) [ SNew(STextBlock).Text(LOCTEXT("GlobalIlluminationLabel1", "Global Illumination")).Font(GroupFont) ]
+MakeGridSlot(0,7) [ SNew(STextBlock).Text(LOCTEXT("Reflection1", "Reflections")).Font(GroupFont) ]
+MakeGridSlot(0,8) [ SNew(STextBlock).Text(LOCTEXT("TextureQualityLabel1", "Textures")).Font(GroupFont) ]
+MakeGridSlot(0,9) [ SNew(STextBlock).Text(LOCTEXT("EffectsQualityLabel1", "Effects")).Font(GroupFont) ]
+MakeGridSlot(0,10) [ SNew(STextBlock).Text(LOCTEXT("FoliageQualityLabel1", "Foliage")).Font(GroupFont) ]
+MakeGridSlot(0,11) [ SNew(STextBlock).Text(LOCTEXT("ShadingQualityLabel1", "Shading")).Font(GroupFont) ]
;
AddButtonsToGrid(1, 2, ButtonMatrix, FiveDistanceNames, LevelCounts.ViewDistanceQuality, TEXT("ViewDistanceQuality"), LOCTEXT("ViewDistanceQualityTooltip", "Set view distance to {0}"));
AddButtonsToGrid(1, 3, ButtonMatrix, FiveNames, LevelCounts.AntiAliasingQuality, TEXT("AntiAliasingQuality"), LOCTEXT("AntiAliasingQualityTooltip", "Set anti-aliasing quality to {0}"));
AddButtonsToGrid(1, 4, ButtonMatrix, FiveNames, LevelCounts.PostProcessQuality, TEXT("PostProcessQuality"), LOCTEXT("PostProcessQualityTooltip", "Set post processing quality to {0}"));
AddButtonsToGrid(1, 5, ButtonMatrix, FiveNames, LevelCounts.ShadowQuality, TEXT("ShadowQuality"), LOCTEXT("ShadowQualityTooltip", "Set shadow quality to {0}"));
AddButtonsToGrid(1, 6, ButtonMatrix, FiveNames, LevelCounts.GlobalIlluminationQuality, TEXT("GlobalIlluminationQuality"), LOCTEXT("GlobalIlluminationQualityTooltip", "Set Global Illumination quality to {0}"));
AddButtonsToGrid(1, 7, ButtonMatrix, FiveNames, LevelCounts.ReflectionQuality, TEXT("ReflectionQuality"), LOCTEXT("ReflectionQualityTooltip", "Set Reflection quality to {0}"));
AddButtonsToGrid(1, 8, ButtonMatrix, FiveNames, LevelCounts.TextureQuality, TEXT("TextureQuality"), LOCTEXT("TextureQualityTooltip", "Set texture quality to {0}"));
AddButtonsToGrid(1, 9, ButtonMatrix, FiveNames, LevelCounts.EffectsQuality, TEXT("EffectsQuality"), LOCTEXT("EffectsQualityTooltip", "Set effects quality to {0}"));
AddButtonsToGrid(1, 10, ButtonMatrix, FiveNames, LevelCounts.FoliageQuality, TEXT("FoliageQuality"), LOCTEXT("FoliageQualityTooltip", "Set foliage quality to {0}"));
AddButtonsToGrid(1, 11, ButtonMatrix, FiveNames, LevelCounts.ShadingQuality, TEXT("ShadingQuality"), LOCTEXT("ShadingQualityTooltip", "Set shading quality to {0}"));
this->ChildSlot
.HAlign(EHorizontalAlignment::HAlign_Fill)
[
SNew(SVerticalBox)
+SVerticalBox::Slot()
[
ButtonMatrix
]
+ SVerticalBox::Slot()
.AutoHeight()
.Padding(5.f)
[
SNew(SCheckBox)
.OnCheckStateChanged(this, &SScalabilitySettings::OnMonitorPerformanceChanged)
.IsChecked(this, &SScalabilitySettings::IsMonitoringPerformance)
.Content()
[
SNew(STextBlock)
.Text(LOCTEXT("PerformanceWarningEnableDisableCheckbox", "Monitor Editor Performance?"))
]
]
];
}
SScalabilitySettings::~SScalabilitySettings()
{
// Record any changed quality levels
if( InitialQualityLevels != CachedQualityLevels )
{
const bool bAutoApplied = false;
Scalability::RecordQualityLevelsAnalytics(bAutoApplied);
}
}
#undef LOCTEXT_NAMESPACE