17#include "Misc/CommandLine.h"
18#include "GenericPlatform/GenericPlatformMisc.h"
19#include "Kismet/GameplayStatics.h"
20#include "GameFramework/GameUserSettings.h"
21#include "Misc/CoreDelegates.h"
22#include "Misc/Parse.h"
24#include "Engine/Engine.h"
25#include "Engine/GameViewportClient.h"
26#include "UObject/ObjectPtr.h"
27#include "LandscapeSubsystem.h"
28#include "Engine/World.h"
29#include "Engine/GameInstance.h"
30#include "TimerManager.h"
33#include "RHIDefinitions.h"
61 ULandscapeSubsystem* LandscapeSubsystem =
CurrentWorld->GetSubsystem<ULandscapeSubsystem>();
62 if (LandscapeSubsystem)
64 LandscapeSubsystem->PrioritizeGrassCreation(
true);
74 GEngine->Exec(World, TEXT(
"g.TimeoutForBlockOnRenderFence 600000"));
75 GEngine->Exec(World, TEXT(
"r.Streaming.PoolSize 0"));
76 GEngine->Exec(World, TEXT(
"r.CustomDepth 0"));
79 GEngine->Exec(World, TEXT(
"t.IdleWhenNotForeground 0"));
97 if (FParse::Param(FCommandLine::Get(), TEXT(
"Fullscreen")))
101 else if (FParse::Param(FCommandLine::Get(), TEXT(
"WindowedFullscreen")))
114 Super::PostInitProperties();
116#if UE_BUILD_SHIPPING || UE_BUILD_DEVELOPMENT
126 return Cast<UAgrarsenseSettings>(UGameUserSettings::GetGameUserSettings());
131 Super::LoadSettings(bForceReload);
136 Super::ApplySettings(bCheckForCommandLineOverrides);
144 bool SettingsWereChanged =
false;
147 FString AntiAliasingString;
148 if (FParse::Value(FCommandLine::Get(), TEXT(
"-antialiasing="), AntiAliasingString))
151 int32 AntiAliasingInt;
152 if (AntiAliasingString.IsNumeric())
154 AntiAliasingInt = FCString::Atoi(*AntiAliasingString);
157 SettingsWereChanged =
true;
162 if (FParse::Param(FCommandLine::Get(), TEXT(
"-no-spectator-rendering")))
165 SettingsWereChanged =
true;
169 if (FParse::Param(FCommandLine::Get(), TEXT(
"-start-camerawindows-minimized")))
172 SettingsWereChanged =
true;
176 FString QualityLevelString;
177 if (FParse::Value(FCommandLine::Get(), TEXT(
"-quality-level="), QualityLevelString))
180 SettingsWereChanged =
true;
183 return SettingsWereChanged;
188 return FPlatformMisc::NumberOfWorkerThreadsToSpawn();
193 IConsoleVariable* ConsoleVariable = IConsoleManager::Get().FindConsoleVariable(*VariableName);
196 FString VariableValue = ConsoleVariable->GetString();
197 return VariableValue;
221 UGameUserSettings* UserSettings = GEngine->GetGameUserSettings();
224 UserSettings->SetFullscreenMode(WindowType);
225 UserSettings->ApplySettings(
false);
254 if (!GEngine || !World)
263 GEngine->Exec(World, TEXT(
"grass.enable 0"));
264 GEngine->Exec(World, TEXT(
"grass.FlushCache"));
268 GEngine->Exec(World, TEXT(
"grass.enable 1"));
287 if (GEngine && World)
293 GEngine->Exec(World, TEXT(
"r.Shadow.CSMCaching 1"));
297 GEngine->Exec(World, TEXT(
"r.Shadow.CSMCaching 0"));
311 if (InstanceRenderer)
327 if (GEngine && World)
329 MaxPixelsPerEdge = FMath::Clamp(MaxPixelsPerEdge, 0.1f, 10.0f);
331 FString Command = FString::Printf(TEXT(
"r.Nanite.MaxPixelsPerEdge %f"), MaxPixelsPerEdge);
332 GEngine->Exec(World, *Command);
350 FString BehaviourStringToLower = BehaviourString.ToLower();
352 if (BehaviourStringToLower ==
"auto")
356 else if (BehaviourStringToLower ==
"rigid")
360 else if (BehaviourStringToLower ==
"always")
364 else if (BehaviourStringToLower ==
"static")
398 if (GEngine || World)
401 if (RenderCustomDepthPass)
403 GEngine->Exec(World, TEXT(
"r.CustomDepth 3"));
407 GEngine->Exec(World, TEXT(
"r.CustomDepth 0"));
415 if (GEngine || World)
421 GEngine->Exec(World, TEXT(
"r.Shadow.Virtual.Enable 1"));
425 GEngine->Exec(World, TEXT(
"r.Shadow.Virtual.Enable 0"));
452 if (!GEngine || !World)
460 switch (AntiAliasingMethod)
463 ExecCommand = TEXT(
"r.AntiAliasingMethod 0");
467 ExecCommand = TEXT(
"r.AntiAliasingMethod 1");
471 ExecCommand = TEXT(
"r.AntiAliasingMethod 2");
477 ExecCommand = TEXT(
"r.AntiAliasingMethod 4");
484 GEngine->Exec(World, *ExecCommand);
497 if (GEngine && GEngine->GameViewport)
499 GEngine->GameViewport->bDisableWorldRendering = !enabled;
502 FString msg = FString::Printf(TEXT(
"World rendering: %s"), enabled ? TEXT(
"On") : TEXT(
"Off"));
533 FString Msg = FString::Printf(TEXT(
"Graphics settings: %s"), *QualityLevelString);
546 return GetFrameRateLimit();
551 SetFrameRateLimit(NewTargetFrameRate);
564 return UGameplayStatics::GetGlobalTimeDilation(World);
576 UGameplayStatics::SetGlobalTimeDilation(World, TimeDilation);
578 FString msg = FString::Printf(TEXT(
"Global time dilation: %f"), TimeDilation);
591 if (IsValid(Spectator))
608 if (IsValid(Spectator))
620 UGameplayStatics::SetGlobalTimeDilation(World, 0.0f);
621 UGameplayStatics::SetGamePaused(World,
true);
634 UGameplayStatics::SetGamePaused(World,
false);
656 FCoreDelegates::OnEndFrame.Remove(EndOfFrameHandle);
657 EndOfFrameHandle.Reset();
667 if (FramesToAdvance == 0)
722 FTimerHandle AdvanceTimeTimer;
723 World->GetTimerManager().SetTimer(AdvanceTimeTimer, FTimerDelegate::CreateLambda([
this]
730 }), TimeToAdvance,
false);
737 MapName = MapName.ToLower();
739 bool FoundMap =
false;
740 for (int32 i = 0; i <
MapNames.Num(); i++)
745 FString msg = FString::Printf(TEXT(
"Changing map to: %s"), *MapName);
755 FString msg = FString::Printf(TEXT(
"Couldn't find map: %s"), *MapName);
765 UGameplayStatics::OpenLevel(World, *Path, TRAVEL_Absolute);
814 SimulatorLog::Log(
"Graphics settings: Ray tracing not supported on this hardware.");
820 bool RayTracingSupported =
false;
823 IConsoleVariable* CVar = IConsoleManager::Get().FindConsoleVariable(TEXT(
"r.RayTracing"));
824 if (CVar && CVar->GetInt() > 0 && GRHISupportsRayTracing)
826 RayTracingSupported =
true;
829 return RayTracingSupported;
835 if (!World || !GEngine)
841#if (ENGINE_MAJOR_VERSION == 5) && (ENGINE_MINOR_VERSION == 6)
843 GEngine->Exec(World, TEXT(
"r.RayTracing.Geometry.NaniteProxies.WPO 0"));
846 GEngine->Exec(World, TEXT(
"r.RayTracing 1"));
847 GEngine->Exec(World, TEXT(
"r.Lumen.HardwareRayTracing 1"));
848 GEngine->Exec(World, TEXT(
"r.RayTracing.Geometry 1"));
849 GEngine->Exec(World, TEXT(
"r.RayTracing.Reflections 1"));
850 GEngine->Exec(World, TEXT(
"r.RayTracing.AmbientOcclusion 1"));
851 GEngine->Exec(World, TEXT(
"r.RayTracing.GlobalIllumination 1"));
852 GEngine->Exec(World, TEXT(
"r.RayTracing.Translucency 1"));
853 GEngine->Exec(World, TEXT(
"r.RayTracing.SkyLight 1"));
860 GEngine->Exec(World, TEXT(
"r.RayTracing.Reflections.MaxRoughness 1.0"));
861 GEngine->Exec(World, TEXT(
"r.RayTracing.Reflections.Shadows 1"));
862 GEngine->Exec(World, TEXT(
"r.RayTracing.Reflections.SortTiles 1"));
863 GEngine->Exec(World, TEXT(
"r.RayTracing.GlobalIllumination.Quality 4"));
864 GEngine->Exec(World, TEXT(
"r.RayTracing.GlobalIllumination.SamplesPerPixel 4"));
866 GEngine->Exec(World, TEXT(
"r.Lumen.Reflections 1"));
867 GEngine->Exec(World, TEXT(
"r.Lumen.ScreenProbeGather.ScreenTraces 1"));
869 GEngine->Exec(World, TEXT(
"r.RayTracing.Denoiser 1"));
870 GEngine->Exec(World, TEXT(
"r.RayTracing.Denoiser.TemporalAccumulation 1"));
871 GEngine->Exec(World, TEXT(
"r.RayTracing.Denoiser.ReuseRadiance 1"));
877 if (!World || !GEngine)
882#if (ENGINE_MAJOR_VERSION == 5) && (ENGINE_MINOR_VERSION == 6)
883 GEngine->Exec(World, TEXT(
"r.RayTracing.Geometry.NaniteProxies.WPO 1"));
886 GEngine->Exec(World, TEXT(
"r.RayTracing 0"));
887 GEngine->Exec(World, TEXT(
"r.RayTracing.Denoiser 0"));
888 GEngine->Exec(World, TEXT(
"r.Lumen.HardwareRayTracing 0"));
889 GEngine->Exec(World, TEXT(
"r.RayTracing.Geometry 0"));
890 GEngine->Exec(World, TEXT(
"r.RayTracing.Reflections 0"));
891 GEngine->Exec(World, TEXT(
"r.RayTracing.AmbientOcclusion 0"));
892 GEngine->Exec(World, TEXT(
"r.RayTracing.GlobalIllumination 0"));
893 GEngine->Exec(World, TEXT(
"r.RayTracing.Translucency 0"));
894 GEngine->Exec(World, TEXT(
"r.RayTracing.SkyLight 0"));
895 GEngine->Exec(World, TEXT(
"r.RayTracing.Shadows 0"));
901 if (!World || !GEngine)
909 GEngine->Exec(World, TEXT(
"sg.PostProcessQuality 3"));
910 GEngine->Exec(World, TEXT(
"sg.ShadowQuality 3"));
911 GEngine->Exec(World, TEXT(
"sg.TextureQuality 4"));
912 GEngine->Exec(World, TEXT(
"sg.EffectsQuality 4"));
913 GEngine->Exec(World, TEXT(
"sg.FoliageQuality 4"));
915 GEngine->Exec(World, TEXT(
"r.MinScreenRadiusForLights 0.03"));
916 GEngine->Exec(World, TEXT(
"r.SeparateTranslucency 1"));
917 GEngine->Exec(World, TEXT(
"r.DepthOfFieldQuality 2"));
918 GEngine->Exec(World, TEXT(
"r.TranslucencyVolumeBlur 1"));
919 GEngine->Exec(World, TEXT(
"r.TranslucencyLightingVolumeDim 64"));
920 GEngine->Exec(World, TEXT(
"r.MaxAnisotropy 8"));
921 GEngine->Exec(World, TEXT(
"r.LensFlareQuality 2"));
922 GEngine->Exec(World, TEXT(
"r.SceneColorFringeQuality 1"));
923 GEngine->Exec(World, TEXT(
"r.FastBlurThreshold 7"));
924 GEngine->Exec(World, TEXT(
"r.EarlyZPassMovable 1"));
925 GEngine->Exec(World, TEXT(
"r.ShadowQuality 5"));
926 GEngine->Exec(World, TEXT(
"r.TranslucentLightingVolume 1"));
927 GEngine->Exec(World, TEXT(
"r.LightShaftDownSampleFactor 2"));
928 GEngine->Exec(World, TEXT(
"r.DetailMode 2"));
929 GEngine->Exec(World, TEXT(
"foliage.DensityScale 1"));
930 GEngine->Exec(World, TEXT(
"grass.DensityScale 1"));
931 GEngine->Exec(World, TEXT(
"r.Streaming.PoolSize 0 "));
932 GEngine->Exec(World, TEXT(
"r.Shadow.RadiusThreshold 0.00"));
940 if (!World || !GEngine)
947 GEngine->Exec(World, TEXT(
"sg.PostProcessQuality 3"));
948 GEngine->Exec(World, TEXT(
"sg.TextureQuality 3"));
949 GEngine->Exec(World, TEXT(
"sg.EffectsQuality 3"));
950 GEngine->Exec(World, TEXT(
"sg.FoliageQuality 3"));
952 GEngine->Exec(World, TEXT(
"r.MinScreenRadiusForLights 0.03"));
953 GEngine->Exec(World, TEXT(
"r.SeparateTranslucency 1"));
954 GEngine->Exec(World, TEXT(
"r.DepthOfFieldQuality 2"));
955 GEngine->Exec(World, TEXT(
"r.TranslucencyVolumeBlur 1"));
956 GEngine->Exec(World, TEXT(
"r.TranslucencyLightingVolumeDim 64"));
957 GEngine->Exec(World, TEXT(
"r.MaxAnisotropy 8"));
958 GEngine->Exec(World, TEXT(
"r.LensFlareQuality 2"));
959 GEngine->Exec(World, TEXT(
"r.SceneColorFringeQuality 1"));
960 GEngine->Exec(World, TEXT(
"r.FastBlurThreshold 7"));
961 GEngine->Exec(World, TEXT(
"r.EarlyZPassMovable 1"));
962 GEngine->Exec(World, TEXT(
"r.ShadowQuality 3"));
963 GEngine->Exec(World, TEXT(
"r.TranslucentLightingVolume 1"));
964 GEngine->Exec(World, TEXT(
"r.LightShaftDownSampleFactor 2"));
965 GEngine->Exec(World, TEXT(
"r.DetailMode 2"));
966 GEngine->Exec(World, TEXT(
"r.BloomQuality 4"));
967 GEngine->Exec(World, TEXT(
"foliage.DensityScale 1"));
968 GEngine->Exec(World, TEXT(
"grass.DensityScale 1"));
969 GEngine->Exec(World, TEXT(
"r.Streaming.PoolSize 0 "));
970 GEngine->Exec(World, TEXT(
"r.Shadow.RadiusThreshold 0.01"));
978 if (!World || !GEngine)
985 GEngine->Exec(World, TEXT(
"sg.PostProcessQuality 0"));
986 GEngine->Exec(World, TEXT(
"sg.ShadowQuality 0"));
987 GEngine->Exec(World, TEXT(
"sg.TextureQuality 0"));
988 GEngine->Exec(World, TEXT(
"sg.EffectsQuality 0"));
989 GEngine->Exec(World, TEXT(
"sg.FoliageQuality 0"));
991 GEngine->Exec(World, TEXT(
"r.DefaultFeature.MotionBlur 0"));
992 GEngine->Exec(World, TEXT(
"r.DefaultFeature.Bloom 0"));
993 GEngine->Exec(World, TEXT(
"r.DefaultFeature.AmbientOcclusion 0"));
994 GEngine->Exec(World, TEXT(
"r.DefaultFeature.AmbientOcclusionStaticFraction 0"));
995 GEngine->Exec(World, TEXT(
"r.HZBOcclusion 0"));
996 GEngine->Exec(World, TEXT(
"r.MinScreenRadiusForLights 0.01"));
997 GEngine->Exec(World, TEXT(
"r.SeparateTranslucency 0"));
998 GEngine->Exec(World, TEXT(
"r.FinishCurrentFrame 0"));
999 GEngine->Exec(World, TEXT(
"r.MotionBlurQuality 0"));
1000 GEngine->Exec(World, TEXT(
"r.BloomQuality 1"));
1001 GEngine->Exec(World, TEXT(
"r.DepthOfFieldQuality 0"));
1002 GEngine->Exec(World, TEXT(
"r.TranslucencyVolumeBlur 0"));
1003 GEngine->Exec(World, TEXT(
"r.TranslucencyLightingVolumeDim 4"));
1004 GEngine->Exec(World, TEXT(
"r.MaxAnisotropy 4"));
1005 GEngine->Exec(World, TEXT(
"r.LensFlareQuality 0"));
1006 GEngine->Exec(World, TEXT(
"r.SceneColorFringeQuality 0"));
1007 GEngine->Exec(World, TEXT(
"r.FastBlurThreshold 0"));
1008 GEngine->Exec(World, TEXT(
"r.SSR 0"));
1009 GEngine->Exec(World, TEXT(
"r.EarlyZPassMovable 1"));
1010 GEngine->Exec(World, TEXT(
"r.TranslucentLightingVolume 0"));
1011 GEngine->Exec(World, TEXT(
"r.LightShaftDownSampleFactor 4"));
1012 GEngine->Exec(World, TEXT(
"r.OcclusionQueryLocation 1"));
1013 GEngine->Exec(World, TEXT(
"foliage.DensityScale 0"));
1014 GEngine->Exec(World, TEXT(
"grass.DensityScale 0"));
1015 GEngine->Exec(World, TEXT(
"r.Streaming.PoolSize 0 "));
@ SemanticSegmentationCamera
void SetInstancedRendering(bool Visible)
virtual ESensorTypes GetSensorType() const
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 OnSensorSpawned(ASensor *SensorPtr)
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
int32 NumberOfPostProcessingSensors
void OnSensorDestroyed(ASensor *SensorPtr)
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)
static USensorManager * Get()
FSensorDestroyedDelegate OnSensorDestroyed
FSensorSpawnedDelegate OnSensorSpawned
EQualityLevel QualityLevel
bool DisableSpectatorRendering
float NaniteMaxPixelsPerEdge
EAntiAliasing AntiAliasingMethod
int32 WorldPositionOffsetDistance
EShadowCacheInvalidationBehavior FoliageShadowCacheInvalidationBehaviour
bool UseVirtualShadowMaps
bool ShowSpectatorRainAndSnowfall
bool StartCameraWindowsMinimized