// Copyright PICO Technology Co., Ltd. All rights reserved. // This plugin incorporates portions of the UnrealĀ® Engine. UnrealĀ® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere. // Copyright Epic Games, Inc. All Rights Reserved. #include "PXR_PluginWrapper.h" #include "PXR_HMDModule.h" #if PLATFORM_ANDROID #include #endif DEFINE_LOG_CATEGORY(LogPICOPluginWrapper); static void* LoadEntryPoint(void* handle, const char* EntryPointName); bool InitializePICOPluginWrapper(PICOPluginWrapper* wrapper) { if (wrapper->Initialized) { UE_LOG(LogPICOPluginWrapper, Warning, TEXT("wrapper already initialized")); return true; } #if PICO_HMD_SUPPORTED_PLATFORMS void* LibraryHandle = nullptr; #if PLATFORM_ANDROID const bool VersionValid = FAndroidMisc::GetAndroidBuildVersion() > 23; #else const bool VersionValid = true; #endif if (VersionValid) { LibraryHandle = FPICOXRHMDModule::GetPVRPluginHandle(); if (LibraryHandle == nullptr) { UE_LOG(LogPICOPluginWrapper, Warning, TEXT("GetPVRPluginHandle() returned NULL")); return false; } } else { return false; } #else return false; #endif struct PICOEntryPoint { const char* EntryPointName; void** EntryPointPtr; }; #define PICO_BIND_ENTRY_POINT(Func) { "Pxr_"#Func, (void**)&wrapper->Func } PICOEntryPoint entryPointArray[] = { // PXRPlugin.h PICO_BIND_ENTRY_POINT(SetGraphicOption), PICO_BIND_ENTRY_POINT(SetPlatformOption), PICO_BIND_ENTRY_POINT(IsInitialized), PICO_BIND_ENTRY_POINT(SetInitializeData), PICO_BIND_ENTRY_POINT(Initialize), PICO_BIND_ENTRY_POINT(Shutdown), PICO_BIND_ENTRY_POINT(GetDeviceExtensionsVk), PICO_BIND_ENTRY_POINT(GetInstanceExtensionsVk), PICO_BIND_ENTRY_POINT(CreateVulkanSystem), PICO_BIND_ENTRY_POINT(GetFeatureSupported), PICO_BIND_ENTRY_POINT(CreateLayer), PICO_BIND_ENTRY_POINT(GetLayerImageCount), PICO_BIND_ENTRY_POINT(GetLayerImageExt), PICO_BIND_ENTRY_POINT(GetLayerImage), PICO_BIND_ENTRY_POINT(GetLayerNextImageIndex), PICO_BIND_ENTRY_POINT(GetLayerFoveationImage), PICO_BIND_ENTRY_POINT(DestroyLayer), PICO_BIND_ENTRY_POINT(IsRunning), PICO_BIND_ENTRY_POINT(BeginXr), PICO_BIND_ENTRY_POINT(EndXr), PICO_BIND_ENTRY_POINT(GetPredictedDisplayTime), PICO_BIND_ENTRY_POINT(GetPredictedMainSensorState), PICO_BIND_ENTRY_POINT(GetPredictedMainSensorState2), PICO_BIND_ENTRY_POINT(GetPredictedMainSensorStateWithEyePose), PICO_BIND_ENTRY_POINT(ResetSensor), PICO_BIND_ENTRY_POINT(WaitFrame), PICO_BIND_ENTRY_POINT(BeginFrame), PICO_BIND_ENTRY_POINT(SubmitLayer), PICO_BIND_ENTRY_POINT(SubmitLayer2), PICO_BIND_ENTRY_POINT(EndFrame), PICO_BIND_ENTRY_POINT(GetDeviceName), PICO_BIND_ENTRY_POINT(PollEvent), PICO_BIND_ENTRY_POINT(LogPrint), PICO_BIND_ENTRY_POINT(GetFov), PICO_BIND_ENTRY_POINT(GetFrustum), PICO_BIND_ENTRY_POINT(SetPerformanceLevels), PICO_BIND_ENTRY_POINT(GetPerformanceLevels), PICO_BIND_ENTRY_POINT(SetColorSpace), PICO_BIND_ENTRY_POINT(GetFoveationLevel), PICO_BIND_ENTRY_POINT(SetFoveationLevel), PICO_BIND_ENTRY_POINT(SetFoveationParams), PICO_BIND_ENTRY_POINT(SetTrackingMode), PICO_BIND_ENTRY_POINT(GetTrackingMode), PICO_BIND_ENTRY_POINT(GetEyeTrackingData), PICO_BIND_ENTRY_POINT(GetFaceTrackingData), PICO_BIND_ENTRY_POINT(SetTrackingOrigin), PICO_BIND_ENTRY_POINT(GetTrackingOrigin), PICO_BIND_ENTRY_POINT(GetIPD), PICO_BIND_ENTRY_POINT(GetEyeOrientation), PICO_BIND_ENTRY_POINT(GetAppHasFocus), PICO_BIND_ENTRY_POINT(GetConfigInt), PICO_BIND_ENTRY_POINT(GetConfigFloat), PICO_BIND_ENTRY_POINT(SetConfigFloatArray), PICO_BIND_ENTRY_POINT(SetConfigInt), PICO_BIND_ENTRY_POINT(SetConfigString), PICO_BIND_ENTRY_POINT(SetConfigUint64), PICO_BIND_ENTRY_POINT(GetBoundaryConfigured), PICO_BIND_ENTRY_POINT(GetBoundaryEnabled), PICO_BIND_ENTRY_POINT(SetBoundaryVisible), PICO_BIND_ENTRY_POINT(SetSeeThroughBackground), PICO_BIND_ENTRY_POINT(GetBoundaryVisible), PICO_BIND_ENTRY_POINT(TestNodeIsInBoundary), PICO_BIND_ENTRY_POINT(TestPointIsInBoundary), PICO_BIND_ENTRY_POINT(GetBoundaryGeometry), PICO_BIND_ENTRY_POINT(GetBoundaryDimensions), PICO_BIND_ENTRY_POINT(EnableMultiview), PICO_BIND_ENTRY_POINT(GetExternalCameraInfo), PICO_BIND_ENTRY_POINT(GetExternalCameraPose), PICO_BIND_ENTRY_POINT(SetIsSupportMovingMrc), PICO_BIND_ENTRY_POINT(SetSensorLostCustomMode), PICO_BIND_ENTRY_POINT(SetSensorLostCMST), PICO_BIND_ENTRY_POINT(GetDisplayRefreshRatesAvailable), PICO_BIND_ENTRY_POINT(SetDisplayRefreshRate), PICO_BIND_ENTRY_POINT(GetDisplayRefreshRate), PICO_BIND_ENTRY_POINT(SetExtraLatencyMode), PICO_BIND_ENTRY_POINT(getPsensorState), PICO_BIND_ENTRY_POINT(GetControllerCapabilities), PICO_BIND_ENTRY_POINT(GetControllerConnectStatus), PICO_BIND_ENTRY_POINT(GetControllerTrackingState), PICO_BIND_ENTRY_POINT(GetControllerInputState), PICO_BIND_ENTRY_POINT(SetControllerVibration), PICO_BIND_ENTRY_POINT(SetControllerVibrationEvent), PICO_BIND_ENTRY_POINT(SetControllerEnableKey), PICO_BIND_ENTRY_POINT(SetControllerMainInputHandle), PICO_BIND_ENTRY_POINT(GetControllerMainInputHandle), PICO_BIND_ENTRY_POINT(StopControllerVCMotor), PICO_BIND_ENTRY_POINT(StartControllerVCMotor), PICO_BIND_ENTRY_POINT(SetControllerAmp), PICO_BIND_ENTRY_POINT(SetControllerDelay), PICO_BIND_ENTRY_POINT(GetVibrateDelayTime), PICO_BIND_ENTRY_POINT(StartVibrateBySharemF), PICO_BIND_ENTRY_POINT(StartVibrateBySharemU), PICO_BIND_ENTRY_POINT(StartVibrateByCache), PICO_BIND_ENTRY_POINT(ClearVibrateByCache), PICO_BIND_ENTRY_POINT(StartVibrateByPHF), PICO_BIND_ENTRY_POINT(PauseVibrate), PICO_BIND_ENTRY_POINT(ResumeVibrate), PICO_BIND_ENTRY_POINT(UpdateVibrateParams), PICO_BIND_ENTRY_POINT(CreateHapticStream), PICO_BIND_ENTRY_POINT(WriteHapticStream), PICO_BIND_ENTRY_POINT(SetPHFHapticSpeed), PICO_BIND_ENTRY_POINT(GetPHFHapticSpeed), PICO_BIND_ENTRY_POINT(GetCurrentFrameSequence), PICO_BIND_ENTRY_POINT(StartPHFHaptic), PICO_BIND_ENTRY_POINT(StopPHFHaptic), PICO_BIND_ENTRY_POINT(RemovePHFHaptic), PICO_BIND_ENTRY_POINT(SetAppHandTrackingEnabled), PICO_BIND_ENTRY_POINT(GetHandTrackerSettingState), PICO_BIND_ENTRY_POINT(GetHandTrackerActiveInputType), PICO_BIND_ENTRY_POINT(GetHandTrackerJointLocations), PICO_BIND_ENTRY_POINT(GetHandTrackerAimState), PICO_BIND_ENTRY_POINT(GetHandTrackerAimStateWithPTFG), PICO_BIND_ENTRY_POINT(GetHandTrackerJointLocationsWithPTFG), PICO_BIND_ENTRY_POINT(GetHandTrackerAimStateWithPT), PICO_BIND_ENTRY_POINT(GetHandTrackerJointLocationsWithPT), PICO_BIND_ENTRY_POINT(GetHandTrackerHandScale), PICO_BIND_ENTRY_POINT(ResetController), PICO_BIND_ENTRY_POINT(SetArmModelParameters), PICO_BIND_ENTRY_POINT(LogSdkApi), PICO_BIND_ENTRY_POINT(GetControllerHandness), //----------------Body Tracking------- PICO_BIND_ENTRY_POINT(SetBodyTrackingStaticCalibState), PICO_BIND_ENTRY_POINT(SetBodyTrackingMode), PICO_BIND_ENTRY_POINT(GetBodyTrackingPose), PICO_BIND_ENTRY_POINT(GetBodyTrackingImuData), PICO_BIND_ENTRY_POINT(GetFitnessBandConnectState), PICO_BIND_ENTRY_POINT(GetFitnessBandBattery), PICO_BIND_ENTRY_POINT(GetFitnessBandCalibState), PICO_BIND_ENTRY_POINT(SetBodyTrackingAlgParam), //----------------Body Tracking------- //----------------Eye Tracking------- PICO_BIND_ENTRY_POINT(WantEyeTrackingService), PICO_BIND_ENTRY_POINT(GetEyeTrackingSupported), PICO_BIND_ENTRY_POINT(StartEyeTracking1), PICO_BIND_ENTRY_POINT(StopEyeTracking1), PICO_BIND_ENTRY_POINT(GetEyeTrackingState), PICO_BIND_ENTRY_POINT(GetEyeTrackingData1), PICO_BIND_ENTRY_POINT(GetEyeOpenness), PICO_BIND_ENTRY_POINT(GetEyePupilInfo), PICO_BIND_ENTRY_POINT(GetPerEyePose), PICO_BIND_ENTRY_POINT(GetEyeBlink), //----------------Eye Tracking------- //----------------Face Tracking------- PICO_BIND_ENTRY_POINT(WantFaceTrackingService), PICO_BIND_ENTRY_POINT(GetFaceTrackingSupported), PICO_BIND_ENTRY_POINT(StartFaceTracking), PICO_BIND_ENTRY_POINT(StopFaceTracking), PICO_BIND_ENTRY_POINT(GetFaceTrackingState), PICO_BIND_ENTRY_POINT(GetFaceTrackingData1), //----------------Face Tracking------- //----------------New Body Tracking------- PICO_BIND_ENTRY_POINT(WantBodyTrackingService), PICO_BIND_ENTRY_POINT(GetBodyTrackingSupported), PICO_BIND_ENTRY_POINT(StartBodyTracking), PICO_BIND_ENTRY_POINT(StopBodyTracking), PICO_BIND_ENTRY_POINT(GetBodyTrackingState), PICO_BIND_ENTRY_POINT(GetBodyTrackingData), PICO_BIND_ENTRY_POINT(StartBodyTrackingCalibApp), //----------------New Body Tracking------- //----------------Standalone Tracker------ PICO_BIND_ENTRY_POINT(GetMotionTrackerConnectState), PICO_BIND_ENTRY_POINT(GetMotionTrackerType), PICO_BIND_ENTRY_POINT(GetMotionTrackerMode), PICO_BIND_ENTRY_POINT(GetMotionTrackerLocations), PICO_BIND_ENTRY_POINT(GetMotionTrackerLocationsWithConfidence), PICO_BIND_ENTRY_POINT(CheckMotionTrackerModeAndNumber), //----------------Standalone Tracker------ //----------------ExtDevTracker---------------- PICO_BIND_ENTRY_POINT(GetExtDevTrackerConnectState), PICO_BIND_ENTRY_POINT(SetExtDevTrackerMotorVibrate), PICO_BIND_ENTRY_POINT(SetExtDevTrackerPassDataState), PICO_BIND_ENTRY_POINT(SetExtDevTrackerByPassData), PICO_BIND_ENTRY_POINT(GetExtDevTrackerByPassData), PICO_BIND_ENTRY_POINT(GetExtDevTrackerBattery), PICO_BIND_ENTRY_POINT(GetExtDevTrackerKeyData), //----------------ExtDevTracker---------------- //----------------MR------- PICO_BIND_ENTRY_POINT(CreateAnchorEntity), PICO_BIND_ENTRY_POINT(DestroyAnchorEntity), PICO_BIND_ENTRY_POINT(GetAnchorPose), PICO_BIND_ENTRY_POINT(GetAnchorEntityUuid), PICO_BIND_ENTRY_POINT(GetAnchorComponentFlags), PICO_BIND_ENTRY_POINT(GetAnchorSceneLabel), PICO_BIND_ENTRY_POINT(GetAnchorPlaneBoundaryInfo), PICO_BIND_ENTRY_POINT(GetAnchorPlanePolygonInfo), PICO_BIND_ENTRY_POINT(GetAnchorBoxInfo), PICO_BIND_ENTRY_POINT(PersistAnchorEntity), PICO_BIND_ENTRY_POINT(UnpersistAnchorEntity), PICO_BIND_ENTRY_POINT(ClearPersistedAnchorEntity), PICO_BIND_ENTRY_POINT(LoadAnchorEntity), PICO_BIND_ENTRY_POINT(GetAnchorEntityLoadResults), PICO_BIND_ENTRY_POINT(StartSpatialSceneCapture), //----------------MR------- //----------------MR 3.0------- /* * future ext */ PICO_BIND_ENTRY_POINT(PollFutureEXT), PICO_BIND_ENTRY_POINT(PollFutureWithProgress), /* * mr sdk 3.0 */ PICO_BIND_ENTRY_POINT(CreateSenseDataProvider), PICO_BIND_ENTRY_POINT(StartSenseDataProviderAsync), PICO_BIND_ENTRY_POINT(StartSenseDataProviderComplete), PICO_BIND_ENTRY_POINT(GetSenseDataProviderState), PICO_BIND_ENTRY_POINT(QuerySenseDataComplete), PICO_BIND_ENTRY_POINT(DestroySenseDataQueryResult), PICO_BIND_ENTRY_POINT(StopSenseDataProvider), PICO_BIND_ENTRY_POINT(DestroySenseDataProvider), PICO_BIND_ENTRY_POINT(QuerySenseDataAsync), PICO_BIND_ENTRY_POINT(GetQueriedSenseData), PICO_BIND_ENTRY_POINT(GetSpatialEntityUuid), PICO_BIND_ENTRY_POINT(EnumerateSpatialEntityComponentTypes), PICO_BIND_ENTRY_POINT(GetSpatialEntityComponentInfo), PICO_BIND_ENTRY_POINT(RetrieveSpatialEntityAnchor), PICO_BIND_ENTRY_POINT(DestroyAnchor), PICO_BIND_ENTRY_POINT(GetAnchorUuid), PICO_BIND_ENTRY_POINT(LocateAnchor), PICO_BIND_ENTRY_POINT(CreateSpatialAnchorAsync), PICO_BIND_ENTRY_POINT(CreateSpatialAnchorComplete), PICO_BIND_ENTRY_POINT(PersistSpatialAnchorAsync), PICO_BIND_ENTRY_POINT(PersistSpatialAnchorComplete), PICO_BIND_ENTRY_POINT(UnpersistSpatialAnchorAsync), PICO_BIND_ENTRY_POINT(UnpersistSpatialAnchorComplete), /** * mr sdk 3.0 scene capture */ PICO_BIND_ENTRY_POINT(StartSceneCaptureAsync), PICO_BIND_ENTRY_POINT(StartSceneCaptureComplete), /* * mr sdk 3.0 cloud anchor */ PICO_BIND_ENTRY_POINT(ShareSpatialAnchorAsync), PICO_BIND_ENTRY_POINT(ShareSpatialAnchorComplete), PICO_BIND_ENTRY_POINT(DownloadSharedSpatialAnchorAsync), PICO_BIND_ENTRY_POINT(DownloadSharedSpatialAnchorComplete), //----------------MR 3.0------- //----------------ETFR------- PICO_BIND_ENTRY_POINT(GetEyeTrackingFoveationRenderingSupported), PICO_BIND_ENTRY_POINT(GetEyeTrackingFoveationRenderingState), PICO_BIND_ENTRY_POINT(SetEyeTrackingFoveationRenderingState), PICO_BIND_ENTRY_POINT(GetEyeTrackingFoveationRenderingCenter), //----------------ETFR------- //----------------Adaptive Resolution------- PICO_BIND_ENTRY_POINT(UpdateAdaptiveResolution), //----------------Adaptive Resolution------- }; #undef PICO_BIND_ENTRY_POINT #if PLATFORM_WINDOWS && WITH_EDITOR bool result = true; for (int i = 0; i < UE_ARRAY_COUNT(entryPointArray); ++i) { *(entryPointArray[i].EntryPointPtr) = LoadEntryPoint(LibraryHandle, entryPointArray[i].EntryPointName); } return result; #else 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 == NULL) { //UE_LOG(LogPICOPluginWrapper, Error, TEXT("PICOPlugin EntryPoint could not be loaded: %hs"), ANSI_TO_TCHAR(entryPointArray[i].EntryPointName)); result = false; } } if (result) { UE_LOG(LogPICOPluginWrapper, Log, TEXT("PICOPlugin initialized successfully")); } else { DestroyPICOPluginWrapper(wrapper); } wrapper->Initialized=result; return result; #endif } void DestroyPICOPluginWrapper(PICOPluginWrapper* wrapper) { if (!wrapper->Initialized) { return; } wrapper->Reset(); UE_LOG(LogPICOPluginWrapper, Log, TEXT("PICOPlugin destroyed successfully")); } static void* LoadEntryPoint(void* Handle, const char* EntryPointName) { if (Handle == nullptr) { return nullptr; } #if PLATFORM_WINDOWS && WITH_EDITOR void* ptr=reinterpret_cast(GetProcAddress((HMODULE)Handle, EntryPointName)); return ptr; #elif PLATFORM_ANDROID void* ptr = dlsym(Handle, EntryPointName); if (ptr == nullptr) { UE_LOG(LogPICOPluginWrapper, Error, TEXT("Unable to load entry point: %s, error %s"), ANSI_TO_TCHAR(EntryPointName), ANSI_TO_TCHAR(dlerror())); } return ptr; #else UE_LOG(LogPICOPluginWrapper, Error, TEXT("LoadEntryPoint: Unsupported platform")); return nullptr; #endif }