9 #include "Components/StaticMeshComponent.h" 10 #include "Engine/DirectionalLight.h" 11 #include "Engine/Engine.h" 12 #include "Engine/LocalPlayer.h" 13 #include "Engine/PostProcessVolume.h" 14 #include "Engine/StaticMesh.h" 15 #include "GameFramework/HUD.h" 16 #include "InstancedFoliageActor.h" 17 #include "Kismet/GameplayStatics.h" 18 #include "Landscape.h" 19 #include "Scalability.h" 28 : ActorSpawnedDelegate(FOnActorSpawned::FDelegate::CreateUObject(
46 if (InActor !=
nullptr &&
IsValid(InActor) && !InActor->IsPendingKill() &&
47 !InActor->IsA<AInstancedFoliageActor>() &&
49 !InActor->IsA<ALandscape>() &&
53 TArray<UPrimitiveComponent *> components;
54 InActor->GetComponents(components);
60 const float maxscale = InActor->GetActorScale().GetMax();
86 Scalability::ToggleTemporaryQualityLevels(
true);
106 UE_LOG(LogCarla, Warning, TEXT(
"Unknown quality level, falling back to default."));
124 if (!
IsValid(InWorld) || InWorld->IsPendingKill())
129 APlayerController *playercontroller = UGameplayStatics::GetPlayerController(InWorld, 0);
130 if (playercontroller)
132 ULocalPlayer *player = playercontroller->GetLocalPlayer();
138 AHUD *hud = playercontroller->GetHUD();
149 return GEngine->GetWorldFromContextObjectChecked(
this);
158 if (world ==
nullptr || !
IsValid(world) || world->IsPendingKill())
162 check(world !=
nullptr);
163 auto GameInstance = Cast<UCarlaGameInstance>(world->GetGameInstance());
164 check(GameInstance !=
nullptr);
177 GEngine->Exec(world, TEXT(
"r.DefaultFeature.MotionBlur 0"));
178 GEngine->Exec(world, TEXT(
"r.DefaultFeature.Bloom 0"));
179 GEngine->Exec(world, TEXT(
"r.DefaultFeature.AmbientOcclusion 0"));
180 GEngine->Exec(world, TEXT(
"r.AmbientOcclusionLevels 0"));
181 GEngine->Exec(world, TEXT(
"r.DefaultFeature.AmbientOcclusionStaticFraction 0"));
182 GEngine->Exec(world, TEXT(
"r.RHICmdBypass 0"));
183 GEngine->Exec(world, TEXT(
"r.DefaultFeature.AntiAliasing 1"));
184 GEngine->Exec(world, TEXT(
"r.Streaming.PoolSize 2000"));
185 GEngine->Exec(world, TEXT(
"r.HZBOcclusion 0"));
186 GEngine->Exec(world, TEXT(
"r.MinScreenRadiusForLights 0.01"));
187 GEngine->Exec(world, TEXT(
"r.SeparateTranslucency 0"));
188 GEngine->Exec(world, TEXT(
"r.FinishCurrentFrame 0"));
189 GEngine->Exec(world, TEXT(
"r.MotionBlurQuality 0"));
190 GEngine->Exec(world, TEXT(
"r.PostProcessAAQuality 0"));
191 GEngine->Exec(world, TEXT(
"r.BloomQuality 1"));
192 GEngine->Exec(world, TEXT(
"r.SSR.Quality 0"));
193 GEngine->Exec(world, TEXT(
"r.DepthOfFieldQuality 0"));
194 GEngine->Exec(world, TEXT(
"r.SceneColorFormat 2"));
195 GEngine->Exec(world, TEXT(
"r.TranslucencyVolumeBlur 0"));
196 GEngine->Exec(world, TEXT(
"r.TranslucencyLightingVolumeDim 4"));
197 GEngine->Exec(world, TEXT(
"r.MaxAnisotropy 8"));
198 GEngine->Exec(world, TEXT(
"r.LensFlareQuality 0"));
199 GEngine->Exec(world, TEXT(
"r.SceneColorFringeQuality 0"));
200 GEngine->Exec(world, TEXT(
"r.FastBlurThreshold 0"));
201 GEngine->Exec(world, TEXT(
"r.SSR.MaxRoughness 0.1"));
202 GEngine->Exec(world, TEXT(
"r.AllowOcclusionQueries 1"));
203 GEngine->Exec(world, TEXT(
"r.SSR 0"));
205 GEngine->Exec(world, TEXT(
"r.EarlyZPass 2"));
206 GEngine->Exec(world, TEXT(
"r.EarlyZPassMovable 1"));
207 GEngine->Exec(world, TEXT(
"Foliage.DitheredLOD 0"));
209 GEngine->Exec(world, TEXT(
"sg.PostProcessQuality 0"));
212 GEngine->Exec(world, TEXT(
"sg.ShadowQuality 0"));
213 GEngine->Exec(world, TEXT(
"sg.TextureQuality 0"));
214 GEngine->Exec(world, TEXT(
"sg.EffectsQuality 0"));
215 GEngine->Exec(world, TEXT(
"sg.FoliageQuality 0"));
216 GEngine->Exec(world, TEXT(
"foliage.DensityScale 0"));
217 GEngine->Exec(world, TEXT(
"grass.DensityScale 0"));
218 GEngine->Exec(world, TEXT(
"r.TranslucentLightingVolume 0"));
219 GEngine->Exec(world, TEXT(
"r.LightShaftDownSampleFactor 4"));
220 GEngine->Exec(world, TEXT(
"r.OcclusionQueryLocation 1"));
223 GEngine->Exec(world, TEXT(
"r.DefaultFeature.AutoExposure 1"));
229 const float max_draw_distance,
230 const TArray<FStaticMaterial> &road_pieces_materials)
const 232 if (!world || !
IsValid(world) || world->IsPendingKill())
236 AsyncTask(ENamedThreads::GameThread, [=]() {
237 if (!world || !
IsValid(world) || world->IsPendingKill())
241 TArray<AActor *> actors;
244 for (int32 i = 0; i < actors.Num(); i++)
246 AActor *actor = actors[i];
247 if (!
IsValid(actor) || actor->IsPendingKill())
251 TArray<UStaticMeshComponent *> components;
252 actor->GetComponents(components);
253 for (int32 j = 0; j < components.Num(); j++)
255 UStaticMeshComponent *staticmeshcomponent = Cast<UStaticMeshComponent>(components[j]);
256 if (staticmeshcomponent)
258 staticmeshcomponent->bAllowCullDistanceVolume = (max_draw_distance > 0);
259 staticmeshcomponent->bUseAsOccluder =
false;
260 staticmeshcomponent->LDMaxDrawDistance = max_draw_distance;
261 staticmeshcomponent->CastShadow = (max_draw_distance == 0);
262 if (road_pieces_materials.Num() > 0)
264 TArray<FName> meshslotsnames = staticmeshcomponent->GetMaterialSlotNames();
265 for (int32 k = 0; k < meshslotsnames.Num(); k++)
267 const FName &slotname = meshslotsnames[k];
268 road_pieces_materials.ContainsByPredicate(
269 [staticmeshcomponent, slotname](
const FStaticMaterial &material)
271 if (material.MaterialSlotName.IsEqual(slotname))
273 staticmeshcomponent->SetMaterial(
274 staticmeshcomponent->GetMaterialIndex(slotname),
275 material.MaterialInterface);
293 const float max_draw_distance)
const 299 TArray<UPrimitiveComponent *> components;
300 actor->GetComponents(components,
false);
301 float dist = max_draw_distance;
302 const float maxscale = actor->GetActorScale().GetMax();
307 for (int32 j = 0; j < components.Num(); j++)
310 if (
IsValid(primitivecomponent))
312 primitivecomponent->SetCullDistance(dist);
313 primitivecomponent->bAllowCullDistanceVolume = dist > 0;
323 if (!world || !
IsValid(world) || world->IsPendingKill())
327 AsyncTask(ENamedThreads::GameThread, [=]() {
328 if (!world || !
IsValid(world) || world->IsPendingKill())
332 TArray<AActor *> actors;
334 UGameplayStatics::GetAllActorsOfClass(world, AActor::StaticClass(), actors);
335 for (int32 i = 0; i < actors.Num(); i++)
337 AActor *actor = actors[i];
338 if (!
IsValid(actor) || actor->IsPendingKill() ||
339 actor->IsA<AInstancedFoliageActor>() ||
341 actor->IsA<ALandscape>() ||
354 TArray<AActor *> actors;
355 UGameplayStatics::GetAllActorsOfClass(world, APostProcessVolume::StaticClass(), actors);
356 for (int32 i = 0; i < actors.Num(); i++)
358 AActor *actor = actors[i];
359 if (!
IsValid(actor) || actor->IsPendingKill())
363 APostProcessVolume *postprocessvolume = Cast<APostProcessVolume>(actor);
364 if (postprocessvolume)
366 postprocessvolume->bEnabled = enabled;
378 GEngine->Exec(world, TEXT(
"r.AmbientOcclusionLevels -1"));
379 GEngine->Exec(world, TEXT(
"r.RHICmdBypass 1"));
380 GEngine->Exec(world, TEXT(
"r.DefaultFeature.AntiAliasing 1"));
381 GEngine->Exec(world, TEXT(
"r.Streaming.PoolSize 2000"));
382 GEngine->Exec(world, TEXT(
"r.MinScreenRadiusForLights 0.03"));
383 GEngine->Exec(world, TEXT(
"r.SeparateTranslucency 1"));
384 GEngine->Exec(world, TEXT(
"r.PostProcessAAQuality 4"));
385 GEngine->Exec(world, TEXT(
"r.BloomQuality 5"));
386 GEngine->Exec(world, TEXT(
"r.SSR.Quality 3"));
387 GEngine->Exec(world, TEXT(
"r.DepthOfFieldQuality 2"));
388 GEngine->Exec(world, TEXT(
"r.SceneColorFormat 4"));
389 GEngine->Exec(world, TEXT(
"r.TranslucencyVolumeBlur 1"));
390 GEngine->Exec(world, TEXT(
"r.TranslucencyLightingVolumeDim 64"));
391 GEngine->Exec(world, TEXT(
"r.MaxAnisotropy 8"));
392 GEngine->Exec(world, TEXT(
"r.LensFlareQuality 2"));
393 GEngine->Exec(world, TEXT(
"r.SceneColorFringeQuality 1"));
394 GEngine->Exec(world, TEXT(
"r.FastBlurThreshold 100"));
395 GEngine->Exec(world, TEXT(
"r.SSR.MaxRoughness -1"));
397 GEngine->Exec(world, TEXT(
"r.EarlyZPass 3"));
398 GEngine->Exec(world, TEXT(
"r.EarlyZPassMovable 1"));
399 GEngine->Exec(world, TEXT(
"Foliage.DitheredLOD 1"));
400 GEngine->Exec(world, TEXT(
"sg.PostProcessQuality 3"));
401 GEngine->Exec(world, TEXT(
"r.ViewDistanceScale 1"));
403 GEngine->Exec(world, TEXT(
"sg.ShadowQuality 3"));
404 GEngine->Exec(world, TEXT(
"sg.TextureQuality 3"));
405 GEngine->Exec(world, TEXT(
"sg.EffectsQuality 3"));
406 GEngine->Exec(world, TEXT(
"sg.FoliageQuality 3"));
407 GEngine->Exec(world, TEXT(
"foliage.DensityScale 1"));
408 GEngine->Exec(world, TEXT(
"grass.DensityScale 1"));
409 GEngine->Exec(world, TEXT(
"r.TranslucentLightingVolume 1"));
410 GEngine->Exec(world, TEXT(
"r.LightShaftDownSampleFactor 2"));
413 GEngine->Exec(world, TEXT(
"r.DetailMode 2"));
418 const float max_distance_fade,
419 const bool cast_shadows,
420 const bool hide_non_directional)
const 422 if (!world || !
IsValid(world) || world->IsPendingKill())
426 AsyncTask(ENamedThreads::GameThread, [=]() {
427 if (!world || !
IsValid(world) || world->IsPendingKill())
431 TArray<AActor *> actors;
432 UGameplayStatics::GetAllActorsOfClass(world, ALight::StaticClass(), actors);
433 for (int32 i = 0; i < actors.Num(); i++)
435 if (!
IsValid(actors[i]) || actors[i]->IsPendingKill())
440 ADirectionalLight *directionallight = Cast<ADirectionalLight>(actors[i]);
441 if (directionallight)
443 directionallight->SetCastShadows(cast_shadows);
444 directionallight->SetLightFunctionFadeDistance(max_distance_fade);
448 actors[i]->SetActorHiddenInGame(hide_non_directional);
static constexpr float CARLA_SETTINGS_MAX_SCALE_SIZE
FOnActorSpawned::FDelegate ActorSpawnedDelegate
void ApplyQualityLevelPostRestart()
After loading a level, apply the current settings.
void SetActorComponentsDrawDistance(AActor *actor, float max_draw_distance) const
void OnActorSpawned(AActor *Actor)
Function to apply to the actor that is being spawned to apply the current settings.
void LaunchLowQualityCommands(UWorld *world) const
Execute engine commands to apply the low quality level to the world.
void SetAllActorsDrawDistance(UWorld *world, float max_draw_distance) const
static bool IsValid(const ACarlaWheeledVehicle *Vehicle)
void RegisterSpawnHandler(UWorld *World)
Create the event trigger handler for all the newly spawned actors to be processed with a custom funct...
void SetAllLights(UWorld *world, float max_distance_fade, bool cast_shadows, bool hide_non_directional) const
Used to set settings for every actor that is spawned into the world.
void LaunchEpicQualityCommands(UWorld *world) const
Execute engine commands to apply the epic quality level to the world.
static EQualityLevel AppliedLowPostResetQualityLevel
Currently applied quality level after level is restarted.
float LowLightFadeDistance
Distance at which the light function should be completely faded to DisabledBrightness.
EQualityLevel GetQualityLevel() const
void SetPostProcessEffectsEnabled(UWorld *world, bool enabled) const
void SetAllRoads(UWorld *world, float max_draw_distance, const TArray< FStaticMaterial > &road_pieces_materials) const
void Reset()
Reset settings to default.
void CheckCarlaSettings(UWorld *world)
Check that the world, instance and settings are valid and save the CarlaSettings instance.
static const FName CARLA_ROAD_TAG
CARLA_ROAD name to tag road mesh actors.
UCarlaSettings * CarlaSettings
bool bDisableRendering
Enable or disable the viewport rendering of the world.
static const FName CARLA_SKY_TAG
CARLA_SKY name to tag the sky sphere (BPS) actors in the scenes.
void ApplyQualityLevelPreRestart()
Before loading a level, apply the current settings.