From a58a627fdff230a3061d220a097511f48bd6d103 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Tue, 5 Apr 2016 15:53:58 -0700 Subject: [PATCH 1/3] Support oculus remote input --- .../resources/controllers/oculus_remote.json | 14 ++++ .../resources/controllers/oculus_touch.json | 23 ++++++ .../oculus/src/OculusControllerManager.cpp | 72 +++++++++++++++---- plugins/oculus/src/OculusControllerManager.h | 4 +- 4 files changed, 98 insertions(+), 15 deletions(-) create mode 100644 interface/resources/controllers/oculus_remote.json create mode 100644 interface/resources/controllers/oculus_touch.json diff --git a/interface/resources/controllers/oculus_remote.json b/interface/resources/controllers/oculus_remote.json new file mode 100644 index 0000000000..0e5b7b667b --- /dev/null +++ b/interface/resources/controllers/oculus_remote.json @@ -0,0 +1,14 @@ +{ + "name": "Oculus Remote to Standard", + "channels": [ + { "from": "OculusRemote.Back", "to": "Standard.Back" }, + { "from": "OculusRemote.Start", "to": "Standard.Start" }, + + { "from": "OculusRemote.DU", "to": "Standard.DU" }, + { "from": "OculusRemote.DD", "to": "Standard.DD" }, + { "from": "OculusRemote.DL", "to": "Standard.DL" }, + { "from": "OculusRemote.DR", "to": "Standard.DR" } + ] +} + + diff --git a/interface/resources/controllers/oculus_touch.json b/interface/resources/controllers/oculus_touch.json new file mode 100644 index 0000000000..cc8c2f8bdc --- /dev/null +++ b/interface/resources/controllers/oculus_touch.json @@ -0,0 +1,23 @@ +{ + "name": "Oculus Touch to Standard", + "channels": [ + { "from": "OculusTouch.LY", "filters": "invert", "to": "Standard.LY" }, + { "from": "OculusTouch.LX", "to": "Standard.LX" }, + { "from": "OculusTouch.LT", "to": "Standard.LT" }, + + { "from": "OculusTouch.RY", "filters": "invert", "to": "Standard.RY" }, + { "from": "OculusTouch.RX", "to": "Standard.RX" }, + + { "from": "OculusTouch.RT", "to": "Standard.RT" }, + { "from": "OculusTouch.RB", "to": "Standard.RB" }, + { "from": "OculusTouch.RS", "to": "Standard.RS" }, + + { "from": "OculusTouch.LeftApplicationMenu", "to": "Standard.Back" }, + { "from": "OculusTouch.RightApplicationMenu", "to": "Standard.Start" }, + + { "from": "OculusTouch.LeftHand", "to": "Standard.LeftHand" }, + { "from": "OculusTouch.RightHand", "to": "Standard.RightHand" } + ] +} + + diff --git a/plugins/oculus/src/OculusControllerManager.cpp b/plugins/oculus/src/OculusControllerManager.cpp index f11ec18b10..b728023e4f 100644 --- a/plugins/oculus/src/OculusControllerManager.cpp +++ b/plugins/oculus/src/OculusControllerManager.cpp @@ -44,12 +44,14 @@ bool OculusControllerManager::activate() { // register with UserInputMapper auto userInputMapper = DependencyManager::get(); - if (_remote) { - userInputMapper->registerDevice(_remote); - } - if (_touch) { - userInputMapper->registerDevice(_touch); - } + _remote = std::make_shared(*this); + userInputMapper->registerDevice(_remote); + +#if 0 + _touch = std::make_shared(); + userInputMapper->registerDevice(_touch); +#endif + return true; } @@ -74,16 +76,21 @@ void OculusControllerManager::deactivate() { void OculusControllerManager::pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) { PerformanceTimer perfTimer("OculusControllerManager::TouchDevice::update"); - if (!OVR_SUCCESS(ovr_GetInputState(_session, ovrControllerType_Touch, &_inputState))) { - qCWarning(oculus) << "Unable to read oculus input state"; - return; - } if (_touch) { - _touch->update(deltaTime, inputCalibrationData, jointsCaptured); + if (OVR_SUCCESS(ovr_GetInputState(_session, ovrControllerType_Touch, &_inputState))) { + _touch->update(deltaTime, inputCalibrationData, jointsCaptured); + } else { + qCWarning(oculus) << "Unable to read Oculus touch input state"; + } } + if (_remote) { - _remote->update(deltaTime, inputCalibrationData, jointsCaptured); + if (OVR_SUCCESS(ovr_GetInputState(_session, ovrControllerType_Remote, &_inputState))) { + _remote->update(deltaTime, inputCalibrationData, jointsCaptured); + } else { + qCWarning(oculus) << "Unable to read Oculus remote input state"; + } } } @@ -99,6 +106,12 @@ void OculusControllerManager::pluginFocusOutEvent() { using namespace controller; static const std::vector> BUTTON_MAP { { + { ovrButton_Up, DU }, + { ovrButton_Down, DD }, + { ovrButton_Left, DL }, + { ovrButton_Right, DR }, + { ovrButton_Enter, START }, + { ovrButton_Back, BACK }, { ovrButton_X, X }, { ovrButton_Y, Y }, { ovrButton_A, A }, @@ -124,6 +137,39 @@ static const std::vector> TOUCH_MAP { { ovrTouch_RIndexPointing, RIGHT_INDEX_POINT }, } }; + +controller::Input::NamedVector OculusControllerManager::RemoteDevice::getAvailableInputs() const { + using namespace controller; + QVector availableInputs { + makePair(DU, "Up"), + makePair(DD, "Down"), + makePair(DL, "Left"), + makePair(DR, "Right"), + makePair(START, "Start"), + makePair(BACK, "Back"), + }; + return availableInputs; +} + +QString OculusControllerManager::RemoteDevice::getDefaultMappingConfig() const { + static const QString MAPPING_JSON = PathUtils::resourcesPath() + "/controllers/oculus_remote.json"; + return MAPPING_JSON; +} + +void OculusControllerManager::RemoteDevice::update(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) { + _buttonPressedMap.clear(); + const auto& inputState = _parent._inputState; + for (const auto& pair : BUTTON_MAP) { + if (inputState.Buttons & pair.first) { + _buttonPressedMap.insert(pair.second); + } + } +} + +void OculusControllerManager::RemoteDevice::focusOutEvent() { + _buttonPressedMap.clear(); +} + void OculusControllerManager::TouchDevice::update(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) { _poseStateMap.clear(); _buttonPressedMap.clear(); @@ -211,7 +257,7 @@ controller::Input::NamedVector OculusControllerManager::TouchDevice::getAvailabl } QString OculusControllerManager::TouchDevice::getDefaultMappingConfig() const { - static const QString MAPPING_JSON = PathUtils::resourcesPath() + "/controllers/touch.json"; + static const QString MAPPING_JSON = PathUtils::resourcesPath() + "/controllers/oculus_touch.json"; return MAPPING_JSON; } diff --git a/plugins/oculus/src/OculusControllerManager.h b/plugins/oculus/src/OculusControllerManager.h index fc10dcc73d..60969097f8 100644 --- a/plugins/oculus/src/OculusControllerManager.h +++ b/plugins/oculus/src/OculusControllerManager.h @@ -45,7 +45,7 @@ private: class RemoteDevice : public OculusInputDevice { public: using Pointer = std::shared_ptr; - RemoteDevice(OculusControllerManager& parent) : OculusInputDevice(parent, "Oculus Remote") {} + RemoteDevice(OculusControllerManager& parent) : OculusInputDevice(parent, "OculusRemote") {} controller::Input::NamedVector getAvailableInputs() const override; QString getDefaultMappingConfig() const override; @@ -58,7 +58,7 @@ private: class TouchDevice : public OculusInputDevice { public: using Pointer = std::shared_ptr; - TouchDevice(OculusControllerManager& parent) : OculusInputDevice(parent, "Oculus Touch") {} + TouchDevice(OculusControllerManager& parent) : OculusInputDevice(parent, "OculusTouch") {} controller::Input::NamedVector getAvailableInputs() const override; QString getDefaultMappingConfig() const override; From 2f28c64edbff38aa356a0ee27a1dc511d8dab594 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Wed, 6 Apr 2016 15:10:48 -0700 Subject: [PATCH 2/3] Fixing menu navigation in oculus remote --- .../resources/controllers/oculus_remote.json | 5 ++-- .../oculus/src/OculusControllerManager.cpp | 24 ++++++++++--------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/interface/resources/controllers/oculus_remote.json b/interface/resources/controllers/oculus_remote.json index 0e5b7b667b..580d7b1184 100644 --- a/interface/resources/controllers/oculus_remote.json +++ b/interface/resources/controllers/oculus_remote.json @@ -1,9 +1,8 @@ { "name": "Oculus Remote to Standard", "channels": [ - { "from": "OculusRemote.Back", "to": "Standard.Back" }, - { "from": "OculusRemote.Start", "to": "Standard.Start" }, - + { "from": "OculusRemote.Start", "to": "Actions.UiNavSelect" }, + { "from": "OculusRemote.Back", "to": "Actions.UiNavBack" }, { "from": "OculusRemote.DU", "to": "Standard.DU" }, { "from": "OculusRemote.DD", "to": "Standard.DD" }, { "from": "OculusRemote.DL", "to": "Standard.DL" }, diff --git a/plugins/oculus/src/OculusControllerManager.cpp b/plugins/oculus/src/OculusControllerManager.cpp index b728023e4f..50ef6b09a1 100644 --- a/plugins/oculus/src/OculusControllerManager.cpp +++ b/plugins/oculus/src/OculusControllerManager.cpp @@ -44,13 +44,16 @@ bool OculusControllerManager::activate() { // register with UserInputMapper auto userInputMapper = DependencyManager::get(); - _remote = std::make_shared(*this); - userInputMapper->registerDevice(_remote); -#if 0 - _touch = std::make_shared(); - userInputMapper->registerDevice(_touch); -#endif + if (OVR_SUCCESS(ovr_GetInputState(_session, ovrControllerType_Remote, &_inputState))) { + _remote = std::make_shared(*this); + userInputMapper->registerDevice(_remote); + } + + if (OVR_SUCCESS(ovr_GetInputState(_session, ovrControllerType_Touch, &_inputState))) { + _touch = std::make_shared(*this); + userInputMapper->registerDevice(_touch); + } return true; } @@ -76,7 +79,6 @@ void OculusControllerManager::deactivate() { void OculusControllerManager::pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) { PerformanceTimer perfTimer("OculusControllerManager::TouchDevice::update"); - if (_touch) { if (OVR_SUCCESS(ovr_GetInputState(_session, ovrControllerType_Touch, &_inputState))) { _touch->update(deltaTime, inputCalibrationData, jointsCaptured); @@ -141,10 +143,10 @@ static const std::vector> TOUCH_MAP { controller::Input::NamedVector OculusControllerManager::RemoteDevice::getAvailableInputs() const { using namespace controller; QVector availableInputs { - makePair(DU, "Up"), - makePair(DD, "Down"), - makePair(DL, "Left"), - makePair(DR, "Right"), + makePair(DU, "DU"), + makePair(DD, "DD"), + makePair(DL, "DL"), + makePair(DR, "DR"), makePair(START, "Start"), makePair(BACK, "Back"), }; From 72d8990fed562e445c6c9f8807bacea682dfbc37 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 7 Apr 2016 14:13:02 -0700 Subject: [PATCH 3/3] Fix menu launch from Oculus remote --- interface/src/Application.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 280f2c5d1f..b6e3b49595 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -895,6 +895,11 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : DependencyManager::get()->toggleMute(); } else if (action == controller::toInt(controller::Action::CYCLE_CAMERA)) { cycleCamera(); + } else if (action == controller::toInt(controller::Action::UI_NAV_SELECT)) { + if (!offscreenUi->navigationFocused()) { + auto reticlePosition = getApplicationCompositor().getReticlePosition(); + offscreenUi->toggleMenu(_glWidget->mapFromGlobal(QPoint(reticlePosition.x, reticlePosition.y))); + } } else if (action == controller::toInt(controller::Action::CONTEXT_MENU)) { auto reticlePosition = getApplicationCompositor().getReticlePosition(); offscreenUi->toggleMenu(_glWidget->mapFromGlobal(QPoint(reticlePosition.x, reticlePosition.y)));