7 #include "Components/StaticMeshComponent.h" 8 #include "Engine/DirectionalLight.h" 9 #include "Engine/Engine.h" 10 #include "Engine/LocalPlayer.h" 11 #include "Engine/PostProcessVolume.h" 12 #include "Engine/StaticMesh.h" 13 #include "GameFramework/HUD.h" 14 #include "InstancedFoliageActor.h" 15 #include "Kismet/GameplayStatics.h" 16 #include "Landscape.h" 17 #include "Scalability.h" 26 : ActorSpawnedDelegate(FOnActorSpawned::FDelegate::CreateUObject(
44 if (InActor !=
nullptr &&
IsValid(InActor) && !InActor->IsPendingKill() &&
45 !InActor->IsA<AInstancedFoliageActor>() &&
47 !InActor->IsA<ALandscape>() &&
51 TArray<UPrimitiveComponent *> components;
52 InActor->GetComponents(components);
58 const float maxscale = InActor->GetActorScale().GetMax();
84 Scalability::ToggleTemporaryQualityLevels(
true);
104 UE_LOG(LogCarla, Warning, TEXT(
"Unknown quality level, falling back to default."));
122 if (!
IsValid(InWorld) || InWorld->IsPendingKill())
127 APlayerController *playercontroller = UGameplayStatics::GetPlayerController(InWorld, 0);
128 if (playercontroller)
130 ULocalPlayer *player = playercontroller->GetLocalPlayer();
136 AHUD *hud = playercontroller->GetHUD();
147 return GEngine->GetWorldFromContextObjectChecked(
this);
156 if (world ==
nullptr || !
IsValid(world) || world->IsPendingKill())
160 check(world !=
nullptr);
161 auto GameInstance = Cast<UCarlaGameInstance>(world->GetGameInstance());
162 check(GameInstance !=
nullptr);
175 GEngine->Exec(world, TEXT(
"r.DefaultFeature.MotionBlur 0"));
176 GEngine->Exec(world, TEXT(
"r.DefaultFeature.Bloom 0"));
177 GEngine->Exec(world, TEXT(
"r.DefaultFeature.AmbientOcclusion 0"));
178 GEngine->Exec(world, TEXT(
"r.AmbientOcclusionLevels 0"));
179 GEngine->Exec(world, TEXT(
"r.DefaultFeature.AmbientOcclusionStaticFraction 0"));
180 GEngine->Exec(world, TEXT(
"r.RHICmdBypass 0"));
181 GEngine->Exec(world, TEXT(
"r.DefaultFeature.AntiAliasing 1"));
182 GEngine->Exec(world, TEXT(
"r.Streaming.PoolSize 2000"));
183 GEngine->Exec(world, TEXT(
"r.HZBOcclusion 0"));
184 GEngine->Exec(world, TEXT(
"r.MinScreenRadiusForLights 0.01"));
185 GEngine->Exec(world, TEXT(
"r.SeparateTranslucency 0"));
186 GEngine->Exec(world, TEXT(
"r.FinishCurrentFrame 0"));
187 GEngine->Exec(world, TEXT(
"r.MotionBlurQuality 0"));
188 GEngine->Exec(world, TEXT(
"r.PostProcessAAQuality 0"));
189 GEngine->Exec(world, TEXT(
"r.BloomQuality 1"));
190 GEngine->Exec(world, TEXT(
"r.SSR.Quality 0"));
191 GEngine->Exec(world, TEXT(
"r.DepthOfFieldQuality 0"));
192 GEngine->Exec(world, TEXT(
"r.SceneColorFormat 2"));
193 GEngine->Exec(world, TEXT(
"r.TranslucencyVolumeBlur 0"));
194 GEngine->Exec(world, TEXT(
"r.TranslucencyLightingVolumeDim 4"));
195 GEngine->Exec(world, TEXT(
"r.MaxAnisotropy 8"));
196 GEngine->Exec(world, TEXT(
"r.LensFlareQuality 0"));
197 GEngine->Exec(world, TEXT(
"r.SceneColorFringeQuality 0"));
198 GEngine->Exec(world, TEXT(
"r.FastBlurThreshold 0"));
199 GEngine->Exec(world, TEXT(
"r.SSR.MaxRoughness 0.1"));
200 GEngine->Exec(world, TEXT(
"r.AllowOcclusionQueries 1"));
201 GEngine->Exec(world, TEXT(
"r.SSR 0"));
203 GEngine->Exec(world, TEXT(
"r.EarlyZPass 2"));
204 GEngine->Exec(world, TEXT(
"r.EarlyZPassMovable 1"));
205 GEngine->Exec(world, TEXT(
"Foliage.DitheredLOD 0"));
207 GEngine->Exec(world, TEXT(
"sg.PostProcessQuality 0"));
210 GEngine->Exec(world, TEXT(
"sg.ShadowQuality 0"));
211 GEngine->Exec(world, TEXT(
"sg.TextureQuality 0"));
212 GEngine->Exec(world, TEXT(
"sg.EffectsQuality 0"));
213 GEngine->Exec(world, TEXT(
"sg.FoliageQuality 0"));
214 GEngine->Exec(world, TEXT(
"foliage.DensityScale 0"));
215 GEngine->Exec(world, TEXT(
"grass.DensityScale 0"));
216 GEngine->Exec(world, TEXT(
"r.TranslucentLightingVolume 0"));
217 GEngine->Exec(world, TEXT(
"r.LightShaftDownSampleFactor 4"));
218 GEngine->Exec(world, TEXT(
"r.OcclusionQueryLocation 1"));
221 GEngine->Exec(world, TEXT(
"r.DefaultFeature.AutoExposure 1"));
227 const float max_draw_distance,
228 const TArray<FStaticMaterial> &road_pieces_materials)
const 230 if (!world || !
IsValid(world) || world->IsPendingKill())
234 AsyncTask(ENamedThreads::GameThread, [=]() {
235 if (!world || !
IsValid(world) || world->IsPendingKill())
239 TArray<AActor *> actors;
242 for (int32 i = 0; i < actors.Num(); i++)
244 AActor *actor = actors[i];
245 if (!
IsValid(actor) || actor->IsPendingKill())
249 TArray<UStaticMeshComponent *> components;
250 actor->GetComponents(components);
251 for (int32 j = 0; j < components.Num(); j++)
253 UStaticMeshComponent *staticmeshcomponent = Cast<UStaticMeshComponent>(components[j]);
254 if (staticmeshcomponent)
256 staticmeshcomponent->bAllowCullDistanceVolume = (max_draw_distance > 0);
257 staticmeshcomponent->bUseAsOccluder =
false;
258 staticmeshcomponent->LDMaxDrawDistance = max_draw_distance;
259 staticmeshcomponent->CastShadow = (max_draw_distance == 0);
260 if (road_pieces_materials.Num() > 0)
262 TArray<FName> meshslotsnames = staticmeshcomponent->GetMaterialSlotNames();
263 for (int32 k = 0; k < meshslotsnames.Num(); k++)
265 const FName &slotname = meshslotsnames[k];
266 road_pieces_materials.ContainsByPredicate(
267 [staticmeshcomponent, slotname](
const FStaticMaterial &material)
269 if (material.MaterialSlotName.IsEqual(slotname))
271 staticmeshcomponent->SetMaterial(
272 staticmeshcomponent->GetMaterialIndex(slotname),
273 material.MaterialInterface);
291 const float max_draw_distance)
const 297 TArray<UPrimitiveComponent *> components;
298 actor->GetComponents(components,
false);
299 float dist = max_draw_distance;
300 const float maxscale = actor->GetActorScale().GetMax();
305 for (int32 j = 0; j < components.Num(); j++)
308 if (
IsValid(primitivecomponent))
310 primitivecomponent->SetCullDistance(dist);
311 primitivecomponent->bAllowCullDistanceVolume = dist > 0;
321 if (!world || !
IsValid(world) || world->IsPendingKill())
325 AsyncTask(ENamedThreads::GameThread, [=]() {
326 if (!world || !
IsValid(world) || world->IsPendingKill())
330 TArray<AActor *> actors;
332 UGameplayStatics::GetAllActorsOfClass(world, AActor::StaticClass(), actors);
333 for (int32 i = 0; i < actors.Num(); i++)
335 AActor *actor = actors[i];
336 if (!
IsValid(actor) || actor->IsPendingKill() ||
337 actor->IsA<AInstancedFoliageActor>() ||
339 actor->IsA<ALandscape>() ||
352 TArray<AActor *> actors;
353 UGameplayStatics::GetAllActorsOfClass(world, APostProcessVolume::StaticClass(), actors);
354 for (int32 i = 0; i < actors.Num(); i++)
356 AActor *actor = actors[i];
357 if (!
IsValid(actor) || actor->IsPendingKill())
361 APostProcessVolume *postprocessvolume = Cast<APostProcessVolume>(actor);
362 if (postprocessvolume)
364 postprocessvolume->bEnabled = enabled;
376 GEngine->Exec(world, TEXT(
"r.AmbientOcclusionLevels -1"));
377 GEngine->Exec(world, TEXT(
"r.RHICmdBypass 1"));
378 GEngine->Exec(world, TEXT(
"r.DefaultFeature.AntiAliasing 1"));
379 GEngine->Exec(world, TEXT(
"r.Streaming.PoolSize 2000"));
380 GEngine->Exec(world, TEXT(
"r.MinScreenRadiusForLights 0.03"));
381 GEngine->Exec(world, TEXT(
"r.SeparateTranslucency 1"));
382 GEngine->Exec(world, TEXT(
"r.PostProcessAAQuality 4"));
383 GEngine->Exec(world, TEXT(
"r.BloomQuality 5"));
384 GEngine->Exec(world, TEXT(
"r.SSR.Quality 3"));
385 GEngine->Exec(world, TEXT(
"r.DepthOfFieldQuality 2"));
386 GEngine->Exec(world, TEXT(
"r.SceneColorFormat 4"));
387 GEngine->Exec(world, TEXT(
"r.TranslucencyVolumeBlur 1"));
388 GEngine->Exec(world, TEXT(
"r.TranslucencyLightingVolumeDim 64"));
389 GEngine->Exec(world, TEXT(
"r.MaxAnisotropy 8"));
390 GEngine->Exec(world, TEXT(
"r.LensFlareQuality 2"));
391 GEngine->Exec(world, TEXT(
"r.SceneColorFringeQuality 1"));
392 GEngine->Exec(world, TEXT(
"r.FastBlurThreshold 100"));
393 GEngine->Exec(world, TEXT(
"r.SSR.MaxRoughness -1"));
395 GEngine->Exec(world, TEXT(
"r.EarlyZPass 3"));
396 GEngine->Exec(world, TEXT(
"r.EarlyZPassMovable 1"));
397 GEngine->Exec(world, TEXT(
"Foliage.DitheredLOD 1"));
398 GEngine->Exec(world, TEXT(
"sg.PostProcessQuality 3"));
399 GEngine->Exec(world, TEXT(
"r.ViewDistanceScale 1"));
401 GEngine->Exec(world, TEXT(
"sg.ShadowQuality 3"));
402 GEngine->Exec(world, TEXT(
"sg.TextureQuality 3"));
403 GEngine->Exec(world, TEXT(
"sg.EffectsQuality 3"));
404 GEngine->Exec(world, TEXT(
"sg.FoliageQuality 3"));
405 GEngine->Exec(world, TEXT(
"foliage.DensityScale 1"));
406 GEngine->Exec(world, TEXT(
"grass.DensityScale 1"));
407 GEngine->Exec(world, TEXT(
"r.TranslucentLightingVolume 1"));
408 GEngine->Exec(world, TEXT(
"r.LightShaftDownSampleFactor 2"));
411 GEngine->Exec(world, TEXT(
"r.DetailMode 2"));
416 const float max_distance_fade,
417 const bool cast_shadows,
418 const bool hide_non_directional)
const 420 if (!world || !
IsValid(world) || world->IsPendingKill())
424 AsyncTask(ENamedThreads::GameThread, [=]() {
425 if (!world || !
IsValid(world) || world->IsPendingKill())
429 TArray<AActor *> actors;
430 UGameplayStatics::GetAllActorsOfClass(world, ALight::StaticClass(), actors);
431 for (int32 i = 0; i < actors.Num(); i++)
433 if (!
IsValid(actors[i]) || actors[i]->IsPendingKill())
438 ADirectionalLight *directionallight = Cast<ADirectionalLight>(actors[i]);
439 if (directionallight)
441 directionallight->SetCastShadows(cast_shadows);
442 directionallight->SetLightFunctionFadeDistance(max_distance_fade);
446 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.