// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "StereoLayerShapes.h" #include "PICO_PassthroughLayerShape.generated.h" class FPassthroughMeshPICO : public FRefCountedObject { public: FPassthroughMeshPICO(const TArray& InVertices, const TArray& InTriangles) : Vertices(InVertices) , Triangles(InTriangles) { } const TArray& GetVertices() const { return Vertices; }; const TArray& GetTriangles() const { return Triangles; }; private: TArray Vertices; TArray Triangles; }; typedef TRefCountPtr FPICOPassthroughMeshRef; UENUM() enum class EColorMapTypePICO : uint8 { /** None*/ ColorMapType_None UMETA(DisplayName = "None"), /** Grayscale to color */ ColorMapType_GrayscaleToColor UMETA(DisplayName = "Grayscale To Color"), /** Grayscale */ ColorMapType_Grayscale UMETA(DisplayName = "Grayscale"), /** Color Adjustment */ ColorMapType_ColorAdjustment UMETA(DisplayName = "Color Adjustment"), ColorMapType_MAX, }; UENUM() enum EPassthroughLayerOrderPICO { /** Layer is rendered on top of scene */ PassthroughLayerOrder_Overlay UMETA(DisplayName = "Overlay"), /** Layer is rendered under scene */ PassthroughLayerOrder_Underlay UMETA(DisplayName = "Underlay"), PassthroughLayerOrder_MAX, }; struct FVSTEdgeStyleParametersPICO { FVSTEdgeStyleParametersPICO() : bEnableEdgeColor(false) , bEnableColorMap(false) , TextureOpacityFactor(1.0f) , EdgeColor{} , ColorMapType{} , ColorMapData{} { }; FVSTEdgeStyleParametersPICO(bool bEnableEdgeColor, bool bEnableColorMap, float TextureOpacityFactor, float Brightness, float Contrast, float Posterize, float Saturation , FLinearColor EdgeColor, FLinearColor ColorScale, FLinearColor ColorOffset, EColorMapTypePICO InColorMapType, const TArray& InColorMapGradient) : bEnableEdgeColor(bEnableEdgeColor) , bEnableColorMap(bEnableColorMap) , TextureOpacityFactor(TextureOpacityFactor) , Brightness(Brightness) , Contrast(Contrast) , Posterize(Posterize) , Saturation(Saturation) , EdgeColor(EdgeColor) , ColorScale(ColorScale) , ColorOffset(ColorOffset) , ColorMapType(GetPICOColorMapType(InColorMapType)) { ColorMapData = GenerateColorMapData(InColorMapType, InColorMapGradient); }; bool bEnableEdgeColor; bool bEnableColorMap; float TextureOpacityFactor; float Brightness; float Contrast; float Posterize; float Saturation; FLinearColor EdgeColor; FLinearColor ColorScale; FLinearColor ColorOffset; PassthroughColorMapType ColorMapType; TArray ColorMapData; private: /** Generates the corresponding color map based on given color map type */ TArray GenerateColorMapData(EColorMapTypePICO InColorMapType, const TArray& InColorMapGradient); /** Generates a grayscale to color color map based on given gradient --> It also applies the color scale and offset */ TArray GenerateMonoToRGBA(const TArray& InGradient, const TArray& InColorMapData); /** Generates a grayscale color map with given Brightness/Contrast/Posterize settings */ TArray GenerateMonoBrightnessContrastPosterizeMap(); /** Generates a luminance based colormap from the the Brightness/Contrast */ TArray GenerateBrightnessContrastSaturationColorMap(); /** Converts `EColorMapType` to `PassthroughColorMapType` */ PassthroughColorMapType GetPICOColorMapType(EColorMapTypePICO InColorMapType); }; class FFullScreenLayerShapePICO : public IStereoLayerShape { public: PICOOPENXRPASSTHROUGH_API static const FName ShapeName; virtual FName GetShapeName() override { return ShapeName; } virtual IStereoLayerShape* Clone() const override { return new FFullScreenLayerShapePICO(*this); } public: FFullScreenLayerShapePICO() {}; FFullScreenLayerShapePICO(const FVSTEdgeStyleParametersPICO& EdgeStyleParameters, EPassthroughLayerOrderPICO PassthroughLayerOrder) : EdgeStyleParameters(EdgeStyleParameters), PassthroughLayerOrder(PassthroughLayerOrder) { }; FVSTEdgeStyleParametersPICO EdgeStyleParameters; EPassthroughLayerOrderPICO PassthroughLayerOrder; }; struct FCustomShapeGeometryDescPICO { FCustomShapeGeometryDescPICO(const FString& MeshName, FPICOPassthroughMeshRef PassthroughMesh, const FTransform& Transform, bool bUpdateTransform) : MeshName(MeshName) , PassthroughMesh(PassthroughMesh) , Transform(Transform) , bUpdateTransform(bUpdateTransform) { }; FString MeshName; FPICOPassthroughMeshRef PassthroughMesh; FTransform Transform; bool bUpdateTransform; }; class FCustomShapeLayerShapePICO : public IStereoLayerShape { public: PICOOPENXRPASSTHROUGH_API static const FName ShapeName; virtual FName GetShapeName() override { return ShapeName; } virtual IStereoLayerShape* Clone() const override { return new FCustomShapeLayerShapePICO(*this); } public: FCustomShapeLayerShapePICO() {}; FCustomShapeLayerShapePICO(TArray InUserGeometryList, const FVSTEdgeStyleParametersPICO& EdgeStyleParameters, EPassthroughLayerOrderPICO PassthroughLayerOrder) : UserGeometryList{} , EdgeStyleParameters(EdgeStyleParameters) , PassthroughLayerOrder(PassthroughLayerOrder) { UserGeometryList = InUserGeometryList; } TArray UserGeometryList; FVSTEdgeStyleParametersPICO EdgeStyleParameters; EPassthroughLayerOrderPICO PassthroughLayerOrder; private: };