// @lint-ignore-every LICENSELINT // Copyright Epic Games, Inc. All Rights Reserved. #include "OculusXRFunctionLibrary.h" #include "OculusXRFunctionLibraryOpenXR.h" #include "OculusXRFunctionLibraryOVR.h" #include "OculusXRHMDPrivate.h" #include "OculusXRHMD.h" #include "OpenXR/OculusXROpenXRUtilities.h" #include "Logging/MessageLog.h" #define LOCTEXT_NAMESPACE "OculusFunctionLibrary" //------------------------------------------------------------------------------------------------- // UOculusXRFunctionLibrary //------------------------------------------------------------------------------------------------- TSharedPtr UOculusXRFunctionLibrary::FunctionLibraryImpl = nullptr; TSharedPtr UOculusXRFunctionLibrary::GetOculusXRFunctionImpl() { if (FunctionLibraryImpl == nullptr) { if (OculusXR::IsOpenXRSystem()) { FunctionLibraryImpl = MakeShared(); } else { FunctionLibraryImpl = MakeShared(); } } return FunctionLibraryImpl; } void UOculusXRFunctionLibrary::ShutdownXRFunctionLibrary() { FunctionLibraryImpl = nullptr; } UOculusXRFunctionLibrary::UOculusXRFunctionLibrary(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { } OculusXRHMD::FOculusXRHMD* UOculusXRFunctionLibrary::GetOculusXRHMD() { return OculusXRHMD::FOculusXRHMD::GetOculusXRHMD(); } void UOculusXRFunctionLibrary::GetPose(FRotator& DeviceRotation, FVector& DevicePosition, FVector& NeckPosition, bool bUseOrienationForPlayerCamera, bool bUsePositionForPlayerCamera, const FVector PositionScale) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->GetPose(DeviceRotation, DevicePosition, NeckPosition); } else #endif { DeviceRotation = FRotator::ZeroRotator; DevicePosition = FVector::ZeroVector; NeckPosition = FVector::ZeroVector; } } void UOculusXRFunctionLibrary::SetBaseRotationAndBaseOffsetInMeters(FRotator Rotation, FVector BaseOffsetInMeters, EOrientPositionSelector::Type Options) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->SetBaseRotationAndBaseOffsetInMeters(Rotation, BaseOffsetInMeters, Options); } #endif } void UOculusXRFunctionLibrary::GetBaseRotationAndBaseOffsetInMeters(FRotator& OutRotation, FVector& OutBaseOffsetInMeters) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->GetBaseRotationAndBaseOffsetInMeters(OutRotation, OutBaseOffsetInMeters); } #endif } void UOculusXRFunctionLibrary::GetRawSensorData(FVector& AngularAcceleration, FVector& LinearAcceleration, FVector& AngularVelocity, FVector& LinearVelocity, float& TimeInSeconds, EOculusXRTrackedDeviceType DeviceType) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->GetRawSensorData(AngularAcceleration, LinearAcceleration, AngularVelocity, LinearVelocity, TimeInSeconds, DeviceType); } #endif } bool UOculusXRFunctionLibrary::IsDeviceTracked(EOculusXRTrackedDeviceType DeviceType) { bool bIsDeviceTracked = false; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { bIsDeviceTracked = Impl->IsDeviceTracked(DeviceType); } #endif return bIsDeviceTracked; } void UOculusXRFunctionLibrary::GetSuggestedCpuAndGpuPerformanceLevels(EOculusXRProcessorPerformanceLevel& CpuPerfLevel, EOculusXRProcessorPerformanceLevel& GpuPerfLevel) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->GetSuggestedCpuAndGpuPerformanceLevels(CpuPerfLevel, GpuPerfLevel); } #endif } void UOculusXRFunctionLibrary::SetSuggestedCpuAndGpuPerformanceLevels(EOculusXRProcessorPerformanceLevel CpuPerfLevel, EOculusXRProcessorPerformanceLevel GpuPerfLevel) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->SetSuggestedCpuAndGpuPerformanceLevels(CpuPerfLevel, GpuPerfLevel); } #endif } void UOculusXRFunctionLibrary::SetCPUAndGPULevels(int CPULevel, int GPULevel) { // Deprecated. Please use Get/SetSuggestedCpuAndGpuPerformanceLevels instead. } bool UOculusXRFunctionLibrary::GetUserProfile(FOculusXRHmdUserProfile& Profile) { bool bGetUserProfile = false; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { bGetUserProfile = Impl->GetUserProfile(Profile); } #endif return bGetUserProfile; } void UOculusXRFunctionLibrary::SetBaseRotationAndPositionOffset(FRotator BaseRot, FVector PosOffset, EOrientPositionSelector::Type Options) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->SetBaseRotationAndPositionOffset(BaseRot, PosOffset, Options); } #endif } void UOculusXRFunctionLibrary::GetBaseRotationAndPositionOffset(FRotator& OutRot, FVector& OutPosOffset) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->GetBaseRotationAndPositionOffset(OutRot, OutPosOffset); } #endif } void UOculusXRFunctionLibrary::AddLoadingSplashScreen(class UTexture2D* Texture, FVector TranslationInMeters, FRotator Rotation, FVector2D SizeInMeters, FRotator DeltaRotation, bool bClearBeforeAdd) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->AddLoadingSplashScreen(Texture, TranslationInMeters, Rotation, SizeInMeters, DeltaRotation, bClearBeforeAdd); } #endif } void UOculusXRFunctionLibrary::ClearLoadingSplashScreens() { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->ClearLoadingSplashScreens(); } #endif } bool UOculusXRFunctionLibrary::HasInputFocus() { bool bHasInputFocus = false; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { bHasInputFocus = Impl->HasInputFocus(); } #endif return bHasInputFocus; } bool UOculusXRFunctionLibrary::HasSystemOverlayPresent() { bool bHasSystemOverlayPresent = false; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { bHasSystemOverlayPresent = Impl->HasSystemOverlayPresent(); } #endif return bHasSystemOverlayPresent; } void UOculusXRFunctionLibrary::GetGPUUtilization(bool& IsGPUAvailable, float& GPUUtilization) { GPUUtilization = 0.0f; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->GetGPUUtilization(IsGPUAvailable, GPUUtilization); } #endif } float UOculusXRFunctionLibrary::GetGPUFrameTime() { float FrameTime = 0; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { FrameTime = Impl->GetGPUFrameTime(); } #endif return FrameTime; } void UOculusXRFunctionLibrary::GetPerformanceMetrics(FOculusXRPerformanceMetrics& PerformanceMetrics) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->GetPerformanceMetrics(PerformanceMetrics); } #endif } EOculusXRFoveatedRenderingMethod UOculusXRFunctionLibrary::GetFoveatedRenderingMethod() { EOculusXRFoveatedRenderingMethod FoveatedRenderingMethod = EOculusXRFoveatedRenderingMethod::FixedFoveatedRendering; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { FoveatedRenderingMethod = Impl->GetFoveatedRenderingMethod(); } #endif return FoveatedRenderingMethod; } void UOculusXRFunctionLibrary::SetFoveatedRenderingMethod(EOculusXRFoveatedRenderingMethod Method) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->SetFoveatedRenderingMethod(Method); } #endif } void UOculusXRFunctionLibrary::SetFoveatedRenderingLevel(EOculusXRFoveatedRenderingLevel level, bool isDynamic) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->SetFoveatedRenderingLevel(level, isDynamic); } #endif } EOculusXRFoveatedRenderingLevel UOculusXRFunctionLibrary::GetFoveatedRenderingLevel() { EOculusXRFoveatedRenderingLevel FoveatedRenderingLevel = EOculusXRFoveatedRenderingLevel::Off; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { FoveatedRenderingLevel = Impl->GetFoveatedRenderingLevel(); } #endif return FoveatedRenderingLevel; } bool UOculusXRFunctionLibrary::GetEyeTrackedFoveatedRenderingSupported() { bool bEyeTrackedFoveatedRenderingSupported = false; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { bEyeTrackedFoveatedRenderingSupported = Impl->GetEyeTrackedFoveatedRenderingSupported(); } #endif return bEyeTrackedFoveatedRenderingSupported; } FString UOculusXRFunctionLibrary::GetDeviceName() { FString DeviceName; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { DeviceName = Impl->GetDeviceName(); } #endif return DeviceName; } EOculusXRDeviceType UOculusXRFunctionLibrary::GetDeviceType() { EOculusXRDeviceType DeviceType = EOculusXRDeviceType::OculusUnknown; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { DeviceType = Impl->GetDeviceType(); } #endif return DeviceType; } EOculusXRControllerType UOculusXRFunctionLibrary::GetControllerType(EControllerHand deviceHand) { EOculusXRControllerType ControllerType = EOculusXRControllerType::Unknown; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { ControllerType = Impl->GetControllerType(deviceHand); } #endif return ControllerType; } TArray UOculusXRFunctionLibrary::GetAvailableDisplayFrequencies() { TArray FreqArray; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { FreqArray = Impl->GetAvailableDisplayFrequencies(); } #endif return FreqArray; } float UOculusXRFunctionLibrary::GetCurrentDisplayFrequency() { float Frequency = 0.0f; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Frequency = Impl->GetCurrentDisplayFrequency(); } #endif return Frequency; } void UOculusXRFunctionLibrary::SetDisplayFrequency(float RequestedFrequency) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->SetDisplayFrequency(RequestedFrequency); } #endif } void UOculusXRFunctionLibrary::EnablePositionTracking(bool bPositionTracking) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->EnablePositionTracking(bPositionTracking); } #endif } void UOculusXRFunctionLibrary::EnableOrientationTracking(bool bOrientationTracking) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->EnableOrientationTracking(bOrientationTracking); } #endif } void UOculusXRFunctionLibrary::SetColorScaleAndOffset(FLinearColor ColorScale, FLinearColor ColorOffset, bool bApplyToAllLayers) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->SetColorScaleAndOffset(ColorScale, ColorOffset, bApplyToAllLayers); } #endif } class IStereoLayers* UOculusXRFunctionLibrary::GetStereoLayers() { IStereoLayers* Layers = nullptr; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Layers = Impl->GetStereoLayers(); } #endif return Layers; } bool UOculusXRFunctionLibrary::IsGuardianConfigured() { bool bIsGuardianConfigured = false; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { bIsGuardianConfigured = Impl->IsGuardianConfigured(); } #endif return bIsGuardianConfigured; } bool UOculusXRFunctionLibrary::IsGuardianDisplayed() { bool bIsGuardianDisplayed = false; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { bIsGuardianDisplayed = Impl->IsGuardianDisplayed(); } #endif return bIsGuardianDisplayed; } TArray UOculusXRFunctionLibrary::GetGuardianPoints(EOculusXRBoundaryType BoundaryType, bool UsePawnSpace /* = false */) { TArray BoundaryPointList; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { BoundaryPointList = Impl->GetGuardianPoints(BoundaryType, UsePawnSpace); } #endif return BoundaryPointList; } FVector UOculusXRFunctionLibrary::GetGuardianDimensions(EOculusXRBoundaryType BoundaryType) { FVector Dimensions = FVector::ZeroVector; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Dimensions = Impl->GetGuardianDimensions(BoundaryType); } #endif return Dimensions; } FTransform UOculusXRFunctionLibrary::GetPlayAreaTransform() { FTransform Transform; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Transform = Impl->GetPlayAreaTransform(); } #endif return Transform; } FOculusXRGuardianTestResult UOculusXRFunctionLibrary::GetPointGuardianIntersection(const FVector Point, EOculusXRBoundaryType BoundaryType) { FOculusXRGuardianTestResult InteractionInfo; memset(&InteractionInfo, 0, sizeof(FOculusXRGuardianTestResult)); #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { InteractionInfo = Impl->GetPointGuardianIntersection(Point, BoundaryType); } #endif return InteractionInfo; } FOculusXRGuardianTestResult UOculusXRFunctionLibrary::GetNodeGuardianIntersection(EOculusXRTrackedDeviceType DeviceType, EOculusXRBoundaryType BoundaryType) { FOculusXRGuardianTestResult InteractionInfo; memset(&InteractionInfo, 0, sizeof(FOculusXRGuardianTestResult)); #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { InteractionInfo = Impl->GetNodeGuardianIntersection(DeviceType, BoundaryType); } #endif return InteractionInfo; } void UOculusXRFunctionLibrary::SetGuardianVisibility(bool GuardianVisible) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->SetGuardianVisibility(GuardianVisible); } #endif } bool UOculusXRFunctionLibrary::GetSystemHmd3DofModeEnabled() { bool bGetSystemHmd3DofModeEnabled = false; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { bGetSystemHmd3DofModeEnabled = Impl->GetSystemHmd3DofModeEnabled(); } #endif return bGetSystemHmd3DofModeEnabled; } EOculusXRColorSpace UOculusXRFunctionLibrary::GetHmdColorDesc() { EOculusXRColorSpace HmdColorSpace = EOculusXRColorSpace::Unknown; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { HmdColorSpace = Impl->GetHmdColorDesc(); } #endif return HmdColorSpace; } void UOculusXRFunctionLibrary::SetClientColorDesc(EOculusXRColorSpace ColorSpace) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->SetClientColorDesc(ColorSpace); } #endif } void UOculusXRFunctionLibrary::SetLocalDimmingOn(bool LocalDimmingOn) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->SetLocalDimmingOn(LocalDimmingOn); } #endif } bool UOculusXRFunctionLibrary::IsPassthroughSupported() { bool bIsPassthroughSupported = false; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { bIsPassthroughSupported = Impl->IsPassthroughSupported(); } #endif return bIsPassthroughSupported; } bool UOculusXRFunctionLibrary::IsColorPassthroughSupported() { bool bIsColorPassthroughSupported = false; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { bIsColorPassthroughSupported = Impl->IsColorPassthroughSupported(); } #endif return bIsColorPassthroughSupported; } void UOculusXRFunctionLibrary::StartEnvironmentDepth() { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->StartEnvironmentDepth(); } #endif } void UOculusXRFunctionLibrary::StopEnvironmentDepth() { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->StopEnvironmentDepth(); } #endif } bool UOculusXRFunctionLibrary::IsEnvironmentDepthStarted() { bool bIsEnvironmentDepthStarted = false; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { bIsEnvironmentDepthStarted = Impl->IsEnvironmentDepthStarted(); } #endif return bIsEnvironmentDepthStarted; } void UOculusXRFunctionLibrary::SetEnvironmentDepthHandRemoval(bool RemoveHands) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->SetEnvironmentDepthHandRemoval(RemoveHands); } #endif } void UOculusXRFunctionLibrary::SetXROcclusionsMode(UObject* WorldContextObject, EOculusXROcclusionsMode Mode) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->SetXROcclusionsMode(WorldContextObject, Mode); } #endif } void UOculusXRFunctionLibrary::SetEyeBufferSharpenType(EOculusXREyeBufferSharpenType EyeBufferSharpenType) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->SetEyeBufferSharpenType(EyeBufferSharpenType); } #endif } bool UOculusXRFunctionLibrary::IsPassthroughRecommended() { bool bIsPassthroughRecommended = false; #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { bIsPassthroughRecommended = Impl->IsPassthroughRecommended(); } #endif return bIsPassthroughRecommended; } void UOculusXRFunctionLibrary::GetOpenXRInstanceProcAddrFunc(void** func) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->GetOpenXRInstanceProcAddrFunc(func); } #endif } void UOculusXRFunctionLibrary::GetNativeOpenXRHandles(uint64_t* OutXrInstance, uint64_t* OutXrSession) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->GetNativeOpenXRHandles(OutXrInstance, OutXrSession); } #endif } void UOculusXRFunctionLibrary::GetAppSpace(uint64_t* OutAppSpace) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->GetAppSpace(OutAppSpace); } #endif } void UOculusXRFunctionLibrary::GetNextPredictedDisplayTime(uint64_t* NextPredictedDisplayTime) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->GetNextPredictedDisplayTime(NextPredictedDisplayTime); } #endif } void UOculusXRFunctionLibrary::RegisterOpenXrEventHandler(void (*OpenXrEventHandler)(void* data, void* context), void* Context) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->RegisterOpenXrEventHandler(OpenXrEventHandler, Context); } #endif } void UOculusXRFunctionLibrary::UnregisterOpenXrEventHandler(void (*OpenXrEventHandler)(void* data, void* context)) { #if OCULUS_HMD_SUPPORTED_PLATFORMS TSharedPtr Impl = GetOculusXRFunctionImpl(); if (Impl != nullptr) { Impl->UnregisterOpenXrEventHandler(OpenXrEventHandler); } #endif } #undef LOCTEXT_NAMESPACE