VRTowerDef/Plugins/MetaXR/Source/OculusXRHMD/Private/OculusXRPluginWrapper.cpp

462 lines
18 KiB
C++

// @lint-ignore-every LICENSELINT
// Copyright Epic Games, Inc. All Rights Reserved.
#include "OculusXRPluginWrapper.h"
#include "OculusXRHMDModule.h"
#if PLATFORM_ANDROID
#include <dlfcn.h>
#define MIN_SDK_VERSION 29
#endif
DEFINE_LOG_CATEGORY(LogOculusPluginWrapper);
static void* LoadEntryPoint(void* handle, const char* EntryPointName);
bool OculusPluginWrapper::InitializeOculusPluginWrapper(OculusPluginWrapper* wrapper)
{
if (wrapper->IsInitialized())
{
UE_LOG(LogOculusPluginWrapper, Warning, TEXT("wrapper already initialized"));
return true;
}
#if OCULUS_HMD_SUPPORTED_PLATFORMS
void* LibraryHandle = nullptr;
#if PLATFORM_ANDROID
const bool VersionValid = FAndroidMisc::GetAndroidBuildVersion() >= MIN_SDK_VERSION;
#else
const bool VersionValid = true;
#endif
if (VersionValid)
{
LibraryHandle = FOculusXRHMDModule::GetOVRPluginHandle();
if (LibraryHandle == nullptr)
{
UE_LOG(LogOculusPluginWrapper, Warning, TEXT("GetOVRPluginHandle() returned NULL"));
return false;
}
}
else
{
return false;
}
#else
return false;
#endif
struct OculusEntryPoint
{
const char* EntryPointName;
void** EntryPointPtr;
};
#define OCULUS_BIND_ENTRY_POINT(Func) { "ovrp_" #Func, (void**)&wrapper->Func }
OculusEntryPoint entryPointArray[] = {
// OVR_Plugin.h
OCULUS_BIND_ENTRY_POINT(PreInitialize5),
OCULUS_BIND_ENTRY_POINT(GetInitialized),
OCULUS_BIND_ENTRY_POINT(Initialize7),
OCULUS_BIND_ENTRY_POINT(Shutdown2),
OCULUS_BIND_ENTRY_POINT(SetLogCallback2),
OCULUS_BIND_ENTRY_POINT(GetVersion2),
OCULUS_BIND_ENTRY_POINT(GetNativeSDKVersion2),
OCULUS_BIND_ENTRY_POINT(GetNativeSDKPointer2),
OCULUS_BIND_ENTRY_POINT(GetDisplayAdapterId2),
OCULUS_BIND_ENTRY_POINT(GetAudioOutId2),
OCULUS_BIND_ENTRY_POINT(GetAudioOutDeviceId2),
OCULUS_BIND_ENTRY_POINT(GetAudioInId2),
OCULUS_BIND_ENTRY_POINT(GetAudioInDeviceId2),
OCULUS_BIND_ENTRY_POINT(GetInstanceExtensionsVk),
OCULUS_BIND_ENTRY_POINT(GetDeviceExtensionsVk),
OCULUS_BIND_ENTRY_POINT(SetupDistortionWindow3),
OCULUS_BIND_ENTRY_POINT(DestroyDistortionWindow2),
OCULUS_BIND_ENTRY_POINT(GetDominantHand),
OCULUS_BIND_ENTRY_POINT(SetRemoteHandedness),
OCULUS_BIND_ENTRY_POINT(SetColorScaleAndOffset),
OCULUS_BIND_ENTRY_POINT(SetupLayer),
OCULUS_BIND_ENTRY_POINT(SetupLayerDepth),
OCULUS_BIND_ENTRY_POINT(SetEyeFovPremultipliedAlphaMode),
OCULUS_BIND_ENTRY_POINT(GetEyeFovLayerId),
OCULUS_BIND_ENTRY_POINT(GetLayerTextureStageCount),
OCULUS_BIND_ENTRY_POINT(GetLayerTexture2),
OCULUS_BIND_ENTRY_POINT(GetLayerTextureFoveation),
OCULUS_BIND_ENTRY_POINT(GetLayerOcclusionMesh),
OCULUS_BIND_ENTRY_POINT(GetLayerAndroidSurfaceObject),
OCULUS_BIND_ENTRY_POINT(GetLayerTextureSpaceWarp),
OCULUS_BIND_ENTRY_POINT(CalculateEyeLayerDesc3),
OCULUS_BIND_ENTRY_POINT(DestroyLayer),
OCULUS_BIND_ENTRY_POINT(CalculateLayerDesc),
OCULUS_BIND_ENTRY_POINT(CalculateEyeLayerDesc2),
OCULUS_BIND_ENTRY_POINT(CalculateEyePreviewRect),
OCULUS_BIND_ENTRY_POINT(SetupMirrorTexture2),
OCULUS_BIND_ENTRY_POINT(DestroyMirrorTexture2),
OCULUS_BIND_ENTRY_POINT(GetAdaptiveGpuPerformanceScale2),
OCULUS_BIND_ENTRY_POINT(GetAppCpuStartToGpuEndTime2),
OCULUS_BIND_ENTRY_POINT(GetEyePixelsPerTanAngleAtCenter2),
OCULUS_BIND_ENTRY_POINT(GetHmdToEyeOffset2),
OCULUS_BIND_ENTRY_POINT(Update3),
OCULUS_BIND_ENTRY_POINT(WaitToBeginFrame),
OCULUS_BIND_ENTRY_POINT(BeginFrame4),
OCULUS_BIND_ENTRY_POINT(UpdateFoveation),
OCULUS_BIND_ENTRY_POINT(EndFrame4),
OCULUS_BIND_ENTRY_POINT(GetTrackingOrientationSupported2),
OCULUS_BIND_ENTRY_POINT(GetTrackingOrientationEnabled2),
OCULUS_BIND_ENTRY_POINT(SetTrackingOrientationEnabled2),
OCULUS_BIND_ENTRY_POINT(GetTrackingPositionSupported2),
OCULUS_BIND_ENTRY_POINT(GetTrackingPositionEnabled2),
OCULUS_BIND_ENTRY_POINT(SetTrackingPositionEnabled2),
OCULUS_BIND_ENTRY_POINT(GetTrackingIPDEnabled2),
OCULUS_BIND_ENTRY_POINT(SetTrackingIPDEnabled2),
OCULUS_BIND_ENTRY_POINT(GetTrackingCalibratedOrigin2),
OCULUS_BIND_ENTRY_POINT(SetTrackingCalibratedOrigin2),
OCULUS_BIND_ENTRY_POINT(GetTrackingOriginType2),
OCULUS_BIND_ENTRY_POINT(SetTrackingOriginType2),
OCULUS_BIND_ENTRY_POINT(RecenterTrackingOrigin2),
OCULUS_BIND_ENTRY_POINT(GetNodePresent2),
OCULUS_BIND_ENTRY_POINT(GetNodeOrientationTracked2),
OCULUS_BIND_ENTRY_POINT(GetNodeOrientationValid),
OCULUS_BIND_ENTRY_POINT(GetNodePositionTracked2),
OCULUS_BIND_ENTRY_POINT(GetNodePositionValid),
OCULUS_BIND_ENTRY_POINT(SetNodePositionTracked2),
OCULUS_BIND_ENTRY_POINT(GetNodePoseState3),
OCULUS_BIND_ENTRY_POINT(GetNodePoseStateRaw),
OCULUS_BIND_ENTRY_POINT(GetNodeFrustum2),
OCULUS_BIND_ENTRY_POINT(SetHeadPoseModifier),
OCULUS_BIND_ENTRY_POINT(GetHeadPoseModifier),
OCULUS_BIND_ENTRY_POINT(GetControllerState4),
OCULUS_BIND_ENTRY_POINT(GetControllerState5),
OCULUS_BIND_ENTRY_POINT(GetControllerState6),
OCULUS_BIND_ENTRY_POINT(GetActiveController2),
OCULUS_BIND_ENTRY_POINT(GetConnectedControllers2),
OCULUS_BIND_ENTRY_POINT(SetControllerVibration2),
OCULUS_BIND_ENTRY_POINT(SetControllerLocalizedVibration),
OCULUS_BIND_ENTRY_POINT(SetControllerHapticsAmplitudeEnvelope),
OCULUS_BIND_ENTRY_POINT(SetControllerHapticsPcm),
OCULUS_BIND_ENTRY_POINT(GetControllerHapticsDesc2),
OCULUS_BIND_ENTRY_POINT(GetControllerHapticsState2),
OCULUS_BIND_ENTRY_POINT(GetControllerSampleRateHz),
OCULUS_BIND_ENTRY_POINT(SetControllerHaptics2),
OCULUS_BIND_ENTRY_POINT(SetSuggestedCpuPerformanceLevel),
OCULUS_BIND_ENTRY_POINT(GetSuggestedCpuPerformanceLevel),
OCULUS_BIND_ENTRY_POINT(SetSuggestedGpuPerformanceLevel),
OCULUS_BIND_ENTRY_POINT(GetSuggestedGpuPerformanceLevel),
OCULUS_BIND_ENTRY_POINT(GetAppCPUPriority2),
OCULUS_BIND_ENTRY_POINT(SetAppCPUPriority2),
OCULUS_BIND_ENTRY_POINT(GetSystemPowerSavingMode2),
OCULUS_BIND_ENTRY_POINT(GetSystemDisplayFrequency2),
OCULUS_BIND_ENTRY_POINT(GetSystemDisplayAvailableFrequencies),
OCULUS_BIND_ENTRY_POINT(SetSystemDisplayFrequency),
OCULUS_BIND_ENTRY_POINT(GetSystemVSyncCount2),
OCULUS_BIND_ENTRY_POINT(SetSystemVSyncCount2),
OCULUS_BIND_ENTRY_POINT(GetSystemProductName2),
OCULUS_BIND_ENTRY_POINT(GetSystemRegion2),
OCULUS_BIND_ENTRY_POINT(ShowSystemUI2),
OCULUS_BIND_ENTRY_POINT(GetAppHasVrFocus2),
OCULUS_BIND_ENTRY_POINT(GetAppHasInputFocus),
OCULUS_BIND_ENTRY_POINT(GetAppHasSystemOverlayPresent),
OCULUS_BIND_ENTRY_POINT(GetAppShouldQuit2),
OCULUS_BIND_ENTRY_POINT(GetAppShouldRecenter2),
OCULUS_BIND_ENTRY_POINT(GetAppShouldRecreateDistortionWindow2),
OCULUS_BIND_ENTRY_POINT(GetAppLatencyTimings2),
OCULUS_BIND_ENTRY_POINT(SetAppEngineInfo2),
OCULUS_BIND_ENTRY_POINT(GetUserPresent2),
OCULUS_BIND_ENTRY_POINT(GetUserIPD2),
OCULUS_BIND_ENTRY_POINT(SetUserIPD2),
OCULUS_BIND_ENTRY_POINT(GetUserEyeHeight2),
OCULUS_BIND_ENTRY_POINT(SetUserEyeHeight2),
OCULUS_BIND_ENTRY_POINT(GetUserNeckEyeDistance2),
OCULUS_BIND_ENTRY_POINT(SetUserNeckEyeDistance2),
OCULUS_BIND_ENTRY_POINT(SetupDisplayObjects2),
OCULUS_BIND_ENTRY_POINT(GetSystemMultiViewSupported2),
OCULUS_BIND_ENTRY_POINT(GetEyeTextureArraySupported2),
OCULUS_BIND_ENTRY_POINT(GetBoundaryConfigured2),
OCULUS_BIND_ENTRY_POINT(GetDepthCompositingSupported),
OCULUS_BIND_ENTRY_POINT(TestBoundaryNode2),
OCULUS_BIND_ENTRY_POINT(TestBoundaryPoint2),
OCULUS_BIND_ENTRY_POINT(GetBoundaryGeometry3),
OCULUS_BIND_ENTRY_POINT(GetBoundaryDimensions2),
OCULUS_BIND_ENTRY_POINT(GetBoundaryVisible2),
OCULUS_BIND_ENTRY_POINT(SetBoundaryVisible2),
OCULUS_BIND_ENTRY_POINT(GetSystemHeadsetType2),
OCULUS_BIND_ENTRY_POINT(GetAppPerfStats2),
OCULUS_BIND_ENTRY_POINT(ResetAppPerfStats2),
OCULUS_BIND_ENTRY_POINT(GetAppFramerate2),
OCULUS_BIND_ENTRY_POINT(IsPerfMetricsSupported),
OCULUS_BIND_ENTRY_POINT(GetPerfMetricsFloat),
OCULUS_BIND_ENTRY_POINT(GetPerfMetricsInt),
OCULUS_BIND_ENTRY_POINT(SetHandNodePoseStateLatency),
OCULUS_BIND_ENTRY_POINT(GetHandNodePoseStateLatency),
OCULUS_BIND_ENTRY_POINT(GetSystemRecommendedMSAALevel2),
OCULUS_BIND_ENTRY_POINT(SetInhibitSystemUX2),
OCULUS_BIND_ENTRY_POINT(GetTiledMultiResSupported),
OCULUS_BIND_ENTRY_POINT(GetTiledMultiResLevel),
OCULUS_BIND_ENTRY_POINT(SetTiledMultiResLevel),
OCULUS_BIND_ENTRY_POINT(GetTiledMultiResDynamic),
OCULUS_BIND_ENTRY_POINT(SetTiledMultiResDynamic),
OCULUS_BIND_ENTRY_POINT(GetFoveationEyeTrackedSupported),
OCULUS_BIND_ENTRY_POINT(GetFoveationEyeTracked),
OCULUS_BIND_ENTRY_POINT(SetFoveationEyeTracked),
OCULUS_BIND_ENTRY_POINT(GetFoveationEyeTrackedCenter),
OCULUS_BIND_ENTRY_POINT(GetGPUUtilSupported),
OCULUS_BIND_ENTRY_POINT(GetGPUUtilLevel),
OCULUS_BIND_ENTRY_POINT(SetThreadPerformance),
OCULUS_BIND_ENTRY_POINT(AutoThreadScheduling),
OCULUS_BIND_ENTRY_POINT(GetGPUFrameTime),
OCULUS_BIND_ENTRY_POINT(GetViewportStencil),
OCULUS_BIND_ENTRY_POINT(SetDeveloperTelemetryConsent),
OCULUS_BIND_ENTRY_POINT(SendEvent),
OCULUS_BIND_ENTRY_POINT(SendEvent2),
OCULUS_BIND_ENTRY_POINT(AddCustomMetadata),
OCULUS_BIND_ENTRY_POINT(SetDeveloperMode),
OCULUS_BIND_ENTRY_POINT(GetCurrentTrackingTransformPose),
OCULUS_BIND_ENTRY_POINT(GetTrackingTransformRawPose),
OCULUS_BIND_ENTRY_POINT(GetTrackingTransformRelativePose),
OCULUS_BIND_ENTRY_POINT(GetTimeInSeconds),
//OCULUS_BIND_ENTRY_POINT(GetPTWNear),
OCULUS_BIND_ENTRY_POINT(GetASWVelocityScale),
OCULUS_BIND_ENTRY_POINT(GetASWDepthScale),
OCULUS_BIND_ENTRY_POINT(GetASWAdaptiveMode),
OCULUS_BIND_ENTRY_POINT(SetASWAdaptiveMode),
OCULUS_BIND_ENTRY_POINT(IsRequestingASWData),
OCULUS_BIND_ENTRY_POINT(GetPredictedDisplayTime),
OCULUS_BIND_ENTRY_POINT(GetHandTrackingEnabled),
OCULUS_BIND_ENTRY_POINT(GetHandState),
OCULUS_BIND_ENTRY_POINT(GetHandState2),
OCULUS_BIND_ENTRY_POINT(GetSkeleton2),
OCULUS_BIND_ENTRY_POINT(GetMesh),
OCULUS_BIND_ENTRY_POINT(GetLocalTrackingSpaceRecenterCount),
OCULUS_BIND_ENTRY_POINT(GetSystemHmd3DofModeEnabled),
OCULUS_BIND_ENTRY_POINT(SetClientColorDesc),
OCULUS_BIND_ENTRY_POINT(GetHmdColorDesc),
OCULUS_BIND_ENTRY_POINT(PollEvent),
OCULUS_BIND_ENTRY_POINT(GetNativeXrApiType),
OCULUS_BIND_ENTRY_POINT(GetLocalDimmingSupported),
OCULUS_BIND_ENTRY_POINT(SetLocalDimming),
OCULUS_BIND_ENTRY_POINT(GetCurrentInteractionProfile),
OCULUS_BIND_ENTRY_POINT(GetLayerRecommendedResolution),
OCULUS_BIND_ENTRY_POINT(IsLayerShapeSupported),
OCULUS_BIND_ENTRY_POINT(SetEyeBufferSharpenType),
OCULUS_BIND_ENTRY_POINT(InitializeEnvironmentDepth),
OCULUS_BIND_ENTRY_POINT(DestroyEnvironmentDepth),
OCULUS_BIND_ENTRY_POINT(GetEnvironmentDepthTextureDesc),
OCULUS_BIND_ENTRY_POINT(GetEnvironmentDepthTextureStageCount),
OCULUS_BIND_ENTRY_POINT(GetEnvironmentDepthTexture),
OCULUS_BIND_ENTRY_POINT(SetEnvironmentDepthHandRemoval),
OCULUS_BIND_ENTRY_POINT(StartEnvironmentDepth),
OCULUS_BIND_ENTRY_POINT(StopEnvironmentDepth),
OCULUS_BIND_ENTRY_POINT(GetEnvironmentDepthFrameDesc),
#ifndef OVRPLUGIN_JNI_LIB_EXCLUDED
OCULUS_BIND_ENTRY_POINT(GetSystemVolume2),
OCULUS_BIND_ENTRY_POINT(GetSystemHeadphonesPresent2),
#endif
// Anchors
OCULUS_BIND_ENTRY_POINT(LocateSpace),
OCULUS_BIND_ENTRY_POINT(LocateSpace2),
OCULUS_BIND_ENTRY_POINT(CreateSpatialAnchor),
OCULUS_BIND_ENTRY_POINT(DestroySpace),
OCULUS_BIND_ENTRY_POINT(SetSpaceComponentStatus),
OCULUS_BIND_ENTRY_POINT(GetSpaceComponentStatus),
OCULUS_BIND_ENTRY_POINT(EnumerateSpaceSupportedComponents),
OCULUS_BIND_ENTRY_POINT(QuerySpaces),
OCULUS_BIND_ENTRY_POINT(RetrieveSpaceQueryResults),
OCULUS_BIND_ENTRY_POINT(SaveSpace),
OCULUS_BIND_ENTRY_POINT(EraseSpace),
OCULUS_BIND_ENTRY_POINT(GetSpaceUuid),
OCULUS_BIND_ENTRY_POINT(SaveSpaceList),
OCULUS_BIND_ENTRY_POINT(ShareSpaces),
OCULUS_BIND_ENTRY_POINT(CreateSpaceUser),
OCULUS_BIND_ENTRY_POINT(DestroySpaceUser),
// Scene
OCULUS_BIND_ENTRY_POINT(GetSpaceContainer),
OCULUS_BIND_ENTRY_POINT(GetSpaceBoundingBox2D),
OCULUS_BIND_ENTRY_POINT(GetSpaceBoundingBox3D),
OCULUS_BIND_ENTRY_POINT(GetSpaceSemanticLabels),
OCULUS_BIND_ENTRY_POINT(GetSpaceRoomLayout),
OCULUS_BIND_ENTRY_POINT(GetSpaceBoundary2D),
OCULUS_BIND_ENTRY_POINT(RequestSceneCapture),
OCULUS_BIND_ENTRY_POINT(GetSpaceTriangleMesh),
// MovementSDK
OCULUS_BIND_ENTRY_POINT(GetBodyTrackingEnabled),
OCULUS_BIND_ENTRY_POINT(GetBodyTrackingSupported),
OCULUS_BIND_ENTRY_POINT(StopBodyTracking),
OCULUS_BIND_ENTRY_POINT(GetBodyState4),
OCULUS_BIND_ENTRY_POINT(GetFullBodyTrackingEnabled),
OCULUS_BIND_ENTRY_POINT(StartBodyTracking2),
OCULUS_BIND_ENTRY_POINT(RequestBodyTrackingFidelity),
OCULUS_BIND_ENTRY_POINT(ResetBodyTrackingCalibration),
OCULUS_BIND_ENTRY_POINT(SuggestBodyTrackingCalibrationOverride),
OCULUS_BIND_ENTRY_POINT(GetFaceTracking2Enabled),
OCULUS_BIND_ENTRY_POINT(GetFaceTracking2Supported),
OCULUS_BIND_ENTRY_POINT(GetFaceState2),
OCULUS_BIND_ENTRY_POINT(StartFaceTracking2),
OCULUS_BIND_ENTRY_POINT(StopFaceTracking2),
OCULUS_BIND_ENTRY_POINT(GetEyeTrackingEnabled),
OCULUS_BIND_ENTRY_POINT(GetEyeTrackingSupported),
OCULUS_BIND_ENTRY_POINT(GetEyeGazesState),
OCULUS_BIND_ENTRY_POINT(StartEyeTracking),
OCULUS_BIND_ENTRY_POINT(StopEyeTracking),
// QPL
OCULUS_BIND_ENTRY_POINT(QplMarkerStart),
OCULUS_BIND_ENTRY_POINT(QplMarkerEnd),
OCULUS_BIND_ENTRY_POINT(QplMarkerPoint),
OCULUS_BIND_ENTRY_POINT(QplMarkerPointCached),
OCULUS_BIND_ENTRY_POINT(QplMarkerAnnotation),
OCULUS_BIND_ENTRY_POINT(QplCreateMarkerHandle),
OCULUS_BIND_ENTRY_POINT(QplDestroyMarkerHandle),
OCULUS_BIND_ENTRY_POINT(OnEditorShutdown),
OCULUS_BIND_ENTRY_POINT(QplSetConsent),
// OVR_Plugin_Insight.h
OCULUS_BIND_ENTRY_POINT(InitializeInsightPassthrough),
OCULUS_BIND_ENTRY_POINT(ShutdownInsightPassthrough),
OCULUS_BIND_ENTRY_POINT(GetInsightPassthroughInitialized),
OCULUS_BIND_ENTRY_POINT(GetInsightPassthroughInitializationState),
OCULUS_BIND_ENTRY_POINT(CreateInsightTriangleMesh),
OCULUS_BIND_ENTRY_POINT(DestroyInsightTriangleMesh),
OCULUS_BIND_ENTRY_POINT(AddInsightPassthroughSurfaceGeometry),
OCULUS_BIND_ENTRY_POINT(DestroyInsightPassthroughGeometryInstance),
OCULUS_BIND_ENTRY_POINT(UpdateInsightPassthroughGeometryTransform),
OCULUS_BIND_ENTRY_POINT(SetInsightPassthroughStyle),
OCULUS_BIND_ENTRY_POINT(SetInsightPassthroughStyle2),
OCULUS_BIND_ENTRY_POINT(GetPassthroughCapabilityFlags),
OCULUS_BIND_ENTRY_POINT(CreatePassthroughColorLut),
OCULUS_BIND_ENTRY_POINT(DestroyPassthroughColorLut),
OCULUS_BIND_ENTRY_POINT(UpdatePassthroughColorLut),
OCULUS_BIND_ENTRY_POINT(GetPassthroughCapabilities),
OCULUS_BIND_ENTRY_POINT(GetPassthroughPreferences),
// OVR_Plugin_MixedReality.h
OCULUS_BIND_ENTRY_POINT(InitializeMixedReality),
OCULUS_BIND_ENTRY_POINT(ShutdownMixedReality),
OCULUS_BIND_ENTRY_POINT(GetMixedRealityInitialized),
OCULUS_BIND_ENTRY_POINT(UpdateExternalCamera),
OCULUS_BIND_ENTRY_POINT(GetExternalCameraCount),
OCULUS_BIND_ENTRY_POINT(GetExternalCameraName),
OCULUS_BIND_ENTRY_POINT(GetExternalCameraIntrinsics),
OCULUS_BIND_ENTRY_POINT(GetExternalCameraExtrinsics),
// OVR_Plugin_Media.h
OCULUS_BIND_ENTRY_POINT(Media_Initialize),
OCULUS_BIND_ENTRY_POINT(Media_Shutdown),
OCULUS_BIND_ENTRY_POINT(Media_GetInitialized),
OCULUS_BIND_ENTRY_POINT(Media_Update),
OCULUS_BIND_ENTRY_POINT(Media_GetMrcActivationMode),
OCULUS_BIND_ENTRY_POINT(Media_SetMrcActivationMode),
OCULUS_BIND_ENTRY_POINT(Media_IsMrcEnabled),
OCULUS_BIND_ENTRY_POINT(Media_IsMrcActivated),
OCULUS_BIND_ENTRY_POINT(Media_UseMrcDebugCamera),
OCULUS_BIND_ENTRY_POINT(Media_SetMrcInputVideoBufferType),
OCULUS_BIND_ENTRY_POINT(Media_GetMrcInputVideoBufferType),
OCULUS_BIND_ENTRY_POINT(Media_SetMrcFrameSize),
OCULUS_BIND_ENTRY_POINT(Media_GetMrcFrameSize),
OCULUS_BIND_ENTRY_POINT(Media_SetMrcAudioSampleRate),
OCULUS_BIND_ENTRY_POINT(Media_GetMrcAudioSampleRate),
OCULUS_BIND_ENTRY_POINT(Media_SetMrcFrameImageFlipped),
OCULUS_BIND_ENTRY_POINT(Media_GetMrcFrameImageFlipped),
OCULUS_BIND_ENTRY_POINT(Media_SetMrcFrameInverseAlpha),
OCULUS_BIND_ENTRY_POINT(Media_GetMrcFrameInverseAlpha),
OCULUS_BIND_ENTRY_POINT(Media_SetAvailableQueueIndexVulkan),
OCULUS_BIND_ENTRY_POINT(Media_EncodeMrcFrame),
OCULUS_BIND_ENTRY_POINT(Media_EncodeMrcFrameWithDualTextures),
OCULUS_BIND_ENTRY_POINT(Media_SyncMrcFrame),
OCULUS_BIND_ENTRY_POINT(Media_EncodeMrcFrameWithPoseTime),
OCULUS_BIND_ENTRY_POINT(Media_EncodeMrcFrameDualTexturesWithPoseTime),
OCULUS_BIND_ENTRY_POINT(Media_SetHeadsetControllerPose),
OCULUS_BIND_ENTRY_POINT(Media_EnumerateCameraAnchorHandles),
OCULUS_BIND_ENTRY_POINT(Media_GetCurrentCameraAnchorHandle),
OCULUS_BIND_ENTRY_POINT(Media_GetCameraAnchorName),
OCULUS_BIND_ENTRY_POINT(Media_GetCameraAnchorHandle),
OCULUS_BIND_ENTRY_POINT(Media_GetCameraAnchorType),
OCULUS_BIND_ENTRY_POINT(Media_CreateCustomCameraAnchor),
OCULUS_BIND_ENTRY_POINT(Media_DestroyCustomCameraAnchor),
OCULUS_BIND_ENTRY_POINT(Media_GetCustomCameraAnchorPose),
OCULUS_BIND_ENTRY_POINT(Media_SetCustomCameraAnchorPose),
OCULUS_BIND_ENTRY_POINT(Media_GetCameraMinMaxDistance),
OCULUS_BIND_ENTRY_POINT(Media_SetCameraMinMaxDistance),
OCULUS_BIND_ENTRY_POINT(SetControllerDrivenHandPoses),
OCULUS_BIND_ENTRY_POINT(SetControllerDrivenHandPosesAreNatural),
};
#undef OCULUS_BIND_ENTRY_POINT
bool result = true;
for (int i = 0; i < UE_ARRAY_COUNT(entryPointArray); ++i)
{
*(entryPointArray[i].EntryPointPtr) = LoadEntryPoint(LibraryHandle, entryPointArray[i].EntryPointName);
if (*entryPointArray[i].EntryPointPtr == nullptr)
{
UE_LOG(LogOculusPluginWrapper, Error, TEXT("OculusPlugin EntryPoint could not be loaded: %s"), ANSI_TO_TCHAR(entryPointArray[i].EntryPointName));
result = false;
}
}
wrapper->Initialized = true;
if (result)
{
UE_LOG(LogOculusPluginWrapper, Log, TEXT("OculusPlugin initialized successfully"));
}
else
{
DestroyOculusPluginWrapper(wrapper);
}
return result;
}
void OculusPluginWrapper::DestroyOculusPluginWrapper(OculusPluginWrapper* wrapper)
{
if (!wrapper->Initialized)
return;
wrapper->Reset();
UE_LOG(LogOculusPluginWrapper, Log, TEXT("OculusPlugin destroyed successfully"));
}
static void* LoadEntryPoint(void* Handle, const char* EntryPointName)
{
if (Handle == nullptr)
return nullptr;
#if PLATFORM_WINDOWS
void* ptr = GetProcAddress((HMODULE)Handle, EntryPointName);
if (ptr == nullptr)
{
UE_LOG(LogOculusPluginWrapper, Error, TEXT("Unable to load entry point: %s"), ANSI_TO_TCHAR(EntryPointName));
}
return ptr;
#elif PLATFORM_ANDROID
void* ptr = dlsym(Handle, EntryPointName);
if (ptr == nullptr)
{
UE_LOG(LogOculusPluginWrapper, Error, TEXT("Unable to load entry point: %s, error %s"), ANSI_TO_TCHAR(EntryPointName), ANSI_TO_TCHAR(dlerror()));
}
return ptr;
#else
UE_LOG(LogOculusPluginWrapper, Error, TEXT("LoadEntryPoint: Unsupported platform"));
return nullptr;
#endif
}