Files
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

362 lines
14 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Components/SceneComponent.h"
#include "Materials/MaterialInstanceDynamic.h"
#include "Components/IDisplayClusterComponent.h"
#include "Render/DisplayDevice/Containers/DisplayClusterDisplayDevice_Enums.h"
#include "Render/Viewport/Containers/DisplayClusterViewport_Enums.h"
#include "DisplayClusterCameraComponent.generated.h"
class UMaterial;
class UMaterialInstanceDynamic;
class UMeshComponent;
class UBillboardComponent;
class UTexture2D;
class IDisplayClusterViewportManager;
class IDisplayClusterWarpPolicy;
class IDisplayClusterViewportConfiguration;
class IDisplayClusterViewportPreview;
class IDisplayClusterViewport;
class UCameraComponent;
class ACineCameraActor;
struct FMinimalViewInfo;
UENUM()
enum class EDisplayClusterEyeStereoOffset : uint8
{
None UMETA(DisplayName = "Default"),
Left UMETA(DisplayName = "Left Eye"),
Right UMETA(DisplayName = "Right Eye"),
};
/** The type of camera used. */
UENUM()
enum class EDisplayClusterTargetCameraType: int32
{
// No camera used
None UMETA(DisplayName = "Disabled"),
// Use active engine camera
ActiveEngineCamera UMETA(DisplayName = "Active Engine Camera"),
// Use camera component from the root actor
ICVFXCameraComponent UMETA(DisplayName = "ICVFX Camera"),
// Use the CineCamera actor reference.
ExternalCineCameraActor UMETA(DisplayName = "Camera Actor"),
};
/**
* 3D point in space used to render nDisplay viewports from
*/
UCLASS(ClassGroup = (DisplayCluster), HideCategories = (Navigation, AssetUserData, LOD, Physics, Cooking, Activation, Tags, Gizmo, Collision, ComponentReplication, Events, Sockets, ComponentTick, Rendering), meta = (BlueprintSpawnableComponent, DisplayName = "NDisplay View Point"))
class DISPLAYCLUSTER_API UDisplayClusterCameraComponent
: public USceneComponent
, public IDisplayClusterComponent
{
GENERATED_BODY()
public:
UDisplayClusterCameraComponent(const FObjectInitializer& ObjectInitializer);
/** Return ViewPoint for this component
* If the component logic supports postprocess, it will also be in the ViewInfo structure.
*
* @param InOutViewInfo - ViewInfo data
* @param OutCustomNearClippingPlane - Custom NCP, or a value less than zero if not defined.
*/
UE_DEPRECATED(5.4, "This function has been deprecated. Please use 'GetDesiredView()'.")
virtual void GetDesiredView(FMinimalViewInfo& InOutViewInfo, float* OutCustomNearClippingPlane = nullptr)
{ }
/** Return ViewPoint for this component
* If the component logic supports postprocess, it will also be in the ViewInfo structure.
*
* @param InOutViewInfo - ViewInfo data
* @param OutCustomNearClippingPlane - Custom NCP, or a value less than zero if not defined.
*/
virtual void GetDesiredView(const IDisplayClusterViewportConfiguration& InViewportConfiguration, FMinimalViewInfo& InOutViewInfo, float* OutCustomNearClippingPlane = nullptr) const;
/** Returns the position of the observer's eyes in the Stage. */
virtual void GetEyePosition(const IDisplayClusterViewportConfiguration& InViewportConfiguration, FVector& OutViewLocation, FRotator& OutViewRotation);
/**
* All cluster viewports that reference this component will be created in the background on the current cluster node if the function returns true.
*/
virtual bool ShouldUseEntireClusterViewports(IDisplayClusterViewportManager* InViewportManager) const
{
return false;
}
/**
* Get the warp policy instance used by this compoenent.
* From the DC ViewportManager, these policies will be assigned to the viewports that use this viewpoint component.
*/
virtual IDisplayClusterWarpPolicy* GetWarpPolicy(IDisplayClusterViewportManager* InViewportManager)
{
return nullptr;
}
/** Override DisplayDevice material by type for
* The UDisplayClusterInFrustumFitCameraComponent uses its own material to display additional deformed preview meshes in front of the camera.
*
* @param InMeshType - mesh type
* @param InMaterialType - the type of material being requested
*
* @return nullptr if DisplayDevice material is used.
*/
virtual TObjectPtr<UMaterial> GetDisplayDeviceMaterial(const EDisplayClusterDisplayDeviceMeshType InMeshType, const EDisplayClusterDisplayDeviceMaterialType InMaterialType) const
{
return nullptr;
}
/** Perform any operations on the mesh and material instance, such as setting parameter values.
*
* @param InViewport - current viewport
* @param InMeshType - mesh type
* @param InMaterialType - type of material being requested
* @param InMeshComponent - mesh component to be updated
* @param InMeshMaterialInstance - material instance that used on this mesh
*/
virtual void OnUpdateDisplayDeviceMeshAndMaterialInstance(IDisplayClusterViewportPreview& InViewportPreview, const EDisplayClusterDisplayDeviceMeshType InMeshType, const EDisplayClusterDisplayDeviceMaterialType InMaterialType, UMeshComponent* InMeshComponent, UMaterialInstanceDynamic* InMeshMaterialInstance) const
{ }
/** Apply the ViewPoint component's post-processes to the viewport.
* (Outer viewport camera)
*
* @param InViewport - viewport to be configured.
*/
virtual void ApplyViewPointComponentPostProcessesToViewport(IDisplayClusterViewport* InViewport);
/** Return a reference to the Camera component, which is used for Outer viewports.
*
* return nullptr if the camera is not in use.
*/
virtual UCameraComponent* GetTargetCameraComponent(const IDisplayClusterViewportConfiguration& InViewportConfiguration) const;
/** Returns true if the given viewpoint position should be used as a camera position. */
virtual bool IsViewPointOverrideCameraPosition() const;
/** Returns true if the eye position (ViewPoint) inside the DCRa can be overriden. */
virtual bool CanOverrideEyePosition() const;
/** Returns true if ViewPoint should use the camera position instead of the DCRA position when transforming. */
virtual bool ShouldFollowCameraLocation() const;
protected:
/** Get view from the referenced camera. */
virtual bool GetTargetCameraDesiredViewInternal(const IDisplayClusterViewportConfiguration& InViewportConfiguration, FMinimalViewInfo& InOutViewInfo, float* OutCustomNearClippingPlane = nullptr) const;
#if WITH_EDITOR
virtual bool GetEditorPreviewInfo(float DeltaTime, FMinimalViewInfo& ViewOut) override;
virtual TSharedPtr<SWidget> GetCustomEditorPreviewWidget() override;
#endif
public:
/**
* Get interpupillary distance
*
* @return - Interpupillary distance
*/
UFUNCTION(BlueprintCallable, Category = "Stereo")
float GetInterpupillaryDistance() const
{
return InterpupillaryDistance;
}
/**
* Set interpupillary distance
*
* @param Distance - New interpupillary distance
*/
UFUNCTION(BlueprintCallable, Category = "Stereo")
void SetInterpupillaryDistance(float Distance)
{
InterpupillaryDistance = Distance;
}
/**
* Get swap eyes state
*
* @return - Eyes swap state. False - normal eyes left|right, true - swapped eyes right|left
*/
UFUNCTION(BlueprintCallable, Category = "Stereo")
bool GetSwapEyes() const
{
return bSwapEyes;
}
/**
* Set swap eyes state
*
* @param SwapEyes - New eyes swap state. False - normal eyes left|right, true - swapped eyes right|left
*/
UFUNCTION(BlueprintCallable, Category = "Stereo")
void SetSwapEyes(bool SwapEyes)
{
bSwapEyes = SwapEyes;
}
/**
* Toggles eyes swap state
*
* @return - New eyes swap state. False - normal eyes left|right, true - swapped eyes right|left
*/
UFUNCTION(BlueprintCallable, Category = "Stereo")
bool ToggleSwapEyes()
{
return (bSwapEyes = !bSwapEyes);
}
/**
* Get stereo offset type
*
* @return - Current forced stereo offset type
*/
UFUNCTION(BlueprintCallable, Category = "Stereo")
EDisplayClusterEyeStereoOffset GetStereoOffset() const
{
return StereoOffset;
}
/**
* Set stereo offset type
*
* @param StereoOffset - New forced stereo offset type
*/
UFUNCTION(BlueprintCallable, Category = "Stereo")
void SetStereoOffset(EDisplayClusterEyeStereoOffset InStereoOffset)
{
StereoOffset = InStereoOffset;
}
public:
/** Decodes parameters into flags. */
EDisplayClusterViewportCameraPostProcessFlags GetCameraPostProcessFlags() const;
/** Returns the camera component from the 'ExternalCameraActor' parameter. */
virtual UCameraComponent* GetExternalCineCameraActorComponent() const;
protected:
/** Returns true if active engine camera is used. */
virtual bool IsActiveEngineCameraBeingUsed() const;
/** Returns true if the `ICVFXCameraComponentName` parameter is used. */
virtual bool IsICVFXCameraBeingUsed() const;
/** Returns true if the `ExternalCineCameraActor` parameter is used. */
virtual bool IsExternalCameraBeingUsed() const;
#if WITH_EDITOR
/** Return used camera component. */
virtual UCameraComponent* GetEditorPreviewCameraComponent();
#endif
public:
#if WITH_EDITOR
// Begin IDisplayClusterComponent
virtual void SetVisualizationScale(float Scale) override;
virtual void SetVisualizationEnabled(bool bEnabled) override;
// End IDisplayClusterComponent
#endif
// Begin UActorComponent
virtual void OnRegister() override;
// End UActorComponent
// Begin UObject
#if WITH_EDITOR
virtual bool CanEditChange(const FProperty* InProperty) const override;
virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;
#endif
// End UObject
protected:
#if WITH_EDITOR
/** Refreshes the visual components to match the component state */
virtual void RefreshVisualRepresentation();
#endif
#if WITH_EDITORONLY_DATA
protected:
/** Gizmo visibility */
UPROPERTY(EditAnywhere, Category = "Gizmo")
uint8 bEnableGizmo : 1;
/** Base gizmo scale */
UPROPERTY(EditAnywhere, Category = "Gizmo")
FVector BaseGizmoScale;
/** Gizmo scale multiplier */
UPROPERTY(EditAnywhere, Category = "Gizmo", meta = (UIMin = "0", UIMax = "2.0", ClampMin = "0.01", ClampMax = "10.0"))
float GizmoScaleMultiplier;
UPROPERTY(Transient)
TObjectPtr<UBillboardComponent> SpriteComponent;
UPROPERTY()
TObjectPtr<UTexture2D> SpriteTexture;
#endif
public:
/** Type of source camera used. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera Settings", meta = (DisplayName = "Source Camera"))
EDisplayClusterTargetCameraType TargetCameraType = EDisplayClusterTargetCameraType::None;
/** The name of the camera component that is used as the PP source. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera Settings", meta = (DisplayName = "ICVFX Camera", EditCondition = "TargetCameraType==EDisplayClusterTargetCameraType::ICVFXCameraComponent", EditConditionHides))
FString ICVFXCameraComponentName;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera Settings", meta = (DisplayName = "Follow ICVFX Camera", EditCondition = "TargetCameraType==EDisplayClusterTargetCameraType::ICVFXCameraComponent", EditConditionHides))
uint8 bUseICVFXCameraComponentTracking: 1 = 1;
/** Use camera position for rendering instead of RootActor. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera Settings", meta = (DisplayName = "Follow Camera", EditCondition = "TargetCameraType!=EDisplayClusterTargetCameraType::ICVFXCameraComponent && TargetCameraType!=EDisplayClusterTargetCameraType::None", EditConditionHides))
uint8 bFollowCameraPosition : 1 = 0;
/** Use a specific actor camera instead of a game camera. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera Settings", meta = (DisplayName = "Camera Actor", EditCondition = "TargetCameraType==EDisplayClusterTargetCameraType::ExternalCineCameraActor", EditConditionHides))
TSoftObjectPtr<ACineCameraActor> ExternalCineCameraActor;
public:
/** Use the PP settings from the specified camera. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera Settings", meta = (DisplayName = "Include Post Process Settings", EditCondition = "TargetCameraType!=EDisplayClusterTargetCameraType::None", EditConditionHides))
uint8 bEnablePostProcess : 1 = 1;
/** Use the NearClippingPlane value from the specified cine camera. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera Settings", meta = (DisplayName = "Include Custom Near Clipping Plane", EditCondition = "TargetCameraType!=EDisplayClusterTargetCameraType::None && TargetCameraType!=EDisplayClusterTargetCameraType::ICVFXCameraComponent", EditConditionHides))
uint8 bEnableNearClippingPlane : 1 = 1;
/** Enable the DoF PP settings from the specified camera. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera Settings", meta = (DisplayName = "Include Depth Of Field", EditCondition = "TargetCameraType!=EDisplayClusterTargetCameraType::None && TargetCameraType!=EDisplayClusterTargetCameraType::ICVFXCameraComponent", EditConditionHides))
uint8 bEnableDepthOfField : 1 = 1;
/** Use the DC Depth-Of-Field settings from the specified ICVFX camera. */
UPROPERTY(BlueprintReadWrite, Category = "Camera Settings", meta = (DisplayName = "Include Inner Frustum Depth Of Field Compensation", EditCondition = "TargetCameraType==EDisplayClusterTargetCameraType::ICVFXCameraComponent", EditConditionHides))
uint8 bEnableICVFXDepthOfFieldCompensation : 1 = 1;
/** Use the DC ColorGrading from the specified ICVFX camera. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera Settings", meta = (DisplayName = "Include Inner Frustum Color Grading", EditCondition = "TargetCameraType==EDisplayClusterTargetCameraType::ICVFXCameraComponent", EditConditionHides))
uint8 bEnableICVFXColorGrading : 1 = 1;
/** Use the DC Motion Blur settings from the specified ICVFX camera. */
UPROPERTY(BlueprintReadWrite, Category = "Camera Settings", meta = (DisplayName = "Include Inner Frustum Motion Blur", EditCondition = "TargetCameraType==EDisplayClusterTargetCameraType::ICVFXCameraComponent", EditConditionHides))
uint8 bEnableICVFXMotionBlur : 1 = 1;
private:
UPROPERTY(EditAnywhere, Category = "Stereo")
float InterpupillaryDistance;
UPROPERTY(EditAnywhere, Category = "Stereo")
bool bSwapEyes;
UPROPERTY(EditAnywhere, Category = "Stereo")
EDisplayClusterEyeStereoOffset StereoOffset;
};