From e6571d334afa4cd7ec149bd01658dd3b131f711f Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Thu, 31 Jul 2014 22:37:02 +0200 Subject: [PATCH 01/13] Oculus SDK 0.4 support for Windows (tested with DK2 HMD) --- interface/src/devices/OculusManager.cpp | 52 +++++++++++++++++++++---- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index 49164cc8dd..0ffc7f405f 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -44,7 +44,7 @@ ovrFovPort OculusManager::_eyeFov[ovrEye_Count]; ovrEyeRenderDesc OculusManager::_eyeRenderDesc[ovrEye_Count]; ovrSizei OculusManager::_renderTargetSize; ovrVector2f OculusManager::_UVScaleOffset[ovrEye_Count][2]; -GLuint OculusManager::_vertices[ovrEye_Count] = { 0, 0 }; +GLuint OculusManager::_vertices[ovrEye_Count] = { 0, 0 }; GLuint OculusManager::_indices[ovrEye_Count] = { 0, 0 }; GLsizei OculusManager::_meshSize[ovrEye_Count] = { 0, 0 }; ovrFrameTiming OculusManager::_hmdFrameTiming; @@ -66,12 +66,13 @@ void OculusManager::connect() { UserActivityLogger::getInstance().connectedDevice("hmd", "oculus"); } _isConnected = true; - - ovrHmd_GetDesc(_ovrHmd, &_ovrHmdDesc); - +#ifdef _WIN32 + _eyeFov[0] = _ovrHmd->DefaultEyeFov[0]; + _eyeFov[1] = _ovrHmd->DefaultEyeFov[1]; +#else _eyeFov[0] = _ovrHmdDesc.DefaultEyeFov[0]; _eyeFov[1] = _ovrHmdDesc.DefaultEyeFov[1]; - +#endif //Get texture size ovrSizei recommendedTex0Size = ovrHmd_GetFovTextureSize(_ovrHmd, ovrEye_Left, _eyeFov[0], 1.0f); @@ -86,11 +87,21 @@ void OculusManager::connect() { _eyeRenderDesc[0] = ovrHmd_GetRenderDesc(_ovrHmd, ovrEye_Left, _eyeFov[0]); _eyeRenderDesc[1] = ovrHmd_GetRenderDesc(_ovrHmd, ovrEye_Right, _eyeFov[1]); +#ifdef _WIN32 + ovrHmd_SetEnabledCaps(_ovrHmd, ovrHmdCap_LowPersistence); +#else ovrHmd_SetEnabledCaps(_ovrHmd, ovrHmdCap_LowPersistence | ovrHmdCap_LatencyTest); +#endif +#ifdef _WIN32 + ovrHmd_ConfigureTracking(_ovrHmd, ovrTrackingCap_Orientation | ovrTrackingCap_Position | + ovrTrackingCap_MagYawCorrection, + ovrTrackingCap_Orientation); +#else ovrHmd_StartSensor(_ovrHmd, ovrSensorCap_Orientation | ovrSensorCap_YawCorrection | ovrSensorCap_Position, ovrSensorCap_Orientation); +#endif if (!_camera) { _camera = new Camera; @@ -183,6 +194,16 @@ void OculusManager::generateDistortionMesh() { DistortionVertex* v = pVBVerts; ovrDistortionVertex* ov = meshData.pVertexData; for (unsigned int vertNum = 0; vertNum < meshData.VertexCount; vertNum++) { +#ifdef _WIN32 + v->pos.x = ov->ScreenPosNDC.x; + v->pos.y = ov->ScreenPosNDC.y; + v->texR.x = ov->TanEyeAnglesR.x; + v->texR.y = ov->TanEyeAnglesR.y; + v->texG.x = ov->TanEyeAnglesG.x; + v->texG.y = ov->TanEyeAnglesG.y; + v->texB.x = ov->TanEyeAnglesB.x; + v->texB.y = ov->TanEyeAnglesB.y; +#else v->pos.x = ov->Pos.x; v->pos.y = ov->Pos.y; v->texR.x = ov->TexR.x; @@ -191,6 +212,7 @@ void OculusManager::generateDistortionMesh() { v->texG.y = ov->TexG.y; v->texB.x = ov->TexB.x; v->texB.y = ov->TexB.y; +#endif v->color.r = v->color.g = v->color.b = (GLubyte)(ov->VignetteFactor * 255.99f); v->color.a = (GLubyte)(ov->TimeWarpFactor * 255.99f); v++; @@ -294,9 +316,11 @@ void OculusManager::display(const glm::quat &bodyOrientation, const glm::vec3 &p //Render each eye into an fbo for (int eyeIndex = 0; eyeIndex < ovrEye_Count; eyeIndex++) { - +#ifdef _WIN32 + ovrEyeType eye = _ovrHmd->EyeRenderOrder[eyeIndex]; +#else ovrEyeType eye = _ovrHmdDesc.EyeRenderOrder[eyeIndex]; - +#endif //Set the camera rotation for this eye eyeRenderPose[eye] = ovrHmd_GetEyePose(_ovrHmd, eye); orientation.x = eyeRenderPose[eye].Orientation.x; @@ -433,10 +457,22 @@ void OculusManager::reset() { //Gets the current predicted angles from the oculus sensors void OculusManager::getEulerAngles(float& yaw, float& pitch, float& roll) { #ifdef HAVE_LIBOVR +#ifdef _WIN32 + ovrTrackingState ts = ovrHmd_GetTrackingState(_ovrHmd, ovr_GetTimeInSeconds()); +#else ovrSensorState ss = ovrHmd_GetSensorState(_ovrHmd, _hmdFrameTiming.ScanoutMidpointSeconds); - +#endif +#ifdef _WIN32 + if (ts.StatusFlags & (ovrStatus_OrientationTracked | ovrStatus_PositionTracked)) { +#else if (ss.StatusFlags & (ovrStatus_OrientationTracked | ovrStatus_PositionTracked)) { +#endif + +#ifdef _WIN32 + ovrPosef pose = ts.CameraPose; +#else ovrPosef pose = ss.Predicted.Pose; +#endif Quatf orientation = Quatf(pose.Orientation); orientation.GetEulerAngles(&yaw, &pitch, &roll); } else { From 11b1425196da577227ca8766c5c6d59664f7581b Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Thu, 31 Jul 2014 22:51:23 +0200 Subject: [PATCH 02/13] Windows requires ws2_32.lib for LIBOVR 0.4 --- interface/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 7336b55852..d3c204a021 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -258,5 +258,8 @@ else (APPLE) add_definitions(-Dssize_t=long) target_link_libraries(${TARGET_NAME} "${GLEW_LIBRARIES}" wsock32.lib opengl32.lib) + if (LIBOVR_FOUND) + target_link_libraries(${TARGET_NAME} ws2_32.lib) + endif() endif() endif (APPLE) From fe3f1dbe837b47fecfca5545cc8832a11fa04e7b Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Thu, 31 Jul 2014 22:56:47 +0200 Subject: [PATCH 03/13] forgot to put back one line of code --- interface/src/devices/OculusManager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index 0ffc7f405f..ab30ee7c8b 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -70,6 +70,7 @@ void OculusManager::connect() { _eyeFov[0] = _ovrHmd->DefaultEyeFov[0]; _eyeFov[1] = _ovrHmd->DefaultEyeFov[1]; #else + ovrHmd_GetDesc(_ovrHmd, &_ovrHmdDesc); _eyeFov[0] = _ovrHmdDesc.DefaultEyeFov[0]; _eyeFov[1] = _ovrHmdDesc.DefaultEyeFov[1]; #endif From 4ff7ff61e8c8e2379224cc1eb3eeaf63826636b8 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Tue, 12 Aug 2014 13:25:22 +0200 Subject: [PATCH 04/13] OSX compatibility with SDK 0.4.1 --- interface/src/devices/OculusManager.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index ab30ee7c8b..96df5b6c7c 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -66,7 +66,7 @@ void OculusManager::connect() { UserActivityLogger::getInstance().connectedDevice("hmd", "oculus"); } _isConnected = true; -#ifdef _WIN32 +#if defined(__APPLE__) || defined(_WIN32) _eyeFov[0] = _ovrHmd->DefaultEyeFov[0]; _eyeFov[1] = _ovrHmd->DefaultEyeFov[1]; #else @@ -88,13 +88,13 @@ void OculusManager::connect() { _eyeRenderDesc[0] = ovrHmd_GetRenderDesc(_ovrHmd, ovrEye_Left, _eyeFov[0]); _eyeRenderDesc[1] = ovrHmd_GetRenderDesc(_ovrHmd, ovrEye_Right, _eyeFov[1]); -#ifdef _WIN32 +#if defined(__APPLE__) || defined(_WIN32) ovrHmd_SetEnabledCaps(_ovrHmd, ovrHmdCap_LowPersistence); #else ovrHmd_SetEnabledCaps(_ovrHmd, ovrHmdCap_LowPersistence | ovrHmdCap_LatencyTest); #endif -#ifdef _WIN32 +#if defined(__APPLE__) || defined(_WIN32) ovrHmd_ConfigureTracking(_ovrHmd, ovrTrackingCap_Orientation | ovrTrackingCap_Position | ovrTrackingCap_MagYawCorrection, ovrTrackingCap_Orientation); @@ -195,7 +195,7 @@ void OculusManager::generateDistortionMesh() { DistortionVertex* v = pVBVerts; ovrDistortionVertex* ov = meshData.pVertexData; for (unsigned int vertNum = 0; vertNum < meshData.VertexCount; vertNum++) { -#ifdef _WIN32 +#if defined(__APPLE__) || defined(_WIN32) v->pos.x = ov->ScreenPosNDC.x; v->pos.y = ov->ScreenPosNDC.y; v->texR.x = ov->TanEyeAnglesR.x; @@ -317,7 +317,7 @@ void OculusManager::display(const glm::quat &bodyOrientation, const glm::vec3 &p //Render each eye into an fbo for (int eyeIndex = 0; eyeIndex < ovrEye_Count; eyeIndex++) { -#ifdef _WIN32 +#if defined(__APPLE__) || defined(_WIN32) ovrEyeType eye = _ovrHmd->EyeRenderOrder[eyeIndex]; #else ovrEyeType eye = _ovrHmdDesc.EyeRenderOrder[eyeIndex]; @@ -458,18 +458,18 @@ void OculusManager::reset() { //Gets the current predicted angles from the oculus sensors void OculusManager::getEulerAngles(float& yaw, float& pitch, float& roll) { #ifdef HAVE_LIBOVR -#ifdef _WIN32 +#if defined(__APPLE__) || defined(_WIN32) ovrTrackingState ts = ovrHmd_GetTrackingState(_ovrHmd, ovr_GetTimeInSeconds()); #else ovrSensorState ss = ovrHmd_GetSensorState(_ovrHmd, _hmdFrameTiming.ScanoutMidpointSeconds); #endif -#ifdef _WIN32 +#if defined(__APPLE__) || defined(_WIN32) if (ts.StatusFlags & (ovrStatus_OrientationTracked | ovrStatus_PositionTracked)) { #else if (ss.StatusFlags & (ovrStatus_OrientationTracked | ovrStatus_PositionTracked)) { #endif -#ifdef _WIN32 +#if defined(__APPLE__) || defined(_WIN32) ovrPosef pose = ts.CameraPose; #else ovrPosef pose = ss.Predicted.Pose; From 75aedae300a5e445837c0c5aec7edb618042083a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 12 Aug 2014 14:12:13 -0700 Subject: [PATCH 05/13] integration of positional tracking with DK2 --- cmake/modules/FindLibOVR.cmake | 4 +-- interface/src/avatar/MyAvatar.cpp | 6 ++++ interface/src/devices/OculusManager.cpp | 39 ++++++++++++++++++++----- interface/src/devices/OculusManager.h | 1 + 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/cmake/modules/FindLibOVR.cmake b/cmake/modules/FindLibOVR.cmake index 505fd90b51..5fbe01d06b 100644 --- a/cmake/modules/FindLibOVR.cmake +++ b/cmake/modules/FindLibOVR.cmake @@ -27,8 +27,8 @@ find_path(LIBOVR_SRC_DIR Util_Render_Stereo.h PATH_SUFFIXES Src/Util HINTS ${OCU include(SelectLibraryConfigurations) if (APPLE) - find_library(LIBOVR_LIBRARY_DEBUG NAMES ovr PATH_SUFFIXES Lib/MacOS/Debug HINTS ${OCULUS_SEARCH_DIRS}) - find_library(LIBOVR_LIBRARY_RELEASE NAMES ovr PATH_SUFFIXES Lib/MacOS/Release HINTS ${OCULUS_SEARCH_DIRS}) + find_library(LIBOVR_LIBRARY_DEBUG NAMES ovr PATH_SUFFIXES Lib/Mac/Debug HINTS ${OCULUS_SEARCH_DIRS}) + find_library(LIBOVR_LIBRARY_RELEASE NAMES ovr PATH_SUFFIXES Lib/Mac/Release HINTS ${OCULUS_SEARCH_DIRS}) find_library(ApplicationServices ApplicationServices) find_library(IOKit IOKit) elseif (UNIX) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index f59064732c..08d33ff252 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -255,6 +255,12 @@ void MyAvatar::updateFromTrackers(float deltaTime) { estimatedRotation.x *= -1.0f; estimatedRotation.z *= -1.0f; + } else if (OculusManager::isConnected()) { + estimatedPosition = OculusManager::getRelativePosition(); + estimatedPosition.x *= -1.0f; + + const float OCULUS_LEAN_SCALE = 0.05f; + estimatedPosition /= OCULUS_LEAN_SCALE; } else { FaceTracker* tracker = Application::getInstance()->getActiveFaceTracker(); if (tracker) { diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index 96df5b6c7c..6ce77e3ca2 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -314,7 +314,16 @@ void OculusManager::display(const glm::quat &bodyOrientation, const glm::vec3 &p glPushMatrix(); glm::quat orientation; - + glm::vec3 trackerPosition; + +#if defined(__APPLE__) || defined(_WIN32) + ovrTrackingState ts = ovrHmd_GetTrackingState(_ovrHmd, ovr_GetTimeInSeconds()); + ovrVector3f ovrHeadPosition = ts.HeadPose.ThePose.Position; + + trackerPosition = glm::vec3(ovrHeadPosition.x, ovrHeadPosition.y, ovrHeadPosition.z); + trackerPosition = bodyOrientation * trackerPosition; +#endif + //Render each eye into an fbo for (int eyeIndex = 0; eyeIndex < ovrEye_Count; eyeIndex++) { #if defined(__APPLE__) || defined(_WIN32) @@ -330,7 +339,8 @@ void OculusManager::display(const glm::quat &bodyOrientation, const glm::vec3 &p orientation.w = eyeRenderPose[eye].Orientation.w; _camera->setTargetRotation(bodyOrientation * orientation); - _camera->setTargetPosition(position); + _camera->setTargetPosition(position + trackerPosition); + _camera->update(1.0f / Application::getInstance()->getFps()); Matrix4f proj = ovrMatrix4f_Projection(_eyeRenderDesc[eye].Fov, whichCamera.getNearClip(), whichCamera.getFarClip(), true); @@ -450,8 +460,9 @@ void OculusManager::renderDistortionMesh(ovrPosef eyeRenderPose[ovrEye_Count]) { //Tries to reconnect to the sensors void OculusManager::reset() { #ifdef HAVE_LIBOVR - disconnect(); - connect(); + if (_isConnected) { + ovrHmd_RecenterPose(_ovrHmd); + } #endif } @@ -463,18 +474,18 @@ void OculusManager::getEulerAngles(float& yaw, float& pitch, float& roll) { #else ovrSensorState ss = ovrHmd_GetSensorState(_ovrHmd, _hmdFrameTiming.ScanoutMidpointSeconds); #endif -#if defined(__APPLE__) || defined(_WIN32) +#if defined(__APPLE__) || defined(_WIN32) if (ts.StatusFlags & (ovrStatus_OrientationTracked | ovrStatus_PositionTracked)) { #else if (ss.StatusFlags & (ovrStatus_OrientationTracked | ovrStatus_PositionTracked)) { #endif #if defined(__APPLE__) || defined(_WIN32) - ovrPosef pose = ts.CameraPose; + ovrPosef headPose = ts.HeadPose.ThePose; #else - ovrPosef pose = ss.Predicted.Pose; + ovrPosef headPose = ss.Predicted.Pose; #endif - Quatf orientation = Quatf(pose.Orientation); + Quatf orientation = Quatf(headPose.Orientation); orientation.GetEulerAngles(&yaw, &pitch, &roll); } else { yaw = 0.0f; @@ -487,6 +498,18 @@ void OculusManager::getEulerAngles(float& yaw, float& pitch, float& roll) { roll = 0.0f; #endif } + +glm::vec3 OculusManager::getRelativePosition() { +#if defined(__APPLE__) || defined(_WIN32) + ovrTrackingState trackingState = ovrHmd_GetTrackingState(_ovrHmd, ovr_GetTimeInSeconds()); + ovrVector3f headPosition = trackingState.HeadPose.ThePose.Position; + + return glm::vec3(headPosition.x, headPosition.y, headPosition.z); +#else + // no positional tracking in Linux yet + return glm::vec3(0.0f, 0.0f, 0.0f); +#endif +} //Used to set the size of the glow framebuffers QSize OculusManager::getRenderTargetSize() { diff --git a/interface/src/devices/OculusManager.h b/interface/src/devices/OculusManager.h index 8c929bb50a..3959ea1ab7 100644 --- a/interface/src/devices/OculusManager.h +++ b/interface/src/devices/OculusManager.h @@ -40,6 +40,7 @@ public: /// param \pitch[out] pitch in radians /// param \roll[out] roll in radians static void getEulerAngles(float& yaw, float& pitch, float& roll); + static glm::vec3 getRelativePosition(); static QSize getRenderTargetSize(); private: From 00087e81d86a4e6d450fd05b1d4ee18d288d05d9 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 12 Aug 2014 14:44:49 -0700 Subject: [PATCH 06/13] remove a line of debug that shouldn't have made its way in --- interface/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 1d91723f4d..fefdcb0ab5 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -8,7 +8,6 @@ foreach(EXTERNAL ${OPTIONAL_EXTERNALS}) if (NOT ${${EXTERNAL}_UPPERCASE}_ROOT_DIR) string(TOLOWER ${EXTERNAL} ${EXTERNAL}_LOWERCASE) set(${${EXTERNAL}_UPPERCASE}_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/${${EXTERNAL}_LOWERCASE}") - message("Dir for ${EXTERNAL} is ${${${EXTERNAL}_UPPERCASE}_ROOT_DIR}") endif () endforeach() From ac4d20bb431009726fc98ea12edd51069b204bec Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 12 Aug 2014 14:49:30 -0700 Subject: [PATCH 07/13] repairs to FindLibOVR for OS X new structure --- cmake/modules/FindLibOVR.cmake | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/cmake/modules/FindLibOVR.cmake b/cmake/modules/FindLibOVR.cmake index 6c5556fb85..9c703f9cfe 100644 --- a/cmake/modules/FindLibOVR.cmake +++ b/cmake/modules/FindLibOVR.cmake @@ -27,8 +27,8 @@ find_path(LIBOVR_SRC_DIR Util_Render_Stereo.h PATH_SUFFIXES Src/Util HINTS ${LIB include(SelectLibraryConfigurations) if (APPLE) - find_library(LIBOVR_LIBRARY_DEBUG NAMES ovr PATH_SUFFIXES Lib/Mac/Debug HINTS ${OCULUS_SEARCH_DIRS}) - find_library(LIBOVR_LIBRARY_RELEASE NAMES ovr PATH_SUFFIXES Lib/Mac/Release HINTS ${OCULUS_SEARCH_DIRS}) + find_library(LIBOVR_LIBRARY_DEBUG NAMES ovr PATH_SUFFIXES Lib/Mac/Debug HINTS ${LIBOVR_SEARCH_DIRS}) + find_library(LIBOVR_LIBRARY_RELEASE NAMES ovr PATH_SUFFIXES Lib/Mac/Release HINTS ${LIBOVR_SEARCH_DIRS}) find_library(ApplicationServices ApplicationServices) find_library(IOKit IOKit) elseif (UNIX) @@ -53,21 +53,20 @@ elseif (WIN32) endif () select_library_configurations(LIBOVR) -set(LIBOVR_LIBRARIES "${LIBOVR_LIBRARY}") +set(LIBOVR_LIBRARIES ${LIBOVR_LIBRARY}) + +list(APPEND LIBOVR_ARGS_LIST LIBOVR_INCLUDE_DIRS LIBOVR_SRC_DIR LIBOVR_LIBRARY) if (APPLE) - set(LIBOVR_LIBRARIES "${LIBOVR_LIBRARIES}" ${IOKit} ${ApplicationServices}) + list(APPEND LIBOVR_LIBRARIES ${IOKit} ${ApplicationServices}) + list(APPEND LIBOVR_ARGS_LIST IOKit ApplicationServices) elseif (UNIX) - set(LIBOVR_LIBRARIES "${LIBOVR_LIBRARIES}" "${UDEV_LIBRARY}" "${XINERAMA_LIBRARY}") + list(APPEND LIBOVR_LIBRARIES "${UDEV_LIBRARY}" "${XINERAMA_LIBRARY}") + list(APPEND LIBOVR_ARGS_LIST UDEV_LIBRARY XINERAMA_LIBRARY) endif () include(FindPackageHandleStandardArgs) -if (APPLE) - find_package_handle_standard_args(LibOVR DEFAULT_MSG LIBOVR_INCLUDE_DIRS LIBOVR_SRC_DIR LIBOVR_LIBRARIES IOKit ApplicationServices) -elseif (UNIX) - find_package_handle_standard_args(LibOVR DEFAULT_MSG LIBOVR_INCLUDE_DIRS LIBOVR_SRC_DIR LIBOVR_LIBRARIES UDEV_LIBRARY XINERAMA_LIBRARY) -else () - find_package_handle_standard_args(LibOVR DEFAULT_MSG LIBOVR_INCLUDE_DIRS LIBOVR_SRC_DIR LIBOVR_LIBRARIES) -endif () -mark_as_advanced(LIBOVR_INCLUDE_DIRS LIBOVR_LIBRARIES OCULUS_SEARCH_DIRS) +find_package_handle_standard_args(LibOVR DEFAULT_MSG ${LIBOVR_ARGS_LIST}) + +mark_as_advanced(LIBOVR_INCLUDE_DIRS LIBOVR_LIBRARIES LIBOVR_SEARCH_DIRS) From 4bf7bbe0df8d2f5a8fb0ae34ede916dcf9e3ac63 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 12 Aug 2014 15:20:04 -0700 Subject: [PATCH 08/13] if enable VR mode is re-checked then attempt to re-connect to Oculus --- interface/src/Application.cpp | 9 +++++++++ interface/src/devices/OculusManager.cpp | 4 ++++ interface/src/devices/SixenseManager.cpp | 4 +++- interface/src/devices/SixenseManager.h | 2 +- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3007943643..9d49dc6281 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1440,6 +1440,15 @@ void Application::setEnable3DTVMode(bool enable3DTVMode) { } void Application::setEnableVRMode(bool enableVRMode) { + if (enableVRMode) { + if (!OculusManager::isConnected()) { + // attempt to reconnect the Oculus manager - it's possible this was a workaround + // for the sixense crash + OculusManager::disconnect(); + OculusManager::connect(); + } + } + resizeGL(_glWidget->width(), _glWidget->height()); } diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index 6ce77e3ca2..7d7375fad5 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -135,6 +135,10 @@ void OculusManager::connect() { } else { _isConnected = false; + + // we're definitely not in "VR mode" so tell the menu that + Menu::getInstance()->getActionForOption(MenuOption::EnableVRMode)->setChecked(false); + ovrHmd_Destroy(_ovrHmd); ovr_Shutdown(); } diff --git a/interface/src/devices/SixenseManager.cpp b/interface/src/devices/SixenseManager.cpp index 089d478198..803060e5d3 100644 --- a/interface/src/devices/SixenseManager.cpp +++ b/interface/src/devices/SixenseManager.cpp @@ -19,6 +19,7 @@ #include "UserActivityLogger.h" #ifdef HAVE_SIXENSE + const int CALIBRATION_STATE_IDLE = 0; const int CALIBRATION_STATE_X = 1; const int CALIBRATION_STATE_Y = 2; @@ -41,8 +42,9 @@ SixenseManager::SixenseManager() { // By default we assume the _neckBase (in orb frame) is as high above the orb // as the "torso" is below it. _neckBase = glm::vec3(NECK_X, -NECK_Y, NECK_Z); - + sixenseInit(); + #endif _hydrasConnected = false; _triggerPressed[0] = false; diff --git a/interface/src/devices/SixenseManager.h b/interface/src/devices/SixenseManager.h index 91f9e9884f..664c102f76 100644 --- a/interface/src/devices/SixenseManager.h +++ b/interface/src/devices/SixenseManager.h @@ -71,7 +71,7 @@ private: glm::vec3 _reachUp; glm::vec3 _reachForward; float _lastDistance; - + #endif bool _hydrasConnected; quint64 _lastMovement; From 4dce4c49194103935c0c550be045f27672d821e7 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 12 Aug 2014 15:23:12 -0700 Subject: [PATCH 09/13] link to ws2_32.lib if LibOVR is being linked to --- cmake/modules/FindLibOVR.cmake | 2 ++ interface/CMakeLists.txt | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cmake/modules/FindLibOVR.cmake b/cmake/modules/FindLibOVR.cmake index 9c703f9cfe..62ac572f2f 100644 --- a/cmake/modules/FindLibOVR.cmake +++ b/cmake/modules/FindLibOVR.cmake @@ -63,6 +63,8 @@ if (APPLE) elseif (UNIX) list(APPEND LIBOVR_LIBRARIES "${UDEV_LIBRARY}" "${XINERAMA_LIBRARY}") list(APPEND LIBOVR_ARGS_LIST UDEV_LIBRARY XINERAMA_LIBRARY) +elseif (WIN32) + list(APPEND LIBOVR_LIBRARIES ws2_32.lib) endif () include(FindPackageHandleStandardArgs) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index fefdcb0ab5..32070a4427 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -201,9 +201,6 @@ else (APPLE) add_definitions(-DGLEW_STATIC) target_link_libraries(${TARGET_NAME} "${GLEW_LIBRARIES}" wsock32.lib opengl32.lib) - if (LIBOVR_FOUND) - target_link_libraries(${TARGET_NAME} ws2_32.lib) - endif() endif() endif (APPLE) From acda466c7656ed76a9ebca6029e100229c536f2a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 13 Aug 2014 09:11:43 -0700 Subject: [PATCH 10/13] add atls as requirement for LibOVR --- cmake/modules/FindLibOVR.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/modules/FindLibOVR.cmake b/cmake/modules/FindLibOVR.cmake index 62ac572f2f..f950bdba58 100644 --- a/cmake/modules/FindLibOVR.cmake +++ b/cmake/modules/FindLibOVR.cmake @@ -64,6 +64,7 @@ elseif (UNIX) list(APPEND LIBOVR_LIBRARIES "${UDEV_LIBRARY}" "${XINERAMA_LIBRARY}") list(APPEND LIBOVR_ARGS_LIST UDEV_LIBRARY XINERAMA_LIBRARY) elseif (WIN32) + list(APPEND LIBOVR_LIRARIES "DEBUG atlsd.lib OPTIMIZED atls.lib") list(APPEND LIBOVR_LIBRARIES ws2_32.lib) endif () From 1ee58b7bd0355ef35b72278a6261fca08356f163 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 13 Aug 2014 09:19:45 -0700 Subject: [PATCH 11/13] find the ATL library on windows for LibOVR --- cmake/modules/FindLibOVR.cmake | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmake/modules/FindLibOVR.cmake b/cmake/modules/FindLibOVR.cmake index f950bdba58..a1d75add3f 100644 --- a/cmake/modules/FindLibOVR.cmake +++ b/cmake/modules/FindLibOVR.cmake @@ -50,6 +50,7 @@ elseif (UNIX) elseif (WIN32) find_library(LIBOVR_LIBRARY_DEBUG NAMES libovrd PATH_SUFFIXES Lib/Win32/VS2010 HINTS ${LIBOVR_SEARCH_DIRS}) find_library(LIBOVR_LIBRARY_RELEASE NAMES libovr PATH_SUFFIXES Lib/Win32/VS2010 HINTS ${LIBOVR_SEARCH_DIRS}) + find_package(ATL) endif () select_library_configurations(LIBOVR) @@ -64,8 +65,8 @@ elseif (UNIX) list(APPEND LIBOVR_LIBRARIES "${UDEV_LIBRARY}" "${XINERAMA_LIBRARY}") list(APPEND LIBOVR_ARGS_LIST UDEV_LIBRARY XINERAMA_LIBRARY) elseif (WIN32) - list(APPEND LIBOVR_LIRARIES "DEBUG atlsd.lib OPTIMIZED atls.lib") - list(APPEND LIBOVR_LIBRARIES ws2_32.lib) + list(APPEND LIBOVR_LIBRARIES ${ATL_LIBRARIES}) + list(APPEND LIBOVR_ARGS_LIST ATL_LIBRARIES) endif () include(FindPackageHandleStandardArgs) From 83952cb85cf42020bb0330fbf10e496f943d1405 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 13 Aug 2014 09:22:07 -0700 Subject: [PATCH 12/13] add the FindATL cmake module --- cmake/modules/FindATL.cmake | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 cmake/modules/FindATL.cmake diff --git a/cmake/modules/FindATL.cmake b/cmake/modules/FindATL.cmake new file mode 100644 index 0000000000..f3affbb49e --- /dev/null +++ b/cmake/modules/FindATL.cmake @@ -0,0 +1,29 @@ +# +# FindATL.cmake +# +# Try to find the ATL library needed to use the LibOVR +# +# Once done this will define +# +# ATL_FOUND - system found ATL +# ATL_LIBRARIES - Link this to use ATL +# +# Created on 8/13/2013 by Stephen Birarda +# Copyright 2014 High Fidelity, Inc. +# +# Distributed under the Apache License, Version 2.0. +# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +# + +if (WIN32) + find_library(ATL_LIBRARY_RELEASE atl PATH_SUFFIXES "7600.16385.1/lib/ATL/i386" HINTS "C:\\WinDDK") + find_library(ATL_LIBRARY_DEBUG atld PATH_SUFFIXES "7600.16385.1/lib/ATL/i386" HINTS "C:\\WinDDK") + + include(SelectLibraryConfigurations) + select_library_configurations(ATL) +endif () + +set(ATL_LIBRARIES "${ATL_LIBRARY}") + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(ATL DEFAULT_MSG ATL_LIBRARIES) \ No newline at end of file From b055e07d72fa62375d3f70ab58f140101029cd9b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 13 Aug 2014 09:29:49 -0700 Subject: [PATCH 13/13] look for atls not atl in FindATL --- cmake/modules/FindATL.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/modules/FindATL.cmake b/cmake/modules/FindATL.cmake index f3affbb49e..f95b0267eb 100644 --- a/cmake/modules/FindATL.cmake +++ b/cmake/modules/FindATL.cmake @@ -16,8 +16,8 @@ # if (WIN32) - find_library(ATL_LIBRARY_RELEASE atl PATH_SUFFIXES "7600.16385.1/lib/ATL/i386" HINTS "C:\\WinDDK") - find_library(ATL_LIBRARY_DEBUG atld PATH_SUFFIXES "7600.16385.1/lib/ATL/i386" HINTS "C:\\WinDDK") + find_library(ATL_LIBRARY_RELEASE atls PATH_SUFFIXES "7600.16385.1/lib/ATL/i386" HINTS "C:\\WinDDK") + find_library(ATL_LIBRARY_DEBUG atlsd PATH_SUFFIXES "7600.16385.1/lib/ATL/i386" HINTS "C:\\WinDDK") include(SelectLibraryConfigurations) select_library_configurations(ATL)