[Bf-blender-cvs] [8253dc47a67] xr-world-navigation: Oculus Touch controllers support: all inputs exposed in python.

nfauvet noreply at git.blender.org
Wed May 13 16:12:56 CEST 2020


Commit: 8253dc47a67c3eebd5fc4d84b8283e0db76fde65
Author: nfauvet
Date:   Wed May 13 11:44:26 2020 +0200
Branches: xr-world-navigation
https://developer.blender.org/rB8253dc47a67c3eebd5fc4d84b8283e0db76fde65

Oculus Touch controllers support: all inputs exposed in python.

World transformation for navigation, exposed in python.
Fix: frustum culling for asymetric frustums.

===================================================================

M	intern/ghost/GHOST_Types.h
M	intern/ghost/intern/GHOST_XrContext.cpp
M	intern/ghost/intern/GHOST_XrEvent.cpp
M	intern/ghost/intern/GHOST_XrSession.cpp
M	intern/ghost/intern/GHOST_XrSession.h
M	source/blender/draw/intern/draw_manager_data.c
M	source/blender/makesrna/intern/rna_xr.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/xr/intern/wm_xr.c
M	source/blender/windowmanager/xr/intern/wm_xr_draw.c
M	source/blender/windowmanager/xr/intern/wm_xr_intern.h
M	source/blender/windowmanager/xr/intern/wm_xr_session.c

===================================================================

diff --git a/intern/ghost/GHOST_Types.h b/intern/ghost/GHOST_Types.h
index b8de31df6c6..35477a79eb5 100644
--- a/intern/ghost/GHOST_Types.h
+++ b/intern/ghost/GHOST_Types.h
@@ -654,6 +654,33 @@ typedef struct {
   void *exit_customdata;
 } GHOST_XrSessionBeginInfo;
 
+typedef struct GHOST_XrControllersDataInfo {
+  GHOST_XrPose left_pose;
+  GHOST_XrPose right_pose;
+  float left_trigger_value;
+  float right_trigger_value;
+  char left_trigger_touch;
+  char right_trigger_touch;
+  float left_grip_value;
+  float right_grip_value;
+  char left_primary_click;
+  char left_primary_touch;
+  char left_secondary_click;
+  char left_secondary_touch;
+  char right_primary_click;
+  char right_primary_touch;
+  char right_secondary_click;
+  char right_secondary_touch;
+  float left_thumbstick_x;
+  float left_thumbstick_y;
+  char left_thumbstick_click;
+  char left_thumbstick_touch;
+  float right_thumbstick_x;
+  float right_thumbstick_y;
+  char right_thumbstick_click;
+  char right_thumbstick_touch;
+} GHOST_XrControllersDataInfo;
+
 typedef struct GHOST_XrDrawViewInfo {
   int ofsx, ofsy;
   int width, height;
@@ -668,6 +695,13 @@ typedef struct GHOST_XrDrawViewInfo {
 
   /** Set if the buffer should be submitted with a srgb transfer applied. */
   char expects_srgb_buffer;
+
+  /** World transform */
+  GHOST_XrPose world_pose;
+  float world_scale;
+
+  /** Controllers poses and input states */
+  GHOST_XrControllersDataInfo controllers_data;
 } GHOST_XrDrawViewInfo;
 
 typedef struct GHOST_XrError {
diff --git a/intern/ghost/intern/GHOST_XrContext.cpp b/intern/ghost/intern/GHOST_XrContext.cpp
index 3aab420a9b6..65aa60db2ee 100644
--- a/intern/ghost/intern/GHOST_XrContext.cpp
+++ b/intern/ghost/intern/GHOST_XrContext.cpp
@@ -458,8 +458,15 @@ void GHOST_XrContext::startSession(const GHOST_XrSessionBeginInfo *begin_info)
   m_custom_funcs.session_exit_customdata = begin_info->exit_customdata;
 
   if (m_session == nullptr) {
+      if (isDebugMode()) printf("Create a new session object.\n");
     m_session = std::unique_ptr<GHOST_XrSession>(new GHOST_XrSession(this));
   }
+  else
+  {
+      if (isDebugMode()) printf("DONT Create a new session object, previous one is still != null.\n");
+  }
+
+  if (isDebugMode()) printf("Start the session.\n");
   m_session->start(begin_info);
 }
 
@@ -467,9 +474,13 @@ void GHOST_XrContext::endSession()
 {
   if (m_session) {
     if (m_session->isRunning()) {
+      if (isDebugMode())
+        printf("Request Session End.\n");
       m_session->requestEnd();
     }
     else {
+      if (isDebugMode())
+        printf("Session state is IDLE, destroying it.\n");
       m_session = nullptr;
     }
   }
@@ -491,7 +502,7 @@ void GHOST_XrContext::drawSessionViews(void *draw_customdata)
 void GHOST_XrContext::handleSessionStateChange(const XrEventDataSessionStateChanged *lifecycle)
 {
   if (m_session &&
-      m_session->handleStateChangeEvent(lifecycle) == GHOST_XrSession::SESSION_DESTROY) {
+      m_session->handleStateChangeEvent(lifecycle, isDebugMode()) == GHOST_XrSession::SESSION_DESTROY) {
     m_session = nullptr;
   }
 }
diff --git a/intern/ghost/intern/GHOST_XrEvent.cpp b/intern/ghost/intern/GHOST_XrEvent.cpp
index 30005055f9b..d9a8ae59f62 100644
--- a/intern/ghost/intern/GHOST_XrEvent.cpp
+++ b/intern/ghost/intern/GHOST_XrEvent.cpp
@@ -24,13 +24,37 @@
 #include "GHOST_XrContext.h"
 #include "GHOST_Xr_intern.h"
 
-static bool GHOST_XrEventPollNext(XrInstance instance, XrEventDataBuffer &r_event_data)
+static bool GHOST_XrEventPollNext(XrInstance instance, XrEventDataBuffer &r_event_data, bool debug)
 {
   /* (Re-)initialize as required by specification. */
   r_event_data.type = XR_TYPE_EVENT_DATA_BUFFER;
   r_event_data.next = nullptr;
 
-  return (xrPollEvent(instance, &r_event_data) == XR_SUCCESS);
+  XrResult result = xrPollEvent(instance, &r_event_data);
+  bool success = (result == XR_SUCCESS);
+  if (!success) {
+    switch (result) {
+      case XR_EVENT_UNAVAILABLE:
+        /* printf("FAIL Event received: XR_EVENT_UNAVAILABLE\n"); // spammy, no print here, we have this event every time nothing gets polled. */
+        break;
+      case XR_ERROR_INSTANCE_LOST:
+        if (debug) printf("POLL Fail Event received: XR_ERROR_INSTANCE_LOST\n");
+        break;
+      case XR_ERROR_RUNTIME_FAILURE:
+        if (debug) printf("POLL Fail Event received: XR_ERROR_RUNTIME_FAILURE\n");
+        break;
+      case XR_ERROR_HANDLE_INVALID:
+        if (debug) printf("POLL Fail Event received: XR_ERROR_HANDLE_INVALID\n");
+        break;
+      case XR_ERROR_VALIDATION_FAILURE:
+        if (debug) printf("POLL Fail Event received: XR_ERROR_VALIDATION_FAILURE\n");
+        break;
+      default:
+          if (debug) printf("POLL Fail Event received(should not happen): %i\n", result);
+          break;
+    }
+  }
+  return success;
 }
 
 GHOST_TSuccess GHOST_XrEventsHandle(GHOST_XrContextHandle xr_contexthandle)
@@ -42,21 +66,90 @@ GHOST_TSuccess GHOST_XrEventsHandle(GHOST_XrContextHandle xr_contexthandle)
     return GHOST_kFailure;
   }
 
-  while (GHOST_XrEventPollNext(xr_context->getInstance(), event_buffer)) {
+  while (GHOST_XrEventPollNext(xr_context->getInstance(), event_buffer, xr_context->isDebugMode())) {
     XrEventDataBaseHeader *event = (XrEventDataBaseHeader *)&event_buffer;
 
     switch (event->type) {
-      case XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED:
-        xr_context->handleSessionStateChange((XrEventDataSessionStateChanged *)event);
-        return GHOST_kSuccess;
-      case XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING:
+        /*
+        XR_TYPE_EVENT_DATA_EVENTS_LOST                          (XrEventDataEventsLost *)event                     .lostEventCount = number of removed events because of overflow of events.
+        XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING                (XrEventDataInstanceLossPending *)event            .lossTime = application if about to loose the instance (occurs when software updates)
+        XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED          (XrEventDataInteractionProfileChanged *)event      .session = bla bla bla
+        XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING       (XrEventDataReferenceSpaceChangePending *)event    quand on recentre la vue. la struct contient la pose dans le precedent espace et le temps avant que l'api retourne des poses dans le nouvel espace.
+        XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED                (XrEventDataSessionStateChanged *)event            lifecycle change of an XrSession, with a new XrSessionState
+        XR_TYPE_EVENT_DATA_PERF_SETTINGS_EXT                    (...)
+        XR_TYPE_EVENT_DATA_VISIBILITY_MASK_CHANGED_KHR          (...)
+        XR_TYPE_EVENT_DATA_MAIN_SESSION_VISIBILITY_CHANGED_EXTX (...)
+        */
+      case XR_TYPE_EVENT_DATA_EVENTS_LOST: 
+      {
+        if (xr_context->isDebugMode())
+        {
+            XrEventDataEventsLost* e = (XrEventDataEventsLost*)event;
+            printf("Event XR_TYPE_EVENT_DATA_EVENTS_LOST received. LostEventCount = %d\n", e->lostEventCount);
+        }
+        return GHOST_kFailure;
+      }
+      case XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED: 
+      {
+          if (xr_context->isDebugMode())
+          {
+              printf("Event XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED => ");
+          }
+          xr_context->handleSessionStateChange((XrEventDataSessionStateChanged *)event);
+          return GHOST_kSuccess;
+      }
+      case XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED: 
+      {
+        if (xr_context->isDebugMode())
+        {
+            XrEventDataInteractionProfileChanged *e = (XrEventDataInteractionProfileChanged *)event;
+            printf("Event XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED received.\n");
+        }
+        return GHOST_kFailure;
+      }
+      case XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING: 
+      {
+        if (xr_context->isDebugMode())
+        {
+            XrEventDataReferenceSpaceChangePending *e = (XrEventDataReferenceSpaceChangePending *)event;
+            printf("Event XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING received.\n");
+        }
+        return GHOST_kFailure;
+      }
+      case XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING: 
+      {
+        if (xr_context->isDebugMode())
+        {
+            XrEventDataInstanceLossPending *e = (XrEventDataInstanceLossPending *)event;
+            printf("Event XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING received. LossTime: %d\n", e->lossTime);
+        }
         GHOST_XrContextDestroy(xr_contexthandle);
         return GHOST_kSuccess;
-      default:
-        if (xr_context->isDebugMode()) {
-          printf("Unhandled event: %i\n", event->type);
+      }
+      case XR_TYPE_EVENT_DATA_PERF_SETTINGS_EXT:
+      {
+          if (xr_context->isDebugMode())
+          {
+              printf("Event XR_TYPE_EVENT_DATA_PERF_SETTINGS_EXT received.\n");
+          }
+          return GHOST_kFailure;
+      }
+      case XR_TYPE_EVENT_DATA_VISIBILITY_MASK_CHANGED_KHR:
+      {
+          if (xr_context->isDebugMode())
+          {
+              printf("Event XR_TYPE_EVENT_DATA_VISIBILITY_MASK_CHANGED_KHR received.\n");
+          }
+          return GHOST_kFailure;
+      }
+      default: 
+      {
+        if (xr_context->isDebugMode()) 
+        {
+            printf("Unhandled event: %i\n", event->type);
         }
         return GHOST_kFailure;
+      }
     }
   }
 
diff --git a/intern/ghost/intern/GHOST_XrSession.cpp b/intern/ghost/intern/GHOST_XrSession.cpp
index edc4960cf32..acda88866d5 100644
--- a/intern/ghost/intern/GHOST_XrSession.cpp
+++ b/intern/ghost/intern/GHOST_XrSession.cpp
@@ -35,6 +35,45 @@
 
 #include "GHOST_XrSession.h"
 
+/** Oculus Touch OpenXR profile data */
+struct OculusTouchProfile {
+  bool valid;
+
+  XrActionSet actionSet;
+  XrPath handPaths[2];
+  XrSpace handSpaces[2];
+
+  /* Common actions for each hands */
+  XrAction squeezeValueAction;
+  XrAction triggerValueAction;
+  XrAction triggerTouchAction;
+  XrAction thumbstickXAction;
+  XrAction thumbstickYAction;
+  XrAction thumbstickClickAction;
+  XrAction thumbstickTouchAction;
+  XrAction thumbrestTouchAction;
+  XrAction gripPoseAc

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list