From 505ef4c5cc90c671c9a6bbf41f4cbb324ab049c1 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Wed, 22 Jul 2015 11:36:31 -0700 Subject: [PATCH] set up sixense/vive menu items with correct event forwarding --- interface/src/Application.cpp | 6 ++++-- interface/src/Application.h | 2 +- .../ControllerScriptingInterface.cpp | 2 +- .../src/input-plugins/SixenseManager.cpp | 7 +------ .../input-plugins/ViveControllerManager.cpp | 20 +++++++++++++++++-- .../src/input-plugins/ViveControllerManager.h | 6 +++++- .../plugins/src/plugins/PluginContainer.h | 2 +- 7 files changed, 31 insertions(+), 14 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 8565f5f3cf..280d474772 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4870,13 +4870,15 @@ void Application::removeMenu(const QString& menuName) { Menu::getInstance()->removeMenu(menuName); } -void Application::addMenuItem(const QString& path, const QString& name, std::function onClicked, bool checkable, bool checked, const QString& groupName) { +void Application::addMenuItem(const QString& path, const QString& name, std::function onClicked, bool checkable, bool checked, const QString& groupName) { auto menu = Menu::getInstance(); MenuWrapper* parentItem = menu->getMenu(path); QAction* action = parentItem->addAction(name); connect(action, &QAction::triggered, [=] { - onClicked(); + onClicked(action->isChecked()); }); + action->setCheckable(checkable); + action->setChecked(checked); _currentDisplayPluginActions.push_back({ path, name }); _currentInputPluginActions.push_back({ path, name }); } diff --git a/interface/src/Application.h b/interface/src/Application.h index 6c20fc8dd0..4c01889c5f 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -282,7 +282,7 @@ public: // Plugin container support virtual void addMenu(const QString& menuName); virtual void removeMenu(const QString& menuName); - virtual void addMenuItem(const QString& path, const QString& name, std::function onClicked, bool checkable, bool checked, const QString& groupName); + virtual void addMenuItem(const QString& path, const QString& name, std::function onClicked, bool checkable, bool checked, const QString& groupName); virtual void removeMenuItem(const QString& menuName, const QString& menuItem); virtual bool isOptionChecked(const QString& name); virtual void setIsOptionChecked(const QString& path, bool checked); diff --git a/interface/src/scripting/ControllerScriptingInterface.cpp b/interface/src/scripting/ControllerScriptingInterface.cpp index bdfea67eac..6fec1a1002 100644 --- a/interface/src/scripting/ControllerScriptingInterface.cpp +++ b/interface/src/scripting/ControllerScriptingInterface.cpp @@ -19,7 +19,7 @@ #include "ControllerScriptingInterface.h" // TODO: this needs to be removed, as well as any related controller-specific information -#include +#include ControllerScriptingInterface::ControllerScriptingInterface() : diff --git a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp index 972dec0b83..ede66b3720 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp +++ b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp @@ -56,7 +56,6 @@ const QString SixenseManager::NAME = "Sixense"; const QString MENU_PARENT = "Avatar"; const QString MENU_NAME = "Sixense"; const QString MENU_PATH = MENU_PARENT + ">" + MENU_NAME; -const QString RENDER_CONTROLLERS = "Render Hand Controllers"; const QString TOGGLE_SMOOTH = "Smooth Sixense Movement"; SixenseManager& SixenseManager::getInstance() { @@ -91,11 +90,8 @@ void SixenseManager::activate(PluginContainer* container) { container->addMenu(MENU_PATH); container->addMenuItem(MENU_PATH, TOGGLE_SMOOTH, - [this, &container] { this->setFilter(container->isOptionChecked(TOGGLE_SMOOTH)); }, + [this, container] (bool clicked) { this->setFilter(clicked); }, true, true); - container->addMenuItem(MENU_PATH, RENDER_CONTROLLERS, - [this, &container] { /*this->setShouldRenderController(container->isOptionChecked(RENDER_CONTROLLERS));*/ }, - true, true); #ifdef __APPLE__ @@ -128,7 +124,6 @@ void SixenseManager::activate(PluginContainer* container) { void SixenseManager::deactivate(PluginContainer* container) { #ifdef HAVE_SIXENSE - container->removeMenuItem(MENU_NAME, RENDER_CONTROLLERS); container->removeMenuItem(MENU_NAME, TOGGLE_SMOOTH); container->removeMenu(MENU_PATH); diff --git a/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp b/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp index 7ab60fe7e2..bb2f8c126a 100644 --- a/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp +++ b/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp @@ -17,8 +17,9 @@ #include #include #include -#include +#include #include "NumericalConstants.h" +#include #include "UserActivityLogger.h" extern vr::IVRSystem* _hmd; @@ -44,12 +45,18 @@ const QString CONTROLLER_MODEL_STRING = "vr_controller_05_wireless_b"; const QString ViveControllerManager::NAME = "OpenVR"; +const QString MENU_PARENT = "Avatar"; +const QString MENU_NAME = "Vive Controllers"; +const QString MENU_PATH = MENU_PARENT + ">" + MENU_NAME; +const QString RENDER_CONTROLLERS = "Render Hand Controllers"; + ViveControllerManager::ViveControllerManager() : InputDevice("SteamVR Controller"), _trackedControllers(0), _modelLoaded(false), _leftHandRenderID(0), - _rightHandRenderID(0) + _rightHandRenderID(0), + _renderControllers(false) { } @@ -59,6 +66,11 @@ bool ViveControllerManager::isSupported() const { } void ViveControllerManager::activate(PluginContainer* container) { + container->addMenu(MENU_PATH); + container->addMenuItem(MENU_PATH, RENDER_CONTROLLERS, + [this, &container] (bool clicked) { this->setRenderControllers(clicked); }, + true, true); + hmdRefCount++; if (!_hmd) { vr::HmdError eError = vr::HmdError_None; @@ -111,10 +123,14 @@ void ViveControllerManager::activate(PluginContainer* container) { _texture->autoGenerateMips(-1); _modelLoaded = true; + _renderControllers = true; } } void ViveControllerManager::deactivate(PluginContainer* container) { + container->removeMenuItem(MENU_NAME, RENDER_CONTROLLERS); + container->removeMenu(MENU_PATH); + hmdRefCount--; if (hmdRefCount == 0 && _hmd) { diff --git a/libraries/input-plugins/src/input-plugins/ViveControllerManager.h b/libraries/input-plugins/src/input-plugins/ViveControllerManager.h index 9d66ebc7a0..82d2c13d7b 100644 --- a/libraries/input-plugins/src/input-plugins/ViveControllerManager.h +++ b/libraries/input-plugins/src/input-plugins/ViveControllerManager.h @@ -42,7 +42,7 @@ public: AXIS_3, AXIS_4, }; - + enum JointChannel { LEFT_HAND = 0, RIGHT_HAND, @@ -68,6 +68,8 @@ public: virtual void focusOutEvent() override; void updateRendering(RenderArgs* args, render::ScenePointer scene, render::PendingChanges pendingChanges); + + void setRenderControllers(bool renderControllers) { _renderControllers = renderControllers; } UserInputMapper::Input makeInput(unsigned int button, int index); UserInputMapper::Input makeInput(JoystickAxisChannel axis, int index); @@ -86,6 +88,8 @@ private: model::Geometry _modelGeometry; gpu::TexturePointer _texture; + bool _renderControllers; + int _leftHandRenderID; int _rightHandRenderID; diff --git a/libraries/plugins/src/plugins/PluginContainer.h b/libraries/plugins/src/plugins/PluginContainer.h index 9cdfc30f25..305906e978 100644 --- a/libraries/plugins/src/plugins/PluginContainer.h +++ b/libraries/plugins/src/plugins/PluginContainer.h @@ -9,7 +9,7 @@ class PluginContainer { public: virtual void addMenu(const QString& menuName) = 0; virtual void removeMenu(const QString& menuName) = 0; - virtual void addMenuItem(const QString& path, const QString& name, std::function onClicked, bool checkable = false, bool checked = false, const QString& groupName = "") = 0; + virtual void addMenuItem(const QString& path, const QString& name, std::function onClicked, bool checkable = false, bool checked = false, const QString& groupName = "") = 0; virtual void removeMenuItem(const QString& menuName, const QString& menuItem) = 0; virtual bool isOptionChecked(const QString& name) = 0; virtual void setIsOptionChecked(const QString& path, bool checked) = 0;