Decouple Application and plugin definitions, cleanup container usage

This commit is contained in:
Brad Davis 2015-08-08 17:50:29 -07:00
parent a79095dcec
commit 5515b9d8ee
43 changed files with 399 additions and 370 deletions

View file

@ -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<KeyboardMouseDevice*>(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<QPair<QString, QString>> _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<QPair<QString, QString>> _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<OffscreenUi>();
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) {

View file

@ -37,6 +37,7 @@
#include <udt/PacketHeaders.h>
#include <ViewFrustum.h>
#include <plugins/PluginContainer.h>
#include <plugins/PluginManager.h>
#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"

View file

@ -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 <display-plugins/DisplayPlugin.h>
#include <display-plugins/NullDisplayPlugin.h>
#include <display-plugins/stereo/SideBySideStereoDisplayPlugin.h>
#include <display-plugins/stereo/InterleavedStereoDisplayPlugin.h>
#include <display-plugins/Basic2DWindowOpenGLDisplayPlugin.h>
#include <display-plugins/openvr/OpenVrDisplayPlugin.h>
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;
}

View file

@ -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 <QVector>
#include <QSharedPointer>
using DisplayPluginPointer = QSharedPointer<DisplayPlugin>;
using DisplayPluginList = QVector<DisplayPluginPointer>;
const DisplayPluginList& getDisplayPlugins();

View file

@ -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 <input-plugins/InputPlugin.h>
#include <input-plugins/KeyboardMouseDevice.h>
#include <input-plugins/SDL2Manager.h>
#include <input-plugins/SixenseManager.h>
#include <input-plugins/ViveControllerManager.h>
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;
}

View file

@ -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 <plugins/PluginContainer.h>
class InputPlugin;
#include <QVector>
#include <QSharedPointer>
using InputPluginPointer = QSharedPointer<InputPlugin>;
using InputPluginList = QVector<InputPluginPointer>;
const InputPluginList& getInputPlugins();

View file

@ -19,13 +19,14 @@
#include <QScreen>
#include <QWindow>
#include <plugins/PluginManager.h>
#include <display-plugins/DisplayPlugin.h>
#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();

View file

@ -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();
}

View file

@ -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;

View file

@ -7,3 +7,46 @@
//
#include "DisplayPlugin.h"
#include <plugins/PluginManager.h>
#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;
}

View file

@ -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() {}

View file

@ -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;

View file

@ -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();

View file

@ -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;

View file

@ -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;
//}

View file

@ -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;

View file

@ -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 {

View file

@ -9,15 +9,13 @@
#include "../MainWindowOpenGLDisplayPlugin.h"
#include <OVR_CAPI.h>
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)

View file

@ -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;
}

View file

@ -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;
}

View file

@ -7,8 +7,6 @@
//
#include "Oculus_0_5_DisplayPlugin.h"
#if (OVR_MAJOR_VERSION == 5)
#include <memory>
#include <QMainWindow>
@ -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<ovrGLTexture&>(_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

View file

@ -9,8 +9,6 @@
#include "OculusBaseDisplayPlugin.h"
#if (OVR_MAJOR_VERSION == 5)
#include <QTimer>
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

View file

@ -7,8 +7,6 @@
//
#include "Oculus_0_6_DisplayPlugin.h"
#if (OVR_MAJOR_VERSION == 6)
#include <memory>
#include <QMainWindow>
@ -20,21 +18,24 @@
#include <OVR_CAPI_GL.h>
#include <PerfStat.h>
#include "plugins/PluginContainer.h"
#include "OculusHelpers.h"
#include <OglplusHelpers.h>
#include <oglplus/opt/list_init.hpp>
#include <oglplus/shapes/vector.hpp>
#include <oglplus/opt/list_init.hpp>
#include <oglplus/shapes/obj_mesh.hpp>
#include <OglplusHelpers.h>
#include <PerfStat.h>
#include <plugins/PluginContainer.h>
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<TextureCache>()->
// 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

View file

@ -11,8 +11,6 @@
#include <QTimer>
#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

View file

@ -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) {

View file

@ -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;

View file

@ -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?
}

View file

@ -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;

View file

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

View file

@ -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;

View file

@ -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"
#include "InputPlugin.h"
#include <plugins/PluginManager.h>
#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;
}

View file

@ -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); }

View file

@ -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;

View file

@ -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();

View file

@ -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); }

View file

@ -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--;

View file

@ -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); }

View file

@ -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() {}

View file

@ -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;
};

View file

@ -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;
};

View file

@ -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 <QString>
@ -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<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 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<void(bool)> onClicked, bool checkable = false, bool checked = false, const QString& groupName = "") = 0;

View file

@ -1 +1,31 @@
#include "PluginManager.h"
#include <mutex>
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;
}

View file

@ -2,9 +2,21 @@
#include "Plugin.h"
#include <QList>
#include <QVector>
#include <QSharedPointer>
class DisplayPlugin;
class InputPlugin;
using DisplayPluginPointer = QSharedPointer<DisplayPlugin>;
using DisplayPluginList = QVector<DisplayPluginPointer>;
using InputPluginPointer = QSharedPointer<InputPlugin>;
using InputPluginList = QVector<InputPluginPointer>;
class PluginManager : public QObject {
public:
static PluginManager * getInstance();
static PluginManager* getInstance();
const DisplayPluginList& getDisplayPlugins();
const InputPluginList& getInputPlugins();
};