165 lines
4.9 KiB
C
165 lines
4.9 KiB
C
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include "StereoLayerShapes.h"
|
||
|
#include "OculusXRPassthroughMesh.h"
|
||
|
#include "Misc/EngineVersionComparison.h"
|
||
|
#include "OculusXRPassthroughLayerShapes.generated.h"
|
||
|
|
||
|
UENUM()
|
||
|
enum EOculusXRColorMapType
|
||
|
{
|
||
|
/** None*/
|
||
|
ColorMapType_None = 0 UMETA(DisplayName = "None"),
|
||
|
|
||
|
/** Grayscale to color */
|
||
|
ColorMapType_GrayscaleToColor = 1 UMETA(DisplayName = "Grayscale To Color"),
|
||
|
|
||
|
/** Grayscale */
|
||
|
ColorMapType_Grayscale = 2 UMETA(DisplayName = "Grayscale"),
|
||
|
|
||
|
/** Color Adjustment */
|
||
|
ColorMapType_ColorAdjustment = 3 UMETA(DisplayName = "Color Adjustment"),
|
||
|
|
||
|
/** Color LUT */
|
||
|
ColorMapType_ColorLut = 4 UMETA(DisplayName = "Color LUT"),
|
||
|
|
||
|
/** Interpolated Color LUT */
|
||
|
ColorMapType_ColorLut_Interpolated = 5 UMETA(DisplayName = "Interpolated Color LUT"),
|
||
|
|
||
|
ColorMapType_MAX = 255,
|
||
|
};
|
||
|
|
||
|
UENUM()
|
||
|
enum EOculusXRPassthroughLayerOrder
|
||
|
{
|
||
|
/** Layer is rendered on top of scene */
|
||
|
PassthroughLayerOrder_Overlay = 0 UMETA(DisplayName = "Overlay"),
|
||
|
|
||
|
/** Layer is rendered under scene */
|
||
|
PassthroughLayerOrder_Underlay = 1 UMETA(DisplayName = "Underlay"),
|
||
|
|
||
|
PassthroughLayerOrder_MAX = 255,
|
||
|
};
|
||
|
|
||
|
struct OCULUSXRHMD_API FColorLutDesc
|
||
|
{
|
||
|
FColorLutDesc();
|
||
|
|
||
|
FColorLutDesc(const TArray<uint64>& InColorLuts, float InWeight);
|
||
|
|
||
|
float Weight;
|
||
|
TArray<uint64> ColorLuts;
|
||
|
};
|
||
|
|
||
|
struct OCULUSXRHMD_API FEdgeStyleParameters
|
||
|
{
|
||
|
public:
|
||
|
FEdgeStyleParameters();
|
||
|
|
||
|
FEdgeStyleParameters(
|
||
|
bool bEnableEdgeColor,
|
||
|
bool bEnableColorMap,
|
||
|
float TextureOpacityFactor,
|
||
|
float Brightness,
|
||
|
float Contrast,
|
||
|
float Posterize,
|
||
|
float Saturation,
|
||
|
FLinearColor EdgeColor,
|
||
|
FLinearColor ColorScale,
|
||
|
FLinearColor ColorOffset,
|
||
|
EOculusXRColorMapType InColorMapType,
|
||
|
const TArray<FLinearColor>& InColorMapGradient,
|
||
|
const FColorLutDesc& InLutDesc);
|
||
|
|
||
|
bool bEnableEdgeColor;
|
||
|
bool bEnableColorMap;
|
||
|
bool bUseColorLuts;
|
||
|
float TextureOpacityFactor;
|
||
|
float Brightness;
|
||
|
float Contrast;
|
||
|
float Posterize;
|
||
|
float Saturation;
|
||
|
FLinearColor EdgeColor;
|
||
|
FLinearColor ColorScale;
|
||
|
FLinearColor ColorOffset;
|
||
|
EOculusXRColorMapType ColorMapType;
|
||
|
TArray<uint8> ColorMapData;
|
||
|
FColorLutDesc ColorLutDesc;
|
||
|
|
||
|
private:
|
||
|
/** Generates the corresponding color map based on given color map type */
|
||
|
TArray<uint8> GenerateColorMapData(EOculusXRColorMapType InColorMapType, const TArray<FLinearColor>& InColorMapGradient);
|
||
|
|
||
|
/** Generates a grayscale to color color map based on given gradient --> It also applies the color scale and offset */
|
||
|
TArray<uint8> GenerateMonoToRGBA(const TArray<FLinearColor>& InGradient, const TArray<uint8>& InColorMapData);
|
||
|
|
||
|
/** Generates a grayscale color map with given Brightness/Contrast/Posterize settings */
|
||
|
TArray<uint8> GenerateMonoBrightnessContrastPosterizeMap();
|
||
|
|
||
|
/** Generates a luminance based colormap from the the Brightness/Contrast */
|
||
|
TArray<uint8> GenerateBrightnessContrastSaturationColorMap();
|
||
|
};
|
||
|
|
||
|
#if UE_VERSION_OLDER_THAN(5, 3, 0)
|
||
|
#define OCULUSXRHMD_API_CLASS OCULUSXRHMD_API
|
||
|
#define OCULUSXRHMD_API_MEMBER
|
||
|
#else
|
||
|
#define OCULUSXRHMD_API_CLASS
|
||
|
#define OCULUSXRHMD_API_MEMBER OCULUSXRHMD_API
|
||
|
#endif
|
||
|
|
||
|
class OCULUSXRHMD_API_CLASS FReconstructedLayer : public IStereoLayerShape
|
||
|
{
|
||
|
public:
|
||
|
OCULUSXRHMD_API_MEMBER static const FName ShapeName;
|
||
|
virtual FName GetShapeName() override { return ShapeName; }
|
||
|
virtual IStereoLayerShape* Clone() const override { return new FReconstructedLayer(*this); }
|
||
|
|
||
|
public:
|
||
|
FReconstructedLayer(){};
|
||
|
FReconstructedLayer(const FEdgeStyleParameters& EdgeStyleParameters, EOculusXRPassthroughLayerOrder PassthroughLayerOrder)
|
||
|
: EdgeStyleParameters(EdgeStyleParameters), PassthroughLayerOrder(PassthroughLayerOrder){};
|
||
|
FEdgeStyleParameters EdgeStyleParameters;
|
||
|
EOculusXRPassthroughLayerOrder PassthroughLayerOrder;
|
||
|
};
|
||
|
|
||
|
struct FUserDefinedGeometryDesc
|
||
|
{
|
||
|
FUserDefinedGeometryDesc(const FString& MeshName, OculusXRHMD::FOculusPassthroughMeshRef PassthroughMesh, const FTransform& Transform, bool bUpdateTransform)
|
||
|
: MeshName(MeshName)
|
||
|
, PassthroughMesh(PassthroughMesh)
|
||
|
, Transform(Transform)
|
||
|
, bUpdateTransform(bUpdateTransform){};
|
||
|
|
||
|
FString MeshName;
|
||
|
OculusXRHMD::FOculusPassthroughMeshRef PassthroughMesh;
|
||
|
FTransform Transform;
|
||
|
bool bUpdateTransform;
|
||
|
};
|
||
|
|
||
|
class OCULUSXRHMD_API_CLASS FUserDefinedLayer : public IStereoLayerShape
|
||
|
{
|
||
|
public:
|
||
|
OCULUSXRHMD_API_MEMBER static const FName ShapeName;
|
||
|
virtual FName GetShapeName() override { return ShapeName; }
|
||
|
virtual IStereoLayerShape* Clone() const override { return new FUserDefinedLayer(*this); }
|
||
|
|
||
|
public:
|
||
|
FUserDefinedLayer(){};
|
||
|
FUserDefinedLayer(TArray<FUserDefinedGeometryDesc> InUserGeometryList, const FEdgeStyleParameters& EdgeStyleParameters, EOculusXRPassthroughLayerOrder PassthroughLayerOrder)
|
||
|
: UserGeometryList{}
|
||
|
, EdgeStyleParameters(EdgeStyleParameters)
|
||
|
, PassthroughLayerOrder(PassthroughLayerOrder)
|
||
|
{
|
||
|
UserGeometryList = InUserGeometryList;
|
||
|
}
|
||
|
|
||
|
TArray<FUserDefinedGeometryDesc> UserGeometryList;
|
||
|
FEdgeStyleParameters EdgeStyleParameters;
|
||
|
EOculusXRPassthroughLayerOrder PassthroughLayerOrder;
|
||
|
|
||
|
private:
|
||
|
};
|