From 89cdacaf880b8b90061c197ae3bcbf30a4866de5 Mon Sep 17 00:00:00 2001
From: Sebastian Pape <pape@vr.rwth-aachen.de>
Date: Thu, 26 Aug 2021 15:43:35 +0200
Subject: [PATCH] Implementing interpupillary distance in
 VirtualRealityUtilities for HMDs

---
 .../Private/Utility/VirtualRealityUtilities.cpp | 17 ++++++++++++++---
 .../Public/Utility/VirtualRealityUtilities.h    |  1 +
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/Source/RWTHVRToolkit/Private/Utility/VirtualRealityUtilities.cpp b/Source/RWTHVRToolkit/Private/Utility/VirtualRealityUtilities.cpp
index 83caec4b..799dcfa2 100644
--- a/Source/RWTHVRToolkit/Private/Utility/VirtualRealityUtilities.cpp
+++ b/Source/RWTHVRToolkit/Private/Utility/VirtualRealityUtilities.cpp
@@ -12,11 +12,13 @@
 
 #include "Engine/Engine.h"
 #include "IXRTrackingSystem.h"
+#include "IHeadMountedDisplay.h"
 
 bool UVirtualRealityUtilities::IsDesktopMode()
 {
 	return !IsRoomMountedMode() && !IsHeadMountedMode();
 }
+
 bool UVirtualRealityUtilities::IsRoomMountedMode()
 {
 #if PLATFORM_SUPPORTS_NDISPLAY
@@ -25,6 +27,7 @@ bool UVirtualRealityUtilities::IsRoomMountedMode()
 	return false;
 #endif
 }
+
 bool UVirtualRealityUtilities::IsHeadMountedMode()
 {
 	return GEngine->XRSystem.IsValid() && GEngine->XRSystem->IsHeadTrackingAllowed();
@@ -101,14 +104,22 @@ FString UVirtualRealityUtilities::GetNodeName()
 	return FString(TEXT("Localhost"));
 #endif
 }
+
 float UVirtualRealityUtilities::GetEyeDistance()
 {
+	if(IsHeadMountedMode())
+	{
+	    return GEngine->XRSystem->GetHMDDevice()->GetInterpupillaryDistance();
+	}
+    else
+	{
 #if PLATFORM_SUPPORTS_NDISPLAY
-	ADisplayClusterRootActor* RootActor = IDisplayCluster::Get().GetGameMgr()->GetRootActor();
-	return (RootActor) ? RootActor->GetDefaultCamera()->GetInterpupillaryDistance() : 0;
+	    ADisplayClusterRootActor* RootActor = IDisplayCluster::Get().GetGameMgr()->GetRootActor();
+	    return (RootActor) ? RootActor->GetDefaultCamera()->GetInterpupillaryDistance() : 0.0f;
 #else
-	return 0;
+	    return 0.0f;
 #endif
+	}
 }
 
 EEyeStereoOffset UVirtualRealityUtilities::GetNodeEyeType()
diff --git a/Source/RWTHVRToolkit/Public/Utility/VirtualRealityUtilities.h b/Source/RWTHVRToolkit/Public/Utility/VirtualRealityUtilities.h
index ac1d1872..23689665 100644
--- a/Source/RWTHVRToolkit/Public/Utility/VirtualRealityUtilities.h
+++ b/Source/RWTHVRToolkit/Public/Utility/VirtualRealityUtilities.h
@@ -52,6 +52,7 @@ public:
 	UFUNCTION(BlueprintPure, Category = "DisplayCluster") static bool IsSlave();
 
 	UFUNCTION(BlueprintPure, Category = "DisplayCluster") static FString GetNodeName();
+	/* Distance in meters */
 	UFUNCTION(BlueprintPure, Category = "DisplayCluster") static float GetEyeDistance();
 
 	UFUNCTION(BlueprintPure, Category = "DisplayCluster") static EEyeStereoOffset GetNodeEyeType();
-- 
GitLab