October3d55/Matain/ViveOpenXR/Source/ViveOpenXRPassthrough/Private/ViveOpenXRPassthrough.h

141 lines
5.8 KiB
C
Raw Normal View History

2025-03-10 09:43:27 +08:00
// Copyright HTC Corporation. All Rights Reserved.
#pragma once
#include "Engine/Engine.h"
#include "OpenXRCommon.h"
#include "PassthroughHandle.h"
#include "PassthroughConfigurationAsyncAction.h"
DECLARE_LOG_CATEGORY_EXTERN(LogViveOpenXRPassthrough, Log, All);
struct FPassthroughDispatchTable_ext
{
PFN_xrGetSystemProperties xrGetSystemProperties;
};
struct PassthroughData
{
// OpenXR handle for passthrough
XrPassthroughHTC Handle;
// Pointer to composition layer info, transient as it's runtime-only
XrCompositionLayerPassthroughHTC* projectedPassthroughCompositionLayerInfoPtr;
// Pointer to mesh transform info, transient as it's runtime-only
XrPassthroughMeshTransformInfoHTC* passthroughMeshTransformInfoPtr;
bool Valid;
};
class FViveOpenXRPassthrough : public IModuleInterface, public IOpenXRExtensionPlugin
{
public:
FViveOpenXRPassthrough(){}
virtual ~FViveOpenXRPassthrough(){}
/************************************************************************/
/* IModuleInterface */
/************************************************************************/
virtual void StartupModule() override;
virtual void ShutdownModule() override
{
UnregisterOpenXRExtensionModularFeature();
}
/** IOpenXRExtensionPlugin */
virtual FString GetDisplayName() override
{
return FString(TEXT("ViveOpenXRPassthrough"));
}
/** IOpenXRExtensionPlugin implementation */
virtual const void* OnCreateSession(XrInstance InInstance, XrSystemId InSystem, const void* InNext) override;
virtual const void* OnBeginSession(XrSession InSession, const void* InNext) override;
virtual bool GetRequiredExtensions(TArray<const ANSICHAR*>& OutExtensions) override;
virtual void PostGetSystem(XrInstance InInstance, XrSystemId InSystem) override;
virtual bool GetOptionalExtensions(TArray<const ANSICHAR*>& OutExtensions) override;
virtual void PostCreateSession(XrSession InSession) override;
virtual void UpdateDeviceLocations(XrSession InSession, XrTime DisplayTime, XrSpace TrackingSpace) override;
virtual void UpdateCompositionLayers(XrSession InSession, TArray<const XrCompositionLayerBaseHeader*>& Headers) override;
virtual void OnDestroySession(XrSession InSession) override;
virtual const void* OnEndProjectionLayer(XrSession InSession, int32 InLayerIndex, const void* InNext, XrCompositionLayerFlags& OutFlags) override;
virtual void OnEvent(XrSession InSession, const XrEventDataBaseHeader* InHeader) override;
//Passthrough Underlay
PassthroughData CreatePassthrough(XrPassthroughFormHTC layerForm);
bool SwitchPassthrough(XrPassthroughFormHTC layerForm);
bool DestroyPassthrough(XrPassthroughHTC PassthroughHandle);
//PassthroughConfigurations
float GetPassthroughQuality();
bool SetPassthroughQuality(float QualityScale);
int32 GetPassthroughRate();
bool SetPassthroughRate(int32 Level);
//For projected passthrough
bool SetPassthroughAlpha(XrPassthroughHTC PassthroughHandle, float alpha);
bool SetPassthroughMesh(XrPassthroughHTC PassthroughHandle, uint32_t inVertexCount, const XrVector3f* inVertexBuffer, uint32_t inIndexCount, const uint32_t* inIndexBuffer);
bool SetPassthroughMeshTransform(XrPassthroughHTC PassthroughHandle, XrSpace meshSpace, XrPosef meshPose, XrVector3f meshScale);
bool SetPassthroughMeshTransformSpace(XrPassthroughHTC PassthroughHandle, XrSpace meshSpace);
bool SetPassthroughMeshTransformPosition(XrPassthroughHTC PassthroughHandle, XrVector3f meshPosition);
bool SetPassthroughMeshTransformOrientation(XrPassthroughHTC PassthroughHandle, XrQuaternionf meshOrientation);
bool SetPassthroughMeshTransformScale(XrPassthroughHTC PassthroughHandle, XrVector3f meshScale);
XrSpace GetHeadlockXrSpace();
XrSpace GetTrackingXrSpace();
//Sync Event
FPassthroughConfigurationQualityChangeCompleted QualityChangeSuccessEvent;
FPassthroughConfigurationQualityChangeFailed QualityChangeFailureEvent;
FPassthroughConfigurationRateChangeCompleted RateChangeSuccessEvent;
FPassthroughConfigurationRateChangeFailed RateChangeFailureEvent;
public:
bool m_bPassthroughConfigurationInitialization = false;
bool m_bEnablePassthrough = false;
bool m_supportsQualityConfiguration = false;
bool m_supportsRateConfiguration = false;
float ProjectSettingsQualityScale = 0.1f;
float FromQualityScale = 0.1f;
int32 ProjectSettingsRateType = 0;
int32 SetRateType = 0;
private:
XrInstance m_XrInstance = XR_NULL_HANDLE;
XrSystemId m_XrSystemId = XR_NULL_SYSTEM_ID;
XrSession m_Session = XR_NULL_HANDLE;
XrSpace m_HeadLockSpace = XR_NULL_HANDLE;
XrSpace m_BaseSpace = XR_NULL_HANDLE;
XrPassthroughFormHTC m_CurrentLayerForm = XrPassthroughFormHTC::XR_PASSTHROUGH_FORM_MAX_ENUM_HTC;
bool isPlanerPassthroughIsValid = false;
bool isPlanerPassthroughCreated = false;
bool isProjectedPassthroughCreated = false;
//Passthrough configuration
TArray<XrPassthroughConfigurationImageRateHTC> imageRates;
//Projected passthrough handles
TMap<XrPassthroughHTC, PassthroughData*> ProjectedPassthroughMap;
PassthroughData ProjectedPassthroughDataHandle{ XR_NULL_HANDLE, nullptr, nullptr, false };
//Planer passthrough handles
XrPassthroughHTC planerPassthroughHandle = XR_NULL_HANDLE;
PassthroughData PlanerPassthroughDataHandle{ XR_NULL_HANDLE, nullptr, nullptr, false };
XrCompositionLayerPassthroughHTC* planerPassthroughCompositionLayerInfoPtr = nullptr;
//OpenXR Function Ptrs
PFN_xrCreatePassthroughHTC xrCreatePassthroughHTC = nullptr;
PFN_xrDestroyPassthroughHTC xrDestroyPassthroughHTC = nullptr;
PFN_xrEnumeratePassthroughImageRatesHTC xrEnumeratePassthroughImageRatesHTC = nullptr;
PFN_xrGetPassthroughConfigurationHTC xrGetPassthroughConfigurationHTC = nullptr;
PFN_xrSetPassthroughConfigurationHTC xrSetPassthroughConfigurationHTC = nullptr;
XrPassthroughColorHTC passthroughColorInfo{};
FPassthroughDispatchTable_ext FPassthrough_ext{};
};
static FViveOpenXRPassthrough* FViveOpenXRPassthroughPtr = nullptr;