// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "CineCameraActor.h" #include "CineCameraComponent.h" #include "DisplayClusterConfigurationTypes_ICVFX.h" #include "DisplayClusterEditorPropertyReference.h" #include "Render/Viewport/Containers/DisplayClusterViewport_Enums.h" #include "Render/Viewport/Containers/DisplayClusterViewport_CameraMotionBlur.h" #include "ShaderParameters/DisplayClusterShaderParameters_ICVFX.h" #include "DisplayClusterICVFXCameraComponent.generated.h" struct FMinimalViewInfo; class SWidget; class UCameraComponent; class IDisplayClusterViewport; /** * nDisplay in-camera VFX camera representation */ UCLASS(ClassGroup = (DisplayCluster), HideCategories = (AssetUserData, Collision, Cooking, ComponentReplication, Events, Physics, Sockets, Activation, Tags, ComponentTick), meta = (BlueprintSpawnableComponent, DisplayName="ICVFX Camera")) class DISPLAYCLUSTER_API UDisplayClusterICVFXCameraComponent : public UCineCameraComponent { GENERATED_BODY() public: UDisplayClusterICVFXCameraComponent(const FObjectInitializer& ObjectInitializer); virtual void Serialize(FArchive& Ar) override; virtual void PostLoad() override; virtual void PostApplyToComponent() override; public: UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = NDisplay) FDisplayClusterConfigurationICVFX_CameraSettings CameraSettings; #if WITH_EDITOR virtual bool GetEditorPreviewInfo(float DeltaTime, FMinimalViewInfo& ViewOut) override; virtual TSharedPtr GetCustomEditorPreviewWidget() override; #endif virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; /** The ICVFXCamera component uses its own PostProcess and applies it to the viewport. * * @param InViewport - a viewport that need to be configured with a PP settings. * @param InPostProcessFlags - Define the PostProcess set that will be used */ virtual void ApplyICVFXCameraPostProcessesToViewport(IDisplayClusterViewport* InDestViewport, const EDisplayClusterViewportCameraPostProcessFlags InPostProcessingFlags); public: UE_DEPRECATED(5.5, "This function has been deprecated. Please use 'FDisplayClusterViewportConfigurationHelpers_Postprocess::GetICVFXCameraMotionBlurParameters()'.") FDisplayClusterViewport_CameraMotionBlur GetMotionBlurParameters() { return FDisplayClusterViewport_CameraMotionBlur(); } /** * Return the actual source camera, e.g. the camera component of the referenced cine camera. * Use GetCameraView() function to get viewinfo with actual camera position, postprocess and ICVFX postprocess */ UFUNCTION(BlueprintCallable, BlueprintPure, Category = "ICVFX Camera") UCineCameraComponent* GetActualCineCameraComponent(); /** Returns true if this camera is active in the current node. */ UFUNCTION(BlueprintCallable, BlueprintPure, Category = "ICVFX Camera") bool IsICVFXEnabled() const; // Return unique camera name FString GetCameraUniqueId() const; const FDisplayClusterConfigurationICVFX_CameraSettings& GetCameraSettingsICVFX() const; /** Obtaining view information for the actual camera, such as the camera component to which the cine-camera is referencing. * The data from the CameraSettings variable is used in postprocess settings (EnableCameraPP, OverrideMotionBlur, etc.). */ virtual void GetCameraView(float DeltaTime, FMinimalViewInfo& InOutViewInfo) override; // UActorComponent interface virtual void OnRegister() override; /** Sets new depth of field parameters and updates the dynamically generated compensation LUT if needed */ UFUNCTION(BlueprintCallable, Category = "ICVFX Camera") void SetDepthOfFieldParameters(const FDisplayClusterConfigurationICVFX_CameraDepthOfField& NewDepthOfFieldParams); /** Get ICVFX camera frame resolution. */ FIntPoint GetICVFXCameraFrameSize(const FDisplayClusterConfigurationICVFX_StageSettings& InStageSettings, const FDisplayClusterConfigurationICVFX_CameraSettings& InCameraSettings); /** Get ICVFX camera shader parameters. */ FDisplayClusterShaderParameters_ICVFX::FCameraSettings GetICVFXCameraShaderParameters(const FDisplayClusterConfigurationICVFX_StageSettings& InStageSettings, const FDisplayClusterConfigurationICVFX_CameraSettings& InCameraSettings); private: void UpdateOverscanEstimatedFrameSize(); ////////////////////////////////////////////////////////////////////////////////////////////// // Details Panel Property Referencers ////////////////////////////////////////////////////////////////////////////////////////////// #if WITH_EDITORONLY_DATA public: // update the status of the Editor's ICVFX preview elements void UpdateICVFXPreviewState(); // saves the value of external camera reference TSoftObjectPtr ExternalCameraCachedValue; virtual void PreEditChange(FProperty* PropertyThatWillChange) override; virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override; private: friend class FDisplayClusterICVFXCameraComponentDetailsCustomization; UPROPERTY(EditAnywhere, Transient, Category = "Inner Frustum", meta = (PropertyPath = "CameraSettings.bEnable")) FDisplayClusterEditorPropertyReference IsEnabledRef; UPROPERTY(EditAnywhere, Transient, Category = "Inner Frustum", meta = (PropertyPath = "CameraSettings.HiddenICVFXViewports")) FDisplayClusterEditorPropertyReference HiddenICVFXViewportsRef; UPROPERTY(EditAnywhere, Transient, Category = "Inner Frustum", meta = (PropertyPath = "CameraSettings.UpscalerSettings")) FDisplayClusterEditorPropertyReference UpscalerSettingsRef; UPROPERTY(EditAnywhere, Transient, Category = "Inner Frustum", meta = (PropertyPath = "CameraSettings.BufferRatio")) FDisplayClusterEditorPropertyReference BufferRatioRef; UPROPERTY(EditAnywhere, Transient, Category = "Inner Frustum", meta = (DisplayName = "Inner Frustum Overscan", PropertyPath = "CameraSettings.CustomFrustum")) FDisplayClusterEditorPropertyReference CustomFrustumRef; UPROPERTY(EditAnywhere, Transient, Category = "Inner Frustum", meta = (PropertyPath = "CameraSettings.SoftEdge")) FDisplayClusterEditorPropertyReference SoftEdgeRef; UPROPERTY(EditAnywhere, Transient, Category = "Inner Frustum", meta = (PropertyPath = "CameraSettings.Border")) FDisplayClusterEditorPropertyReference BorderRef; UPROPERTY(EditAnywhere, Transient, Category = "Inner Frustum", meta = (PropertyPath = "CameraSettings.FrustumRotation")) FDisplayClusterEditorPropertyReference FrustumRotationRef; UPROPERTY(EditAnywhere, Transient, Category = "Inner Frustum", meta = (PropertyPath = "CameraSettings.FrustumOffset")) FDisplayClusterEditorPropertyReference FrustumOffsetRef; UPROPERTY(EditAnywhere, Transient, Category = "Inner Frustum", meta = (PropertyPath = "CameraSettings.OffCenterprojectionoffset")) FDisplayClusterEditorPropertyReference OffCenterProjectionOffsetRef; UPROPERTY(EditAnywhere, Transient, Category = "Inner Frustum", meta = (PropertyPath = "CameraSettings.RenderSettings.GenerateMips")) FDisplayClusterEditorPropertyReference GenerateMipsRef; UPROPERTY(EditAnywhere, Transient, Category = "Camera ICVFX", meta = (PropertyPath = "CameraSettings.ExternalCameraActor")) FDisplayClusterEditorPropertyReference ExternalCameraActorRef; /** Exposed reference to the camera's inner depth of field settings */ UPROPERTY(EditAnywhere, Transient, Category = "Camera ICVFX", meta = (PropertyPath = "CameraSettings.CameraDepthOfField", DisplayName = "ICVFX Depth of Field")) FDisplayClusterEditorPropertyReference CameraDepthOfFieldRef; UPROPERTY(EditAnywhere, Transient, Category = "Camera ICVFX", meta = (PropertyPath = "CameraSettings.CameraMotionBlur", DisplayName = "ICVFX Camera Motion Blur")) FDisplayClusterEditorPropertyReference CameraMotionBlurRef; UPROPERTY(EditAnywhere, Transient, Category = "Inner Frustum", meta = (PropertyPath = "CameraSettings.CameraHideList")) FDisplayClusterEditorPropertyReference CameraHideListRef; UPROPERTY(EditAnywhere, Transient, Category = Chromakey, meta = (PropertyPath = "CameraSettings.Chromakey.bEnable")) FDisplayClusterEditorPropertyReference ChromaKeyEnabledRef; UPROPERTY(EditAnywhere, Transient, Category = Chromakey, meta = (PropertyPath = "CameraSettings.Chromakey.ChromakeyType")) FDisplayClusterEditorPropertyReference ChromakeyTypeRef; UPROPERTY(EditAnywhere, Transient, Category = Chromakey, meta = (PropertyPath = "CameraSettings.Chromakey.ChromakeySettingsSource")) FDisplayClusterEditorPropertyReference ChromakeySettingsSourceRef; UPROPERTY(EditAnywhere, Transient, Category = Chromakey, meta = (PropertyPath = "CameraSettings.Chromakey.ChromakeyColor")) FDisplayClusterEditorPropertyReference ChromakeyColorRef; UPROPERTY(EditAnywhere, Transient, Category = Chromakey, meta = (PropertyPath = "CameraSettings.Chromakey.ChromakeyMarkers")) FDisplayClusterEditorPropertyReference ChromakeyMarkersRef; UPROPERTY(EditAnywhere, Transient, Category = Chromakey, meta = (PropertyPath = "CameraSettings.Chromakey.ChromakeyRenderTexture")) FDisplayClusterEditorPropertyReference ChromakeyRenderTextureRef; UPROPERTY(EditAnywhere, Transient, Category = OCIO, meta = (PropertyPath = "CameraSettings.CameraOCIO.AllNodesOCIOConfiguration.bIsEnabled", DisplayName = "Enable Inner Frustum OCIO")) FDisplayClusterEditorPropertyReference EnableInnerFrustuOCIORef; UPROPERTY(EditAnywhere, Transient, Category = OCIO, meta = (PropertyPath = "CameraSettings.CameraOCIO.AllNodesOCIOConfiguration.ColorConfiguration", DisplayName = "All Nodes Color Configuration")) FDisplayClusterEditorPropertyReference AllNodesOCIOConfigurationRef; UPROPERTY(EditAnywhere, Transient, Category = OCIO, meta = (PropertyPath = "CameraSettings.CameraOCIO.PerNodeOCIOProfiles", DisplayName = "Per-Node OCIO Overrides")) FDisplayClusterEditorPropertyReference PerNodeOCIOProfilesRef; UPROPERTY(EditAnywhere, Transient, Category = "Inner Frustum Color Grading", meta = (PropertyPath = "CameraSettings.EnableInnerFrustumColorGrading", DisplayName = "Enable Inner Frustum Color Grading")) FDisplayClusterEditorPropertyReference EnableInnerFrustumColorGrading; UPROPERTY(EditAnywhere, Transient, Category = "Inner Frustum Color Grading", meta = (PropertyPath = "CameraSettings.AllNodesColorGrading", DisplayName = "All Nodes")) FDisplayClusterEditorPropertyReference AllNodesColorGradingRef; UPROPERTY(EditAnywhere, Transient, Category = "Inner Frustum Color Grading", meta = (PropertyPath = "CameraSettings.PerNodeColorGrading")) FDisplayClusterEditorPropertyReference PerNodeColorGradingRef; UPROPERTY(EditAnywhere, Transient, Category = "Texture Replacement", meta = (PropertyPath = "CameraSettings.RenderSettings.Replace.bAllowReplace", DisplayName = "Enable Inner Frustum Texture Replacement", ToolTip = "Set to True to replace the entire inner frustum with the specified texture.")) FDisplayClusterEditorPropertyReference TextureReplacementEnabledRef; UPROPERTY(EditAnywhere, Transient, Category = "Texture Replacement", meta = (PropertyPath = "CameraSettings.RenderSettings.Replace.SourceTexture")) FDisplayClusterEditorPropertyReference SourceTextureRef; UPROPERTY(EditAnywhere, Transient, Category = "Texture Replacement", meta = (PropertyPath = "CameraSettings.RenderSettings.Replace.bShouldUseTextureRegion")) FDisplayClusterEditorPropertyReference ShouldUseTextureRegionRef; UPROPERTY(EditAnywhere, Transient, Category = "Texture Replacement", meta = (PropertyPath = "CameraSettings.RenderSettings.Replace.TextureRegion")) FDisplayClusterEditorPropertyReference TextureRegionRef; UPROPERTY(EditDefaultsOnly, Transient, Category = "Media", meta = (PropertyPath = "CameraSettings.RenderSettings.Media")) FDisplayClusterEditorPropertyReference MediaRef; UPROPERTY(EditAnywhere, Transient, Category = Configuration, meta = (PropertyPath = "CameraSettings.RenderSettings.RenderOrder")) FDisplayClusterEditorPropertyReference RenderOrderRef; UPROPERTY(EditAnywhere, Transient, Category = Configuration, meta = (PropertyPath = "CameraSettings.RenderSettings.CustomFrameSize")) FDisplayClusterEditorPropertyReference CustomFrameSizeRef; UPROPERTY(EditAnywhere, Transient, Category = Configuration, meta = (PropertyPath = "CameraSettings.RenderSettings.AdvancedRenderSettings.RenderTargetRatio")) FDisplayClusterEditorPropertyReference RenderTargetRatioRef; UPROPERTY(EditAnywhere, Transient, Category = Configuration, meta = (PropertyPath = "CameraSettings.RenderSettings.AdvancedRenderSettings.GPUIndex")) FDisplayClusterEditorPropertyReference GPUIndexRef; UPROPERTY(EditAnywhere, Transient, Category = Configuration, meta = (PropertyPath = "CameraSettings.RenderSettings.AdvancedRenderSettings.StereoGPUIndex")) FDisplayClusterEditorPropertyReference StereoGPUIndexRef; UPROPERTY(EditAnywhere, Transient, Category = Configuration, meta = (PropertyPath = "CameraSettings.RenderSettings.AdvancedRenderSettings.StereoMode")) FDisplayClusterEditorPropertyReference StereoModeRef; #endif // WITH_EDITORONLY_DATA };