Files
UnrealEngine/Engine/Plugins/Runtime/OpenXR/Source/OpenXRHMD/Private/OpenXRHMD_Layer.h
2025-05-18 13:04:45 +08:00

54 lines
2.3 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "IStereoLayers.h"
#include "OpenXRCore.h"
#include "XRSwapChain.h"
union FXrCompositionLayerUnion;
struct FOpenXRLayer
{
struct FPerEyeTextureData
{
FTextureRHIRef Texture = nullptr;
FXRSwapChainPtr Swapchain = nullptr;
FVector2D SwapchainSize{};
bool bStaticSwapchain = false;
bool bUpdateTexture = false;
void ConfigureSwapchain(XrSession Session, class FOpenXRRenderBridge* RenderBridge, FTextureRHIRef Texture, bool bStaticSwapchain);
};
IStereoLayers::FLayerDesc Desc;
/** Texture tracking data for the right eye.*/
FPerEyeTextureData RightEye;
/** Texture tracking data for the left eye, may not be present.*/
FPerEyeTextureData LeftEye;
FOpenXRLayer(const IStereoLayers::FLayerDesc& InLayerDesc)
: Desc(InLayerDesc)
{ }
FIntRect GetRightViewportSize() const;
FVector2D GetRightQuadSize() const;
FIntRect GetLeftViewportSize() const;
FVector2D GetLeftQuadSize() const;
TArray<FXrCompositionLayerUnion> CreateOpenXRLayer(FTransform InvTrackingToWorld, float WorldToMeters, XrSpace Space, EOpenXRLayerCreationFlags CreationFlags) const;
void ApplyCompositionDepthTestLayer(TArray<FXrCompositionLayerUnion>& Headers, EOpenXRLayerCreationFlags CreationFlags, TArray<XrCompositionLayerDepthTestFB>& InCompositionDepthTestLayers) const;
private:
void CreateOpenXRQuadLayer(bool bIsStereo, bool bNoAlpha, FTransform PositionTransform, float WorldToMeters, XrSpace Space, TArray<FXrCompositionLayerUnion>& Headers) const;
void CreateOpenXRCylinderLayer(bool bIsStereo, bool bNoAlpha, FTransform PositionTransform, float WorldToMeters, XrSpace Space, TArray<FXrCompositionLayerUnion>& Headers) const;
void CreateOpenXREquirectLayer(bool bIsStereo, bool bNoAlpha, FTransform PositionTransform, float WorldToMeters, XrSpace Space, TArray<FXrCompositionLayerUnion>& Headers) const;
void CreateOpenXREquirect2Layer(bool bIsStereo, bool bNoAlpha, FTransform PositionTransform, float WorldToMeters, XrSpace Space, TArray<FXrCompositionLayerUnion>& Headers) const;
void SetupEquirect2(FVector2D Scale, FVector2D Bias, FVector2D Position, FVector2D Size, FTransform PositionTransform, float WorldToMeters, XrCompositionLayerEquirect2KHR& Equirect2) const;
};