From 7c9189cfbe74c3e15574404b802e1054dec1685b Mon Sep 17 00:00:00 2001 From: Sam Gondelman Date: Thu, 23 Jul 2015 16:13:27 -0700 Subject: [PATCH 1/4] trying to fix init issue --- interface/src/Application.cpp | 3 +++ interface/src/InputPlugins.cpp | 5 +---- .../oculus/Oculus_0_5_DisplayPlugin.cpp | 16 +++++++++++----- .../oculus/Oculus_0_5_DisplayPlugin.h | 2 ++ .../src/input-plugins/SixenseManager.h | 6 +++--- 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b4a285a680..4b6c4663d1 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -535,6 +535,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : container->setFocus(); container->installEventFilter(DependencyManager::get().data()); + // Necessary to call this here so Oculus can get inited before Sixense + getDisplayPlugins(); + // must be before initializeGL() _activeInputPlugins.clear(); auto inputPlugins = getInputPlugins(); diff --git a/interface/src/InputPlugins.cpp b/interface/src/InputPlugins.cpp index c0f6dcbf65..c99be26b8f 100644 --- a/interface/src/InputPlugins.cpp +++ b/interface/src/InputPlugins.cpp @@ -28,7 +28,7 @@ static void addInputPluginToMenu(InputPluginPointer inputPlugin, bool active = f } auto parent = menu->getMenu(MenuOption::InputMenu); auto action = menu->addCheckableActionToQMenuAndActionHash(parent, - name, 0, true, qApp, + name, 0, active, qApp, SLOT(updateInputModes())); inputPluginGroup->addAction(action); inputPluginGroup->setExclusive(false); @@ -45,10 +45,7 @@ const InputPluginList& getInputPlugins() { InputPlugin* PLUGIN_POOL[] = { new KeyboardMouseDevice(), new SDL2Manager(), - // Sixense is causing some sort of memory corruption on OSX -#ifndef Q_OS_MAC new SixenseManager(), -#endif new ViveControllerManager(), nullptr }; diff --git a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp index a44e724981..48235be2a0 100644 --- a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp @@ -47,7 +47,7 @@ bool Oculus_0_5_DisplayPlugin::isSupported() const { return result; } -void Oculus_0_5_DisplayPlugin::activate(PluginContainer * container) { +void Oculus_0_5_DisplayPlugin::init() { if (!OVR_SUCCESS(ovr_Initialize(nullptr))) { Q_ASSERT(false); qFatal("Failed to Initialize SDK"); @@ -57,6 +57,16 @@ void Oculus_0_5_DisplayPlugin::activate(PluginContainer * container) { qFatal("Failed to acquire HMD"); } +} + +void Oculus_0_5_DisplayPlugin::deinit() { + ovr_Shutdown(); + + ovrHmd_Destroy(_hmd); + _hmd = nullptr; +} + +void Oculus_0_5_DisplayPlugin::activate(PluginContainer * container) { OculusBaseDisplayPlugin::activate(container); _window->makeCurrent(); @@ -104,10 +114,6 @@ void Oculus_0_5_DisplayPlugin::deactivate(PluginContainer* container) { _hmdWindow = nullptr; OculusBaseDisplayPlugin::deactivate(container); - - ovrHmd_Destroy(_hmd); - _hmd = nullptr; - ovr_Shutdown(); } void Oculus_0_5_DisplayPlugin::preRender() { diff --git a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.h b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.h index e1594b2d1d..4cba780b34 100644 --- a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.h @@ -25,6 +25,8 @@ public: virtual bool isSupported() const override; virtual const QString & getName() const override; + virtual void init() override; + virtual void deinit() override; virtual void activate(PluginContainer * container) override; virtual void deactivate(PluginContainer* container) override; diff --git a/libraries/input-plugins/src/input-plugins/SixenseManager.h b/libraries/input-plugins/src/input-plugins/SixenseManager.h index 09166d4eb6..2b63aa4ebd 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseManager.h +++ b/libraries/input-plugins/src/input-plugins/SixenseManager.h @@ -81,7 +81,9 @@ public: UserInputMapper::Input makeInput(unsigned int button, int index); UserInputMapper::Input makeInput(JoystickAxisChannel axis, int index); UserInputMapper::Input makeInput(JointChannel joint); - + + static const QString NAME; + public slots: void setFilter(bool filter); @@ -118,8 +120,6 @@ private: bool _hydrasConnected; bool _invertButtons = DEFAULT_INVERT_SIXENSE_MOUSE_BUTTONS; - - static const QString NAME; }; #endif // hifi_SixenseManager_h From 1af51572afef365edbf0c94d2dbed12c4b435501 Mon Sep 17 00:00:00 2001 From: Sam Gondelman Date: Fri, 24 Jul 2015 17:10:39 -0700 Subject: [PATCH 2/4] fixed init crash if you follow very specific startup steps --- interface/src/Application.cpp | 29 +++++++++---------- interface/src/ui/ApplicationCompositor.cpp | 4 ++- .../oculus/Oculus_0_5_DisplayPlugin.cpp | 4 +-- .../src/input-plugins/SixenseManager.h | 4 +-- 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 8e02edd130..f67f2ac66b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -535,21 +535,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : container->setFocus(); container->installEventFilter(DependencyManager::get().data()); - // Necessary to call this here so Oculus can get inited before Sixense - getDisplayPlugins(); - - // must be before initializeGL() - _activeInputPlugins.clear(); - auto inputPlugins = getInputPlugins(); - foreach(auto inputPlugin, inputPlugins) { - QString name = inputPlugin->getName(); - if (name == KeyboardMouseDevice::NAME) { - _keyboardMouseDevice = static_cast(inputPlugin.data()); // TODO: this seems super hacky - break; - } - } - updateInputModes(); - _offscreenContext->makeCurrent(); initializeGL(); // initialization continues in initializeGL when OpenGL context is ready @@ -894,6 +879,20 @@ void Application::initializeUi() { resizeGL(); } }); + + // This will prevent the hid_init sixense crash + getActiveDisplayPlugin(); + + // This will set up the input plugins UI + _activeInputPlugins.clear(); + auto inputPlugins = getInputPlugins(); + foreach(auto inputPlugin, inputPlugins) { + QString name = inputPlugin->getName(); + if (name == KeyboardMouseDevice::NAME) { + _keyboardMouseDevice = static_cast(inputPlugin.data()); // TODO: this seems super hacky + } + } + updateInputModes(); } template diff --git a/interface/src/ui/ApplicationCompositor.cpp b/interface/src/ui/ApplicationCompositor.cpp index 38badeaaa4..828d13fe19 100644 --- a/interface/src/ui/ApplicationCompositor.cpp +++ b/interface/src/ui/ApplicationCompositor.cpp @@ -112,7 +112,9 @@ bool raySphereIntersect(const glm::vec3 &dir, const glm::vec3 &origin, float r, } } -ApplicationCompositor::ApplicationCompositor() { +ApplicationCompositor::ApplicationCompositor() : + _alphaPropertyAnimation(new QPropertyAnimation(this, "alpha")) +{ memset(_reticleActive, 0, sizeof(_reticleActive)); memset(_magActive, 0, sizeof(_reticleActive)); memset(_magSizeMult, 0, sizeof(_magSizeMult)); diff --git a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp index 48235be2a0..0f76744130 100644 --- a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp @@ -56,14 +56,12 @@ void Oculus_0_5_DisplayPlugin::init() { if (!_hmd) { qFatal("Failed to acquire HMD"); } - } void Oculus_0_5_DisplayPlugin::deinit() { - ovr_Shutdown(); - ovrHmd_Destroy(_hmd); _hmd = nullptr; + ovr_Shutdown(); } void Oculus_0_5_DisplayPlugin::activate(PluginContainer * container) { diff --git a/libraries/input-plugins/src/input-plugins/SixenseManager.h b/libraries/input-plugins/src/input-plugins/SixenseManager.h index a49cf6c70a..c6992bc711 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseManager.h +++ b/libraries/input-plugins/src/input-plugins/SixenseManager.h @@ -84,8 +84,6 @@ public: UserInputMapper::Input makeInput(JoystickAxisChannel axis, int index); UserInputMapper::Input makeInput(JointChannel joint); - static const QString NAME; - public slots: void setFilter(bool filter); @@ -120,6 +118,8 @@ private: bool _hydrasConnected; bool _invertButtons = DEFAULT_INVERT_SIXENSE_MOUSE_BUTTONS; + + static const QString NAME; }; #endif // hifi_SixenseManager_h From f801471dd70302dbd6364a3883588fd33b2801fd Mon Sep 17 00:00:00 2001 From: Sam Gondelman Date: Fri, 24 Jul 2015 17:33:06 -0700 Subject: [PATCH 3/4] remove unnecessary line --- interface/src/Application.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f67f2ac66b..8fb82f7ec0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -880,9 +880,6 @@ void Application::initializeUi() { } }); - // This will prevent the hid_init sixense crash - getActiveDisplayPlugin(); - // This will set up the input plugins UI _activeInputPlugins.clear(); auto inputPlugins = getInputPlugins(); From 0aee95fe38a3d5e5ec2e1f3479139d6f18969842 Mon Sep 17 00:00:00 2001 From: Sam Gondelman Date: Fri, 24 Jul 2015 17:44:20 -0700 Subject: [PATCH 4/4] oculus sdk initialization done in activate/deactivate, not init/deinit --- .../oculus/Oculus_0_5_DisplayPlugin.cpp | 16 ++++++---------- .../oculus/Oculus_0_5_DisplayPlugin.h | 2 -- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp index 0f76744130..12b0b8d38f 100644 --- a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp @@ -47,7 +47,7 @@ bool Oculus_0_5_DisplayPlugin::isSupported() const { return result; } -void Oculus_0_5_DisplayPlugin::init() { +void Oculus_0_5_DisplayPlugin::activate(PluginContainer * container) { if (!OVR_SUCCESS(ovr_Initialize(nullptr))) { Q_ASSERT(false); qFatal("Failed to Initialize SDK"); @@ -56,15 +56,7 @@ void Oculus_0_5_DisplayPlugin::init() { if (!_hmd) { qFatal("Failed to acquire HMD"); } -} - -void Oculus_0_5_DisplayPlugin::deinit() { - ovrHmd_Destroy(_hmd); - _hmd = nullptr; - ovr_Shutdown(); -} - -void Oculus_0_5_DisplayPlugin::activate(PluginContainer * container) { + OculusBaseDisplayPlugin::activate(container); _window->makeCurrent(); @@ -112,6 +104,10 @@ void Oculus_0_5_DisplayPlugin::deactivate(PluginContainer* container) { _hmdWindow = nullptr; OculusBaseDisplayPlugin::deactivate(container); + + ovrHmd_Destroy(_hmd); + _hmd = nullptr; + ovr_Shutdown(); } void Oculus_0_5_DisplayPlugin::preRender() { diff --git a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.h b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.h index 594544d9ad..6b77f7617e 100644 --- a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.h @@ -25,8 +25,6 @@ public: virtual bool isSupported() const override; virtual const QString & getName() const override; - virtual void init() override; - virtual void deinit() override; virtual void activate(PluginContainer * container) override; virtual void deactivate(PluginContainer* container) override;