[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