mirror of
https://github.com/overte-org/overte.git
synced 2025-04-08 08:14:48 +02:00
Decouple Application and plugin definitions, cleanup container usage
This commit is contained in:
parent
a79095dcec
commit
5515b9d8ee
43 changed files with 399 additions and 370 deletions
|
@ -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) {
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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();
|
|
@ -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;
|
||||
}
|
|
@ -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();
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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() {}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
//}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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?
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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); }
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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); }
|
||||
|
|
|
@ -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--;
|
||||
|
||||
|
|
|
@ -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); }
|
||||
|
|
|
@ -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() {}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
15
libraries/plugins/src/plugins/PluginContainer.cpp
Normal file
15
libraries/plugins/src/plugins/PluginContainer.cpp
Normal 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;
|
||||
};
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue