Files
Unreal_EmberWild/Source/EmberWild/Private/SettingsGraphicsWidget.cpp
T

251 lines
8.6 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#include "SettingsGraphicsWidget.h"
#include "SettingRowWidget.h"
#include "SurvivalUserSettings.h"
#define LOCTEXT_NAMESPACE "Reglages"
namespace SettingsGraphicsTab
{
/**
* Index de "Personnalise" dans la ligne de qualite globale.
*
* Le moteur renvoie -1 quand les curseurs ne correspondent a aucun preset.
* On l'affiche comme un cinquieme choix, mais SetMaxSelectableIndex(3)
* empeche le joueur de le selectionner : c'est un etat dans lequel on tombe,
* pas un reglage qu'on choisit.
*/
constexpr int32 CustomQualityIndex = 4;
/** Bas / Moyen / Eleve / Epique. Le moteur accepte aussi 4 (cinematique), qu'on n'expose pas. */
constexpr int32 MaxQualityLevel = 3;
}
void USettingsGraphicsWidget::SetupQualityRow(USettingRowWidget* Row, const FText& Label)
{
if (!Row)
{
return;
}
Row->SetupAsChoice(Label,
{ LOCTEXT("QualiteBas", "Bas"),
LOCTEXT("QualiteMoyen", "Moyen"),
LOCTEXT("QualiteEleve", "Élevé"),
LOCTEXT("QualiteEpique", "Épique") }, 0);
}
void USettingsGraphicsWidget::NativeConstruct()
{
Super::NativeConstruct();
if (OverallQualityRow)
{
OverallQualityRow->SetupAsChoice(LOCTEXT("QualiteGlobale", "Qualité globale"),
{ LOCTEXT("QualiteBas", "Bas"),
LOCTEXT("QualiteMoyen", "Moyen"),
LOCTEXT("QualiteEleve", "Élevé"),
LOCTEXT("QualiteEpique", "Épique"),
LOCTEXT("QualitePerso", "Personnalisé") }, 0);
OverallQualityRow->SetMaxSelectableIndex(SettingsGraphicsTab::MaxQualityLevel);
OverallQualityRow->OnIndexChanged.AddDynamic(this, &USettingsGraphicsWidget::HandleOverallQualityChanged);
}
SetupQualityRow(ViewDistanceRow, LOCTEXT("DistanceAffichage", "Distance d'affichage"));
SetupQualityRow(FoliageRow, LOCTEXT("Vegetation", "Végétation"));
SetupQualityRow(ShadowRow, LOCTEXT("Ombres", "Ombres"));
SetupQualityRow(TextureRow, LOCTEXT("Textures", "Textures"));
SetupQualityRow(VisualEffectRow, LOCTEXT("Effets", "Effets"));
SetupQualityRow(PostProcessRow, LOCTEXT("PostProcess", "Post-process"));
SetupQualityRow(AntiAliasingRow, LOCTEXT("AntiAliasing", "Anti-aliasing"));
SetupQualityRow(ReflectionRow, LOCTEXT("Reflexions", "Réflexions"));
SetupQualityRow(GlobalIlluminationRow, LOCTEXT("EclairageGlobal", "Éclairage global"));
SetupQualityRow(ShadingRow, LOCTEXT("Ombrage", "Ombrage"));
if (ViewDistanceRow) { ViewDistanceRow->OnIndexChanged.AddDynamic(this, &USettingsGraphicsWidget::HandleViewDistanceChanged); }
if (FoliageRow) { FoliageRow->OnIndexChanged.AddDynamic(this, &USettingsGraphicsWidget::HandleFoliageChanged); }
if (ShadowRow) { ShadowRow->OnIndexChanged.AddDynamic(this, &USettingsGraphicsWidget::HandleShadowChanged); }
if (TextureRow) { TextureRow->OnIndexChanged.AddDynamic(this, &USettingsGraphicsWidget::HandleTextureChanged); }
if (VisualEffectRow) { VisualEffectRow->OnIndexChanged.AddDynamic(this, &USettingsGraphicsWidget::HandleVisualEffectChanged); }
if (PostProcessRow) { PostProcessRow->OnIndexChanged.AddDynamic(this, &USettingsGraphicsWidget::HandlePostProcessChanged); }
if (AntiAliasingRow) { AntiAliasingRow->OnIndexChanged.AddDynamic(this, &USettingsGraphicsWidget::HandleAntiAliasingChanged); }
if (ReflectionRow) { ReflectionRow->OnIndexChanged.AddDynamic(this, &USettingsGraphicsWidget::HandleReflectionChanged); }
if (GlobalIlluminationRow) { GlobalIlluminationRow->OnIndexChanged.AddDynamic(this, &USettingsGraphicsWidget::HandleGlobalIlluminationChanged); }
if (ShadingRow) { ShadingRow->OnIndexChanged.AddDynamic(this, &USettingsGraphicsWidget::HandleShadingChanged); }
RefreshFromSettings();
}
void USettingsGraphicsWidget::RefreshFromSettings()
{
USurvivalUserSettings* Settings = USurvivalUserSettings::Get();
if (!Settings)
{
return;
}
if (OverallQualityRow)
{
// -1 quand les curseurs ne collent a aucun preset : c'est la que
// "Personnalise" s'affiche.
const int32 Overall = Settings->GetOverallScalabilityLevel();
OverallQualityRow->SetIndexSilently(Overall >= 0 ? Overall : SettingsGraphicsTab::CustomQualityIndex);
}
if (ViewDistanceRow) { ViewDistanceRow->SetIndexSilently(Settings->GetViewDistanceQuality()); }
if (FoliageRow) { FoliageRow->SetIndexSilently(Settings->GetFoliageQuality()); }
if (ShadowRow) { ShadowRow->SetIndexSilently(Settings->GetShadowQuality()); }
if (TextureRow) { TextureRow->SetIndexSilently(Settings->GetTextureQuality()); }
if (VisualEffectRow) { VisualEffectRow->SetIndexSilently(Settings->GetVisualEffectQuality()); }
if (PostProcessRow) { PostProcessRow->SetIndexSilently(Settings->GetPostProcessingQuality()); }
if (AntiAliasingRow) { AntiAliasingRow->SetIndexSilently(Settings->GetAntiAliasingQuality()); }
if (ReflectionRow) { ReflectionRow->SetIndexSilently(Settings->GetReflectionQuality()); }
if (GlobalIlluminationRow) { GlobalIlluminationRow->SetIndexSilently(Settings->GetGlobalIlluminationQuality()); }
if (ShadingRow) { ShadingRow->SetIndexSilently(Settings->GetShadingQuality()); }
}
void USettingsGraphicsWidget::ResetToDefaults()
{
USurvivalUserSettings* Settings = USurvivalUserSettings::Get();
if (!Settings)
{
return;
}
// "Eleve" plutot que le benchmark automatique : sur une machine modeste,
// RunHardwareBenchmark peut descendre tres bas et le joueur ne comprendrait
// pas pourquoi "Reinitialiser" a degrade son jeu.
Settings->SetOverallScalabilityLevel(2);
Settings->ApplyNonResolutionSettings();
RefreshFromSettings();
}
void USettingsGraphicsWidget::ApplyAndRefreshOverall()
{
USurvivalUserSettings* Settings = USurvivalUserSettings::Get();
if (!Settings || !OverallQualityRow)
{
return;
}
Settings->ApplyNonResolutionSettings();
// Toucher un curseur individuel fait presque toujours basculer la qualite
// globale sur "Personnalise" : la ligne du haut doit suivre immediatement,
// sinon elle affiche un preset qui ne correspond plus a rien.
const int32 Overall = Settings->GetOverallScalabilityLevel();
OverallQualityRow->SetIndexSilently(Overall >= 0 ? Overall : SettingsGraphicsTab::CustomQualityIndex);
}
void USettingsGraphicsWidget::HandleOverallQualityChanged(int32 NewIndex)
{
USurvivalUserSettings* Settings = USurvivalUserSettings::Get();
if (!Settings)
{
return;
}
Settings->SetOverallScalabilityLevel(FMath::Clamp(NewIndex, 0, SettingsGraphicsTab::MaxQualityLevel));
Settings->ApplyNonResolutionSettings();
// Un preset repositionne les dix autres lignes d'un coup.
RefreshFromSettings();
}
void USettingsGraphicsWidget::HandleViewDistanceChanged(int32 NewIndex)
{
if (USurvivalUserSettings* Settings = USurvivalUserSettings::Get())
{
Settings->SetViewDistanceQuality(NewIndex);
ApplyAndRefreshOverall();
}
}
void USettingsGraphicsWidget::HandleFoliageChanged(int32 NewIndex)
{
if (USurvivalUserSettings* Settings = USurvivalUserSettings::Get())
{
Settings->SetFoliageQuality(NewIndex);
ApplyAndRefreshOverall();
}
}
void USettingsGraphicsWidget::HandleShadowChanged(int32 NewIndex)
{
if (USurvivalUserSettings* Settings = USurvivalUserSettings::Get())
{
Settings->SetShadowQuality(NewIndex);
ApplyAndRefreshOverall();
}
}
void USettingsGraphicsWidget::HandleTextureChanged(int32 NewIndex)
{
if (USurvivalUserSettings* Settings = USurvivalUserSettings::Get())
{
Settings->SetTextureQuality(NewIndex);
ApplyAndRefreshOverall();
}
}
void USettingsGraphicsWidget::HandleVisualEffectChanged(int32 NewIndex)
{
if (USurvivalUserSettings* Settings = USurvivalUserSettings::Get())
{
Settings->SetVisualEffectQuality(NewIndex);
ApplyAndRefreshOverall();
}
}
void USettingsGraphicsWidget::HandlePostProcessChanged(int32 NewIndex)
{
if (USurvivalUserSettings* Settings = USurvivalUserSettings::Get())
{
Settings->SetPostProcessingQuality(NewIndex);
ApplyAndRefreshOverall();
}
}
void USettingsGraphicsWidget::HandleAntiAliasingChanged(int32 NewIndex)
{
if (USurvivalUserSettings* Settings = USurvivalUserSettings::Get())
{
Settings->SetAntiAliasingQuality(NewIndex);
ApplyAndRefreshOverall();
}
}
void USettingsGraphicsWidget::HandleReflectionChanged(int32 NewIndex)
{
if (USurvivalUserSettings* Settings = USurvivalUserSettings::Get())
{
Settings->SetReflectionQuality(NewIndex);
ApplyAndRefreshOverall();
}
}
void USettingsGraphicsWidget::HandleGlobalIlluminationChanged(int32 NewIndex)
{
if (USurvivalUserSettings* Settings = USurvivalUserSettings::Get())
{
Settings->SetGlobalIlluminationQuality(NewIndex);
ApplyAndRefreshOverall();
}
}
void USettingsGraphicsWidget::HandleShadingChanged(int32 NewIndex)
{
if (USurvivalUserSettings* Settings = USurvivalUserSettings::Get())
{
Settings->SetShadingQuality(NewIndex);
ApplyAndRefreshOverall();
}
}
#undef LOCTEXT_NAMESPACE