9#include "HAL/IConsoleManager.h"
10#include "Misc/CommandLine.h"
11#include "Misc/CoreDelegates.h"
12#include "Misc/Parse.h"
13#include "Scalability.h"
24enum class QualityTier {
32inline constexpr std::string_view kDefaultQualityLevel{
"Epic"};
38[[nodiscard]]
constexpr std::optional<QualityTier> ResolveQualityLevel(
39 std::string_view value) {
41 return QualityTier::Low;
43 if (value ==
"Medium") {
44 return QualityTier::Medium;
46 if (value ==
"High") {
47 return QualityTier::High;
49 if (value ==
"Epic") {
50 return QualityTier::Epic;
59TAutoConsoleVariable<int32> CVarCameraUseRayTracing(
60 TEXT(
"carla.Camera.UseRayTracing"),
62 TEXT(
"Per-tier hardware ray tracing policy for scene-capture cameras.\n")
63 TEXT(
" -1: Respect the per-sensor bUseRayTracing attribute.\n")
64 TEXT(
" 0: Force ray tracing OFF on every camera that does not require it.\n")
65 TEXT(
" 1: Force ray tracing ON on every camera."),
68QualityTier GResolvedTier{QualityTier::Epic};
69FDelegateHandle GPostEngineInitHandle{};
80constexpr CVarOverride kLowOverrides[] = {
81 {TEXT(
"r.DynamicGlobalIlluminationMethod"), TEXT(
"0")},
82 {TEXT(
"r.ReflectionMethod"), TEXT(
"2")},
83 {TEXT(
"r.Streaming.PoolSize"), TEXT(
"2000")},
84 {TEXT(
"r.Nanite.Streaming.StreamingPoolSize"), TEXT(
"768")},
85 {TEXT(
"r.ReflectionCaptureResolution"), TEXT(
"128")},
86 {TEXT(
"r.CustomDepth"), TEXT(
"1")},
87 {TEXT(
"r.DefaultFeature.MotionBlur"), TEXT(
"0")},
88 {TEXT(
"r.AntiAliasingMethod"), TEXT(
"2")},
89 {TEXT(
"r.Shadow.DistanceScale"), TEXT(
"1")},
90 {TEXT(
"r.Shadow.Virtual.UseFarShadowCulling"), TEXT(
"1")},
91 {TEXT(
"carla.Camera.UseRayTracing"), TEXT(
"0")},
94constexpr CVarOverride kMediumOverrides[] = {
95 {TEXT(
"r.DynamicGlobalIlluminationMethod"), TEXT(
"0")},
96 {TEXT(
"r.ReflectionMethod"), TEXT(
"2")},
97 {TEXT(
"r.Streaming.PoolSize"), TEXT(
"3000")},
98 {TEXT(
"r.ReflectionCaptureResolution"), TEXT(
"256")},
99 {TEXT(
"r.AntiAliasingMethod"), TEXT(
"2")},
100 {TEXT(
"r.Shadow.DistanceScale"), TEXT(
"1.5")},
101 {TEXT(
"r.Shadow.Virtual.UseFarShadowCulling"), TEXT(
"1")},
102 {TEXT(
"carla.Camera.UseRayTracing"), TEXT(
"0")},
105constexpr CVarOverride kHighOverrides[] = {
106 {TEXT(
"carla.Camera.UseRayTracing"), TEXT(
"0")},
109std::span<const CVarOverride> OverridesForTier(QualityTier tier) {
111 case QualityTier::Low:
112 return kLowOverrides;
113 case QualityTier::Medium:
114 return kMediumOverrides;
115 case QualityTier::High:
116 return kHighOverrides;
117 case QualityTier::Epic:
123void ApplyOverrides(std::span<const CVarOverride> overrides) {
124 for (
const auto &entry : overrides) {
125 if (
auto *cv = IConsoleManager::Get().FindConsoleVariable(entry.name); cv !=
nullptr) {
126 cv->Set(entry.value, ECVF_SetByDeviceProfile);
135void ApplyScalabilityForTier(QualityTier tier) {
136 const int32 bucket =
static_cast<int32
>(tier);
137 Scalability::FQualityLevels q{};
138 q.ResolutionQuality = 100.0f;
139 q.ViewDistanceQuality = bucket;
140 q.AntiAliasingQuality = bucket;
141 q.ShadowQuality = bucket;
142 q.GlobalIlluminationQuality = bucket;
143 q.ReflectionQuality = bucket;
144 q.PostProcessQuality = bucket;
145 q.TextureQuality = bucket;
146 q.EffectsQuality = bucket;
147 q.FoliageQuality = bucket;
148 q.ShadingQuality = bucket;
149 Scalability::SetQualityLevels(q,
true);
152void OnPostEngineInit() {
157 ApplyScalabilityForTier(GResolvedTier);
163 FString quality_level;
164 if (!FParse::Value(FCommandLine::Get(), TEXT(
"-quality-level="), quality_level)) {
165 quality_level = FString{ANSI_TO_TCHAR(kDefaultQualityLevel.data())};
168 const std::string quality_level_std{TCHAR_TO_UTF8(*quality_level)};
169 const auto tier = ResolveQualityLevel(quality_level_std);
170 if (!tier.has_value()) {
174 TEXT(
"CarlaDeviceProfileSelector: unrecognised -quality-level=%s; no tier applied"),
179 GResolvedTier = *tier;
181 ApplyOverrides(OverridesForTier(*tier));
182 ApplyScalabilityForTier(*tier);
184 GPostEngineInitHandle = FCoreDelegates::GetOnPostEngineInit().AddStatic(&OnPostEngineInit);
188 if (GPostEngineInitHandle.IsValid()) {
189 FCoreDelegates::GetOnPostEngineInit().Remove(GPostEngineInitHandle);
190 GPostEngineInitHandle.Reset();
IMPLEMENT_MODULE(FCarlaDeviceProfileSelectorModule, CarlaDeviceProfileSelector)
virtual void ShutdownModule() override
virtual void StartupModule() override