16#include "Misc/CommandLine.h"
17#include "GenericPlatform/GenericPlatformMisc.h"
18#include "Kismet/GameplayStatics.h"
19#include "GameFramework/GameUserSettings.h"
20#include "Misc/CoreDelegates.h"
21#include "Misc/Parse.h"
23#include "Engine/Engine.h"
24#include "Engine/GameViewportClient.h"
25#include "UObject/ObjectPtr.h"
26#include "LandscapeSubsystem.h"
27#include "Engine/World.h"
28#include "Engine/GameInstance.h"
29#include "TimerManager.h"
32#include "RHIDefinitions.h"
60 ULandscapeSubsystem* LandscapeSubsystem =
CurrentWorld->GetSubsystem<ULandscapeSubsystem>();
61 if (LandscapeSubsystem)
63 LandscapeSubsystem->PrioritizeGrassCreation(
true);
73 GEngine->Exec(World, TEXT(
"g.TimeoutForBlockOnRenderFence 600000"));
74 GEngine->Exec(World, TEXT(
"r.Streaming.PoolSize 0"));
77 GEngine->Exec(World, TEXT(
"t.IdleWhenNotForeground 0"));
83 if (FParse::Param(FCommandLine::Get(), TEXT(
"Fullscreen")))
87 else if (FParse::Param(FCommandLine::Get(), TEXT(
"WindowedFullscreen")))
100 Super::PostInitProperties();
102#if UE_BUILD_SHIPPING || UE_BUILD_DEVELOPMENT
112 return Cast<UAgrarsenseSettings>(UGameUserSettings::GetGameUserSettings());
117 Super::LoadSettings(bForceReload);
122 Super::ApplySettings(bCheckForCommandLineOverrides);
130 bool SettingsWereChanged =
false;
133 FString AntiAliasingString;
134 if (FParse::Value(FCommandLine::Get(), TEXT(
"-antialiasing="), AntiAliasingString))
137 int32 AntiAliasingInt;
138 if (AntiAliasingString.IsNumeric())
140 AntiAliasingInt = FCString::Atoi(*AntiAliasingString);
143 SettingsWereChanged =
true;
148 if (FParse::Param(FCommandLine::Get(), TEXT(
"-no-spectator-rendering")))
151 SettingsWereChanged =
true;
155 if (FParse::Param(FCommandLine::Get(), TEXT(
"-start-camerawindows-minimized")))
158 SettingsWereChanged =
true;
162 FString QualityLevelString;
163 if (FParse::Value(FCommandLine::Get(), TEXT(
"-quality-level="), QualityLevelString))
166 SettingsWereChanged =
true;
169 return SettingsWereChanged;
174 return FPlatformMisc::NumberOfWorkerThreadsToSpawn();
179 IConsoleVariable* ConsoleVariable = IConsoleManager::Get().FindConsoleVariable(*VariableName);
182 FString VariableValue = ConsoleVariable->GetString();
183 return VariableValue;
207 UGameUserSettings* UserSettings = GEngine->GetGameUserSettings();
210 UserSettings->SetFullscreenMode(WindowType);
211 UserSettings->ApplySettings(
false);
240 if (!GEngine || !World)
249 GEngine->Exec(World, TEXT(
"grass.enable 0"));
250 GEngine->Exec(World, TEXT(
"grass.FlushCache"));
254 GEngine->Exec(World, TEXT(
"grass.enable 1"));
273 if (GEngine && World)
279 GEngine->Exec(World, TEXT(
"r.Shadow.CSMCaching 1"));
283 GEngine->Exec(World, TEXT(
"r.Shadow.CSMCaching 0"));
297 if (InstanceRenderer)
313 if (GEngine && World)
315 MaxPixelsPerEdge = FMath::Clamp(MaxPixelsPerEdge, 0.1f, 10.0f);
317 FString Command = FString::Printf(TEXT(
"r.Nanite.MaxPixelsPerEdge %f"), MaxPixelsPerEdge);
318 GEngine->Exec(World, *Command);
336 FString BehaviourStringToLower = BehaviourString.ToLower();
338 if (BehaviourStringToLower ==
"auto")
342 else if (BehaviourStringToLower ==
"rigid")
346 else if (BehaviourStringToLower ==
"always")
350 else if (BehaviourStringToLower ==
"static")
384 if (GEngine || World)
387 if (RenderCustomDepthPass)
390 GEngine->Exec(World, TEXT(
"r.CustomDepth 3"));
394 GEngine->Exec(World, TEXT(
"r.CustomDepth 0"));
402 if (GEngine || World)
408 GEngine->Exec(World, TEXT(
"r.Shadow.Virtual.Enable 1"));
412 GEngine->Exec(World, TEXT(
"r.Shadow.Virtual.Enable 0"));
439 if (!GEngine || !World)
447 switch (AntiAliasingMethod)
450 ExecCommand = TEXT(
"r.AntiAliasingMethod 0");
454 ExecCommand = TEXT(
"r.AntiAliasingMethod 1");
458 ExecCommand = TEXT(
"r.AntiAliasingMethod 2");
464 ExecCommand = TEXT(
"r.AntiAliasingMethod 4");
471 GEngine->Exec(World, *ExecCommand);
484 if (GEngine && GEngine->GameViewport)
486 GEngine->GameViewport->bDisableWorldRendering = !enabled;
489 FString msg = FString::Printf(TEXT(
"World rendering: %s"), enabled ? TEXT(
"On") : TEXT(
"Off"));
520 FString Msg = FString::Printf(TEXT(
"Graphics settings: %s"), *QualityLevelString);
533 return GetFrameRateLimit();
538 SetFrameRateLimit(NewTargetFrameRate);
551 return UGameplayStatics::GetGlobalTimeDilation(World);
563 UGameplayStatics::SetGlobalTimeDilation(World, TimeDilation);
565 FString msg = FString::Printf(TEXT(
"Global time dilation: %f"), TimeDilation);
578 if (IsValid(Spectator))
595 if (IsValid(Spectator))
607 UGameplayStatics::SetGlobalTimeDilation(World, 0.0f);
608 UGameplayStatics::SetGamePaused(World,
true);
621 UGameplayStatics::SetGamePaused(World,
false);
643 FCoreDelegates::OnEndFrame.Remove(EndOfFrameHandle);
644 EndOfFrameHandle.Reset();
654 if (FramesToAdvance == 0)
709 FTimerHandle AdvanceTimeTimer;
710 World->GetTimerManager().SetTimer(AdvanceTimeTimer, FTimerDelegate::CreateLambda([
this]
717 }), TimeToAdvance,
false);
724 MapName = MapName.ToLower();
726 bool FoundMap =
false;
727 for (int32 i = 0; i <
MapNames.Num(); i++)
732 FString msg = FString::Printf(TEXT(
"Changing map to: %s"), *MapName);
742 FString msg = FString::Printf(TEXT(
"Couldn't find map: %s"), *MapName);
752 UGameplayStatics::OpenLevel(World, *Path, TRAVEL_Absolute);
765 SimulatorLog::Log(
"Graphics settings: Ray tracing not supported on this hardware.");
771 bool RayTracingSupported =
false;
774 IConsoleVariable* CVar = IConsoleManager::Get().FindConsoleVariable(TEXT(
"r.RayTracing"));
775 if (CVar && CVar->GetInt() > 0 && GRHISupportsRayTracing)
777 RayTracingSupported =
true;
780 return RayTracingSupported;
786 if (!World || !GEngine)
792#if (ENGINE_MAJOR_VERSION == 5) && (ENGINE_MINOR_VERSION == 6)
794 GEngine->Exec(World, TEXT(
"r.RayTracing.Geometry.NaniteProxies.WPO 0"));
797 GEngine->Exec(World, TEXT(
"r.RayTracing 1"));
798 GEngine->Exec(World, TEXT(
"r.Lumen.HardwareRayTracing 1"));
799 GEngine->Exec(World, TEXT(
"r.RayTracing.Geometry 1"));
800 GEngine->Exec(World, TEXT(
"r.RayTracing.Reflections 1"));
801 GEngine->Exec(World, TEXT(
"r.RayTracing.AmbientOcclusion 1"));
802 GEngine->Exec(World, TEXT(
"r.RayTracing.GlobalIllumination 1"));
803 GEngine->Exec(World, TEXT(
"r.RayTracing.Translucency 1"));
804 GEngine->Exec(World, TEXT(
"r.RayTracing.SkyLight 1"));
811 GEngine->Exec(World, TEXT(
"r.RayTracing.Reflections.MaxRoughness 1.0"));
812 GEngine->Exec(World, TEXT(
"r.RayTracing.Reflections.Shadows 1"));
813 GEngine->Exec(World, TEXT(
"r.RayTracing.Reflections.SortTiles 1"));
814 GEngine->Exec(World, TEXT(
"r.RayTracing.GlobalIllumination.Quality 4"));
815 GEngine->Exec(World, TEXT(
"r.RayTracing.GlobalIllumination.SamplesPerPixel 4"));
817 GEngine->Exec(World, TEXT(
"r.Lumen.Reflections 1"));
818 GEngine->Exec(World, TEXT(
"r.Lumen.ScreenProbeGather.ScreenTraces 1"));
820 GEngine->Exec(World, TEXT(
"r.RayTracing.Denoiser 1"));
821 GEngine->Exec(World, TEXT(
"r.RayTracing.Denoiser.TemporalAccumulation 1"));
822 GEngine->Exec(World, TEXT(
"r.RayTracing.Denoiser.ReuseRadiance 1"));
828 if (!World || !GEngine)
833#if (ENGINE_MAJOR_VERSION == 5) && (ENGINE_MINOR_VERSION == 6)
834 GEngine->Exec(World, TEXT(
"r.RayTracing.Geometry.NaniteProxies.WPO 1"));
837 GEngine->Exec(World, TEXT(
"r.RayTracing 0"));
838 GEngine->Exec(World, TEXT(
"r.RayTracing.Denoiser 0"));
839 GEngine->Exec(World, TEXT(
"r.Lumen.HardwareRayTracing 0"));
840 GEngine->Exec(World, TEXT(
"r.RayTracing.Geometry 0"));
841 GEngine->Exec(World, TEXT(
"r.RayTracing.Reflections 0"));
842 GEngine->Exec(World, TEXT(
"r.RayTracing.AmbientOcclusion 0"));
843 GEngine->Exec(World, TEXT(
"r.RayTracing.GlobalIllumination 0"));
844 GEngine->Exec(World, TEXT(
"r.RayTracing.Translucency 0"));
845 GEngine->Exec(World, TEXT(
"r.RayTracing.SkyLight 0"));
846 GEngine->Exec(World, TEXT(
"r.RayTracing.Shadows 0"));
852 if (!World || !GEngine)
860 GEngine->Exec(World, TEXT(
"sg.PostProcessQuality 3"));
861 GEngine->Exec(World, TEXT(
"sg.ShadowQuality 3"));
862 GEngine->Exec(World, TEXT(
"sg.TextureQuality 4"));
863 GEngine->Exec(World, TEXT(
"sg.EffectsQuality 4"));
864 GEngine->Exec(World, TEXT(
"sg.FoliageQuality 4"));
866 GEngine->Exec(World, TEXT(
"r.MinScreenRadiusForLights 0.03"));
867 GEngine->Exec(World, TEXT(
"r.SeparateTranslucency 1"));
868 GEngine->Exec(World, TEXT(
"r.DepthOfFieldQuality 2"));
869 GEngine->Exec(World, TEXT(
"r.TranslucencyVolumeBlur 1"));
870 GEngine->Exec(World, TEXT(
"r.TranslucencyLightingVolumeDim 64"));
871 GEngine->Exec(World, TEXT(
"r.MaxAnisotropy 8"));
872 GEngine->Exec(World, TEXT(
"r.LensFlareQuality 2"));
873 GEngine->Exec(World, TEXT(
"r.SceneColorFringeQuality 1"));
874 GEngine->Exec(World, TEXT(
"r.FastBlurThreshold 7"));
875 GEngine->Exec(World, TEXT(
"r.EarlyZPassMovable 1"));
876 GEngine->Exec(World, TEXT(
"r.ShadowQuality 5"));
877 GEngine->Exec(World, TEXT(
"r.TranslucentLightingVolume 1"));
878 GEngine->Exec(World, TEXT(
"r.LightShaftDownSampleFactor 2"));
879 GEngine->Exec(World, TEXT(
"r.DetailMode 2"));
880 GEngine->Exec(World, TEXT(
"foliage.DensityScale 1"));
881 GEngine->Exec(World, TEXT(
"grass.DensityScale 1"));
882 GEngine->Exec(World, TEXT(
"r.Streaming.PoolSize 0 "));
883 GEngine->Exec(World, TEXT(
"r.Shadow.RadiusThreshold 0.00"));
891 if (!World || !GEngine)
898 GEngine->Exec(World, TEXT(
"sg.PostProcessQuality 3"));
899 GEngine->Exec(World, TEXT(
"sg.TextureQuality 3"));
900 GEngine->Exec(World, TEXT(
"sg.EffectsQuality 3"));
901 GEngine->Exec(World, TEXT(
"sg.FoliageQuality 3"));
903 GEngine->Exec(World, TEXT(
"r.MinScreenRadiusForLights 0.03"));
904 GEngine->Exec(World, TEXT(
"r.SeparateTranslucency 1"));
905 GEngine->Exec(World, TEXT(
"r.DepthOfFieldQuality 2"));
906 GEngine->Exec(World, TEXT(
"r.TranslucencyVolumeBlur 1"));
907 GEngine->Exec(World, TEXT(
"r.TranslucencyLightingVolumeDim 64"));
908 GEngine->Exec(World, TEXT(
"r.MaxAnisotropy 8"));
909 GEngine->Exec(World, TEXT(
"r.LensFlareQuality 2"));
910 GEngine->Exec(World, TEXT(
"r.SceneColorFringeQuality 1"));
911 GEngine->Exec(World, TEXT(
"r.FastBlurThreshold 7"));
912 GEngine->Exec(World, TEXT(
"r.EarlyZPassMovable 1"));
913 GEngine->Exec(World, TEXT(
"r.ShadowQuality 3"));
914 GEngine->Exec(World, TEXT(
"r.TranslucentLightingVolume 1"));
915 GEngine->Exec(World, TEXT(
"r.LightShaftDownSampleFactor 2"));
916 GEngine->Exec(World, TEXT(
"r.DetailMode 2"));
917 GEngine->Exec(World, TEXT(
"r.BloomQuality 4"));
918 GEngine->Exec(World, TEXT(
"foliage.DensityScale 1"));
919 GEngine->Exec(World, TEXT(
"grass.DensityScale 1"));
920 GEngine->Exec(World, TEXT(
"r.Streaming.PoolSize 0 "));
921 GEngine->Exec(World, TEXT(
"r.Shadow.RadiusThreshold 0.01"));
929 if (!World || !GEngine)
936 GEngine->Exec(World, TEXT(
"sg.PostProcessQuality 0"));
937 GEngine->Exec(World, TEXT(
"sg.ShadowQuality 0"));
938 GEngine->Exec(World, TEXT(
"sg.TextureQuality 0"));
939 GEngine->Exec(World, TEXT(
"sg.EffectsQuality 0"));
940 GEngine->Exec(World, TEXT(
"sg.FoliageQuality 0"));
942 GEngine->Exec(World, TEXT(
"r.DefaultFeature.MotionBlur 0"));
943 GEngine->Exec(World, TEXT(
"r.DefaultFeature.Bloom 0"));
944 GEngine->Exec(World, TEXT(
"r.DefaultFeature.AmbientOcclusion 0"));
945 GEngine->Exec(World, TEXT(
"r.DefaultFeature.AmbientOcclusionStaticFraction 0"));
946 GEngine->Exec(World, TEXT(
"r.HZBOcclusion 0"));
947 GEngine->Exec(World, TEXT(
"r.MinScreenRadiusForLights 0.01"));
948 GEngine->Exec(World, TEXT(
"r.SeparateTranslucency 0"));
949 GEngine->Exec(World, TEXT(
"r.FinishCurrentFrame 0"));
950 GEngine->Exec(World, TEXT(
"r.MotionBlurQuality 0"));
951 GEngine->Exec(World, TEXT(
"r.BloomQuality 1"));
952 GEngine->Exec(World, TEXT(
"r.DepthOfFieldQuality 0"));
953 GEngine->Exec(World, TEXT(
"r.TranslucencyVolumeBlur 0"));
954 GEngine->Exec(World, TEXT(
"r.TranslucencyLightingVolumeDim 4"));
955 GEngine->Exec(World, TEXT(
"r.MaxAnisotropy 4"));
956 GEngine->Exec(World, TEXT(
"r.LensFlareQuality 0"));
957 GEngine->Exec(World, TEXT(
"r.SceneColorFringeQuality 0"));
958 GEngine->Exec(World, TEXT(
"r.FastBlurThreshold 0"));
959 GEngine->Exec(World, TEXT(
"r.SSR 0"));
960 GEngine->Exec(World, TEXT(
"r.EarlyZPassMovable 1"));
961 GEngine->Exec(World, TEXT(
"r.TranslucentLightingVolume 0"));
962 GEngine->Exec(World, TEXT(
"r.LightShaftDownSampleFactor 4"));
963 GEngine->Exec(World, TEXT(
"r.OcclusionQueryLocation 1"));
964 GEngine->Exec(World, TEXT(
"foliage.DensityScale 0"));
965 GEngine->Exec(World, TEXT(
"grass.DensityScale 0"));
966 GEngine->Exec(World, TEXT(
"r.Streaming.PoolSize 0 "));
void SetInstancedRendering(bool Visible)
void SetMaxSpeed(float MaxSpeed=1500.0f)
bool IsNiagaraComponentVisible()
void SetNiagaraComponentVisibility(bool Visible)
static void Log(const FString &Message, bool LogToTextFile=true, bool LogToROS=true)
void ApplySettings(bool bCheckForCommandLineOverrides) override
EAntiAliasing GetAntiAliasingMethod() const
void SetStartWindowInitiallyMinimized(bool Minimized)
int32 GetGlobalTargetFrameRate() const
void SetQualityLevelFromString(const FString &QualityLevelString)
EShadowCacheInvalidationBehavior GetShadowCacheInvalidationBehavior() const
void SetUltraWithRaytracingLevel()
void SetSpectatorMaxSpeed(float MaxSpeed)
bool GetIsUsingVirtualShadowMaps() const
int32 GetWorldPositionOffsetRenderDistance() const
void SetShowSpectatorRainAndSnowfall(bool Show)
bool GetStartWindowInitiallyMinimized() const
bool ParseLaunchArguments()
FDelegateHandle AdvanceFramesHandle
FDelegateHandle EndOfFrameHandle
void SetSimulationSettings(FGlobalSimulationSettings NewSettings)
void AdvanceTime(float TimeToAdvance)
void ChangeMapByName(FString MapName)
void AdvanceFrameCount(int32 FramesToAdvance)
FGraphicsSettingsDelegate OnGraphicsSettingsChanged
void SetAntiAliasingMethod(EAntiAliasing AntiAliasingMethod)
const TArray< FString > MapPaths
void SetInstancedRenderingVisibility(bool Visible)
void SetLowQualityLevel()
virtual void PostInitProperties() override
float GetGlobalTimeDilation() const
void SetShadowCSMCache(bool CacheShadowCSM)
void SetGlobalTargetFrameRate(int32 NewTargetFrameRate)
void SetAntiAliasingMethodFromString(const FString &AntiAliasingMethodString)
FGlobalSimulationSettings SimulationSettings
void SetUseVirtualShadowMaps(bool UseVirtualShadowMaps)
void SetGraphicsSettings(FGlobalGraphicsSettings NewSettings)
void SetBalancedQualityLevel()
TWeakObjectPtr< UWorld > CurrentWorld
void LoadSettings(bool bForceReload=false) override
void SetQualityLevel(EQualityLevel newQualityLevel)
void Setup(UWorld *World)
int32 GetNumberOfWorkerThreads() const
float GetNaniteMaxPixelsPerEdge() const
void SetGlobalTimeDilation(float TimeDilation)
static FString CurrentMapName
void SetWindowMode(EWindowMode::Type WindowType)
void SetRenderCustomDepthPass(bool RenderCustomDepthPass)
bool GetIsRenderingCustomDepthPass() const
void SetGrassVisibility(bool Visible)
void SetUltraQualityLevel()
bool GetShadowCSMCache() const
void SetShadowCacheInvalidationBehaviorFromString(const FString &BehaviourString)
void SetShadowCacheInvalidationBehavior(EShadowCacheInvalidationBehavior Behaviour=EShadowCacheInvalidationBehavior::Rigid)
void ChangeMapByMapPath(const FString &Path)
FString GetConsoleVariableValueString(const FString &VariableName) const
void PauseSimulationEndOfThisFrame()
static UAgrarsenseSettings * GetAgrarsenseSettings()
bool GetGrassVisibility() const
void SetWorldPositionOffsetRenderDistance(int32 WorldPositionOffsetDistance)
FGlobalGraphicsSettings GraphicsSettings
const TArray< FString > MapNames
void SetWorldRendering(bool enabled)
void SetNaniteMaxPixelsPerEdge(float MaxPixelsPerEdge=1.0f)
bool IsRaytracingSupported() const
static ASpectator * GetSpectator(const UObject *WorldContextObject)
static AInstancedRendererManager * GetInstancedRenderer(const UObject *WorldContextObject)
static FString ConvertQualityLevelToString(EQualityLevel QualityLevel)
static EQualityLevel ConvertStringToQualityLevel(const FString &String)
static EAntiAliasing ConvertStringToAntiAliasingMethod(const FString &String)
EQualityLevel QualityLevel
bool DisableSpectatorRendering
float NaniteMaxPixelsPerEdge
EAntiAliasing AntiAliasingMethod
int32 WorldPositionOffsetDistance
EShadowCacheInvalidationBehavior FoliageShadowCacheInvalidationBehaviour
bool UseVirtualShadowMaps
bool ShowSpectatorRainAndSnowfall
bool StartCameraWindowsMinimized