diff --git a/Unreal/CarlaUnreal/CarlaUnreal.uproject b/Unreal/CarlaUnreal/CarlaUnreal.uproject index 7882a43d6..29639c251 100644 --- a/Unreal/CarlaUnreal/CarlaUnreal.uproject +++ b/Unreal/CarlaUnreal/CarlaUnreal.uproject @@ -165,6 +165,10 @@ { "Name": "MovieRenderPipeline", "Enabled": true + }, + { + "Name": "Volumetrics", + "Enabled": true } ], "TargetPlatforms": [ diff --git a/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Actor/ActorBlueprintFunctionLibrary.cpp b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Actor/ActorBlueprintFunctionLibrary.cpp index aaaa6495b..ed690701d 100644 --- a/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Actor/ActorBlueprintFunctionLibrary.cpp +++ b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Actor/ActorBlueprintFunctionLibrary.cpp @@ -399,26 +399,26 @@ void UActorBlueprintFunctionLibrary::MakeCameraDefinition( FActorVariation MBIntesity; MBIntesity.Id = TEXT("motion_blur_intensity"); MBIntesity.Type = EActorAttributeType::Float; - MBIntesity.RecommendedValues = { TEXT("0.45") }; + MBIntesity.RecommendedValues = { TEXT("0.5") }; MBIntesity.bRestrictToRecommended = false; FActorVariation MBMaxDistortion; MBMaxDistortion.Id = TEXT("motion_blur_max_distortion"); MBMaxDistortion.Type = EActorAttributeType::Float; - MBMaxDistortion.RecommendedValues = { TEXT("0.35") }; + MBMaxDistortion.RecommendedValues = { TEXT("5.0") }; MBMaxDistortion.bRestrictToRecommended = false; FActorVariation MBMinObjectScreenSize; MBMinObjectScreenSize.Id = TEXT("motion_blur_min_object_screen_size"); MBMinObjectScreenSize.Type = EActorAttributeType::Float; - MBMinObjectScreenSize.RecommendedValues = { TEXT("0.1") }; + MBMinObjectScreenSize.RecommendedValues = { TEXT("0.0") }; MBMinObjectScreenSize.bRestrictToRecommended = false; // Lens Flare FActorVariation LensFlareIntensity; LensFlareIntensity.Id = TEXT("lens_flare_intensity"); LensFlareIntensity.Type = EActorAttributeType::Float; - LensFlareIntensity.RecommendedValues = { TEXT("0.1") }; + LensFlareIntensity.RecommendedValues = { TEXT("1.0") }; LensFlareIntensity.bRestrictToRecommended = false; // Bloom @@ -450,7 +450,7 @@ void UActorBlueprintFunctionLibrary::MakeCameraDefinition( FActorVariation ExposureCompensation; ExposureCompensation.Id = TEXT("exposure_compensation"); ExposureCompensation.Type = EActorAttributeType::Float; - ExposureCompensation.RecommendedValues = { TEXT("0.0") }; + ExposureCompensation.RecommendedValues = { TEXT("1.0") }; ExposureCompensation.bRestrictToRecommended = false; // - Manual ------------------------------------------------ @@ -462,7 +462,7 @@ void UActorBlueprintFunctionLibrary::MakeCameraDefinition( FActorVariation ShutterSpeed; // (1/t) ShutterSpeed.Id = TEXT("shutter_speed"); ShutterSpeed.Type = EActorAttributeType::Float; - ShutterSpeed.RecommendedValues = { TEXT("200.0") }; + ShutterSpeed.RecommendedValues = { TEXT("60.0") }; ShutterSpeed.bRestrictToRecommended = false; // The camera sensor sensitivity. @@ -477,7 +477,7 @@ void UActorBlueprintFunctionLibrary::MakeCameraDefinition( FActorVariation Aperture; // N Aperture.Id = TEXT("fstop"); Aperture.Type = EActorAttributeType::Float; - Aperture.RecommendedValues = { TEXT("1.4") }; + Aperture.RecommendedValues = { TEXT("4.0") }; Aperture.bRestrictToRecommended = false; // - Histogram --------------------------------------------- @@ -487,7 +487,7 @@ void UActorBlueprintFunctionLibrary::MakeCameraDefinition( FActorVariation ExposureMinBright; ExposureMinBright.Id = TEXT("exposure_min_bright"); ExposureMinBright.Type = EActorAttributeType::Float; - ExposureMinBright.RecommendedValues = { TEXT("10.0") }; + ExposureMinBright.RecommendedValues = { TEXT("-10.0") }; ExposureMinBright.bRestrictToRecommended = false; // The maximum brightness for auto exposure that limits the upper @@ -495,7 +495,7 @@ void UActorBlueprintFunctionLibrary::MakeCameraDefinition( FActorVariation ExposureMaxBright; ExposureMaxBright.Id = TEXT("exposure_max_bright"); ExposureMaxBright.Type = EActorAttributeType::Float; - ExposureMaxBright.RecommendedValues = { TEXT("12.0") }; + ExposureMaxBright.RecommendedValues = { TEXT("20.0") }; ExposureMaxBright.bRestrictToRecommended = false; // The speed at which the adaptation occurs from a dark environment @@ -526,7 +526,7 @@ void UActorBlueprintFunctionLibrary::MakeCameraDefinition( FActorVariation FocalDistance; FocalDistance.Id = TEXT("focal_distance"); FocalDistance.Type = EActorAttributeType::Float; - FocalDistance.RecommendedValues = { TEXT("1000.0") }; + FocalDistance.RecommendedValues = { TEXT("0.0") }; FocalDistance.bRestrictToRecommended = false; // Depth blur km for 50% @@ -1556,11 +1556,11 @@ void UActorBlueprintFunctionLibrary::SetCamera( Camera->SetMotionBlurMaxDistortion( RetrieveActorAttributeToFloat("motion_blur_max_distortion", Description.Variations, 5.0f)); Camera->SetMotionBlurMinObjectScreenSize( - RetrieveActorAttributeToFloat("motion_blur_min_object_screen_size", Description.Variations, 0.5f)); + RetrieveActorAttributeToFloat("motion_blur_min_object_screen_size", Description.Variations, 0.0f)); Camera->SetLensFlareIntensity( - RetrieveActorAttributeToFloat("lens_flare_intensity", Description.Variations, 0.1f)); + RetrieveActorAttributeToFloat("lens_flare_intensity", Description.Variations, 1.0f)); Camera->SetBloomIntensity( - RetrieveActorAttributeToFloat("bloom_intensity", Description.Variations, 0.675f)); + RetrieveActorAttributeToFloat("bloom_intensity", Description.Variations, 0.675000f)); // Exposure, histogram mode by default if (RetrieveActorAttributeToString("exposure_mode", Description.Variations, "histogram") == "histogram") { @@ -1571,27 +1571,28 @@ void UActorBlueprintFunctionLibrary::SetCamera( Camera->SetExposureMethod(EAutoExposureMethod::AEM_Manual); } Camera->SetExposureCompensation( - RetrieveActorAttributeToFloat("exposure_compensation", Description.Variations, 0.0f)); + RetrieveActorAttributeToFloat("exposure_compensation", Description.Variations, 1.0f)); Camera->SetShutterSpeed( - RetrieveActorAttributeToFloat("shutter_speed", Description.Variations, 200.0f)); + RetrieveActorAttributeToFloat("shutter_speed", Description.Variations, 60.0f)); Camera->SetISO( RetrieveActorAttributeToFloat("iso", Description.Variations, 100.0f)); Camera->SetAperture( - RetrieveActorAttributeToFloat("fstop", Description.Variations, 1.4f)); + RetrieveActorAttributeToFloat("fstop", Description.Variations, 4.0f)); Camera->SetExposureMinBrightness( - RetrieveActorAttributeToFloat("exposure_min_bright", Description.Variations, 7.0f)); + RetrieveActorAttributeToFloat("exposure_min_bright", Description.Variations, -10.0f)); Camera->SetExposureMaxBrightness( - RetrieveActorAttributeToFloat("exposure_max_bright", Description.Variations, 9.0f)); + RetrieveActorAttributeToFloat("exposure_max_bright", Description.Variations, 20.0f)); Camera->SetExposureSpeedUp( RetrieveActorAttributeToFloat("exposure_speed_up", Description.Variations, 3.0f)); Camera->SetExposureSpeedDown( RetrieveActorAttributeToFloat("exposure_speed_down", Description.Variations, 1.0f)); + // This is deprecated: Camera->SetExposureCalibrationConstant( RetrieveActorAttributeToFloat("calibration_constant", Description.Variations, 16.0f)); Camera->SetFocalDistance( - RetrieveActorAttributeToFloat("focal_distance", Description.Variations, 1000.0f)); + RetrieveActorAttributeToFloat("focal_distance", Description.Variations, 0.0f)); Camera->SetDepthBlurAmount( RetrieveActorAttributeToFloat("blur_amount", Description.Variations, 1.0f)); Camera->SetDepthBlurRadius( diff --git a/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/ImageUtil.cpp b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/ImageUtil.cpp index 49120db72..d9d4318a0 100644 --- a/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/ImageUtil.cpp +++ b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/ImageUtil.cpp @@ -109,13 +109,13 @@ namespace ImageUtil case PF_FloatRGBA: case PF_R16G16B16A16_UNORM: case PF_R16G16B16A16_SNORM: - ConvertRawR16G16B16A16FDataToFColor(DestinationExtent.X, DestinationExtent.Y, (uint8*)PixelData, SourcePitch, Out.GetData(), false); + ConvertRawR16G16B16A16FDataToFColor(DestinationExtent.X, DestinationExtent.Y, (uint8*)PixelData, SourcePitch, Out.GetData(), Flags.GetLinearToGamma()); break; case PF_FloatR11G11B10: - ConvertRawR11G11B10DataToFColor(DestinationExtent.X, DestinationExtent.Y, (uint8*)PixelData, SourcePitch, Out.GetData(), false); + ConvertRawR11G11B10DataToFColor(DestinationExtent.X, DestinationExtent.Y, (uint8*)PixelData, SourcePitch, Out.GetData(), Flags.GetLinearToGamma()); break; case PF_A32B32G32R32F: - ConvertRawR32G32B32A32DataToFColor(DestinationExtent.X, DestinationExtent.Y, (uint8*)PixelData, SourcePitch, Out.GetData(), false); + ConvertRawR32G32B32A32DataToFColor(DestinationExtent.X, DestinationExtent.Y, (uint8*)PixelData, SourcePitch, Out.GetData(), Flags.GetLinearToGamma()); break; case PF_A16B16G16R16: ConvertRawR16G16B16A16DataToFColor(DestinationExtent.X, DestinationExtent.Y, (uint8*)PixelData, SourcePitch, Out.GetData()); diff --git a/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/PostProcessConfig.cpp b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/PostProcessConfig.cpp new file mode 100644 index 000000000..fee29b8dd --- /dev/null +++ b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/PostProcessConfig.cpp @@ -0,0 +1,201 @@ +#include "PostProcessConfig.h" +#include "Components/SceneCaptureComponent.h" +#include "Components/SceneCaptureComponent2D.h" + +void FPostProcessConfig::EnablePostProcessingEffects() +{ + // This block of code { + EngineShowFlags.SetLensFlares(true); + EngineShowFlags.SetEyeAdaptation(true); + EngineShowFlags.SetColorGrading(true); + EngineShowFlags.SetCameraImperfections(true); + EngineShowFlags.SetDepthOfField(true); + EngineShowFlags.SetVignette(true); + EngineShowFlags.SetGrain(true); + EngineShowFlags.SetSeparateTranslucency(true); + EngineShowFlags.SetScreenSpaceReflections(true); + EngineShowFlags.SetTemporalAA(true); + EngineShowFlags.SetAmbientOcclusion(true); + EngineShowFlags.SetIndirectLightingCache(true); + EngineShowFlags.SetLightShafts(true); + EngineShowFlags.SetPostProcessMaterial(true); + EngineShowFlags.SetDistanceFieldAO(true); + // TODO: Remove when Physical page pool size scales automatically with demand + EngineShowFlags.SetVirtualShadowMapCaching(false); + // } must be kept in sync with EngineShowFlags.EnableAdvancedFeatures(), AND activate Lumen. + EngineShowFlags.SetMotionBlur(true); +} + +void FPostProcessConfig::DisablePostProcessingEffects() +{ + EngineShowFlags.SetAmbientOcclusion(false); + EngineShowFlags.SetAntiAliasing(false); + EngineShowFlags.SetVolumetricFog(false); + // EngineShowFlags.SetAtmosphericFog(false); + // EngineShowFlags.SetAudioRadius(false); + // EngineShowFlags.SetBillboardSprites(false); + EngineShowFlags.SetBloom(false); + // EngineShowFlags.SetBounds(false); + // EngineShowFlags.SetBrushes(false); + // EngineShowFlags.SetBSP(false); + // EngineShowFlags.SetBSPSplit(false); + // EngineShowFlags.SetBSPTriangles(false); + // EngineShowFlags.SetBuilderBrush(false); + // EngineShowFlags.SetCameraAspectRatioBars(false); + // EngineShowFlags.SetCameraFrustums(false); + EngineShowFlags.SetCameraImperfections(false); + EngineShowFlags.SetCameraInterpolation(false); + // EngineShowFlags.SetCameraSafeFrames(false); + // EngineShowFlags.SetCollision(false); + // EngineShowFlags.SetCollisionPawn(false); + // EngineShowFlags.SetCollisionVisibility(false); + EngineShowFlags.SetColorGrading(false); + // EngineShowFlags.SetCompositeEditorPrimitives(false); + // EngineShowFlags.SetConstraints(false); + // EngineShowFlags.SetCover(false); + // EngineShowFlags.SetDebugAI(false); + // EngineShowFlags.SetDecals(false); + // EngineShowFlags.SetDeferredLighting(false); + EngineShowFlags.SetDepthOfField(false); + EngineShowFlags.SetDiffuse(false); + EngineShowFlags.SetDirectionalLights(false); + EngineShowFlags.SetDirectLighting(false); + // EngineShowFlags.SetDistanceCulledPrimitives(false); + // EngineShowFlags.SetDistanceFieldAO(false); + // EngineShowFlags.SetDistanceFieldGI(false); + EngineShowFlags.SetDynamicShadows(false); + // EngineShowFlags.SetEditor(false); + EngineShowFlags.SetEyeAdaptation(false); + EngineShowFlags.SetFog(false); + // EngineShowFlags.SetGame(false); + // EngineShowFlags.SetGameplayDebug(false); + // EngineShowFlags.SetGBufferHints(false); + EngineShowFlags.SetGlobalIllumination(false); + EngineShowFlags.SetGrain(false); + // EngineShowFlags.SetGrid(false); + // EngineShowFlags.SetHighResScreenshotMask(false); + // EngineShowFlags.SetHitProxies(false); + EngineShowFlags.SetHLODColoration(false); + EngineShowFlags.SetHMDDistortion(false); + // EngineShowFlags.SetIndirectLightingCache(false); + // EngineShowFlags.SetInstancedFoliage(false); + // EngineShowFlags.SetInstancedGrass(false); + // EngineShowFlags.SetInstancedStaticMeshes(false); + // EngineShowFlags.SetLandscape(false); + // EngineShowFlags.SetLargeVertices(false); + EngineShowFlags.SetLensFlares(false); + EngineShowFlags.SetLevelColoration(false); + EngineShowFlags.SetLightComplexity(false); + EngineShowFlags.SetLightFunctions(false); + EngineShowFlags.SetLightInfluences(false); + EngineShowFlags.SetLighting(false); + EngineShowFlags.SetLightMapDensity(false); + EngineShowFlags.SetLightRadius(false); + EngineShowFlags.SetLightShafts(false); + // EngineShowFlags.SetLOD(false); + EngineShowFlags.SetLODColoration(false); + // EngineShowFlags.SetMaterials(false); + // EngineShowFlags.SetMaterialTextureScaleAccuracy(false); + // EngineShowFlags.SetMeshEdges(false); + // EngineShowFlags.SetMeshUVDensityAccuracy(false); + // EngineShowFlags.SetModeWidgets(false); + EngineShowFlags.SetMotionBlur(false); + // EngineShowFlags.SetNavigation(false); + EngineShowFlags.SetOnScreenDebug(false); + // EngineShowFlags.SetOutputMaterialTextureScales(false); + // EngineShowFlags.SetOverrideDiffuseAndSpecular(false); + // EngineShowFlags.SetPaper2DSprites(false); + EngineShowFlags.SetParticles(false); + // EngineShowFlags.SetPivot(false); + EngineShowFlags.SetPointLights(false); + // EngineShowFlags.SetPostProcessing(false); + // EngineShowFlags.SetPostProcessMaterial(false); + // EngineShowFlags.SetPrecomputedVisibility(false); + // EngineShowFlags.SetPrecomputedVisibilityCells(false); + // EngineShowFlags.SetPreviewShadowsIndicator(false); + // EngineShowFlags.SetPrimitiveDistanceAccuracy(false); + EngineShowFlags.SetPropertyColoration(false); + // EngineShowFlags.SetQuadOverdraw(false); + // EngineShowFlags.SetReflectionEnvironment(false); + // EngineShowFlags.SetReflectionOverride(false); + EngineShowFlags.SetRefraction(false); + // EngineShowFlags.SetRendering(false); + EngineShowFlags.SetSceneColorFringe(false); + // EngineShowFlags.SetScreenPercentage(false); + EngineShowFlags.SetScreenSpaceAO(false); + EngineShowFlags.SetScreenSpaceReflections(false); + // EngineShowFlags.SetSelection(false); + // EngineShowFlags.SetSelectionOutline(false); + // EngineShowFlags.SetSeparateTranslucency(false); + // EngineShowFlags.SetShaderComplexity(false); + // EngineShowFlags.SetShaderComplexityWithQuadOverdraw(false); + // EngineShowFlags.SetShadowFrustums(false); + // EngineShowFlags.SetSkeletalMeshes(false); + // EngineShowFlags.SetSkinCache(false); + EngineShowFlags.SetSkyLighting(false); + // EngineShowFlags.SetSnap(false); + // EngineShowFlags.SetSpecular(false); + // EngineShowFlags.SetSplines(false); + EngineShowFlags.SetSpotLights(false); + // EngineShowFlags.SetStaticMeshes(false); + EngineShowFlags.SetStationaryLightOverlap(false); + // EngineShowFlags.SetStereoRendering(false); + // EngineShowFlags.SetStreamingBounds(false); + EngineShowFlags.SetSubsurfaceScattering(false); + // EngineShowFlags.SetTemporalAA(false); + // EngineShowFlags.SetTessellation(false); + // EngineShowFlags.SetTestImage(false); + // EngineShowFlags.SetTextRender(false); + // EngineShowFlags.SetTexturedLightProfiles(false); + EngineShowFlags.SetTonemapper(false); + // EngineShowFlags.SetTranslucency(false); + // EngineShowFlags.SetVectorFields(false); + // EngineShowFlags.SetVertexColors(false); + // EngineShowFlags.SetVignette(false); + // EngineShowFlags.SetVisLog(false); + // EngineShowFlags.SetVisualizeAdaptiveDOF(false); + // EngineShowFlags.SetVisualizeBloom(false); + EngineShowFlags.SetVisualizeBuffer(false); + EngineShowFlags.SetVisualizeDistanceFieldAO(false); + EngineShowFlags.SetVisualizeDOF(false); + EngineShowFlags.SetVisualizeHDR(false); + EngineShowFlags.SetVisualizeLightCulling(false); + EngineShowFlags.SetVisualizeMeshDistanceFields(false); + EngineShowFlags.SetVisualizeMotionBlur(false); + EngineShowFlags.SetVisualizeOutOfBoundsPixels(false); + EngineShowFlags.SetVisualizeSenses(false); + EngineShowFlags.SetVisualizeShadingModels(false); + EngineShowFlags.SetVisualizeSSR(false); + EngineShowFlags.SetVisualizeSSS(false); + // EngineShowFlags.SetVolumeLightingSamples(false); + // EngineShowFlags.SetVolumes(false); + // EngineShowFlags.SetWidgetComponents(false); + // EngineShowFlags.SetWireframe(false); +} + +FPostProcessConfig::FPostProcessConfig( + FPostProcessSettings& InPostProcessSettings, + FEngineShowFlags& InEngineShowFlags) : + PostProcessSettings(InPostProcessSettings), + EngineShowFlags(InEngineShowFlags) +{ +} + +void FPostProcessConfig::UpdateFromSceneCaptureComponent(const USceneCaptureComponent& Component) +{ + EngineShowFlags = Component.ShowFlags; +} + +void FPostProcessConfig::UpdateFromSceneCaptureComponent2D(const USceneCaptureComponent2D& Component) +{ + EngineShowFlags = Component.ShowFlags; + PostProcessSettings = Component.PostProcessSettings; +} + +void FPostProcessConfig::EnablePostProcessingEffects(bool Enable) +{ + if (Enable) + EnablePostProcessingEffects(); + else + DisablePostProcessingEffects(); +} diff --git a/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/PostProcessConfig.h b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/PostProcessConfig.h new file mode 100644 index 000000000..58ab9412f --- /dev/null +++ b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/PostProcessConfig.h @@ -0,0 +1,25 @@ +#pragma once +#include "Engine/Scene.h" + + + +class CARLA_API FPostProcessConfig +{ + void EnablePostProcessingEffects(); + void DisablePostProcessingEffects(); + +public: + + FPostProcessConfig( + FPostProcessSettings& InPostProcessSettings, + FEngineShowFlags& InEngineShowFlags); + ~FPostProcessConfig() = default; + + void UpdateFromSceneCaptureComponent(const class USceneCaptureComponent& Component); + void UpdateFromSceneCaptureComponent2D(const class USceneCaptureComponent2D& Component); + void EnablePostProcessingEffects(bool Enable); + + FPostProcessSettings PostProcessSettings; + FEngineShowFlags EngineShowFlags; + +}; diff --git a/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/SceneCaptureSensor.cpp b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/SceneCaptureSensor.cpp index b736a80e4..0ea4ff5b6 100644 --- a/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/SceneCaptureSensor.cpp +++ b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/SceneCaptureSensor.cpp @@ -5,10 +5,12 @@ // For a copy, see . #include "Carla/Sensor/SceneCaptureSensor.h" +#include "Carla/Sensor/PostProcessConfig.h" #include "Carla.h" #include "Carla/Game/CarlaStatics.h" #include "Actor/ActorBlueprintFunctionLibrary.h" #include "Engine/PostProcessVolume.h" +#include "GameFramework/SpectatorPawn.h" #include #include @@ -25,8 +27,6 @@ namespace SceneCaptureSensor_local_ns { static void SetCameraDefaultOverrides(USceneCaptureComponent2D &CaptureComponent2D); - static void ConfigureShowFlags(FEngineShowFlags &ShowFlags, bool bPostProcessing = true); - static auto GetQualitySettings(UWorld *World) { auto Settings = UCarlaStatics::GetCarlaSettings(World); @@ -56,7 +56,7 @@ ASceneCaptureSensor::ASceneCaptureSensor(const FObjectInitializer &ObjectInitial CaptureRenderTarget->AddressY = TextureAddress::TA_Clamp; CaptureComponent2D = CreateDefaultSubobject( - FName(*FString::Printf(TEXT("USceneCaptureComponent2D_CARLA_%d"), SCENE_CAPTURE_COUNTER))); + FName(*FString::Printf(TEXT("USceneCaptureComponent2D%d"), SCENE_CAPTURE_COUNTER))); check(CaptureComponent2D != nullptr); CaptureComponent2D->ViewActor = this; CaptureComponent2D->SetupAttachment(RootComponent); @@ -449,6 +449,11 @@ float ASceneCaptureSensor::GetChromAberrOffset() const return CaptureComponent2D->PostProcessSettings.ChromaticAberrationStartOffset; } +void ASceneCaptureSensor::UpdatePostProcessConfig( + FPostProcessConfig& InOutPostProcessConfig) +{ +} + bool ASceneCaptureSensor::ApplyPostProcessVolumeToSensor(APostProcessVolume* Origin, ASceneCaptureSensor* Dest, bool bOverrideCurrentCamera) { if(!IsValid(Origin) || !IsValid(Dest)) @@ -548,8 +553,11 @@ void ASceneCaptureSensor::BeginPlay() // Determine the gamma of the player. const bool bInForceLinearGamma = !bEnablePostProcessingEffects; - CaptureRenderTarget->InitCustomFormat(ImageWidth, ImageHeight, bEnable16BitFormat ? PF_FloatRGBA : PF_B8G8R8A8, - bInForceLinearGamma); + CaptureRenderTarget->InitCustomFormat( + ImageWidth, + ImageHeight, + bEnable16BitFormat ? PF_FloatRGBA : PF_B8G8R8A8, + bInForceLinearGamma); if (bEnablePostProcessingEffects) { @@ -574,13 +582,19 @@ void ASceneCaptureSensor::BeginPlay() GetWorld(), FString("g.TimeoutForBlockOnRenderFence 300000")); - SceneCaptureSensor_local_ns::ConfigureShowFlags(CaptureComponent2D->ShowFlags, - bEnablePostProcessingEffects); + auto PostProcessConfig = FPostProcessConfig( + CaptureComponent2D->PostProcessSettings, + CaptureComponent2D->ShowFlags); + PostProcessConfig.UpdateFromSceneCaptureComponent2D(*CaptureComponent2D); + PostProcessConfig.EnablePostProcessingEffects(ArePostProcessingEffectsEnabled()); + UpdatePostProcessConfig(PostProcessConfig); + CaptureComponent2D->ShowFlags = PostProcessConfig.EngineShowFlags; + CaptureComponent2D->PostProcessSettings = PostProcessConfig.PostProcessSettings; // This ensures the camera is always spawning the raindrops in case the // weather was previously set to have rain. GetEpisode().GetWeather()->NotifyWeather(this); - + Super::BeginPlay(); } @@ -713,239 +727,41 @@ namespace SceneCaptureSensor_local_ns { { auto &PostProcessSettings = CaptureComponent2D.PostProcessSettings; - // Exposure - PostProcessSettings.bOverride_AutoExposureMethod = true; - PostProcessSettings.AutoExposureMethod = EAutoExposureMethod::AEM_Histogram; - PostProcessSettings.bOverride_AutoExposureBias = true; - PostProcessSettings.bOverride_AutoExposureMinBrightness = true; - PostProcessSettings.bOverride_AutoExposureMaxBrightness = true; - PostProcessSettings.bOverride_AutoExposureSpeedUp = true; - PostProcessSettings.bOverride_AutoExposureSpeedDown = true; - PostProcessSettings.bOverride_AutoExposureCalibrationConstant_DEPRECATED = true; - PostProcessSettings.bOverride_HistogramLogMin = true; - PostProcessSettings.HistogramLogMin = 1.0f; - PostProcessSettings.bOverride_HistogramLogMax = true; - PostProcessSettings.HistogramLogMax = 12.0f; - - // Camera - PostProcessSettings.bOverride_CameraShutterSpeed = true; - PostProcessSettings.bOverride_CameraISO = true; - PostProcessSettings.bOverride_DepthOfFieldFstop = true; - PostProcessSettings.bOverride_DepthOfFieldMinFstop = true; - PostProcessSettings.bOverride_DepthOfFieldBladeCount = true; - - // Film (Tonemapper) - PostProcessSettings.bOverride_FilmSlope = true; - PostProcessSettings.bOverride_FilmToe = true; - PostProcessSettings.bOverride_FilmShoulder = true; - PostProcessSettings.bOverride_FilmWhiteClip = true; - PostProcessSettings.bOverride_FilmBlackClip = true; - - // Motion blur - PostProcessSettings.bOverride_MotionBlurAmount = true; - PostProcessSettings.MotionBlurAmount = 0.45f; - PostProcessSettings.bOverride_MotionBlurMax = true; - PostProcessSettings.MotionBlurMax = 0.35f; - PostProcessSettings.bOverride_MotionBlurPerObjectSize = true; - PostProcessSettings.MotionBlurPerObjectSize = 0.1f; - - // Color Grading - PostProcessSettings.bOverride_WhiteTemp = true; - PostProcessSettings.bOverride_WhiteTint = true; - PostProcessSettings.bOverride_ColorContrast = true; -#if PLATFORM_LINUX - // Looks like Windows and Linux have different outputs with the - // same exposure compensation, this fixes it. - PostProcessSettings.ColorContrast = FVector4(1.2f, 1.2f, 1.2f, 1.0f); -#endif - - // Chromatic Aberration - PostProcessSettings.bOverride_SceneFringeIntensity = true; - PostProcessSettings.bOverride_ChromaticAberrationStartOffset = true; - - // Ambient Occlusion - PostProcessSettings.bOverride_AmbientOcclusionIntensity = true; - PostProcessSettings.AmbientOcclusionIntensity = 0.5f; - PostProcessSettings.bOverride_AmbientOcclusionRadius = true; - PostProcessSettings.AmbientOcclusionRadius = 100.0f; - PostProcessSettings.bOverride_AmbientOcclusionStaticFraction = true; - PostProcessSettings.AmbientOcclusionStaticFraction = 1.0f; - PostProcessSettings.bOverride_AmbientOcclusionFadeDistance = true; - PostProcessSettings.AmbientOcclusionFadeDistance = 50000.0f; - PostProcessSettings.bOverride_AmbientOcclusionPower = true; - PostProcessSettings.AmbientOcclusionPower = 2.0f; - PostProcessSettings.bOverride_AmbientOcclusionBias = true; - PostProcessSettings.AmbientOcclusionBias = 3.0f; - PostProcessSettings.bOverride_AmbientOcclusionQuality = true; - PostProcessSettings.AmbientOcclusionQuality = 100.0f; - - // Bloom - PostProcessSettings.bOverride_BloomMethod = true; - PostProcessSettings.BloomMethod = EBloomMethod::BM_SOG; - PostProcessSettings.bOverride_BloomIntensity = true; - PostProcessSettings.BloomIntensity = 0.675f; - PostProcessSettings.bOverride_BloomThreshold = true; - PostProcessSettings.BloomThreshold = -1.0f; - - // Lens - PostProcessSettings.bOverride_LensFlareIntensity = true; - PostProcessSettings.LensFlareIntensity = 0.1; + CaptureComponent2D.bUseRayTracingIfEnabled = true; + // Lumen + PostProcessSettings.bOverride_DynamicGlobalIlluminationMethod = true; + PostProcessSettings.DynamicGlobalIlluminationMethod = EDynamicGlobalIlluminationMethod::Lumen; + PostProcessSettings.bOverride_LumenSceneLightingQuality = true; + PostProcessSettings.LumenSceneLightingQuality = 1.0f; + PostProcessSettings.bOverride_LumenSceneDetail = true; + PostProcessSettings.LumenSceneDetail = 1.0f; + PostProcessSettings.bOverride_LumenSceneViewDistance = true; + PostProcessSettings.LumenSceneViewDistance = 20000.0f; + PostProcessSettings.bOverride_LumenFinalGatherQuality = true; + PostProcessSettings.LumenFinalGatherQuality = 1.0f; + PostProcessSettings.bOverride_LumenMaxTraceDistance = true; + PostProcessSettings.LumenMaxTraceDistance = 20000.0f; + PostProcessSettings.bOverride_LumenSurfaceCacheResolution = true; + PostProcessSettings.LumenSurfaceCacheResolution = 1.0f; + PostProcessSettings.bOverride_LumenSceneLightingUpdateSpeed = true; + PostProcessSettings.LumenSceneLightingUpdateSpeed = 1.0f; + PostProcessSettings.bOverride_LumenFinalGatherLightingUpdateSpeed = true; + PostProcessSettings.LumenFinalGatherLightingUpdateSpeed = 1.0f; + PostProcessSettings.bOverride_LumenDiffuseColorBoost = true; + PostProcessSettings.LumenDiffuseColorBoost = 1.0f; + PostProcessSettings.bOverride_LumenSkylightLeaking = true; + PostProcessSettings.LumenSkylightLeaking = 0.0f; + PostProcessSettings.bOverride_LumenFullSkylightLeakingDistance = true; + PostProcessSettings.LumenFullSkylightLeakingDistance = 1000.0f; + PostProcessSettings.bOverride_ReflectionMethod = true; + PostProcessSettings.ReflectionMethod = EReflectionMethod::Lumen; + PostProcessSettings.bOverride_LumenReflectionQuality = true; + PostProcessSettings.LumenReflectionQuality = 1.0f; + PostProcessSettings.bOverride_LumenRayLightingMode = true; + PostProcessSettings.LumenRayLightingMode = ELumenRayLightingModeOverride::Default; + PostProcessSettings.bOverride_LumenFrontLayerTranslucencyReflections = true; + PostProcessSettings.LumenFrontLayerTranslucencyReflections = false; + PostProcessSettings.bOverride_LumenMaxReflectionBounces = true; + PostProcessSettings.LumenMaxReflectionBounces = 1; } - - // Remove the show flags that might interfere with post-processing effects - // like depth and semantic segmentation. - static void ConfigureShowFlags(FEngineShowFlags &ShowFlags, bool bPostProcessing) - { - if (bPostProcessing) - { - ShowFlags.EnableAdvancedFeatures(); - ShowFlags.SetMotionBlur(true); - return; - } - - ShowFlags.SetAmbientOcclusion(false); - ShowFlags.SetAntiAliasing(false); - ShowFlags.SetVolumetricFog(false); - // ShowFlags.SetAtmosphericFog(false); - // ShowFlags.SetAudioRadius(false); - // ShowFlags.SetBillboardSprites(false); - ShowFlags.SetBloom(false); - // ShowFlags.SetBounds(false); - // ShowFlags.SetBrushes(false); - // ShowFlags.SetBSP(false); - // ShowFlags.SetBSPSplit(false); - // ShowFlags.SetBSPTriangles(false); - // ShowFlags.SetBuilderBrush(false); - // ShowFlags.SetCameraAspectRatioBars(false); - // ShowFlags.SetCameraFrustums(false); - ShowFlags.SetCameraImperfections(false); - ShowFlags.SetCameraInterpolation(false); - // ShowFlags.SetCameraSafeFrames(false); - // ShowFlags.SetCollision(false); - // ShowFlags.SetCollisionPawn(false); - // ShowFlags.SetCollisionVisibility(false); - ShowFlags.SetColorGrading(false); - // ShowFlags.SetCompositeEditorPrimitives(false); - // ShowFlags.SetConstraints(false); - // ShowFlags.SetCover(false); - // ShowFlags.SetDebugAI(false); - // ShowFlags.SetDecals(false); - // ShowFlags.SetDeferredLighting(false); - ShowFlags.SetDepthOfField(false); - ShowFlags.SetDiffuse(false); - ShowFlags.SetDirectionalLights(false); - ShowFlags.SetDirectLighting(false); - // ShowFlags.SetDistanceCulledPrimitives(false); - // ShowFlags.SetDistanceFieldAO(false); - // ShowFlags.SetDistanceFieldGI(false); - ShowFlags.SetDynamicShadows(false); - // ShowFlags.SetEditor(false); - ShowFlags.SetEyeAdaptation(false); - ShowFlags.SetFog(false); - // ShowFlags.SetGame(false); - // ShowFlags.SetGameplayDebug(false); - // ShowFlags.SetGBufferHints(false); - ShowFlags.SetGlobalIllumination(false); - ShowFlags.SetGrain(false); - // ShowFlags.SetGrid(false); - // ShowFlags.SetHighResScreenshotMask(false); - // ShowFlags.SetHitProxies(false); - ShowFlags.SetHLODColoration(false); - ShowFlags.SetHMDDistortion(false); - // ShowFlags.SetIndirectLightingCache(false); - // ShowFlags.SetInstancedFoliage(false); - // ShowFlags.SetInstancedGrass(false); - // ShowFlags.SetInstancedStaticMeshes(false); - // ShowFlags.SetLandscape(false); - // ShowFlags.SetLargeVertices(false); - ShowFlags.SetLensFlares(false); - ShowFlags.SetLevelColoration(false); - ShowFlags.SetLightComplexity(false); - ShowFlags.SetLightFunctions(false); - ShowFlags.SetLightInfluences(false); - ShowFlags.SetLighting(false); - ShowFlags.SetLightMapDensity(false); - ShowFlags.SetLightRadius(false); - ShowFlags.SetLightShafts(false); - // ShowFlags.SetLOD(false); - ShowFlags.SetLODColoration(false); - // ShowFlags.SetMaterials(false); - // ShowFlags.SetMaterialTextureScaleAccuracy(false); - // ShowFlags.SetMeshEdges(false); - // ShowFlags.SetMeshUVDensityAccuracy(false); - // ShowFlags.SetModeWidgets(false); - ShowFlags.SetMotionBlur(false); - // ShowFlags.SetNavigation(false); - ShowFlags.SetOnScreenDebug(false); - // ShowFlags.SetOutputMaterialTextureScales(false); - // ShowFlags.SetOverrideDiffuseAndSpecular(false); - // ShowFlags.SetPaper2DSprites(false); - ShowFlags.SetParticles(false); - // ShowFlags.SetPivot(false); - ShowFlags.SetPointLights(false); - // ShowFlags.SetPostProcessing(false); - // ShowFlags.SetPostProcessMaterial(false); - // ShowFlags.SetPrecomputedVisibility(false); - // ShowFlags.SetPrecomputedVisibilityCells(false); - // ShowFlags.SetPreviewShadowsIndicator(false); - // ShowFlags.SetPrimitiveDistanceAccuracy(false); - ShowFlags.SetPropertyColoration(false); - // ShowFlags.SetQuadOverdraw(false); - // ShowFlags.SetReflectionEnvironment(false); - // ShowFlags.SetReflectionOverride(false); - ShowFlags.SetRefraction(false); - // ShowFlags.SetRendering(false); - ShowFlags.SetSceneColorFringe(false); - // ShowFlags.SetScreenPercentage(false); - ShowFlags.SetScreenSpaceAO(false); - ShowFlags.SetScreenSpaceReflections(false); - // ShowFlags.SetSelection(false); - // ShowFlags.SetSelectionOutline(false); - // ShowFlags.SetSeparateTranslucency(false); - // ShowFlags.SetShaderComplexity(false); - // ShowFlags.SetShaderComplexityWithQuadOverdraw(false); - // ShowFlags.SetShadowFrustums(false); - // ShowFlags.SetSkeletalMeshes(false); - // ShowFlags.SetSkinCache(false); - ShowFlags.SetSkyLighting(false); - // ShowFlags.SetSnap(false); - // ShowFlags.SetSpecular(false); - // ShowFlags.SetSplines(false); - ShowFlags.SetSpotLights(false); - // ShowFlags.SetStaticMeshes(false); - ShowFlags.SetStationaryLightOverlap(false); - // ShowFlags.SetStereoRendering(false); - // ShowFlags.SetStreamingBounds(false); - ShowFlags.SetSubsurfaceScattering(false); - // ShowFlags.SetTemporalAA(false); - // ShowFlags.SetTessellation(false); - // ShowFlags.SetTestImage(false); - // ShowFlags.SetTextRender(false); - // ShowFlags.SetTexturedLightProfiles(false); - ShowFlags.SetTonemapper(false); - // ShowFlags.SetTranslucency(false); - // ShowFlags.SetVectorFields(false); - // ShowFlags.SetVertexColors(false); - // ShowFlags.SetVignette(false); - // ShowFlags.SetVisLog(false); - // ShowFlags.SetVisualizeAdaptiveDOF(false); - // ShowFlags.SetVisualizeBloom(false); - ShowFlags.SetVisualizeBuffer(false); - ShowFlags.SetVisualizeDistanceFieldAO(false); - ShowFlags.SetVisualizeDOF(false); - ShowFlags.SetVisualizeHDR(false); - ShowFlags.SetVisualizeLightCulling(false); - ShowFlags.SetVisualizeMeshDistanceFields(false); - ShowFlags.SetVisualizeMotionBlur(false); - ShowFlags.SetVisualizeOutOfBoundsPixels(false); - ShowFlags.SetVisualizeSenses(false); - ShowFlags.SetVisualizeShadingModels(false); - ShowFlags.SetVisualizeSSR(false); - ShowFlags.SetVisualizeSSS(false); - // ShowFlags.SetVolumeLightingSamples(false); - // ShowFlags.SetVolumes(false); - // ShowFlags.SetWidgetComponents(false); - // ShowFlags.SetWireframe(false); - } - } // namespace SceneCaptureSensor_local_ns diff --git a/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/SceneCaptureSensor.h b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/SceneCaptureSensor.h index 75060b3a1..f3d12a155 100644 --- a/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/SceneCaptureSensor.h +++ b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/SceneCaptureSensor.h @@ -10,6 +10,7 @@ #include "Carla/Sensor/Sensor.h" #include "Carla/Sensor/UE4_Overridden/SceneCaptureComponent2D_CARLA.h" #include "Carla/Sensor/ImageUtil.h" +#include "Carla/Sensor/PostProcessConfig.h" #include "Async/Async.h" @@ -115,9 +116,6 @@ struct FCameraGBufferFloat - - - /// Base class for sensors using a USceneCaptureComponent2D for rendering the /// scene. This class does not capture data, use /// `FPixelReader::SendPixelsInRenderThread(*this)` in derived classes. @@ -369,6 +367,9 @@ public: UFUNCTION(BlueprintCallable) float GetChromAberrOffset() const; + virtual void UpdatePostProcessConfig( + FPostProcessConfig& InOutPostProcessConfig); + /// Use for debugging purposes only. UFUNCTION(BlueprintCallable) bool ReadPixels(TArray &BitMap) const @@ -443,11 +444,11 @@ protected: virtual void SetUpSceneCaptureComponent(USceneCaptureComponent2D &SceneCapture) {} /// Render target necessary for scene capture. - UPROPERTY(EditAnywhere) + UPROPERTY(VisibleAnywhere) UTextureRenderTarget2D *CaptureRenderTarget = nullptr; /// Scene capture component. - UPROPERTY(EditAnywhere) + UPROPERTY(VisibleAnywhere) USceneCaptureComponent2D_CARLA *CaptureComponent2D = nullptr; UPROPERTY(EditAnywhere) diff --git a/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/ShaderBasedSensor.cpp b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/ShaderBasedSensor.cpp index b5a29d20b..3c8627e83 100644 --- a/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/ShaderBasedSensor.cpp +++ b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/ShaderBasedSensor.cpp @@ -11,6 +11,12 @@ #include "Components/SceneCaptureComponent2D.h" #include "Actor/ActorBlueprintFunctionLibrary.h" +AShaderBasedSensor::AShaderBasedSensor(const FObjectInitializer& ObjectInitializer) +: Super(ObjectInitializer) +{ + EnablePostProcessingEffects(false); +} + bool AShaderBasedSensor::AddPostProcessingMaterial(const FString &Path) { ConstructorHelpers::FObjectFinder Loader(*Path); diff --git a/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/ShaderBasedSensor.h b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/ShaderBasedSensor.h index b2d6d9d6d..c839f3493 100644 --- a/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/ShaderBasedSensor.h +++ b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Sensor/ShaderBasedSensor.h @@ -51,11 +51,7 @@ class CARLA_API AShaderBasedSensor : public ASceneCaptureSensor public: - AShaderBasedSensor(const FObjectInitializer &ObjectInitializer) - : Super(ObjectInitializer) - { - EnablePostProcessingEffects(false); - } + AShaderBasedSensor(const FObjectInitializer &ObjectInitializer); void Set(const FActorDescription &ActorDescription) override; diff --git a/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Weather/Sky.cpp b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Weather/Sky.cpp new file mode 100644 index 000000000..0614d7a87 --- /dev/null +++ b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Weather/Sky.cpp @@ -0,0 +1,29 @@ +#include "Sky.h" +#include "Components/PostProcessComponent.h" +#include "Components/ExponentialHeightFogComponent.h" +#include "Components/DirectionalLightComponent.h" +#include "Components/DirectionalLightComponent.h" +#include "Components/SkyLightComponent.h" +#include "Components/VolumetricCloudComponent.h" +#include "Components/SkyAtmosphereComponent.h" + + +ASkyBase::ASkyBase( + const FObjectInitializer& ObjectInitializer) : + Super(ObjectInitializer), + PostProcessComponent(nullptr), + ExponentialHeightFogComponent(nullptr), + DirectionalLightComponentSun(nullptr), + DirectionalLightComponentMoon(nullptr), + SkyLightComponent(nullptr), + VolumetricCloudComponent(nullptr), + SkyAtmosphereComponent(nullptr) +{ + PostProcessComponent = CreateDefaultSubobject("PostProcessComponent"); + ExponentialHeightFogComponent = CreateDefaultSubobject("ExponentialHeightFogComponent"); + DirectionalLightComponentSun = CreateDefaultSubobject("DirectionalLightComponentSun"); + DirectionalLightComponentMoon = CreateDefaultSubobject("DirectionalLightComponentMoon"); + SkyLightComponent = CreateDefaultSubobject("SkyLightComponent"); + VolumetricCloudComponent = CreateDefaultSubobject("VolumetricCloudComponent"); + SkyAtmosphereComponent = CreateDefaultSubobject("SkyAtmosphereComponent"); +} diff --git a/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Weather/Sky.h b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Weather/Sky.h new file mode 100644 index 000000000..4766f8f61 --- /dev/null +++ b/Unreal/CarlaUnreal/Plugins/Carla/Source/Carla/Weather/Sky.h @@ -0,0 +1,46 @@ +#pragma once +#include "GameFramework/Actor.h" +#include "Sky.generated.h" + +class UPostProcessComponent; +class UExponentialHeightFogComponent; +class UDirectionalLightComponent; +class USkyLightComponent; +class UVolumetricCloudComponent; +class USkyAtmosphereComponent; + +UCLASS(Abstract) +class CARLA_API ASkyBase : + public AActor +{ + GENERATED_BODY() + +public: + + ASkyBase(const FObjectInitializer& ObjectInitializer); + +protected: + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Components") + UPostProcessComponent* PostProcessComponent; + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Components") + UExponentialHeightFogComponent* ExponentialHeightFogComponent; + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Components") + UDirectionalLightComponent* DirectionalLightComponentSun; + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Components") + UDirectionalLightComponent* DirectionalLightComponentMoon; + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Components") + USkyLightComponent* SkyLightComponent; + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Components") + UVolumetricCloudComponent* VolumetricCloudComponent; + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Components") + USkyAtmosphereComponent* SkyAtmosphereComponent; + + +};