[Bf-blender-cvs] [16af40c] HMD_viewport: Send an event when a HMD was plugged in/out
Julian Eisel
noreply at git.blender.org
Sun Apr 10 19:18:39 CEST 2016
Commit: 16af40cc36b72171ff741083a7b107ba6708ae57
Author: Julian Eisel
Date: Sun Apr 10 18:57:54 2016 +0200
Branches: HMD_viewport
https://developer.blender.org/rB16af40cc36b72171ff741083a7b107ba6708ae57
Send an event when a HMD was plugged in/out
It's not used for now, will commit separately.
===================================================================
M intern/ghost/GHOST_Types.h
M intern/ghost/intern/GHOST_EventOpenHMD.h
M intern/ghost/intern/GHOST_OpenHMDManager.cpp
M source/blender/windowmanager/intern/wm_event_system.c
M source/blender/windowmanager/intern/wm_operators.c
M source/blender/windowmanager/wm_event_types.h
===================================================================
diff --git a/intern/ghost/GHOST_Types.h b/intern/ghost/GHOST_Types.h
index 381b339..1eeb69b 100644
--- a/intern/ghost/GHOST_Types.h
+++ b/intern/ghost/GHOST_Types.h
@@ -517,8 +517,14 @@ typedef struct {
char utf8_buf[6];
} GHOST_TEventKeyData;
+typedef enum {
+ GHOST_kOrientationUpdate,
+ GHOST_kDeviceNumChanged,
+} GHOST_TEventOpenHMDSubTypes;
+
typedef struct {
- float orientation[4]; // Orientation quaternion of the HMD
+ GHOST_TEventOpenHMDSubTypes subtype;
+ float orientation[4]; // Orientation quaternion of the HMD (only for subtype GHOST_kOrientationUpdate)
} GHOST_TEventOpenHMDData;
typedef struct {
diff --git a/intern/ghost/intern/GHOST_EventOpenHMD.h b/intern/ghost/intern/GHOST_EventOpenHMD.h
index 11af607..30c3134 100644
--- a/intern/ghost/intern/GHOST_EventOpenHMD.h
+++ b/intern/ghost/intern/GHOST_EventOpenHMD.h
@@ -6,14 +6,15 @@
class GHOST_EventOpenHMD : public GHOST_Event
{
public:
- GHOST_EventOpenHMD(GHOST_TUns64 time, GHOST_IWindow *window)
+ GHOST_EventOpenHMD(GHOST_TUns64 time, GHOST_TEventOpenHMDSubTypes subtype, GHOST_IWindow *window)
: GHOST_Event(time, GHOST_kEventHMD, window)
{
- m_data = &m_orientationData;
+ m_OpenHMDEventData.subtype = subtype;
+ m_data = &m_OpenHMDEventData;
}
protected:
- GHOST_TEventOpenHMDData m_orientationData;
+ GHOST_TEventOpenHMDData m_OpenHMDEventData;
};
#endif // __GHOST_EVENTOPENHMD_H_
diff --git a/intern/ghost/intern/GHOST_OpenHMDManager.cpp b/intern/ghost/intern/GHOST_OpenHMDManager.cpp
index a48030c..8bf1d7b 100644
--- a/intern/ghost/intern/GHOST_OpenHMDManager.cpp
+++ b/intern/ghost/intern/GHOST_OpenHMDManager.cpp
@@ -46,21 +46,35 @@ GHOST_OpenHMDManager::~GHOST_OpenHMDManager()
bool GHOST_OpenHMDManager::processEvents()
{
GHOST_IWindow *window;
+ GHOST_TUns64 now = m_system.getMilliSeconds();
+ static int num_devices_prev = 0;
+ const int num_devices = getNumDevices();
+ bool anyProcessed = false;
- if (!m_device || !(window = m_system.getWindowManager()->getActiveWindow()))
- return false;
+ /* DeviceNumChanged event
+ * Would be nicer if OpenHMD could handle this for us. */
+ if (num_devices_prev != num_devices && (window = m_system.getWindowManager()->getActiveWindow())) {
+ GHOST_EventOpenHMD *event = new GHOST_EventOpenHMD(now, GHOST_kDeviceNumChanged, window);
+ m_system.pushEvent(event);
+ num_devices_prev = num_devices;
+ anyProcessed = true;
+ }
+ /* OrientationUpdate event
+ * We might want to add a timeout check here to avoid too many updates. */
+ if (1 && m_device && (window = m_system.getWindowManager()->getActiveWindow())) {
+ GHOST_EventOpenHMD *event = new GHOST_EventOpenHMD(now, GHOST_kOrientationUpdate, window);
+ GHOST_TEventOpenHMDData *data = (GHOST_TEventOpenHMDData*)event->getData();
- GHOST_TUns64 now = m_system.getMilliSeconds();
- GHOST_EventOpenHMD *event = new GHOST_EventOpenHMD(now, window);
- GHOST_TEventOpenHMDData* data = (GHOST_TEventOpenHMDData*)event->getData();
+ ohmd_ctx_update(m_context);
+ if (!getRotationQuat(data->orientation))
+ return false;
- ohmd_ctx_update(m_context);
- if (!getRotationQuat(data->orientation))
- return false;
+ m_system.pushEvent(event);
+ anyProcessed = true;
+ }
- m_system.pushEvent(event);
- return true;
+ return anyProcessed;
}
bool GHOST_OpenHMDManager::available() const
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 50a0320..4436889 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -3505,10 +3505,20 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U
{
GHOST_TEventOpenHMDData *e = customdata;
- event.type = EVT_HMD_TRANSFORM;
- event.customdata = MEM_mallocN(sizeof(GHOST_TEventOpenHMDData), "GHOST_TEventOpenHMDData");
- event.customdatafree = true;
- memcpy(event.customdata, e, sizeof(*e));
+ switch (e->subtype) {
+ case GHOST_kOrientationUpdate:
+ event.type = EVT_HMD_TRANSFORM;
+ event.customdata = MEM_mallocN(sizeof(e->orientation), "HMD orientation event data");
+ event.customdatafree = true;
+ memcpy(event.customdata, e->orientation, sizeof(e->orientation));
+ break;
+ case GHOST_kDeviceNumChanged:
+ event.type = EVT_HMD_DEVICENUM_CHANGE;
+ break;
+ default:
+ BLI_assert(0);
+ break;
+ }
wm_event_add(win, &event);
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 66135ae..df43e90 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -5126,13 +5126,9 @@ static void WM_OT_stereo3d_set(wmOperatorType *ot)
/* ******************************************************* */
/* Head Mounted Display */
-/**
- * Same as #GHOST_TEventOpenHMDData.
- * \warning Keep in sync!
- */
-typedef struct HMDData {
+typedef struct HMDOrientationData {
float orientation[4];
-} HMDData;
+} HMDOrientationData;
/**
* Initial camera rotation (quaternion).
@@ -5271,7 +5267,7 @@ static void WM_OT_hmd_session_toggle(wmOperatorType *ot)
ot->poll = hmd_session_toggle_poll;
}
-static void hmd_session_refresh(bContext *C, wmWindow *hmd_win, Scene *scene, HMDData *data)
+static void hmd_session_refresh(bContext *C, wmWindow *hmd_win, Scene *scene, HMDOrientationData *data)
{
if (scene->r.scemode & R_HMD_IGNORE_ROT)
return;
diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h
index 7e7ae7e..44c7f92 100644
--- a/source/blender/windowmanager/wm_event_types.h
+++ b/source/blender/windowmanager/wm_event_types.h
@@ -292,6 +292,7 @@ enum {
/* VR Viewport transform event */
EVT_HMD_TRANSFORM,
+ EVT_HMD_DEVICENUM_CHANGE,
/* ********** End of Input devices. ********** */
More information about the Bf-blender-cvs
mailing list