diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fc43c0d25c..aeb87bce40 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -344,6 +344,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _applicationOverlay() { setInstance(this); + Plugin::setContainer(this); #ifdef Q_OS_WIN installNativeEventFilter(&MyNativeEventFilter::getInstance()); #endif @@ -666,7 +667,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : void Application::aboutToQuit() { emit beforeAboutToQuit(); - getActiveDisplayPlugin()->deactivate(this); + getActiveDisplayPlugin()->deactivate(); _aboutToQuit = true; cleanupBeforeQuit(); } @@ -744,12 +745,11 @@ Application::~Application() { ModelEntityItem::cleanupLoadedAnimations(); - auto inputPlugins = getInputPlugins(); - foreach(auto inputPlugin, inputPlugins) { + foreach(auto inputPlugin, PluginManager::getInstance()->getInputPlugins()) { QString name = inputPlugin->getName(); QAction* action = Menu::getInstance()->getActionForOption(name); if (action->isChecked()) { - inputPlugin->deactivate(this); + inputPlugin->deactivate(); } } @@ -883,8 +883,7 @@ void Application::initializeUi() { // This will set up the input plugins UI _activeInputPlugins.clear(); - auto inputPlugins = getInputPlugins(); - foreach(auto inputPlugin, inputPlugins) { + foreach(auto inputPlugin, PluginManager::getInstance()->getInputPlugins()) { QString name = inputPlugin->getName(); if (name == KeyboardMouseDevice::NAME) { _keyboardMouseDevice = static_cast(inputPlugin.data()); // TODO: this seems super hacky @@ -1601,7 +1600,7 @@ void Application::keyReleaseEvent(QKeyEvent* event) { } void Application::focusOutEvent(QFocusEvent* event) { - auto inputPlugins = getInputPlugins(); + auto inputPlugins = PluginManager::getInstance()->getInputPlugins(); foreach(auto inputPlugin, inputPlugins) { QString name = inputPlugin->getName(); QAction* action = Menu::getInstance()->getActionForOption(name); @@ -1948,7 +1947,7 @@ void Application::idle() { PerformanceTimer perfTimer("updateGL"); PerformanceWarning warn(showWarnings, "Application::idle()... updateGL()"); getActiveDisplayPlugin()->idle(); - auto inputPlugins = getInputPlugins(); + auto inputPlugins = PluginManager::getInstance()->getInputPlugins(); foreach(auto inputPlugin, inputPlugins) { QString name = inputPlugin->getName(); QAction* action = Menu::getInstance()->getActionForOption(name); @@ -2519,7 +2518,7 @@ void Application::update(float deltaTime) { // This needs to go after userInputMapper->update() because of the keyboard bool jointsCaptured = false; - auto inputPlugins = getInputPlugins(); + auto inputPlugins = PluginManager::getInstance()->getInputPlugins(); foreach(auto inputPlugin, inputPlugins) { QString name = inputPlugin->getName(); QAction* action = Menu::getInstance()->getActionForOption(name); @@ -4519,15 +4518,53 @@ const DisplayPlugin * Application::getActiveDisplayPlugin() const { return ((Application*)this)->getActiveDisplayPlugin(); } + +static void addDisplayPluginToMenu(DisplayPluginPointer displayPlugin, bool active = false) { + auto menu = Menu::getInstance(); + QString name = displayPlugin->getName(); + Q_ASSERT(!menu->menuItemExists(MenuOption::OutputMenu, name)); + + static QActionGroup* displayPluginGroup = nullptr; + if (!displayPluginGroup) { + displayPluginGroup = new QActionGroup(menu); + displayPluginGroup->setExclusive(true); + } + auto parent = menu->getMenu(MenuOption::OutputMenu); + auto action = menu->addActionToQMenuAndActionHash(parent, + name, 0, qApp, + SLOT(updateDisplayMode())); + action->setCheckable(true); + action->setChecked(active); + displayPluginGroup->addAction(action); + Q_ASSERT(menu->menuItemExists(MenuOption::OutputMenu, name)); +} + static QVector> _currentDisplayPluginActions; void Application::updateDisplayMode() { auto menu = Menu::getInstance(); - auto displayPlugins = getDisplayPlugins(); + auto displayPlugins = PluginManager::getInstance()->getDisplayPlugins(); + + static std::once_flag once; + std::call_once(once, [&] { + bool first = true; + foreach(auto displayPlugin, displayPlugins) { + addDisplayPluginToMenu(displayPlugin, first); + QObject::connect(displayPlugin.data(), &DisplayPlugin::requestRender, [this] { + paintGL(); + }); + QObject::connect(displayPlugin.data(), &DisplayPlugin::recommendedFramebufferSizeChanged, [this](const QSize & size) { + resizeGL(); + }); + + first = false; + } + }); + // Default to the first item on the list, in case none of the menu items match DisplayPluginPointer newDisplayPlugin = displayPlugins.at(0); - foreach(DisplayPluginPointer displayPlugin, getDisplayPlugins()) { + foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getDisplayPlugins()) { QString name = displayPlugin->getName(); QAction* action = menu->getActionForOption(name); if (action->isChecked()) { @@ -4549,7 +4586,7 @@ void Application::updateDisplayMode() { if (newDisplayPlugin) { _offscreenContext->makeCurrent(); - newDisplayPlugin->activate(this); + newDisplayPlugin->activate(); _offscreenContext->makeCurrent(); offscreenUi->resize(fromGlm(newDisplayPlugin->getRecommendedUiSize())); _offscreenContext->makeCurrent(); @@ -4559,7 +4596,7 @@ void Application::updateDisplayMode() { _displayPlugin = newDisplayPlugin; if (oldDisplayPlugin) { - oldDisplayPlugin->deactivate(this); + oldDisplayPlugin->deactivate(); _offscreenContext->makeCurrent(); } resetSensors(); @@ -4569,9 +4606,37 @@ void Application::updateDisplayMode() { static QVector> _currentInputPluginActions; + +static void addInputPluginToMenu(InputPluginPointer inputPlugin, bool active = false) { + auto menu = Menu::getInstance(); + QString name = inputPlugin->getName(); + Q_ASSERT(!menu->menuItemExists(MenuOption::InputMenu, name)); + + static QActionGroup* inputPluginGroup = nullptr; + if (!inputPluginGroup) { + inputPluginGroup = new QActionGroup(menu); + } + auto parent = menu->getMenu(MenuOption::InputMenu); + auto action = menu->addCheckableActionToQMenuAndActionHash(parent, + name, 0, active, qApp, + SLOT(updateInputModes())); + inputPluginGroup->addAction(action); + inputPluginGroup->setExclusive(false); + Q_ASSERT(menu->menuItemExists(MenuOption::InputMenu, name)); +} + + void Application::updateInputModes() { auto menu = Menu::getInstance(); - auto inputPlugins = getInputPlugins(); + auto inputPlugins = PluginManager::getInstance()->getInputPlugins(); + static std::once_flag once; + std::call_once(once, [&] { + bool first = true; + foreach(auto inputPlugin, inputPlugins) { + addInputPluginToMenu(inputPlugin, first); + first = false; + } + }); auto offscreenUi = DependencyManager::get(); InputPluginList newInputPlugins; @@ -4591,14 +4656,14 @@ void Application::updateInputModes() { // A plugin was checked if (newInputPlugins.size() > 0) { foreach(auto newInputPlugin, newInputPlugins) { - newInputPlugin->activate(this); + newInputPlugin->activate(); //newInputPlugin->installEventFilter(qApp); //newInputPlugin->installEventFilter(offscreenUi.data()); } } if (removedInputPlugins.size() > 0) { // A plugin was unchecked foreach(auto removedInputPlugin, removedInputPlugins) { - removedInputPlugin->deactivate(this); + removedInputPlugin->deactivate(); //removedInputPlugin->removeEventFilter(qApp); //removedInputPlugin->removeEventFilter(offscreenUi.data()); } @@ -4732,7 +4797,7 @@ QGLWidget* Application::getPrimarySurface() { void Application::setActiveDisplayPlugin(const QString& pluginName) { auto menu = Menu::getInstance(); - foreach(DisplayPluginPointer displayPlugin, getDisplayPlugins()) { + foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getDisplayPlugins()) { QString name = displayPlugin->getName(); QAction* action = menu->getActionForOption(name); if (pluginName == name) { diff --git a/interface/src/Application.h b/interface/src/Application.h index 6567c72455..0cda3fa14d 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -37,6 +37,7 @@ #include #include #include +#include #include "AudioClient.h" #include "Bookmarks.h" @@ -67,8 +68,6 @@ #include "ui/ToolWindow.h" #include "octree/OctreePacketProcessor.h" #include "UndoStackScriptingInterface.h" -#include "DisplayPlugins.h" -#include "InputPlugins.h" #include "gpu/Context.h" diff --git a/interface/src/DisplayPlugins.cpp b/interface/src/DisplayPlugins.cpp deleted file mode 100644 index 58ff9860d7..0000000000 --- a/interface/src/DisplayPlugins.cpp +++ /dev/null @@ -1,83 +0,0 @@ -// -// Created by Bradley Austin Davis on 2015/05/30 -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include "DisplayPlugins.h" - -#include "Application.h" - -#include -#include -#include -#include -#include - -#include - -extern DisplayPlugin* makeOculusDisplayPlugin(); - -static void addDisplayPluginToMenu(DisplayPluginPointer displayPlugin, bool active = false) { - auto menu = Menu::getInstance(); - QString name = displayPlugin->getName(); - Q_ASSERT(!menu->menuItemExists(MenuOption::OutputMenu, name)); - - static QActionGroup* displayPluginGroup = nullptr; - if (!displayPluginGroup) { - displayPluginGroup = new QActionGroup(menu); - displayPluginGroup->setExclusive(true); - } - auto parent = menu->getMenu(MenuOption::OutputMenu); - auto action = menu->addActionToQMenuAndActionHash(parent, - name, 0, qApp, - SLOT(updateDisplayMode())); - action->setCheckable(true); - action->setChecked(active); - displayPluginGroup->addAction(action); - Q_ASSERT(menu->menuItemExists(MenuOption::OutputMenu, name)); -} - -// FIXME move to a plugin manager class -const DisplayPluginList& getDisplayPlugins() { - static DisplayPluginList RENDER_PLUGINS; - static bool init = false; - if (!init) { - init = true; - - DisplayPlugin* PLUGIN_POOL[] = { - new Basic2DWindowOpenGLDisplayPlugin(), -#ifdef DEBUG - new NullDisplayPlugin(), -#endif - // FIXME fix stereo display plugins - //new SideBySideStereoDisplayPlugin(), - //new InterleavedStereoDisplayPlugin(), - - makeOculusDisplayPlugin(), - -#ifdef Q_OS_WIN - new OpenVrDisplayPlugin(), -#endif - nullptr - }; - for (int i = 0; PLUGIN_POOL[i]; ++i) { - DisplayPlugin * plugin = PLUGIN_POOL[i]; - if (plugin->isSupported()) { - plugin->init(); - QObject::connect(plugin, &DisplayPlugin::requestRender, [] { - qApp->paintGL(); - }); - QObject::connect(plugin, &DisplayPlugin::recommendedFramebufferSizeChanged, [](const QSize & size) { - qApp->resizeGL(); - }); - DisplayPluginPointer pluginPointer(plugin); - addDisplayPluginToMenu(pluginPointer, plugin == *PLUGIN_POOL); - RENDER_PLUGINS.push_back(pluginPointer); - } - } - } - return RENDER_PLUGINS; -} diff --git a/interface/src/DisplayPlugins.h b/interface/src/DisplayPlugins.h deleted file mode 100644 index f40b8d049f..0000000000 --- a/interface/src/DisplayPlugins.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// Created by Bradley Austin Davis on 2015/05/30 -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// -#pragma once - -class DisplayPlugin; - -#include -#include - -using DisplayPluginPointer = QSharedPointer; -using DisplayPluginList = QVector; - -const DisplayPluginList& getDisplayPlugins(); \ No newline at end of file diff --git a/interface/src/InputPlugins.cpp b/interface/src/InputPlugins.cpp deleted file mode 100644 index c99be26b8f..0000000000 --- a/interface/src/InputPlugins.cpp +++ /dev/null @@ -1,63 +0,0 @@ -// -// Created by Sam Gondelman on 7/16/2015 -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include "InputPlugins.h" - -#include "Application.h" - -#include -#include -#include -#include -#include - - -static void addInputPluginToMenu(InputPluginPointer inputPlugin, bool active = false) { - auto menu = Menu::getInstance(); - QString name = inputPlugin->getName(); - Q_ASSERT(!menu->menuItemExists(MenuOption::InputMenu, name)); - - static QActionGroup* inputPluginGroup = nullptr; - if (!inputPluginGroup) { - inputPluginGroup = new QActionGroup(menu); - } - auto parent = menu->getMenu(MenuOption::InputMenu); - auto action = menu->addCheckableActionToQMenuAndActionHash(parent, - name, 0, active, qApp, - SLOT(updateInputModes())); - inputPluginGroup->addAction(action); - inputPluginGroup->setExclusive(false); - Q_ASSERT(menu->menuItemExists(MenuOption::InputMenu, name)); -} - -// FIXME move to a plugin manager class -const InputPluginList& getInputPlugins() { - static InputPluginList INPUT_PLUGINS; - static bool init = false; - if (!init) { - init = true; - - InputPlugin* PLUGIN_POOL[] = { - new KeyboardMouseDevice(), - new SDL2Manager(), - new SixenseManager(), - new ViveControllerManager(), - nullptr - }; - for (int i = 0; PLUGIN_POOL[i]; ++i) { - InputPlugin * plugin = PLUGIN_POOL[i]; - if (plugin->isSupported()) { - plugin->init(); - InputPluginPointer pluginPointer(plugin); - addInputPluginToMenu(pluginPointer, plugin == *PLUGIN_POOL); - INPUT_PLUGINS.push_back(pluginPointer); - } - } - } - return INPUT_PLUGINS; -} diff --git a/interface/src/InputPlugins.h b/interface/src/InputPlugins.h deleted file mode 100644 index ce1beeb708..0000000000 --- a/interface/src/InputPlugins.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// Created by Sam Gondelman on 7/16/2015 -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// -#pragma once - -#include - -class InputPlugin; - -#include -#include - -using InputPluginPointer = QSharedPointer; -using InputPluginList = QVector; - -const InputPluginList& getInputPlugins(); \ No newline at end of file diff --git a/interface/src/ui/HMDToolsDialog.cpp b/interface/src/ui/HMDToolsDialog.cpp index 833a0cf692..16e76a2bcc 100644 --- a/interface/src/ui/HMDToolsDialog.cpp +++ b/interface/src/ui/HMDToolsDialog.cpp @@ -19,13 +19,14 @@ #include #include +#include #include #include "MainWindow.h" #include "Menu.h" #include "ui/DialogsManager.h" #include "ui/HMDToolsDialog.h" -#include "DisplayPlugins.h" + HMDToolsDialog::HMDToolsDialog(QWidget* parent) : QDialog(parent, Qt::Window | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint) , @@ -38,7 +39,7 @@ HMDToolsDialog::HMDToolsDialog(QWidget* parent) : _inHDMMode(false) { // FIXME do we want to support more than one connected HMD? It seems like a pretty corner case - foreach(auto dp, getDisplayPlugins()) { + foreach(auto dp, PluginManager::getInstance()->getDisplayPlugins()) { // The first plugin is always the standard 2D display, by convention if (_defaultPluginName.isEmpty()) { _defaultPluginName = dp->getName(); @@ -223,7 +224,8 @@ void HMDToolsDialog::aboutToQuit() { void HMDToolsDialog::screenCountChanged(int newCount) { int hmdScreenNumber = -1; - foreach(auto dp, getDisplayPlugins()) { + auto displayPlugins = PluginManager::getInstance()->getDisplayPlugins(); + foreach(auto dp, displayPlugins) { if (dp->isHmd()) { if (dp->getHmdScreen() >= 0) { hmdScreenNumber = dp->getHmdScreen(); diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp index c5df4d4d5f..ce6467cd55 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp @@ -21,16 +21,16 @@ const QString& Basic2DWindowOpenGLDisplayPlugin::getName() const { return NAME; } -void Basic2DWindowOpenGLDisplayPlugin::activate(PluginContainer* container) { +void Basic2DWindowOpenGLDisplayPlugin::activate() { // container->addMenu(MENU_PATH); // container->addMenuItem(MENU_PATH, FULLSCREEN, // [this] (bool clicked) { this->setFullscreen(clicked); }, // true, false); - MainWindowOpenGLDisplayPlugin::activate(container); + MainWindowOpenGLDisplayPlugin::activate(); } -void Basic2DWindowOpenGLDisplayPlugin::deactivate(PluginContainer* container) { +void Basic2DWindowOpenGLDisplayPlugin::deactivate() { // container->removeMenuItem(MENU_NAME, FULLSCREEN); // container->removeMenu(MENU_PATH); - MainWindowOpenGLDisplayPlugin::deactivate(container); + MainWindowOpenGLDisplayPlugin::deactivate(); } diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h index 93ceb6a8a7..d19326f007 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h @@ -13,8 +13,8 @@ class Basic2DWindowOpenGLDisplayPlugin : public MainWindowOpenGLDisplayPlugin { Q_OBJECT public: - virtual void activate(PluginContainer * container) override; - virtual void deactivate(PluginContainer* container) override; + virtual void activate() override; + virtual void deactivate() override; virtual const QString & getName() const override; diff --git a/libraries/display-plugins/src/display-plugins/DisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/DisplayPlugin.cpp index 27ebeeff90..2316ff70c4 100644 --- a/libraries/display-plugins/src/display-plugins/DisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/DisplayPlugin.cpp @@ -7,3 +7,46 @@ // #include "DisplayPlugin.h" +#include + +#include "NullDisplayPlugin.h" +#include "stereo/SideBySideStereoDisplayPlugin.h" +#include "stereo/InterleavedStereoDisplayPlugin.h" +#include "Basic2DWindowOpenGLDisplayPlugin.h" + +#include "openvr/OpenVrDisplayPlugin.h" +#include "oculus/Oculus_0_5_DisplayPlugin.h" +#include "oculus/Oculus_0_6_DisplayPlugin.h" + +// TODO migrate to a DLL model where plugins are discovered and loaded at runtime by the PluginManager class +DisplayPluginList getDisplayPlugins() { + DisplayPlugin* PLUGIN_POOL[] = { + new Basic2DWindowOpenGLDisplayPlugin(), +#ifdef DEBUG + new NullDisplayPlugin(), +#endif + + // Stereo modes + // FIXME fix stereo display plugins + //new SideBySideStereoDisplayPlugin(), + //new InterleavedStereoDisplayPlugin(), + + // HMDs + new Oculus_0_5_DisplayPlugin(), + new Oculus_0_6_DisplayPlugin(), +#ifdef Q_OS_WIN + new OpenVrDisplayPlugin(), +#endif + nullptr + }; + + DisplayPluginList result; + for (int i = 0; PLUGIN_POOL[i]; ++i) { + DisplayPlugin * plugin = PLUGIN_POOL[i]; + if (plugin->isSupported()) { + plugin->init(); + result.push_back(DisplayPluginPointer(plugin)); + } + } + return result; +} diff --git a/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.cpp index dba4f9e259..e5a96d167e 100644 --- a/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.cpp @@ -28,5 +28,5 @@ void NullDisplayPlugin::preDisplay() {} void NullDisplayPlugin::display(GLuint sceneTexture, const glm::uvec2& sceneSize) {} void NullDisplayPlugin::finishFrame() {} -void NullDisplayPlugin::activate(PluginContainer * container) {} -void NullDisplayPlugin::deactivate(PluginContainer* container) {} +void NullDisplayPlugin::activate() {} +void NullDisplayPlugin::deactivate() {} diff --git a/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.h index 8d9ecbdac1..90e717b5ee 100644 --- a/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.h @@ -15,8 +15,8 @@ public: virtual ~NullDisplayPlugin() final {} virtual const QString & getName() const override; - void activate(PluginContainer * container) override; - void deactivate(PluginContainer* container) override; + void activate() override; + void deactivate() override; virtual glm::uvec2 getRecommendedRenderSize() const override; virtual bool hasFocus() const override; diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index 380348437d..7269c9410c 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -36,7 +36,7 @@ void OpenGLDisplayPlugin::finishFrame() { doneCurrent(); }; -void OpenGLDisplayPlugin::customizeContext(PluginContainer * container) { +void OpenGLDisplayPlugin::customizeContext() { using namespace oglplus; Context::BlendFunc(BlendFunction::SrcAlpha, BlendFunction::OneMinusSrcAlpha); Context::Disable(Capability::Blend); @@ -48,11 +48,11 @@ void OpenGLDisplayPlugin::customizeContext(PluginContainer * container) { _plane = loadPlane(_program); } -void OpenGLDisplayPlugin::activate(PluginContainer * container) { +void OpenGLDisplayPlugin::activate() { _timer.start(1); } -void OpenGLDisplayPlugin::deactivate(PluginContainer* container) { +void OpenGLDisplayPlugin::deactivate() { _timer.stop(); makeCurrent(); diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h index a18bdb8fb0..9986610a50 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h @@ -23,15 +23,15 @@ public: virtual void preDisplay() override; virtual void finishFrame() override; - virtual void activate(PluginContainer* container) override; - virtual void deactivate(PluginContainer* container) override; + virtual void activate() override; + virtual void deactivate() override; virtual bool eventFilter(QObject* receiver, QEvent* event) override; virtual void display(GLuint sceneTexture, const glm::uvec2& sceneSize) override; protected: - virtual void customizeContext(PluginContainer * container); + virtual void customizeContext(); virtual void drawUnitQuad(); virtual void makeCurrent() = 0; virtual void doneCurrent() = 0; diff --git a/libraries/display-plugins/src/display-plugins/WindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/WindowOpenGLDisplayPlugin.cpp index 092b03eac4..658aa2c767 100644 --- a/libraries/display-plugins/src/display-plugins/WindowOpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/WindowOpenGLDisplayPlugin.cpp @@ -35,16 +35,16 @@ bool WindowOpenGLDisplayPlugin::hasFocus() const { return _window ? _window->hasFocus() : false; } -void WindowOpenGLDisplayPlugin::activate(PluginContainer * container) { - OpenGLDisplayPlugin::activate(container); - _window = container->getPrimarySurface(); +void WindowOpenGLDisplayPlugin::activate() { + OpenGLDisplayPlugin::activate(); + _window = CONTAINER->getPrimarySurface(); _window->makeCurrent(); - customizeContext(container); + customizeContext(); _window->doneCurrent(); } -void WindowOpenGLDisplayPlugin::deactivate(PluginContainer* container) { - OpenGLDisplayPlugin::deactivate(container); +void WindowOpenGLDisplayPlugin::deactivate() { + OpenGLDisplayPlugin::deactivate(); _window = nullptr; } @@ -59,15 +59,3 @@ void WindowOpenGLDisplayPlugin::doneCurrent() { void WindowOpenGLDisplayPlugin::swapBuffers() { _window->swapBuffers(); } -// -//void WindowOpenGLDisplayPlugin::installEventFilter(QObject* filter) { -// _window->installEventFilter(filter); -//} -// -//void WindowOpenGLDisplayPlugin::removeEventFilter(QObject* filter) { -// _window->removeEventFilter(filter); -//} -// -//QWindow* WindowOpenGLDisplayPlugin::getWindow() const { -// return _window; -//} diff --git a/libraries/display-plugins/src/display-plugins/WindowOpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/WindowOpenGLDisplayPlugin.h index 9308693383..c75cf1484c 100644 --- a/libraries/display-plugins/src/display-plugins/WindowOpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/WindowOpenGLDisplayPlugin.h @@ -17,10 +17,8 @@ public: virtual glm::uvec2 getRecommendedRenderSize() const override; virtual glm::uvec2 getRecommendedUiSize() const override; virtual bool hasFocus() const override; - virtual void activate(PluginContainer * container) override; - virtual void deactivate(PluginContainer* container) override; - //virtual void installEventFilter(QObject* filter) override; - //virtual void removeEventFilter(QObject* filter) override; + virtual void activate() override; + virtual void deactivate() override; protected: virtual void makeCurrent() override; diff --git a/libraries/display-plugins/src/display-plugins/oculus/OculusBaseDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/oculus/OculusBaseDisplayPlugin.cpp index 97d2226e2c..7d0fb705df 100644 --- a/libraries/display-plugins/src/display-plugins/oculus/OculusBaseDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/oculus/OculusBaseDisplayPlugin.cpp @@ -11,7 +11,10 @@ #include "OculusHelpers.h" -void OculusBaseDisplayPlugin::activate(PluginContainer * container) { + +using namespace Oculus; + +void OculusBaseDisplayPlugin::activate() { glm::uvec2 eyeSizes[2]; ovr_for_each_eye([&](ovrEyeType eye) { _eyeFovs[eye] = _hmd->MaxEyeFov[eye]; @@ -38,7 +41,7 @@ void OculusBaseDisplayPlugin::activate(PluginContainer * container) { qFatal("Could not attach to sensor device"); } - MainWindowOpenGLDisplayPlugin::activate(container); + MainWindowOpenGLDisplayPlugin::activate(); } uvec2 OculusBaseDisplayPlugin::getRecommendedRenderSize() const { diff --git a/libraries/display-plugins/src/display-plugins/oculus/OculusBaseDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/oculus/OculusBaseDisplayPlugin.h index b9cb9d2142..b338e2709b 100644 --- a/libraries/display-plugins/src/display-plugins/oculus/OculusBaseDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/oculus/OculusBaseDisplayPlugin.h @@ -9,15 +9,13 @@ #include "../MainWindowOpenGLDisplayPlugin.h" -#include - class OculusBaseDisplayPlugin : public MainWindowOpenGLDisplayPlugin { public: // Stereo specific methods virtual bool isHmd() const override { return true; } virtual glm::mat4 getProjection(Eye eye, const glm::mat4& baseProjection) const override; virtual glm::mat4 getModelview(Eye eye, const glm::mat4& baseModelview) const override; - virtual void activate(PluginContainer * container) override; + virtual void activate() override; virtual void preRender() override; virtual glm::uvec2 getRecommendedRenderSize() const override; virtual glm::uvec2 getRecommendedUiSize() const override { return uvec2(1920, 1080); } @@ -25,17 +23,6 @@ public: virtual glm::mat4 getEyePose(Eye eye) const override; virtual glm::mat4 getHeadPose() const override; -protected: - ovrHmd _hmd; - unsigned int _frameIndex{ 0 }; - - ovrEyeRenderDesc _eyeRenderDescs[2]; - ovrPosef _eyePoses[2]; - ovrVector3f _eyeOffsets[2]; - ovrFovPort _eyeFovs[2]; - mat4 _eyeProjections[2]; - mat4 _compositeEyeProjections[2]; - uvec2 _desiredFramebufferSize; }; #if (OVR_MAJOR_VERSION < 6) diff --git a/libraries/display-plugins/src/display-plugins/oculus/OculusHelpers.cpp b/libraries/display-plugins/src/display-plugins/oculus/OculusHelpers.cpp new file mode 100644 index 0000000000..f93580e5a3 --- /dev/null +++ b/libraries/display-plugins/src/display-plugins/oculus/OculusHelpers.cpp @@ -0,0 +1,24 @@ +// +// Created by Bradley Austin Davis on 2015/08/08 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "OculusHelpers.h" + + +namespace Oculus { + ovrHmd _hmd; + unsigned int _frameIndex{ 0 }; + ovrEyeRenderDesc _eyeRenderDescs[2]; + ovrPosef _eyePoses[2]; + ovrVector3f _eyeOffsets[2]; + ovrFovPort _eyeFovs[2]; + mat4 _eyeProjections[2]; + mat4 _compositeEyeProjections[2]; + uvec2 _desiredFramebufferSize; +} + + diff --git a/libraries/display-plugins/src/display-plugins/oculus/OculusHelpers.h b/libraries/display-plugins/src/display-plugins/oculus/OculusHelpers.h index 08c65cc399..d4e1bec312 100644 --- a/libraries/display-plugins/src/display-plugins/oculus/OculusHelpers.h +++ b/libraries/display-plugins/src/display-plugins/oculus/OculusHelpers.h @@ -74,3 +74,15 @@ inline ovrSizei ovrFromGlm(const glm::uvec2 & v) { inline ovrQuatf ovrFromGlm(const glm::quat & q) { return{ q.x, q.y, q.z, q.w }; } + +namespace Oculus { + extern ovrHmd _hmd; + extern unsigned int _frameIndex; + extern ovrEyeRenderDesc _eyeRenderDescs[2]; + extern ovrPosef _eyePoses[2]; + extern ovrVector3f _eyeOffsets[2]; + extern ovrFovPort _eyeFovs[2]; + extern mat4 _eyeProjections[2]; + extern mat4 _compositeEyeProjections[2]; + extern uvec2 _desiredFramebufferSize; +} 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 58d0b04631..e1fb21de7b 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 @@ -7,8 +7,6 @@ // #include "Oculus_0_5_DisplayPlugin.h" -#if (OVR_MAJOR_VERSION == 5) - #include #include @@ -30,6 +28,11 @@ #include "plugins/PluginContainer.h" #include "OculusHelpers.h" +using namespace Oculus; +ovrTexture _eyeTextures[2]; +int _hmdScreen{ -1 }; +bool _hswDismissed{ false }; + DisplayPlugin* makeOculusDisplayPlugin() { return new Oculus_0_5_DisplayPlugin(); } @@ -44,6 +47,7 @@ const QString & Oculus_0_5_DisplayPlugin::getName() const { bool Oculus_0_5_DisplayPlugin::isSupported() const { +#if (OVR_MAJOR_VERSION == 5) if (!ovr_Initialize(nullptr)) { return false; } @@ -68,9 +72,13 @@ bool Oculus_0_5_DisplayPlugin::isSupported() const { ovr_Shutdown(); return result; +#else + return false; +#endif } -void Oculus_0_5_DisplayPlugin::activate(PluginContainer * container) { +void Oculus_0_5_DisplayPlugin::activate() { +#if (OVR_MAJOR_VERSION == 5) if (!OVR_SUCCESS(ovr_Initialize(nullptr))) { Q_ASSERT(false); qFatal("Failed to Initialize SDK"); @@ -81,7 +89,7 @@ void Oculus_0_5_DisplayPlugin::activate(PluginContainer * container) { qFatal("Failed to acquire HMD"); } - OculusBaseDisplayPlugin::activate(container); + OculusBaseDisplayPlugin::activate(); int screen = getHmdScreen(); if (screen != -1) { container->setFullscreen(qApp->screens()[screen]); @@ -113,27 +121,32 @@ void Oculus_0_5_DisplayPlugin::activate(PluginContainer * container) { ovrEyeRenderDesc _eyeRenderDescs[ovrEye_Count]; ovrBool result = ovrHmd_ConfigureRendering(_hmd, &config.Config, distortionCaps, _eyeFovs, _eyeRenderDescs); Q_ASSERT(result); +#endif } -void Oculus_0_5_DisplayPlugin::deactivate(PluginContainer* container) { +void Oculus_0_5_DisplayPlugin::deactivate() { +#if (OVR_MAJOR_VERSION == 5) _window->removeEventFilter(this); - OculusBaseDisplayPlugin::deactivate(container); + OculusBaseDisplayPlugin::deactivate(); QScreen* riftScreen = nullptr; if (_hmdScreen >= 0) { riftScreen = qApp->screens()[_hmdScreen]; } - container->unsetFullscreen(riftScreen); + _container->unsetFullscreen(riftScreen); ovrHmd_Destroy(_hmd); _hmd = nullptr; ovr_Shutdown(); +#endif } void Oculus_0_5_DisplayPlugin::preRender() { +#if (OVR_MAJOR_VERSION == 5) OculusBaseDisplayPlugin::preRender(); ovrHmd_BeginFrame(_hmd, _frameIndex); +#endif } void Oculus_0_5_DisplayPlugin::preDisplay() { @@ -142,14 +155,17 @@ void Oculus_0_5_DisplayPlugin::preDisplay() { void Oculus_0_5_DisplayPlugin::display(GLuint finalTexture, const glm::uvec2& sceneSize) { ++_frameIndex; +#if (OVR_MAJOR_VERSION == 5) ovr_for_each_eye([&](ovrEyeType eye) { reinterpret_cast(_eyeTextures[eye]).OGL.TexId = finalTexture; }); ovrHmd_EndFrame(_hmd, _eyePoses, _eyeTextures); +#endif } // Pass input events on to the application bool Oculus_0_5_DisplayPlugin::eventFilter(QObject* receiver, QEvent* event) { +#if (OVR_MAJOR_VERSION == 5) if (!_hswDismissed && (event->type() == QEvent::KeyPress)) { static ovrHSWDisplayState hswState; ovrHmd_GetHSWDisplayState(_hmd, &hswState); @@ -159,6 +175,7 @@ bool Oculus_0_5_DisplayPlugin::eventFilter(QObject* receiver, QEvent* event) { _hswDismissed = true; } } +#endif return OculusBaseDisplayPlugin::eventFilter(receiver, event); } @@ -173,5 +190,3 @@ void Oculus_0_5_DisplayPlugin::finishFrame() { int Oculus_0_5_DisplayPlugin::getHmdScreen() const { return _hmdScreen; } - -#endif 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 f29b374833..b539d07fb0 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 @@ -9,8 +9,6 @@ #include "OculusBaseDisplayPlugin.h" -#if (OVR_MAJOR_VERSION == 5) - #include class Oculus_0_5_DisplayPlugin : public OculusBaseDisplayPlugin { @@ -18,9 +16,8 @@ public: virtual bool isSupported() const override; virtual const QString & getName() const override; - virtual void activate(PluginContainer * container) override; - virtual void deactivate(PluginContainer* container) override; - + virtual void activate() override; + virtual void deactivate() override; virtual bool eventFilter(QObject* receiver, QEvent* event) override; @@ -34,12 +31,7 @@ protected: virtual void finishFrame() override; private: - ovrTexture _eyeTextures[2]; - mutable int _hmdScreen{ -1 }; - bool _hswDismissed{ false }; static const QString NAME; }; - -#endif diff --git a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_6_DisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_6_DisplayPlugin.cpp index 19a44c1823..4670d5bb7a 100644 --- a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_6_DisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_6_DisplayPlugin.cpp @@ -7,8 +7,6 @@ // #include "Oculus_0_6_DisplayPlugin.h" -#if (OVR_MAJOR_VERSION == 6) - #include #include @@ -20,21 +18,24 @@ #include -#include -#include "plugins/PluginContainer.h" - -#include "OculusHelpers.h" +#include #include #include #include #include -#include +#include +#include -DisplayPlugin* makeOculusDisplayPlugin() { - return new Oculus_0_6_DisplayPlugin(); -} +#include "OculusHelpers.h" + +using namespace Oculus; +#if (OVR_MAJOR_VERSION == 6) +SwapFboPtr _sceneFbo; +MirrorFboPtr _mirrorFbo; +ovrLayerEyeFov _sceneLayer; +#endif // A base class for FBO wrappers that need to use the Oculus C // API to manage textures via ovrHmd_CreateSwapTextureSetGL, @@ -167,13 +168,13 @@ bool Oculus_0_6_DisplayPlugin::isSupported() const { return result; } -ovrLayerEyeFov& Oculus_0_6_DisplayPlugin::getSceneLayer() { +ovrLayerEyeFov& getSceneLayer() { return _sceneLayer; } //static gpu::TexturePointer _texture; -void Oculus_0_6_DisplayPlugin::activate(PluginContainer * container) { +void Oculus_0_6_DisplayPlugin::activate() { if (!OVR_SUCCESS(ovr_Initialize(nullptr))) { Q_ASSERT(false); qFatal("Failed to Initialize SDK"); @@ -183,7 +184,7 @@ void Oculus_0_6_DisplayPlugin::activate(PluginContainer * container) { qFatal("Failed to acquire HMD"); } - OculusBaseDisplayPlugin::activate(container); + OculusBaseDisplayPlugin::activate(); // Parent class relies on our _hmd intialization, so it must come after that. ovrLayerEyeFov& sceneLayer = getSceneLayer(); @@ -210,8 +211,8 @@ void Oculus_0_6_DisplayPlugin::activate(PluginContainer * container) { } -void Oculus_0_6_DisplayPlugin::customizeContext(PluginContainer * container) { - OculusBaseDisplayPlugin::customizeContext(container); +void Oculus_0_6_DisplayPlugin::customizeContext() { + OculusBaseDisplayPlugin::customizeContext(); //_texture = DependencyManager::get()-> // getImageTexture(PathUtils::resourcesPath() + "/images/cube_texture.png"); @@ -223,14 +224,14 @@ void Oculus_0_6_DisplayPlugin::customizeContext(PluginContainer * container) { _sceneFbo->Init(getRecommendedRenderSize()); } -void Oculus_0_6_DisplayPlugin::deactivate(PluginContainer* container) { +void Oculus_0_6_DisplayPlugin::deactivate() { makeCurrent(); _sceneFbo.reset(); _mirrorFbo.reset(); doneCurrent(); PerformanceTimer::setActive(false); - OculusBaseDisplayPlugin::deactivate(container); + OculusBaseDisplayPlugin::deactivate(); ovrHmd_Destroy(_hmd); _hmd = nullptr; @@ -349,5 +350,3 @@ _uiFbo->Bound([&] { Q_ASSERT(0 == glGetError()); }); #endif - -#endif diff --git a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_6_DisplayPlugin.h b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_6_DisplayPlugin.h index e89cec30dc..0fde5e76b3 100644 --- a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_6_DisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_6_DisplayPlugin.h @@ -11,8 +11,6 @@ #include -#if (OVR_MAJOR_VERSION == 6) - class OffscreenGlCanvas; struct SwapFramebufferWrapper; struct MirrorFramebufferWrapper; @@ -25,27 +23,19 @@ public: virtual bool isSupported() const override; virtual const QString & getName() const override; - virtual void activate(PluginContainer * container) override; - virtual void deactivate(PluginContainer* container) override; + virtual void activate() override; + virtual void deactivate() override; virtual bool eventFilter(QObject* receiver, QEvent* event) override; protected: virtual void display(GLuint finalTexture, const glm::uvec2& sceneSize) override; - virtual void customizeContext(PluginContainer * container) override; + virtual void customizeContext() override; // Do not perform swap in finish virtual void finishFrame() override; private: - static const QString NAME; - - ovrLayerEyeFov& getSceneLayer(); - - SwapFboPtr _sceneFbo; - MirrorFboPtr _mirrorFbo; - ovrLayerEyeFov _sceneLayer; }; -#endif diff --git a/libraries/display-plugins/src/display-plugins/openvr/OpenVrDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/openvr/OpenVrDisplayPlugin.cpp index d0df531948..181546d428 100644 --- a/libraries/display-plugins/src/display-plugins/openvr/OpenVrDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/openvr/OpenVrDisplayPlugin.cpp @@ -78,11 +78,18 @@ mat4 toGlm(const vr::HmdMatrix34_t& m) { } bool OpenVrDisplayPlugin::isSupported() const { - return vr::VR_IsHmdPresent(); + bool success = vr::VR_IsHmdPresent(); + if (success) { + vr::HmdError eError = vr::HmdError_None; + auto hmd = vr::VR_Init(&eError); + success = (hmd != nullptr); + vr::VR_Shutdown(); + } + return success; } -void OpenVrDisplayPlugin::activate(PluginContainer * container) { - container->setIsOptionChecked(StandingHMDSensorMode, true); +void OpenVrDisplayPlugin::activate() { + CONTAINER->setIsOptionChecked(StandingHMDSensorMode, true); hmdRefCount++; vr::HmdError eError = vr::HmdError_None; @@ -121,11 +128,11 @@ void OpenVrDisplayPlugin::activate(PluginContainer * container) { delete[] buffer; } Q_ASSERT(unSize <= 1); - MainWindowOpenGLDisplayPlugin::activate(container); + MainWindowOpenGLDisplayPlugin::activate(); } -void OpenVrDisplayPlugin::deactivate(PluginContainer* container) { - container->setIsOptionChecked(StandingHMDSensorMode, false); +void OpenVrDisplayPlugin::deactivate() { + CONTAINER->setIsOptionChecked(StandingHMDSensorMode, false); hmdRefCount--; @@ -134,6 +141,7 @@ void OpenVrDisplayPlugin::deactivate(PluginContainer* container) { _hmd = nullptr; } _compositor = nullptr; + MainWindowOpenGLDisplayPlugin::deactivate(); } uvec2 OpenVrDisplayPlugin::getRecommendedRenderSize() const { @@ -160,8 +168,8 @@ glm::mat4 OpenVrDisplayPlugin::getHeadPose() const { return _trackedDevicePoseMat4[0]; } -void OpenVrDisplayPlugin::customizeContext(PluginContainer * container) { - MainWindowOpenGLDisplayPlugin::customizeContext(container); +void OpenVrDisplayPlugin::customizeContext() { + MainWindowOpenGLDisplayPlugin::customizeContext(); } void OpenVrDisplayPlugin::display(GLuint finalTexture, const glm::uvec2& sceneSize) { diff --git a/libraries/display-plugins/src/display-plugins/openvr/OpenVrDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/openvr/OpenVrDisplayPlugin.h index 23888d97ed..608a869341 100644 --- a/libraries/display-plugins/src/display-plugins/openvr/OpenVrDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/openvr/OpenVrDisplayPlugin.h @@ -19,8 +19,8 @@ public: virtual const QString & getName() const override; virtual bool isHmd() const override { return true; } - virtual void activate(PluginContainer * container) override; - virtual void deactivate(PluginContainer* container) override; + virtual void activate() override; + virtual void deactivate() override; virtual glm::uvec2 getRecommendedRenderSize() const override; virtual glm::uvec2 getRecommendedUiSize() const override { return uvec2(1920, 1080); } @@ -35,7 +35,7 @@ public: protected: virtual void display(GLuint finalTexture, const glm::uvec2& sceneSize) override; - virtual void customizeContext(PluginContainer * container) override; + virtual void customizeContext() override; // Do not perform swap in finish virtual void finishFrame() override; diff --git a/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.cpp index 65ef1837ed..7d017f714d 100644 --- a/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.cpp @@ -26,8 +26,8 @@ const QString & InterleavedStereoDisplayPlugin::getName() const { InterleavedStereoDisplayPlugin::InterleavedStereoDisplayPlugin() { } -void InterleavedStereoDisplayPlugin::customizeContext(PluginContainer * container) { - StereoDisplayPlugin::customizeContext(container); +void InterleavedStereoDisplayPlugin::customizeContext() { + StereoDisplayPlugin::customizeContext(); // Set up the stencil buffers? Or use a custom shader? } diff --git a/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.h index fae145d9b8..1dd38efed5 100644 --- a/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.h @@ -16,7 +16,7 @@ public: virtual const QString & getName() const override; // initialize OpenGL context settings needed by the plugin - virtual void customizeContext(PluginContainer * container) override; + virtual void customizeContext() override; private: static const QString NAME; diff --git a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp index 636c62ac38..c741967328 100644 --- a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp @@ -50,8 +50,8 @@ glm::mat4 StereoDisplayPlugin::getModelview(Eye eye, const glm::mat4& baseModelv return baseModelview * glm::translate(mat4(), vec3(modelviewShift, 0, 0)); } -void StereoDisplayPlugin::activate(PluginContainer * container) { - WindowOpenGLDisplayPlugin::activate(container); - container->setFullscreen(qApp->primaryScreen()); +void StereoDisplayPlugin::activate() { + WindowOpenGLDisplayPlugin::activate(); + CONTAINER->setFullscreen(qApp->primaryScreen()); // FIXME Add menu items } diff --git a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h index 406a659039..bb1a4fd42c 100644 --- a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h @@ -16,7 +16,7 @@ public: virtual bool isStereo() const override final { return true; } virtual bool isSupported() const override final; - virtual void activate(PluginContainer * container) override; + virtual void activate() override; virtual glm::mat4 getProjection(Eye eye, const glm::mat4& baseProjection) const override; virtual glm::mat4 getModelview(Eye eye, const glm::mat4& baseModelview) const override; diff --git a/libraries/input-plugins/src/input-plugins/InputPlugin.cpp b/libraries/input-plugins/src/input-plugins/InputPlugin.cpp index 36000ae5cc..ea1639ec66 100644 --- a/libraries/input-plugins/src/input-plugins/InputPlugin.cpp +++ b/libraries/input-plugins/src/input-plugins/InputPlugin.cpp @@ -8,4 +8,32 @@ // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include "InputPlugin.h" \ No newline at end of file +#include "InputPlugin.h" + +#include + +#include "KeyboardMouseDevice.h" +#include "SDL2Manager.h" +#include "SixenseManager.h" +#include "ViveControllerManager.h" + +// TODO migrate to a DLL model where plugins are discovered and loaded at runtime by the PluginManager class +InputPluginList getInputPlugins() { + InputPlugin* PLUGIN_POOL[] = { + new KeyboardMouseDevice(), + new SDL2Manager(), + new SixenseManager(), + new ViveControllerManager(), + nullptr + }; + + InputPluginList result; + for (int i = 0; PLUGIN_POOL[i]; ++i) { + InputPlugin * plugin = PLUGIN_POOL[i]; + if (plugin->isSupported()) { + plugin->init(); + result.push_back(InputPluginPointer(plugin)); + } + } + return result; +} diff --git a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h index 5df1f2f797..70e2ee5d34 100644 --- a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h +++ b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h @@ -61,8 +61,8 @@ public: virtual bool isJointController() const override { return false; } const QString& getName() const { return NAME; } - virtual void activate(PluginContainer * container) override {}; - virtual void deactivate(PluginContainer* container) override {}; + virtual void activate() override {}; + virtual void deactivate() override {}; virtual void pluginFocusOutEvent() override { focusOutEvent(); } virtual void pluginUpdate(float deltaTime, bool jointsCaptured) override { update(deltaTime, jointsCaptured); } diff --git a/libraries/input-plugins/src/input-plugins/SDL2Manager.h b/libraries/input-plugins/src/input-plugins/SDL2Manager.h index 58e5337423..f017e2cc65 100644 --- a/libraries/input-plugins/src/input-plugins/SDL2Manager.h +++ b/libraries/input-plugins/src/input-plugins/SDL2Manager.h @@ -34,8 +34,8 @@ public: virtual void init() override; virtual void deinit() override; - virtual void activate(PluginContainer * container) override {}; - virtual void deactivate(PluginContainer* container) override {}; + virtual void activate() override {}; + virtual void deactivate() override {}; virtual void pluginFocusOutEvent() override; virtual void pluginUpdate(float deltaTime, bool jointsCaptured) override; diff --git a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp index 8283847918..ec7f1ee9bb 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp +++ b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp @@ -83,15 +83,15 @@ bool SixenseManager::isSupported() const { #endif } -void SixenseManager::activate(PluginContainer* container) { +void SixenseManager::activate() { #ifdef HAVE_SIXENSE _calibrationState = CALIBRATION_STATE_IDLE; // By default we assume the _neckBase (in orb frame) is as high above the orb // as the "torso" is below it. _neckBase = glm::vec3(NECK_X, -NECK_Y, NECK_Z); - container->addMenu(MENU_PATH); - container->addMenuItem(MENU_PATH, TOGGLE_SMOOTH, + CONTAINER->addMenu(MENU_PATH); + CONTAINER->addMenuItem(MENU_PATH, TOGGLE_SMOOTH, [this] (bool clicked) { this->setFilter(clicked); }, true, true); @@ -124,10 +124,10 @@ void SixenseManager::activate(PluginContainer* container) { #endif } -void SixenseManager::deactivate(PluginContainer* container) { +void SixenseManager::deactivate() { #ifdef HAVE_SIXENSE - container->removeMenuItem(MENU_NAME, TOGGLE_SMOOTH); - container->removeMenu(MENU_PATH); + CONTAINER->removeMenuItem(MENU_NAME, TOGGLE_SMOOTH); + CONTAINER->removeMenu(MENU_PATH); _poseStateMap.clear(); diff --git a/libraries/input-plugins/src/input-plugins/SixenseManager.h b/libraries/input-plugins/src/input-plugins/SixenseManager.h index c6992bc711..03482287d9 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseManager.h +++ b/libraries/input-plugins/src/input-plugins/SixenseManager.h @@ -65,8 +65,8 @@ public: virtual bool isJointController() const override { return true; } const QString& getName() const { return NAME; } - virtual void activate(PluginContainer * container) override; - virtual void deactivate(PluginContainer* container) override; + virtual void activate() override; + virtual void deactivate() override; virtual void pluginFocusOutEvent() override { focusOutEvent(); } virtual void pluginUpdate(float deltaTime, bool jointsCaptured) override { update(deltaTime, jointsCaptured); } diff --git a/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp b/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp index 6455b312e0..dbcaa05143 100644 --- a/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp +++ b/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp @@ -71,10 +71,10 @@ bool ViveControllerManager::isSupported() const { #endif } -void ViveControllerManager::activate(PluginContainer* container) { +void ViveControllerManager::activate() { #ifdef Q_OS_WIN - container->addMenu(MENU_PATH); - container->addMenuItem(MENU_PATH, RENDER_CONTROLLERS, + CONTAINER->addMenu(MENU_PATH); + CONTAINER->addMenuItem(MENU_PATH, RENDER_CONTROLLERS, [this] (bool clicked) { this->setRenderControllers(clicked); }, true, true); @@ -135,10 +135,10 @@ void ViveControllerManager::activate(PluginContainer* container) { #endif } -void ViveControllerManager::deactivate(PluginContainer* container) { +void ViveControllerManager::deactivate() { #ifdef Q_OS_WIN - container->removeMenuItem(MENU_NAME, RENDER_CONTROLLERS); - container->removeMenu(MENU_PATH); + CONTAINER->removeMenuItem(MENU_NAME, RENDER_CONTROLLERS); + CONTAINER->removeMenu(MENU_PATH); hmdRefCount--; diff --git a/libraries/input-plugins/src/input-plugins/ViveControllerManager.h b/libraries/input-plugins/src/input-plugins/ViveControllerManager.h index 251343cd2b..98f32b9f35 100644 --- a/libraries/input-plugins/src/input-plugins/ViveControllerManager.h +++ b/libraries/input-plugins/src/input-plugins/ViveControllerManager.h @@ -55,8 +55,8 @@ public: virtual bool isJointController() const override { return true; } const QString& getName() const { return NAME; } - virtual void activate(PluginContainer * container) override; - virtual void deactivate(PluginContainer* container) override; + virtual void activate() override; + virtual void deactivate() override; virtual void pluginFocusOutEvent() override { focusOutEvent(); } virtual void pluginUpdate(float deltaTime, bool jointsCaptured) override { update(deltaTime, jointsCaptured); } diff --git a/libraries/plugins/src/plugins/Plugin.cpp b/libraries/plugins/src/plugins/Plugin.cpp index 1910b525c2..e0cacda474 100644 --- a/libraries/plugins/src/plugins/Plugin.cpp +++ b/libraries/plugins/src/plugins/Plugin.cpp @@ -1,5 +1,11 @@ #include "Plugin.h" +PluginContainer* Plugin::CONTAINER{ nullptr }; + +void Plugin::setContainer(PluginContainer* container) { + CONTAINER = container; +} + bool Plugin::isSupported() const { return true; } void Plugin::init() {} diff --git a/libraries/plugins/src/plugins/Plugin.h b/libraries/plugins/src/plugins/Plugin.h index 1a20ffe4b0..a2edbc8236 100644 --- a/libraries/plugins/src/plugins/Plugin.h +++ b/libraries/plugins/src/plugins/Plugin.h @@ -9,16 +9,19 @@ class Plugin : public QObject { public: virtual const QString& getName() const = 0; virtual bool isSupported() const; + + static void setContainer(PluginContainer* container); /// Called when plugin is initially loaded, typically at application start virtual void init(); + /// Called when application is shutting down virtual void deinit(); /// Called when a plugin is being activated for use. May be called multiple times. - virtual void activate(PluginContainer* container) = 0; + virtual void activate() = 0; /// Called when a plugin is no longer being used. May be called multiple times. - virtual void deactivate(PluginContainer* container) = 0; + virtual void deactivate() = 0; /** * Called by the application during it's idle phase. If the plugin needs to do @@ -26,4 +29,7 @@ public: * do long operations in the idle call */ virtual void idle(); + +protected: + static PluginContainer* CONTAINER; }; diff --git a/libraries/plugins/src/plugins/PluginContainer.cpp b/libraries/plugins/src/plugins/PluginContainer.cpp new file mode 100644 index 0000000000..b27f076eb6 --- /dev/null +++ b/libraries/plugins/src/plugins/PluginContainer.cpp @@ -0,0 +1,15 @@ +// +// Created by Bradley Austin Davis on 2015/08/08 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +#include "PluginContainer.h" + +static PluginContainer* INSTANCE{ nullptr }; + +PluginContainer::PluginContainer() { + Q_ASSERT(!INSTANCE); + INSTANCE = this; +}; diff --git a/libraries/plugins/src/plugins/PluginContainer.h b/libraries/plugins/src/plugins/PluginContainer.h index 93f1659e1a..85c5c814de 100644 --- a/libraries/plugins/src/plugins/PluginContainer.h +++ b/libraries/plugins/src/plugins/PluginContainer.h @@ -1,3 +1,10 @@ +// +// Created by Bradley Austin Davis on 2015/08/08 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// #pragma once #include @@ -8,23 +15,7 @@ class QScreen; class PluginContainer { public: - //class Menu { - // 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 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 Menu* getMenu(); - //class Surface { - // virtual bool makeCurrent() = 0; - // virtual void doneCurrent() = 0; - // virtual void swapBuffers() = 0; - // virtual void setFullscreen(const QScreen* targetScreen) = 0; - // virtual void unsetFullscreen() = 0; - //}; - //virtual Surface* getSurface(); + PluginContainer(); 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; diff --git a/libraries/plugins/src/plugins/PluginManager.cpp b/libraries/plugins/src/plugins/PluginManager.cpp index 7f631abd64..ffee9905a0 100644 --- a/libraries/plugins/src/plugins/PluginManager.cpp +++ b/libraries/plugins/src/plugins/PluginManager.cpp @@ -1 +1,31 @@ #include "PluginManager.h" +#include + + +PluginManager* PluginManager::getInstance() { + static PluginManager _manager; + return &_manager; +} + +// TODO migrate to a DLL model where plugins are discovered and loaded at runtime by the PluginManager class +extern DisplayPluginList getDisplayPlugins(); +extern InputPluginList getInputPlugins(); + +const DisplayPluginList& PluginManager::getDisplayPlugins() { + static DisplayPluginList displayPlugins; + static std::once_flag once; + std::call_once(once, [&] { + displayPlugins = ::getDisplayPlugins(); + }); + return displayPlugins; +} + +const InputPluginList& PluginManager::getInputPlugins() { + static InputPluginList inputPlugins; + static std::once_flag once; + std::call_once(once, [&] { + inputPlugins = ::getInputPlugins(); + }); + return inputPlugins; +} + diff --git a/libraries/plugins/src/plugins/PluginManager.h b/libraries/plugins/src/plugins/PluginManager.h index 653c7a616a..88dba3366e 100644 --- a/libraries/plugins/src/plugins/PluginManager.h +++ b/libraries/plugins/src/plugins/PluginManager.h @@ -2,9 +2,21 @@ #include "Plugin.h" #include +#include #include +class DisplayPlugin; +class InputPlugin; + +using DisplayPluginPointer = QSharedPointer; +using DisplayPluginList = QVector; +using InputPluginPointer = QSharedPointer; +using InputPluginList = QVector; + class PluginManager : public QObject { public: - static PluginManager * getInstance(); + static PluginManager* getInstance(); + + const DisplayPluginList& getDisplayPlugins(); + const InputPluginList& getInputPlugins(); };