Merge pull request #7589 from jherico/oculus_input

Support oculus remote input
This commit is contained in:
Brad Hefta-Gaub 2016-04-07 15:05:45 -07:00
commit 3d94558d6b
5 changed files with 101 additions and 12 deletions

View file

@ -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" }
]
}

View file

@ -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" }
]
}

View file

@ -917,6 +917,11 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) :
DependencyManager::get<AudioClient>()->toggleMute(); DependencyManager::get<AudioClient>()->toggleMute();
} else if (action == controller::toInt(controller::Action::CYCLE_CAMERA)) { } else if (action == controller::toInt(controller::Action::CYCLE_CAMERA)) {
cycleCamera(); 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)) { } else if (action == controller::toInt(controller::Action::CONTEXT_MENU)) {
auto reticlePosition = getApplicationCompositor().getReticlePosition(); auto reticlePosition = getApplicationCompositor().getReticlePosition();
offscreenUi->toggleMenu(_glWidget->mapFromGlobal(QPoint(reticlePosition.x, reticlePosition.y))); offscreenUi->toggleMenu(_glWidget->mapFromGlobal(QPoint(reticlePosition.x, reticlePosition.y)));

View file

@ -44,12 +44,17 @@ bool OculusControllerManager::activate() {
// register with UserInputMapper // register with UserInputMapper
auto userInputMapper = DependencyManager::get<controller::UserInputMapper>(); auto userInputMapper = DependencyManager::get<controller::UserInputMapper>();
if (_remote) {
if (OVR_SUCCESS(ovr_GetInputState(_session, ovrControllerType_Remote, &_inputState))) {
_remote = std::make_shared<RemoteDevice>(*this);
userInputMapper->registerDevice(_remote); userInputMapper->registerDevice(_remote);
} }
if (_touch) {
if (OVR_SUCCESS(ovr_GetInputState(_session, ovrControllerType_Touch, &_inputState))) {
_touch = std::make_shared<TouchDevice>(*this);
userInputMapper->registerDevice(_touch); userInputMapper->registerDevice(_touch);
} }
return true; return true;
} }
@ -74,16 +79,20 @@ void OculusControllerManager::deactivate() {
void OculusControllerManager::pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) { void OculusControllerManager::pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) {
PerformanceTimer perfTimer("OculusControllerManager::TouchDevice::update"); PerformanceTimer perfTimer("OculusControllerManager::TouchDevice::update");
if (!OVR_SUCCESS(ovr_GetInputState(_session, ovrControllerType_Touch, &_inputState))) { if (_touch) {
qCWarning(oculus) << "Unable to read oculus input state"; if (OVR_SUCCESS(ovr_GetInputState(_session, ovrControllerType_Touch, &_inputState))) {
return; _touch->update(deltaTime, inputCalibrationData, jointsCaptured);
} else {
qCWarning(oculus) << "Unable to read Oculus touch input state";
}
} }
if (_touch) {
_touch->update(deltaTime, inputCalibrationData, jointsCaptured);
}
if (_remote) { 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; using namespace controller;
static const std::vector<std::pair<ovrButton, StandardButtonChannel>> BUTTON_MAP { { static const std::vector<std::pair<ovrButton, StandardButtonChannel>> BUTTON_MAP { {
{ ovrButton_Up, DU },
{ ovrButton_Down, DD },
{ ovrButton_Left, DL },
{ ovrButton_Right, DR },
{ ovrButton_Enter, START },
{ ovrButton_Back, BACK },
{ ovrButton_X, X }, { ovrButton_X, X },
{ ovrButton_Y, Y }, { ovrButton_Y, Y },
{ ovrButton_A, A }, { ovrButton_A, A },
@ -124,6 +139,39 @@ static const std::vector<std::pair<ovrTouch, StandardButtonChannel>> TOUCH_MAP {
{ ovrTouch_RIndexPointing, RIGHT_INDEX_POINT }, { ovrTouch_RIndexPointing, RIGHT_INDEX_POINT },
} }; } };
controller::Input::NamedVector OculusControllerManager::RemoteDevice::getAvailableInputs() const {
using namespace controller;
QVector<Input::NamedPair> 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) { void OculusControllerManager::TouchDevice::update(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) {
_poseStateMap.clear(); _poseStateMap.clear();
_buttonPressedMap.clear(); _buttonPressedMap.clear();
@ -211,7 +259,7 @@ controller::Input::NamedVector OculusControllerManager::TouchDevice::getAvailabl
} }
QString OculusControllerManager::TouchDevice::getDefaultMappingConfig() const { 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; return MAPPING_JSON;
} }

View file

@ -45,7 +45,7 @@ private:
class RemoteDevice : public OculusInputDevice { class RemoteDevice : public OculusInputDevice {
public: public:
using Pointer = std::shared_ptr<RemoteDevice>; using Pointer = std::shared_ptr<RemoteDevice>;
RemoteDevice(OculusControllerManager& parent) : OculusInputDevice(parent, "Oculus Remote") {} RemoteDevice(OculusControllerManager& parent) : OculusInputDevice(parent, "OculusRemote") {}
controller::Input::NamedVector getAvailableInputs() const override; controller::Input::NamedVector getAvailableInputs() const override;
QString getDefaultMappingConfig() const override; QString getDefaultMappingConfig() const override;
@ -58,7 +58,7 @@ private:
class TouchDevice : public OculusInputDevice { class TouchDevice : public OculusInputDevice {
public: public:
using Pointer = std::shared_ptr<TouchDevice>; using Pointer = std::shared_ptr<TouchDevice>;
TouchDevice(OculusControllerManager& parent) : OculusInputDevice(parent, "Oculus Touch") {} TouchDevice(OculusControllerManager& parent) : OculusInputDevice(parent, "OculusTouch") {}
controller::Input::NamedVector getAvailableInputs() const override; controller::Input::NamedVector getAvailableInputs() const override;
QString getDefaultMappingConfig() const override; QString getDefaultMappingConfig() const override;