[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