diff --git a/interface/resources/controllers/oculus_remote.json b/interface/resources/controllers/oculus_remote.json new file mode 100644 index 0000000000..580d7b1184 --- /dev/null +++ b/interface/resources/controllers/oculus_remote.json @@ -0,0 +1,13 @@ +{ + "name": "Oculus Remote to Standard", + "channels": [ + { "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" }, + { "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/interface/src/Application.cpp b/interface/src/Application.cpp index f567f26426..52985d9d9d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -917,6 +917,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))); diff --git a/plugins/oculus/src/OculusControllerManager.cpp b/plugins/oculus/src/OculusControllerManager.cpp index f11ec18b10..50ef6b09a1 100644 --- a/plugins/oculus/src/OculusControllerManager.cpp +++ b/plugins/oculus/src/OculusControllerManager.cpp @@ -44,12 +44,17 @@ bool OculusControllerManager::activate() { // register with UserInputMapper auto userInputMapper = DependencyManager::get(); - if (_remote) { + + if (OVR_SUCCESS(ovr_GetInputState(_session, ovrControllerType_Remote, &_inputState))) { + _remote = std::make_shared(*this); userInputMapper->registerDevice(_remote); } - if (_touch) { + + if (OVR_SUCCESS(ovr_GetInputState(_session, ovrControllerType_Touch, &_inputState))) { + _touch = std::make_shared(*this); userInputMapper->registerDevice(_touch); } + return true; } @@ -74,16 +79,20 @@ 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) { + 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 (_touch) { - _touch->update(deltaTime, inputCalibrationData, jointsCaptured); - } 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 +108,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 +139,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, "DU"), + makePair(DD, "DD"), + makePair(DL, "DL"), + makePair(DR, "DR"), + 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 +259,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;