From 17200c245a58b58f2b30dc4b63f8b497f18ef8f0 Mon Sep 17 00:00:00 2001
From: Tobias Frisch <tfrisch@uni-koblenz.de>
Date: Sun, 1 Sep 2024 04:22:05 +0200
Subject: [PATCH] Create XR space for controller

Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de>
---
 .../vkcv/camera/XRCameraController.hpp        |  1 +
 .../src/vkcv/camera/XRCameraController.cpp    | 44 ++++++++++++++++---
 2 files changed, 40 insertions(+), 5 deletions(-)

diff --git a/modules/camera/include/vkcv/camera/XRCameraController.hpp b/modules/camera/include/vkcv/camera/XRCameraController.hpp
index 9b51b4ee..d11e7d2f 100644
--- a/modules/camera/include/vkcv/camera/XRCameraController.hpp
+++ b/modules/camera/include/vkcv/camera/XRCameraController.hpp
@@ -25,6 +25,7 @@ namespace vkcv::camera {
         XrInstance m_instance;
         XrSystemId m_system_id;
         XrSession m_session;
+        XrSpace m_space;
 
     public:
 
diff --git a/modules/camera/src/vkcv/camera/XRCameraController.cpp b/modules/camera/src/vkcv/camera/XRCameraController.cpp
index 57109a31..4e9f5d6a 100644
--- a/modules/camera/src/vkcv/camera/XRCameraController.cpp
+++ b/modules/camera/src/vkcv/camera/XRCameraController.cpp
@@ -6,12 +6,10 @@ namespace vkcv::camera {
   XRCameraController::XRCameraController() :
     m_instance(XR_NULL_HANDLE),
     m_system_id(XR_NULL_SYSTEM_ID),
-    m_session(XR_NULL_HANDLE)
+    m_session(XR_NULL_HANDLE),
+    m_space(XR_NULL_HANDLE)
   {
     XrInstanceCreateInfo instanceInfo {XR_TYPE_INSTANCE_CREATE_INFO};
-    instanceInfo.next = nullptr;
-    instanceInfo.enabledExtensionCount = 0;
-    instanceInfo.enabledExtensionNames = nullptr;
 
     strcpy(instanceInfo.applicationInfo.applicationName, VKCV_FRAMEWORK_NAME);
 
@@ -27,15 +25,26 @@ namespace vkcv::camera {
     }
 
     XrSessionCreateInfo sessionInfo {XR_TYPE_SESSION_CREATE_INFO};
-    sessionInfo.next = nullptr;
     sessionInfo.systemId = m_system_id;
 
     if (XR_SUCCESS != xrCreateSession(m_instance, &sessionInfo, &m_session)) {
       vkcv::log(vkcv::LogLevel::ERROR, "Creating an XR session failed");
     }
+
+    XrReferenceSpaceCreateInfo spaceInfo {XR_TYPE_REFERENCE_SPACE_CREATE_INFO};
+    spaceInfo.poseInReferenceSpace.orientation.w = 1.0f;
+    spaceInfo.referenceSpaceType = XR_REFERENCE_SPACE_TYPE_LOCAL;
+
+    if (XR_SUCCESS != xrCreateReferenceSpace(m_session, &spaceInfo, &m_space)) {
+      vkcv::log(vkcv::LogLevel::ERROR, "Creating an XR space failed");
+    }
   }
 
   XRCameraController::~XRCameraController() {
+    if (m_space) {
+      xrDestroySpace(m_space);
+    }
+
     if (m_session) {
       xrDestroySession(m_session);
     }
@@ -46,6 +55,31 @@ namespace vkcv::camera {
   }
 
   void XRCameraController::updateCamera(double deltaTime, Camera &camera) {
+    std::vector<XrView> views;
+
+    XrViewState viewState {XR_TYPE_VIEW_STATE};
+    const uint32_t viewCapacity = views.size();
+    uint32_t viewCount;
+
+    XrViewLocateInfo viewInfo {XR_TYPE_VIEW_LOCATE_INFO};
+    viewInfo.viewConfigurationType = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO;
+    viewInfo.space = m_space;
+
+    XrResult result = xrLocateViews(
+      m_session,
+      &viewInfo,
+      &viewState,
+      &viewCount,
+      views.data()
+    );
+
+    if ((XR_SUCCESS != result) || 
+        ((viewState.viewStateFlags & XR_VIEW_STATE_POSITION_VALID_BIT) == 0) ||
+        ((viewState.viewStateFlags & XR_VIEW_STATE_ORIENTATION_VALID_BIT) == 0)) {
+      vkcv::log(vkcv::LogLevel::WARNING, "Unable to locate XR views");
+      return;
+    }
+
     // TODO
   }
 
-- 
GitLab