Merge remote-tracking branch 'sam2/sam/input-plugins' into plugins

This commit is contained in:
Bradley Austin Davis 2015-07-23 15:40:22 -04:00
commit 4ad72be0c7
28 changed files with 191 additions and 56 deletions

View file

@ -143,6 +143,7 @@
#include "ui/AddressBarDialog.h" #include "ui/AddressBarDialog.h"
#include "ui/UpdateDialog.h" #include "ui/UpdateDialog.h"
#include <qopenglcontext.h>
// ON WIndows PC, NVidia Optimus laptop, we want to enable NVIDIA GPU // ON WIndows PC, NVidia Optimus laptop, we want to enable NVIDIA GPU
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN)
@ -754,14 +755,14 @@ Application::~Application() {
ModelEntityItem::cleanupLoadedAnimations(); ModelEntityItem::cleanupLoadedAnimations();
getActiveDisplayPlugin()->deactivate(); getActiveDisplayPlugin()->deactivate(this);
auto inputPlugins = getInputPlugins(); auto inputPlugins = getInputPlugins();
foreach(auto inputPlugin, inputPlugins) { foreach(auto inputPlugin, inputPlugins) {
QString name = inputPlugin->getName(); QString name = inputPlugin->getName();
QAction* action = Menu::getInstance()->getActionForOption(name); QAction* action = Menu::getInstance()->getActionForOption(name);
if (action->isChecked()) { if (action->isChecked()) {
inputPlugin->deactivate(); inputPlugin->deactivate(this);
} }
} }
@ -4773,7 +4774,7 @@ void Application::updateDisplayMode() {
_displayPlugin = newDisplayPlugin; _displayPlugin = newDisplayPlugin;
if (oldDisplayPlugin) { if (oldDisplayPlugin) {
oldDisplayPlugin->deactivate(); oldDisplayPlugin->deactivate(this);
_offscreenContext->makeCurrent(); _offscreenContext->makeCurrent();
} }
} }
@ -4811,7 +4812,7 @@ void Application::updateInputModes() {
} }
if (removedInputPlugins.size() > 0) { // A plugin was unchecked if (removedInputPlugins.size() > 0) { // A plugin was unchecked
foreach(auto removedInputPlugin, removedInputPlugins) { foreach(auto removedInputPlugin, removedInputPlugins) {
removedInputPlugin->deactivate(); removedInputPlugin->deactivate(this);
//removedInputPlugin->removeEventFilter(qApp); //removedInputPlugin->removeEventFilter(qApp);
//removedInputPlugin->removeEventFilter(offscreenUi.data()); //removedInputPlugin->removeEventFilter(offscreenUi.data());
} }
@ -4828,17 +4829,39 @@ void Application::updateInputModes() {
//} //}
} }
void Application::addMenuItem(const QString& path, const QString& name, std::function<void()> onClicked, bool checkable, bool checked, const QString& groupName) { void Application::addMenu(const QString& menuName) {
Menu::getInstance()->addMenu(menuName);
}
void Application::removeMenu(const QString& menuName) {
Menu::getInstance()->removeMenu(menuName);
}
void Application::addMenuItem(const QString& path, const QString& name, std::function<void(bool)> onClicked, bool checkable, bool checked, const QString& groupName) {
auto menu = Menu::getInstance(); auto menu = Menu::getInstance();
MenuWrapper* parentItem = menu->getMenu(path); MenuWrapper* parentItem = menu->getMenu(path);
QAction* action = parentItem->addAction(name); QAction* action = parentItem->addAction(name);
connect(action, &QAction::triggered, [=] { connect(action, &QAction::triggered, [=] {
onClicked(); onClicked(action->isChecked());
}); });
action->setCheckable(checkable);
action->setChecked(checked);
_currentDisplayPluginActions.push_back({ path, name }); _currentDisplayPluginActions.push_back({ path, name });
_currentInputPluginActions.push_back({ path, name }); _currentInputPluginActions.push_back({ path, name });
} }
void Application::removeMenuItem(const QString& menuName, const QString& menuItem) {
Menu::getInstance()->removeMenuItem(menuName, menuItem);
}
bool Application::isOptionChecked(const QString& name) {
return Menu::getInstance()->isOptionChecked(name);
}
void Application::setIsOptionChecked(const QString& path, bool checked) {
Menu::getInstance()->setIsOptionChecked(path, checked);
}
GlWindow* Application::getVisibleWindow() { GlWindow* Application::getVisibleWindow() {
return _glWindow; return _glWindow;
} }

View file

@ -279,7 +279,12 @@ public:
virtual qreal getDevicePixelRatio(); virtual qreal getDevicePixelRatio();
// Plugin container support // Plugin container support
virtual void addMenuItem(const QString& path, const QString& name, std::function<void()> onClicked, bool checkable, bool checked, const QString& groupName); virtual void addMenu(const QString& menuName);
virtual void removeMenu(const QString& menuName);
virtual void addMenuItem(const QString& path, const QString& name, std::function<void(bool)> 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);
virtual GlWindow* getVisibleWindow(); virtual GlWindow* getVisibleWindow();
private: private:

View file

@ -45,7 +45,7 @@ const InputPluginList& getInputPlugins() {
InputPlugin* PLUGIN_POOL[] = { InputPlugin* PLUGIN_POOL[] = {
new KeyboardMouseDevice(), new KeyboardMouseDevice(),
new SDL2Manager(), new SDL2Manager(),
// Sixense is causing some sort of memory corruption on OSX // Sixense is causing some sort of memory corruption on OSX
#ifndef Q_OS_MAC #ifndef Q_OS_MAC
new SixenseManager(), new SixenseManager(),
#endif #endif

View file

@ -28,7 +28,6 @@
#include "devices/DdeFaceTracker.h" #include "devices/DdeFaceTracker.h"
#include "devices/Faceshift.h" #include "devices/Faceshift.h"
#include "devices/RealSense.h" #include "devices/RealSense.h"
#include <input-plugins/SixenseManager.h> // TODO: should be able to remove this once input plugin architecture is finished
#include "MainWindow.h" #include "MainWindow.h"
#include "scripting/MenuScriptingInterface.h" #include "scripting/MenuScriptingInterface.h"
#if defined(Q_OS_MAC) || defined(Q_OS_WIN) #if defined(Q_OS_MAC) || defined(Q_OS_WIN)
@ -443,14 +442,6 @@ Menu::Menu() {
qApp, SLOT(setLowVelocityFilter(bool))); qApp, SLOT(setLowVelocityFilter(bool)));
addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::ShowIKConstraints, 0, false); addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::ShowIKConstraints, 0, false);
MenuWrapper* sixenseOptionsMenu = handOptionsMenu->addMenu("Sixense");
addCheckableActionToQMenuAndActionHash(sixenseOptionsMenu,
MenuOption::FilterSixense,
0,
true,
&SixenseManager::getInstance(),
SLOT(setFilter(bool)));
MenuWrapper* leapOptionsMenu = handOptionsMenu->addMenu("Leap Motion"); MenuWrapper* leapOptionsMenu = handOptionsMenu->addMenu("Leap Motion");
addCheckableActionToQMenuAndActionHash(leapOptionsMenu, MenuOption::LeapMotionOnHMD, 0, false); addCheckableActionToQMenuAndActionHash(leapOptionsMenu, MenuOption::LeapMotionOnHMD, 0, false);

View file

@ -190,7 +190,6 @@ namespace MenuOption {
const QString ExpandPaintGLTiming = "Expand /paintGL"; const QString ExpandPaintGLTiming = "Expand /paintGL";
const QString ExpandUpdateTiming = "Expand /update"; const QString ExpandUpdateTiming = "Expand /update";
const QString Faceshift = "Faceshift"; const QString Faceshift = "Faceshift";
const QString FilterSixense = "Smooth Sixense Movement";
const QString FirstPerson = "First Person"; const QString FirstPerson = "First Person";
const QString Forward = "Forward"; const QString Forward = "Forward";
const QString FrameTimer = "Show Timer"; const QString FrameTimer = "Show Timer";
@ -271,7 +270,6 @@ namespace MenuOption {
const QString ShowRealtimeEntityStats = "Show Realtime Entity Stats"; const QString ShowRealtimeEntityStats = "Show Realtime Entity Stats";
const QString ShowWhosLookingAtMe = "Show Who's Looking at Me"; const QString ShowWhosLookingAtMe = "Show Who's Looking at Me";
const QString SimpleShadows = "Simple"; const QString SimpleShadows = "Simple";
const QString SixenseEnabled = "Enable Hydra Support";
const QString ShiftHipsForIdleAnimations = "Shift hips for idle animations"; const QString ShiftHipsForIdleAnimations = "Shift hips for idle animations";
const QString StandingHMDSensorMode = "Standing HMD Sensor Mode"; const QString StandingHMDSensorMode = "Standing HMD Sensor Mode";
const QString Stars = "Stars"; const QString Stars = "Stars";

View file

@ -7,8 +7,76 @@
// //
#include "Basic2DWindowOpenGLDisplayPlugin.h" #include "Basic2DWindowOpenGLDisplayPlugin.h"
#include <plugins/PluginContainer.h>
#include <QWindow>
const QString Basic2DWindowOpenGLDisplayPlugin::NAME("2D Display"); const QString Basic2DWindowOpenGLDisplayPlugin::NAME("2D Display");
const QString & Basic2DWindowOpenGLDisplayPlugin::getName() const { const QString MENU_PARENT = "View";
const QString MENU_NAME = "Display Options";
const QString MENU_PATH = MENU_PARENT + ">" + MENU_NAME;
const QString FULLSCREEN = "Fullscreen";
const QString& Basic2DWindowOpenGLDisplayPlugin::getName() const {
return NAME; return NAME;
} }
void Basic2DWindowOpenGLDisplayPlugin::activate(PluginContainer* container) {
// container->addMenu(MENU_PATH);
// container->addMenuItem(MENU_PATH, FULLSCREEN,
// [this] (bool clicked) { this->setFullscreen(clicked); },
// true, false);
MainWindowOpenGLDisplayPlugin::activate(container);
}
void Basic2DWindowOpenGLDisplayPlugin::deactivate(PluginContainer* container) {
// container->removeMenuItem(MENU_NAME, FULLSCREEN);
// container->removeMenu(MENU_PATH);
MainWindowOpenGLDisplayPlugin::deactivate(container);
}
void Basic2DWindowOpenGLDisplayPlugin::setFullscreen(bool fullscreen) {
// The following code block is useful on platforms that can have a visible
// app menu in a fullscreen window. However the OSX mechanism hides the
// application menu for fullscreen apps, so the check is not required.
//#ifndef Q_OS_MAC
// if (fullscreen) {
// // Move menu to a QWidget floating above _glWidget so that show/hide doesn't adjust viewport.
// _menuBarHeight = Menu::getInstance()->height();
// Menu::getInstance()->setParent(_fullscreenMenuWidget);
// Menu::getInstance()->setFixedWidth(_window->windowHandle()->screen()->size().width());
// _fullscreenMenuWidget->show();
// }
// else {
// // Restore menu to being part of MainWindow.
// _fullscreenMenuWidget->hide();
// _window->setMenuBar(Menu::getInstance());
// _window->menuBar()->setMaximumHeight(QWIDGETSIZE_MAX);
// }
//#endif
// Work around Qt bug that prevents floating menus being shown when in fullscreen mode.
// https://bugreports.qt.io/browse/QTBUG-41883
// Known issue: Top-level menu items don't highlight when cursor hovers. This is probably a side-effect of the work-around.
// TODO: Remove this work-around once the bug has been fixed and restore the following lines.
//_window->setWindowState(fullscreen ? (_window->windowState() | Qt::WindowFullScreen) :
// (_window->windowState() & ~Qt::WindowFullScreen));
auto window = this->getWindow();
window->hide();
if (fullscreen) {
auto state = window->windowState() | Qt::WindowFullScreen;
window->setWindowState(Qt::WindowState((int)state));
// The next line produces the following warning in the log:
// [WARNING][03 / 06 12:17 : 58] QWidget::setMinimumSize: (/ MainWindow) Negative sizes
// (0, -1) are not possible
// This is better than the alternative which is to have the window slightly less than fullscreen with a visible line
// of pixels for the remainder of the screen.
//window->setContentsMargins(0, 0, 0, -1);
}
else {
window->setWindowState(Qt::WindowState(window->windowState() & ~Qt::WindowFullScreen));
//window->setContentsMargins(0, 0, 0, 0);
}
window->show();
}

View file

@ -13,8 +13,14 @@ class Basic2DWindowOpenGLDisplayPlugin : public MainWindowOpenGLDisplayPlugin {
Q_OBJECT Q_OBJECT
public: public:
virtual void activate(PluginContainer * container) override;
virtual void deactivate(PluginContainer* container) override;
virtual const QString & getName() const override; virtual const QString & getName() const override;
public slots:
void setFullscreen(bool fullscreen);
private: private:
static const QString NAME; static const QString NAME;
}; };

View file

@ -33,4 +33,4 @@ void NullDisplayPlugin::display(GLuint sceneTexture, const glm::uvec2& sceneSize
void NullDisplayPlugin::finishFrame() {} void NullDisplayPlugin::finishFrame() {}
void NullDisplayPlugin::activate(PluginContainer * container) {} void NullDisplayPlugin::activate(PluginContainer * container) {}
void NullDisplayPlugin::deactivate() {} void NullDisplayPlugin::deactivate(PluginContainer* container) {}

View file

@ -16,7 +16,7 @@ public:
virtual const QString & getName() const override; virtual const QString & getName() const override;
void activate(PluginContainer * container) override; void activate(PluginContainer * container) override;
void deactivate() override; void deactivate(PluginContainer* container) override;
virtual glm::uvec2 getRecommendedRenderSize() const override; virtual glm::uvec2 getRecommendedRenderSize() const override;
virtual bool hasFocus() const override; virtual bool hasFocus() const override;

View file

@ -72,7 +72,7 @@ void OpenGLDisplayPlugin::activate(PluginContainer * container) {
_timer.start(1); _timer.start(1);
} }
void OpenGLDisplayPlugin::deactivate() { void OpenGLDisplayPlugin::deactivate(PluginContainer* container) {
_timer.stop(); _timer.stop();
makeCurrent(); makeCurrent();

View file

@ -23,8 +23,8 @@ public:
virtual void preDisplay() override; virtual void preDisplay() override;
virtual void finishFrame() override; virtual void finishFrame() override;
virtual void activate(PluginContainer * container) override; virtual void activate(PluginContainer* container) override;
virtual void deactivate() override; virtual void deactivate(PluginContainer* container) override;
virtual bool eventFilter(QObject* receiver, QEvent* event) override; virtual bool eventFilter(QObject* receiver, QEvent* event) override;

View file

@ -45,8 +45,8 @@ void WindowOpenGLDisplayPlugin::activate(PluginContainer * container) {
customizeContext(container); customizeContext(container);
} }
void WindowOpenGLDisplayPlugin::deactivate() { void WindowOpenGLDisplayPlugin::deactivate(PluginContainer* container) {
OpenGLDisplayPlugin::deactivate(); OpenGLDisplayPlugin::deactivate(container);
destroyWindow(); destroyWindow();
_window = nullptr; _window = nullptr;
} }

View file

@ -22,7 +22,7 @@ public:
virtual bool hasFocus() const override; virtual bool hasFocus() const override;
virtual QWindow* getWindow() const override; virtual QWindow* getWindow() const override;
virtual void activate(PluginContainer * container) override; virtual void activate(PluginContainer * container) override;
virtual void deactivate() override; virtual void deactivate(PluginContainer* container) override;
virtual void installEventFilter(QObject* filter) override; virtual void installEventFilter(QObject* filter) override;
virtual void removeEventFilter(QObject* filter) override; virtual void removeEventFilter(QObject* filter) override;

View file

@ -99,11 +99,11 @@ void Oculus_0_5_DisplayPlugin::activate(PluginContainer * container) {
Q_ASSERT(result); Q_ASSERT(result);
} }
void Oculus_0_5_DisplayPlugin::deactivate() { void Oculus_0_5_DisplayPlugin::deactivate(PluginContainer* container) {
_hmdWindow->deleteLater(); _hmdWindow->deleteLater();
_hmdWindow = nullptr; _hmdWindow = nullptr;
OculusBaseDisplayPlugin::deactivate(); OculusBaseDisplayPlugin::deactivate(container);
ovrHmd_Destroy(_hmd); ovrHmd_Destroy(_hmd);
_hmd = nullptr; _hmd = nullptr;

View file

@ -26,7 +26,7 @@ public:
virtual const QString & getName() const override; virtual const QString & getName() const override;
virtual void activate(PluginContainer * container) override; virtual void activate(PluginContainer * container) override;
virtual void deactivate() override; virtual void deactivate(PluginContainer* container) override;
virtual bool eventFilter(QObject* receiver, QEvent* event) override; virtual bool eventFilter(QObject* receiver, QEvent* event) override;

View file

@ -220,14 +220,14 @@ void Oculus_0_6_DisplayPlugin::customizeContext(PluginContainer * container) {
_sceneFbo->Init(getRecommendedRenderSize()); _sceneFbo->Init(getRecommendedRenderSize());
} }
void Oculus_0_6_DisplayPlugin::deactivate() { void Oculus_0_6_DisplayPlugin::deactivate(PluginContainer* container) {
makeCurrent(); makeCurrent();
_sceneFbo.reset(); _sceneFbo.reset();
_mirrorFbo.reset(); _mirrorFbo.reset();
doneCurrent(); doneCurrent();
PerformanceTimer::setActive(false); PerformanceTimer::setActive(false);
OculusBaseDisplayPlugin::deactivate(); OculusBaseDisplayPlugin::deactivate(container);
ovrHmd_Destroy(_hmd); ovrHmd_Destroy(_hmd);
_hmd = nullptr; _hmd = nullptr;

View file

@ -26,7 +26,7 @@ public:
virtual const QString & getName() const override; virtual const QString & getName() const override;
virtual void activate(PluginContainer * container) override; virtual void activate(PluginContainer * container) override;
virtual void deactivate() override; virtual void deactivate(PluginContainer* container) override;
virtual bool eventFilter(QObject* receiver, QEvent* event) override; virtual bool eventFilter(QObject* receiver, QEvent* event) override;

View file

@ -31,6 +31,8 @@ Q_LOGGING_CATEGORY(displayplugins, "hifi.displayplugins")
const QString OpenVrDisplayPlugin::NAME("OpenVR (Vive)"); const QString OpenVrDisplayPlugin::NAME("OpenVR (Vive)");
const QString StandingHMDSensorMode = "Standing HMD Sensor Mode"; // this probably shouldn't be hardcoded here
const QString & OpenVrDisplayPlugin::getName() const { const QString & OpenVrDisplayPlugin::getName() const {
return NAME; return NAME;
} }
@ -80,6 +82,8 @@ bool OpenVrDisplayPlugin::isSupported() const {
} }
void OpenVrDisplayPlugin::activate(PluginContainer * container) { void OpenVrDisplayPlugin::activate(PluginContainer * container) {
container->setIsOptionChecked(StandingHMDSensorMode, true);
hmdRefCount++; hmdRefCount++;
vr::HmdError eError = vr::HmdError_None; vr::HmdError eError = vr::HmdError_None;
if (!_hmd) { if (!_hmd) {
@ -120,7 +124,9 @@ void OpenVrDisplayPlugin::activate(PluginContainer * container) {
MainWindowOpenGLDisplayPlugin::activate(container); MainWindowOpenGLDisplayPlugin::activate(container);
} }
void OpenVrDisplayPlugin::deactivate() { void OpenVrDisplayPlugin::deactivate(PluginContainer* container) {
container->setIsOptionChecked(StandingHMDSensorMode, false);
hmdRefCount--; hmdRefCount--;
if (hmdRefCount == 0 && _hmd) { if (hmdRefCount == 0 && _hmd) {

View file

@ -18,7 +18,7 @@ public:
virtual bool isHmd() const override { return true; } virtual bool isHmd() const override { return true; }
virtual void activate(PluginContainer * container) override; virtual void activate(PluginContainer * container) override;
virtual void deactivate() override; virtual void deactivate(PluginContainer* container) override;
virtual glm::uvec2 getRecommendedRenderSize() const override; virtual glm::uvec2 getRecommendedRenderSize() const override;
virtual glm::uvec2 getRecommendedUiSize() const override { return uvec2(1920, 1080); } virtual glm::uvec2 getRecommendedUiSize() const override { return uvec2(1920, 1080); }

View file

@ -62,7 +62,7 @@ public:
const QString& getName() const { return NAME; } const QString& getName() const { return NAME; }
virtual void activate(PluginContainer * container) override {}; virtual void activate(PluginContainer * container) override {};
virtual void deactivate() override {}; virtual void deactivate(PluginContainer* container) override {};
virtual void pluginFocusOutEvent() override { focusOutEvent(); } virtual void pluginFocusOutEvent() override { focusOutEvent(); }
virtual void pluginUpdate(float deltaTime, bool jointsCaptured) override { update(deltaTime, jointsCaptured); } virtual void pluginUpdate(float deltaTime, bool jointsCaptured) override { update(deltaTime, jointsCaptured); }

View file

@ -35,7 +35,7 @@ public:
virtual void init() override; virtual void init() override;
virtual void deinit() override; virtual void deinit() override;
virtual void activate(PluginContainer * container) override {}; virtual void activate(PluginContainer * container) override {};
virtual void deactivate() override {}; virtual void deactivate(PluginContainer* container) override {};
virtual void pluginFocusOutEvent() override; virtual void pluginFocusOutEvent() override;
virtual void pluginUpdate(float deltaTime, bool jointsCaptured) override; virtual void pluginUpdate(float deltaTime, bool jointsCaptured) override;

View file

@ -15,6 +15,7 @@
#include <NumericalConstants.h> #include <NumericalConstants.h>
#include "NumericalConstants.h" #include "NumericalConstants.h"
#include <plugins/PluginContainer.h>
#include "SixenseManager.h" #include "SixenseManager.h"
#include "UserActivityLogger.h" #include "UserActivityLogger.h"
@ -52,6 +53,11 @@ typedef int (*SixenseTakeIntAndSixenseControllerData)(int, sixenseControllerData
const QString SixenseManager::NAME = "Sixense"; 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 TOGGLE_SMOOTH = "Smooth Sixense Movement";
SixenseManager& SixenseManager::getInstance() { SixenseManager& SixenseManager::getInstance() {
static SixenseManager sharedInstance; static SixenseManager sharedInstance;
return sharedInstance; return sharedInstance;
@ -69,7 +75,7 @@ SixenseManager::SixenseManager() :
bool SixenseManager::isSupported() const { bool SixenseManager::isSupported() const {
#ifdef HAVE_SIXENSE #ifdef HAVE_SIXENSE
return false; return true;
#else #else
return false; return false;
#endif #endif
@ -82,6 +88,11 @@ void SixenseManager::activate(PluginContainer* container) {
// as the "torso" is below it. // as the "torso" is below it.
_neckBase = glm::vec3(NECK_X, -NECK_Y, NECK_Z); _neckBase = glm::vec3(NECK_X, -NECK_Y, NECK_Z);
container->addMenu(MENU_PATH);
container->addMenuItem(MENU_PATH, TOGGLE_SMOOTH,
[this] (bool clicked) { this->setFilter(clicked); },
true, true);
#ifdef __APPLE__ #ifdef __APPLE__
if (!_sixenseLibrary) { if (!_sixenseLibrary) {
@ -111,8 +122,12 @@ void SixenseManager::activate(PluginContainer* container) {
#endif #endif
} }
void SixenseManager::deinit() { void SixenseManager::deactivate(PluginContainer* container) {
#ifdef HAVE_SIXENSE_ #ifdef HAVE_SIXENSE
container->removeMenuItem(MENU_NAME, TOGGLE_SMOOTH);
container->removeMenu(MENU_PATH);
_poseStateMap.clear();
#ifdef __APPLE__ #ifdef __APPLE__
SixenseBaseFunction sixenseExit = (SixenseBaseFunction)_sixenseLibrary->resolve("sixenseExit"); SixenseBaseFunction sixenseExit = (SixenseBaseFunction)_sixenseLibrary->resolve("sixenseExit");

View file

@ -18,6 +18,7 @@
#include "sixense.h" #include "sixense.h"
#ifdef __APPLE__ #ifdef __APPLE__
#include <QCoreApplication>
#include <qlibrary.h> #include <qlibrary.h>
#endif #endif
@ -62,9 +63,8 @@ public:
virtual bool isJointController() const override { return true; } virtual bool isJointController() const override { return true; }
const QString& getName() const { return NAME; } const QString& getName() const { return NAME; }
virtual void deinit() override;
virtual void activate(PluginContainer * container) override; virtual void activate(PluginContainer * container) override;
virtual void deactivate() override { _poseStateMap.clear(); } virtual void deactivate(PluginContainer* container) override;
virtual void pluginFocusOutEvent() override { focusOutEvent(); } virtual void pluginFocusOutEvent() override { focusOutEvent(); }
virtual void pluginUpdate(float deltaTime, bool jointsCaptured) override { update(deltaTime, jointsCaptured); } virtual void pluginUpdate(float deltaTime, bool jointsCaptured) override { update(deltaTime, jointsCaptured); }

View file

@ -19,6 +19,7 @@
#include <DeferredLightingEffect.h> #include <DeferredLightingEffect.h>
#include <display-plugins/openvr/OpenVrHelpers.h> #include <display-plugins/openvr/OpenVrHelpers.h>
#include "NumericalConstants.h" #include "NumericalConstants.h"
#include <plugins/PluginContainer.h>
#include "UserActivityLogger.h" #include "UserActivityLogger.h"
#ifndef Q_OS_MAC #ifndef Q_OS_MAC
@ -46,12 +47,18 @@ const QString CONTROLLER_MODEL_STRING = "vr_controller_05_wireless_b";
const QString ViveControllerManager::NAME = "OpenVR"; 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() : ViveControllerManager::ViveControllerManager() :
InputDevice("SteamVR Controller"), InputDevice("SteamVR Controller"),
_trackedControllers(0), _trackedControllers(0),
_modelLoaded(false), _modelLoaded(false),
_leftHandRenderID(0), _leftHandRenderID(0),
_rightHandRenderID(0) _rightHandRenderID(0),
_renderControllers(false)
{ {
} }
@ -66,6 +73,11 @@ bool ViveControllerManager::isSupported() const {
void ViveControllerManager::activate(PluginContainer* container) { void ViveControllerManager::activate(PluginContainer* container) {
#ifndef Q_OS_MAC #ifndef Q_OS_MAC
container->addMenu(MENU_PATH);
container->addMenuItem(MENU_PATH, RENDER_CONTROLLERS,
[this] (bool clicked) { this->setRenderControllers(clicked); },
true, true);
hmdRefCount++; hmdRefCount++;
if (!_hmd) { if (!_hmd) {
vr::HmdError eError = vr::HmdError_None; vr::HmdError eError = vr::HmdError_None;
@ -118,12 +130,16 @@ void ViveControllerManager::activate(PluginContainer* container) {
_texture->autoGenerateMips(-1); _texture->autoGenerateMips(-1);
_modelLoaded = true; _modelLoaded = true;
_renderControllers = true;
} }
#endif #endif
} }
void ViveControllerManager::deactivate() { void ViveControllerManager::deactivate(PluginContainer* container) {
#ifndef Q_OS_MAC #ifndef Q_OS_MAC
container->removeMenuItem(MENU_NAME, RENDER_CONTROLLERS);
container->removeMenu(MENU_PATH);
hmdRefCount--; hmdRefCount--;
if (hmdRefCount == 0 && _hmd) { if (hmdRefCount == 0 && _hmd) {
@ -199,18 +215,18 @@ void ViveControllerManager::renderHand(UserInputMapper::PoseValue pose, gpu::Bat
void ViveControllerManager::update(float deltaTime, bool jointsCaptured) { void ViveControllerManager::update(float deltaTime, bool jointsCaptured) {
#ifndef Q_OS_MAC #ifndef Q_OS_MAC
_poseStateMap.clear(); _poseStateMap.clear();
// TODO: This shouldn't be necessary // TODO: This shouldn't be necessary
if (!_hmd) { if (!_hmd) {
return; return;
} }
return;
_buttonPressedMap.clear(); _buttonPressedMap.clear();
PerformanceTimer perfTimer("ViveControllerManager::update"); PerformanceTimer perfTimer("ViveControllerManager::update");
int numTrackedControllers = 0; int numTrackedControllers = 0;
for (vr::TrackedDeviceIndex_t device = vr::k_unTrackedDeviceIndex_Hmd + 1; for (vr::TrackedDeviceIndex_t device = vr::k_unTrackedDeviceIndex_Hmd + 1;
device < vr::k_unMaxTrackedDeviceCount && numTrackedControllers < 2; ++device) { device < vr::k_unMaxTrackedDeviceCount && numTrackedControllers < 2; ++device) {
@ -360,7 +376,6 @@ void ViveControllerManager::registerToUserInputMapper(UserInputMapper& mapper) {
void ViveControllerManager::assignDefaultInputMapping(UserInputMapper& mapper) { void ViveControllerManager::assignDefaultInputMapping(UserInputMapper& mapper) {
const float JOYSTICK_MOVE_SPEED = 1.0f; const float JOYSTICK_MOVE_SPEED = 1.0f;
const float BOOM_SPEED = 0.1f;
// Left Trackpad: Movement, strafing // Left Trackpad: Movement, strafing
mapper.addInputChannel(UserInputMapper::LONGITUDINAL_FORWARD, makeInput(AXIS_Y_POS, 0), makeInput(TRACKPAD_BUTTON, 0), JOYSTICK_MOVE_SPEED); mapper.addInputChannel(UserInputMapper::LONGITUDINAL_FORWARD, makeInput(AXIS_Y_POS, 0), makeInput(TRACKPAD_BUTTON, 0), JOYSTICK_MOVE_SPEED);

View file

@ -42,7 +42,7 @@ public:
AXIS_3, AXIS_3,
AXIS_4, AXIS_4,
}; };
enum JointChannel { enum JointChannel {
LEFT_HAND = 0, LEFT_HAND = 0,
RIGHT_HAND, RIGHT_HAND,
@ -56,7 +56,7 @@ public:
const QString& getName() const { return NAME; } const QString& getName() const { return NAME; }
virtual void activate(PluginContainer * container) override; virtual void activate(PluginContainer * container) override;
virtual void deactivate() override; virtual void deactivate(PluginContainer* container) override;
virtual void pluginFocusOutEvent() override { focusOutEvent(); } virtual void pluginFocusOutEvent() override { focusOutEvent(); }
virtual void pluginUpdate(float deltaTime, bool jointsCaptured) override { update(deltaTime, jointsCaptured); } virtual void pluginUpdate(float deltaTime, bool jointsCaptured) override { update(deltaTime, jointsCaptured); }
@ -68,6 +68,8 @@ public:
virtual void focusOutEvent() override; virtual void focusOutEvent() override;
void updateRendering(RenderArgs* args, render::ScenePointer scene, render::PendingChanges pendingChanges); 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(unsigned int button, int index);
UserInputMapper::Input makeInput(JoystickAxisChannel axis, int index); UserInputMapper::Input makeInput(JoystickAxisChannel axis, int index);
@ -89,6 +91,8 @@ private:
int _leftHandRenderID; int _leftHandRenderID;
int _rightHandRenderID; int _rightHandRenderID;
bool _renderControllers;
static const QString NAME; static const QString NAME;
}; };

View file

@ -16,9 +16,9 @@ public:
virtual void deinit(); virtual void deinit();
/// Called when a plugin is being activated for use. May be called multiple times. /// Called when a plugin is being activated for use. May be called multiple times.
virtual void activate(PluginContainer * container) = 0; virtual void activate(PluginContainer* container) = 0;
/// Called when a plugin is no longer being used. May be called multiple times. /// Called when a plugin is no longer being used. May be called multiple times.
virtual void deactivate() = 0; virtual void deactivate(PluginContainer* container) = 0;
/** /**
* Called by the application during it's idle phase. If the plugin needs to do * Called by the application during it's idle phase. If the plugin needs to do

View file

@ -7,6 +7,11 @@ class GlWindow;
class PluginContainer { class PluginContainer {
public: public:
virtual void addMenuItem(const QString& path, const QString& name, std::function<void()> onClicked, bool checkable = false, bool checked = false, const QString& groupName = "") = 0; 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<void(bool)> 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;
virtual GlWindow* getVisibleWindow() = 0; virtual GlWindow* getVisibleWindow() = 0;
}; };

View file

@ -213,7 +213,6 @@ public:
ShowBordersEntityNodes, ShowBordersEntityNodes,
ShowIKConstraints, ShowIKConstraints,
SimpleShadows, SimpleShadows,
SixenseEnabled,
ShiftHipsForIdleAnimations, ShiftHipsForIdleAnimations,
Stars, Stars,
Stats, Stats,