From 8090bc8e8d7d2b65963aa1ad17e5fb45e06c61a5 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Tue, 6 Oct 2015 10:16:42 -0700 Subject: [PATCH] Revert "Enabling programmatic access to the IPD scale" --- examples/example/hmd/ipdScalingTest.js | 42 ------------ interface/src/Application.cpp | 47 ++++--------- interface/src/PluginContainerProxy.cpp | 7 -- interface/src/PluginContainerProxy.h | 3 - interface/src/avatar/MyAvatar.cpp | 8 +-- .../src/scripting/HMDScriptingInterface.cpp | 68 +++++++++---------- .../src/scripting/HMDScriptingInterface.h | 23 ++++--- .../AbstractHMDScriptingInterface.cpp | 52 -------------- .../AbstractHMDScriptingInterface.h | 39 ----------- .../src/display-plugins/DisplayPlugin.h | 17 ++--- .../oculus/OculusBaseDisplayPlugin.cpp | 16 ++--- .../oculus/OculusBaseDisplayPlugin.h | 11 ++- .../display-plugins/oculus/OculusHelpers.h | 8 --- .../oculus/OculusLegacyDisplayPlugin.cpp | 4 +- .../oculus/OculusLegacyDisplayPlugin.h | 2 +- .../openvr/OpenVrDisplayPlugin.cpp | 4 +- .../openvr/OpenVrDisplayPlugin.h | 2 +- .../stereo/StereoDisplayPlugin.cpp | 4 ++ .../stereo/StereoDisplayPlugin.h | 9 +-- .../plugins/src/plugins/PluginContainer.cpp | 10 --- .../plugins/src/plugins/PluginContainer.h | 4 -- 21 files changed, 90 insertions(+), 290 deletions(-) delete mode 100644 examples/example/hmd/ipdScalingTest.js delete mode 100644 libraries/display-plugins/src/display-plugins/AbstractHMDScriptingInterface.cpp delete mode 100644 libraries/display-plugins/src/display-plugins/AbstractHMDScriptingInterface.h diff --git a/examples/example/hmd/ipdScalingTest.js b/examples/example/hmd/ipdScalingTest.js deleted file mode 100644 index daa11170e4..0000000000 --- a/examples/example/hmd/ipdScalingTest.js +++ /dev/null @@ -1,42 +0,0 @@ -// -// Created by Bradley Austin Davis on 2015/10/04 -// Copyright 2013-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 -// - -IPDScalingTest = function() { - // Switch every 5 seconds between normal IPD and 0 IPD (in seconds) - this.UPDATE_INTERVAL = 10.0; - this.lastUpdateInterval = 0; - this.scaled = false; - - var that = this; - Script.scriptEnding.connect(function() { - that.onCleanup(); - }); - - Script.update.connect(function(deltaTime) { - that.lastUpdateInterval += deltaTime; - if (that.lastUpdateInterval >= that.UPDATE_INTERVAL) { - that.onUpdate(that.lastUpdateInterval); - that.lastUpdateInterval = 0; - } - }); -} - -IPDScalingTest.prototype.onCleanup = function() { - HMD.setIPDScale(1.0); -} - -IPDScalingTest.prototype.onUpdate = function(deltaTime) { - this.scaled = !this.scaled; - if (this.scaled) { - HMD.ipdScale = 0.0; - } else { - HMD.ipdScale = 1.0; - } -} - -new IPDScalingTest(); \ No newline at end of file diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 025e448e29..b25f3aa6a5 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -300,7 +300,6 @@ bool setupEssentials(int& argc, char** argv) { auto desktopScriptingInterface = DependencyManager::set(); auto entityScriptingInterface = DependencyManager::set(); auto windowScriptingInterface = DependencyManager::set(); - auto hmdScriptingInterface = DependencyManager::set(); #if defined(Q_OS_MAC) || defined(Q_OS_WIN) auto speechRecognizer = DependencyManager::set(); #endif @@ -1204,11 +1203,9 @@ void Application::paintGL() { // right eye. There are FIXMEs in the relevant plugins _myCamera.setProjection(displayPlugin->getProjection(Mono, _myCamera.getProjection())); renderArgs._context->enableStereo(true); - mat4 eyeOffsets[2]; + mat4 eyeViews[2]; mat4 eyeProjections[2]; auto baseProjection = renderArgs._viewFrustum->getProjection(); - auto hmdInterface = DependencyManager::get(); - float IPDScale = hmdInterface->getIPDScale(); // FIXME we probably don't need to set the projection matrix every frame, // only when the display plugin changes (or in non-HMD modes when the user // changes the FOV manually, which right now I don't think they can. @@ -1217,24 +1214,14 @@ void Application::paintGL() { // applied to the avatar, so we need to get the difference between the head // pose applied to the avatar and the per eye pose, and use THAT as // the per-eye stereo matrix adjustment. - mat4 eyeToHead = displayPlugin->getEyeToHeadTransform(eye); - // Grab the translation - vec3 eyeOffset = glm::vec3(eyeToHead[3]); - // Apply IPD scaling - mat4 eyeOffsetTransform = glm::translate(mat4(), eyeOffset * -1.0f * IPDScale); - eyeOffsets[eye] = eyeOffsetTransform; - - // Tell the plugin what pose we're using to render. In this case we're just using the - // unmodified head pose because the only plugin that cares (the Oculus plugin) uses it - // for rotational timewarp. If we move to support positonal timewarp, we need to - // ensure this contains the full pose composed with the eye offsets. + mat4 eyePose = displayPlugin->getEyePose(eye); mat4 headPose = displayPlugin->getHeadPose(); - displayPlugin->setEyeRenderPose(eye, headPose); - + mat4 eyeView = glm::inverse(eyePose) * headPose; + eyeViews[eye] = eyeView; eyeProjections[eye] = displayPlugin->getProjection(eye, baseProjection); }); renderArgs._context->setStereoProjections(eyeProjections); - renderArgs._context->setStereoViews(eyeOffsets); + renderArgs._context->setStereoViews(eyeViews); } displaySide(&renderArgs, _myCamera); renderArgs._context->enableStereo(false); @@ -4143,7 +4130,7 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri scriptEngine->registerGlobalObject("Paths", DependencyManager::get().data()); - scriptEngine->registerGlobalObject("HMD", DependencyManager::get().data()); + scriptEngine->registerGlobalObject("HMD", &HMDScriptingInterface::getInstance()); scriptEngine->registerFunction("HMD", "getHUDLookAtPosition2D", HMDScriptingInterface::getHUDLookAtPosition2D, 0); scriptEngine->registerFunction("HMD", "getHUDLookAtPosition3D", HMDScriptingInterface::getHUDLookAtPosition3D, 0); @@ -4993,25 +4980,19 @@ mat4 Application::getEyeProjection(int eye) const { mat4 Application::getEyePose(int eye) const { if (isHMDMode()) { - auto hmdInterface = DependencyManager::get(); - float IPDScale = hmdInterface->getIPDScale(); - auto displayPlugin = getActiveDisplayPlugin(); - mat4 headPose = displayPlugin->getHeadPose(); - mat4 eyeToHead = displayPlugin->getEyeToHeadTransform((Eye)eye); - { - vec3 eyeOffset = glm::vec3(eyeToHead[3]); - // Apply IPD scaling - mat4 eyeOffsetTransform = glm::translate(mat4(), eyeOffset * -1.0f * IPDScale); - eyeToHead[3] = vec4(eyeOffset, 1.0); - } - return eyeToHead * headPose; + return getActiveDisplayPlugin()->getEyePose((Eye)eye); } + return mat4(); } mat4 Application::getEyeOffset(int eye) const { - // FIXME invert? - return getActiveDisplayPlugin()->getEyeToHeadTransform((Eye)eye); + if (isHMDMode()) { + mat4 identity; + return getActiveDisplayPlugin()->getView((Eye)eye, identity); + } + + return mat4(); } mat4 Application::getHMDSensorPose() const { diff --git a/interface/src/PluginContainerProxy.cpp b/interface/src/PluginContainerProxy.cpp index d31231e11c..469e7f7c77 100644 --- a/interface/src/PluginContainerProxy.cpp +++ b/interface/src/PluginContainerProxy.cpp @@ -16,9 +16,6 @@ PluginContainerProxy::PluginContainerProxy() { Plugin::setContainer(this); } -PluginContainerProxy::~PluginContainerProxy() { -} - bool PluginContainerProxy::isForeground() { return qApp->_isForeground && !qApp->getWindow()->isMinimized(); } @@ -154,7 +151,3 @@ void PluginContainerProxy::showDisplayPluginsTools() { QGLWidget* PluginContainerProxy::getPrimarySurface() { return qApp->_glWidget; } - -const DisplayPlugin* PluginContainerProxy::getActiveDisplayPlugin() const { - return qApp->getActiveDisplayPlugin(); -} diff --git a/interface/src/PluginContainerProxy.h b/interface/src/PluginContainerProxy.h index 79f8287b66..95865609c8 100644 --- a/interface/src/PluginContainerProxy.h +++ b/interface/src/PluginContainerProxy.h @@ -11,7 +11,6 @@ class PluginContainerProxy : public QObject, PluginContainer { Q_OBJECT PluginContainerProxy(); - virtual ~PluginContainerProxy(); virtual void addMenu(const QString& menuName) override; virtual void removeMenu(const QString& menuName) override; virtual QAction* addMenuItem(const QString& path, const QString& name, std::function onClicked, bool checkable = false, bool checked = false, const QString& groupName = "") override; @@ -24,8 +23,6 @@ class PluginContainerProxy : public QObject, PluginContainer { virtual void requestReset() override; virtual QGLWidget* getPrimarySurface() override; virtual bool isForeground() override; - virtual const DisplayPlugin* getActiveDisplayPlugin() const override; - QRect _savedGeometry{ 10, 120, 800, 600 }; friend class Application; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 71698fa4ea..9654305d70 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1341,13 +1341,11 @@ void MyAvatar::renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, fl if (qApp->isHMDMode()) { glm::vec3 cameraPosition = Application::getInstance()->getCamera()->getPosition(); - glm::mat4 headPose = Application::getInstance()->getActiveDisplayPlugin()->getHeadPose(); - glm::mat4 leftEyePose = Application::getInstance()->getActiveDisplayPlugin()->getEyeToHeadTransform(Eye::Left); - leftEyePose = leftEyePose * headPose; + glm::mat4 leftEyePose = Application::getInstance()->getActiveDisplayPlugin()->getEyePose(Eye::Left); glm::vec3 leftEyePosition = glm::vec3(leftEyePose[3]); - glm::mat4 rightEyePose = Application::getInstance()->getActiveDisplayPlugin()->getEyeToHeadTransform(Eye::Right); - rightEyePose = rightEyePose * headPose; + glm::mat4 rightEyePose = Application::getInstance()->getActiveDisplayPlugin()->getEyePose(Eye::Right); glm::vec3 rightEyePosition = glm::vec3(rightEyePose[3]); + glm::mat4 headPose = Application::getInstance()->getActiveDisplayPlugin()->getHeadPose(); glm::vec3 headPosition = glm::vec3(headPose[3]); getHead()->renderLookAts(renderArgs, diff --git a/interface/src/scripting/HMDScriptingInterface.cpp b/interface/src/scripting/HMDScriptingInterface.cpp index f6bf7f8b3c..68ac511eaf 100644 --- a/interface/src/scripting/HMDScriptingInterface.cpp +++ b/interface/src/scripting/HMDScriptingInterface.cpp @@ -10,46 +10,12 @@ // #include "HMDScriptingInterface.h" - -#include - #include "display-plugins/DisplayPlugin.h" #include -#include "Application.h" -HMDScriptingInterface::HMDScriptingInterface() { -} - -QScriptValue HMDScriptingInterface::getHUDLookAtPosition2D(QScriptContext* context, QScriptEngine* engine) { - glm::vec3 hudIntersection; - auto instance = DependencyManager::get(); - if (instance->getHUDLookAtPosition3D(hudIntersection)) { - MyAvatar* myAvatar = DependencyManager::get()->getMyAvatar(); - glm::vec3 sphereCenter = myAvatar->getDefaultEyePosition(); - glm::vec3 direction = glm::inverse(myAvatar->getOrientation()) * (hudIntersection - sphereCenter); - glm::quat rotation = ::rotationBetween(glm::vec3(0.0f, 0.0f, -1.0f), direction); - glm::vec3 eulers = ::safeEulerAngles(rotation); - return qScriptValueFromValue(engine, Application::getInstance()->getApplicationCompositor() - .sphericalToOverlay(glm::vec2(eulers.y, -eulers.x))); - } - return QScriptValue::NullValue; -} - -QScriptValue HMDScriptingInterface::getHUDLookAtPosition3D(QScriptContext* context, QScriptEngine* engine) { - glm::vec3 result; - auto instance = DependencyManager::get(); - if (instance->getHUDLookAtPosition3D(result)) { - return qScriptValueFromValue(engine, result); - } - return QScriptValue::NullValue; -} - -void HMDScriptingInterface::toggleMagnifier() { - qApp->getApplicationCompositor().toggleMagnifier(); -} - -bool HMDScriptingInterface::getMagnifier() const { - return Application::getInstance()->getApplicationCompositor().hasMagnifier(); +HMDScriptingInterface& HMDScriptingInterface::getInstance() { + static HMDScriptingInterface sharedInstance; + return sharedInstance; } bool HMDScriptingInterface::getHUDLookAtPosition3D(glm::vec3& result) const { @@ -63,3 +29,31 @@ bool HMDScriptingInterface::getHUDLookAtPosition3D(glm::vec3& result) const { return compositor.calculateRayUICollisionPoint(position, direction, result); } + +QScriptValue HMDScriptingInterface::getHUDLookAtPosition2D(QScriptContext* context, QScriptEngine* engine) { + + glm::vec3 hudIntersection; + + if ((&HMDScriptingInterface::getInstance())->getHUDLookAtPosition3D(hudIntersection)) { + MyAvatar* myAvatar = DependencyManager::get()->getMyAvatar(); + glm::vec3 sphereCenter = myAvatar->getDefaultEyePosition(); + glm::vec3 direction = glm::inverse(myAvatar->getOrientation()) * (hudIntersection - sphereCenter); + glm::quat rotation = ::rotationBetween(glm::vec3(0.0f, 0.0f, -1.0f), direction); + glm::vec3 eulers = ::safeEulerAngles(rotation); + return qScriptValueFromValue(engine, Application::getInstance()->getApplicationCompositor() + .sphericalToOverlay(glm::vec2(eulers.y, -eulers.x))); + } + return QScriptValue::NullValue; +} + +QScriptValue HMDScriptingInterface::getHUDLookAtPosition3D(QScriptContext* context, QScriptEngine* engine) { + glm::vec3 result; + if ((&HMDScriptingInterface::getInstance())->getHUDLookAtPosition3D(result)) { + return qScriptValueFromValue(engine, result); + } + return QScriptValue::NullValue; +} + +float HMDScriptingInterface::getIPD() const { + return Application::getInstance()->getActiveDisplayPlugin()->getIPD(); +} diff --git a/interface/src/scripting/HMDScriptingInterface.h b/interface/src/scripting/HMDScriptingInterface.h index c097cde5e3..82b444abaa 100644 --- a/interface/src/scripting/HMDScriptingInterface.h +++ b/interface/src/scripting/HMDScriptingInterface.h @@ -12,29 +12,32 @@ #ifndef hifi_HMDScriptingInterface_h #define hifi_HMDScriptingInterface_h -#include -class QScriptContext; -class QScriptEngine; - #include -#include -#include +#include "Application.h" -class HMDScriptingInterface : public AbstractHMDScriptingInterface, public Dependency { +class HMDScriptingInterface : public QObject { Q_OBJECT Q_PROPERTY(bool magnifier READ getMagnifier) + Q_PROPERTY(bool active READ isHMDMode) + Q_PROPERTY(float ipd READ getIPD) public: - HMDScriptingInterface(); + static HMDScriptingInterface& getInstance(); + static QScriptValue getHUDLookAtPosition2D(QScriptContext* context, QScriptEngine* engine); static QScriptValue getHUDLookAtPosition3D(QScriptContext* context, QScriptEngine* engine); public slots: - void toggleMagnifier(); + void toggleMagnifier() { Application::getInstance()->getApplicationCompositor().toggleMagnifier(); }; private: - bool getMagnifier() const; + HMDScriptingInterface() {}; + bool getMagnifier() const { return Application::getInstance()->getApplicationCompositor().hasMagnifier(); }; + bool isHMDMode() const { return Application::getInstance()->isHMDMode(); } + float getIPD() const; + bool getHUDLookAtPosition3D(glm::vec3& result) const; + }; #endif // hifi_HMDScriptingInterface_h diff --git a/libraries/display-plugins/src/display-plugins/AbstractHMDScriptingInterface.cpp b/libraries/display-plugins/src/display-plugins/AbstractHMDScriptingInterface.cpp deleted file mode 100644 index 9987ae345c..0000000000 --- a/libraries/display-plugins/src/display-plugins/AbstractHMDScriptingInterface.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// -// Created by Bradley Austin Davis on 2015/10/04 -// Copyright 2013-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 "AbstractHMDScriptingInterface.h" - -#include - -#include "DisplayPlugin.h" -#include -#include - -static Setting::Handle IPD_SCALE_HANDLE("hmd.ipdScale", 1.0f); - -AbstractHMDScriptingInterface::AbstractHMDScriptingInterface() { - _IPDScale = IPD_SCALE_HANDLE.get(); -} - -float AbstractHMDScriptingInterface::getIPD() const { - return PluginContainer::getInstance().getActiveDisplayPlugin()->getIPD(); -} - -float AbstractHMDScriptingInterface::getEyeHeight() const { - // FIXME update the display plugin interface to expose per-plugin settings - return OVR_DEFAULT_EYE_HEIGHT; -} - -float AbstractHMDScriptingInterface::getPlayerHeight() const { - // FIXME update the display plugin interface to expose per-plugin settings - return OVR_DEFAULT_PLAYER_HEIGHT; -} - -float AbstractHMDScriptingInterface::getIPDScale() const { - return _IPDScale; -} - -void AbstractHMDScriptingInterface::setIPDScale(float IPDScale) { - IPDScale = glm::clamp(IPDScale, -1.0f, 3.0f); - if (IPDScale != _IPDScale) { - _IPDScale = IPDScale; - IPD_SCALE_HANDLE.set(IPDScale); - emit IPDScaleChanged(); - } -} - -bool AbstractHMDScriptingInterface::isHMDMode() const { - return PluginContainer::getInstance().getActiveDisplayPlugin()->isHmd(); -} diff --git a/libraries/display-plugins/src/display-plugins/AbstractHMDScriptingInterface.h b/libraries/display-plugins/src/display-plugins/AbstractHMDScriptingInterface.h deleted file mode 100644 index 5df58ce677..0000000000 --- a/libraries/display-plugins/src/display-plugins/AbstractHMDScriptingInterface.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// Created by Bradley Austin Davis on 2015/10/04 -// Copyright 2013-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 -#ifndef hifi_AbstractHMDScriptingInterface_h -#define hifi_AbstractHMDScriptingInterface_h - -#include - -class AbstractHMDScriptingInterface : public QObject { - Q_OBJECT - Q_PROPERTY(bool active READ isHMDMode) - Q_PROPERTY(float ipd READ getIPD) - Q_PROPERTY(float eyeHeight READ getEyeHeight) - Q_PROPERTY(float playerHeight READ getPlayerHeight) - Q_PROPERTY(float ipdScale READ getIPDScale WRITE setIPDScale NOTIFY IPDScaleChanged) - -public: - AbstractHMDScriptingInterface(); - float getIPD() const; - float getEyeHeight() const; - float getPlayerHeight() const; - float getIPDScale() const; - void setIPDScale(float ipdScale); - bool isHMDMode() const; - -signals: - void IPDScaleChanged(); - -private: - float _IPDScale{ 1.0 }; -}; - -#endif // hifi_AbstractHMDScriptingInterface_h diff --git a/libraries/display-plugins/src/display-plugins/DisplayPlugin.h b/libraries/display-plugins/src/display-plugins/DisplayPlugin.h index b4ae6be97f..8b9d249bd4 100644 --- a/libraries/display-plugins/src/display-plugins/DisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/DisplayPlugin.h @@ -46,8 +46,6 @@ void for_each_eye(F f, FF ff) { class QWindow; -#define AVERAGE_HUMAN_IPD 0.064f - class DisplayPlugin : public Plugin { Q_OBJECT public: @@ -109,22 +107,21 @@ public: return baseProjection; } + virtual glm::mat4 getView(Eye eye, const glm::mat4& baseView) const { + return glm::inverse(getEyePose(eye)) * baseView; + } + // HMD specific methods // TODO move these into another class? - virtual glm::mat4 getEyeToHeadTransform(Eye eye) const { - static const glm::mat4 transform; return transform; + virtual glm::mat4 getEyePose(Eye eye) const { + static const glm::mat4 pose; return pose; } virtual glm::mat4 getHeadPose() const { static const glm::mat4 pose; return pose; } - // Needed for timewarp style features - virtual void setEyeRenderPose(Eye eye, const glm::mat4& pose) { - // NOOP - } - - virtual float getIPD() const { return AVERAGE_HUMAN_IPD; } + virtual float getIPD() const { return 0.0f; } virtual void abandonCalibration() {} virtual void resetSensors() {} diff --git a/libraries/display-plugins/src/display-plugins/oculus/OculusBaseDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/oculus/OculusBaseDisplayPlugin.cpp index 859a4a810a..f2a7b06510 100644 --- a/libraries/display-plugins/src/display-plugins/oculus/OculusBaseDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/oculus/OculusBaseDisplayPlugin.cpp @@ -19,6 +19,7 @@ void OculusBaseDisplayPlugin::preRender() { #if (OVR_MAJOR_VERSION >= 6) ovrFrameTiming ftiming = ovr_GetFrameTiming(_hmd, _frameIndex); _trackingState = ovr_GetTrackingState(_hmd, ftiming.DisplayMidpointSeconds); + ovr_CalcEyePoses(_trackingState.HeadPose.ThePose, _eyeOffsets, _eyePoses); #endif } @@ -32,19 +33,14 @@ void OculusBaseDisplayPlugin::resetSensors() { #endif } -glm::mat4 OculusBaseDisplayPlugin::getEyeToHeadTransform(Eye eye) const { - return glm::translate(mat4(), toGlm(_eyeOffsets[eye])); +glm::mat4 OculusBaseDisplayPlugin::getEyePose(Eye eye) const { + return toGlm(_eyePoses[eye]); } glm::mat4 OculusBaseDisplayPlugin::getHeadPose() const { return toGlm(_trackingState.HeadPose.ThePose); } -void OculusBaseDisplayPlugin::setEyeRenderPose(Eye eye, const glm::mat4& pose) { - _eyePoses[eye] = ovrPoseFromGlm(pose); -} - - bool OculusBaseDisplayPlugin::isSupported() const { #if (OVR_MAJOR_VERSION >= 6) if (!OVR_SUCCESS(ovr_Initialize(nullptr))) { @@ -155,9 +151,9 @@ void OculusBaseDisplayPlugin::display(GLuint finalTexture, const glm::uvec2& sce } float OculusBaseDisplayPlugin::getIPD() const { - float result = OVR_DEFAULT_IPD; + float result = 0.0f; #if (OVR_MAJOR_VERSION >= 6) - result = ovr_GetFloat(_hmd, OVR_KEY_IPD, result); + result = ovr_GetFloat(_hmd, OVR_KEY_IPD, OVR_DEFAULT_IPD); #endif return result; -} +} \ No newline at end of file diff --git a/libraries/display-plugins/src/display-plugins/oculus/OculusBaseDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/oculus/OculusBaseDisplayPlugin.h index 6307f6bbf9..d879085b8f 100644 --- a/libraries/display-plugins/src/display-plugins/oculus/OculusBaseDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/oculus/OculusBaseDisplayPlugin.h @@ -29,9 +29,8 @@ public: virtual glm::uvec2 getRecommendedRenderSize() const override final; virtual glm::uvec2 getRecommendedUiSize() const override final { return uvec2(1920, 1080); } virtual void resetSensors() override final; - virtual glm::mat4 getEyeToHeadTransform(Eye eye) const override final; + virtual glm::mat4 getEyePose(Eye eye) const override final; virtual glm::mat4 getHeadPose() const override final; - virtual void setEyeRenderPose(Eye eye, const glm::mat4& pose) override final; virtual float getIPD() const override final; protected: @@ -40,7 +39,6 @@ protected: protected: ovrPosef _eyePoses[2]; - ovrVector3f _eyeOffsets[2]; mat4 _eyeProjections[3]; mat4 _compositeEyeProjections[2]; @@ -52,12 +50,13 @@ protected: ovrHmd _hmd; float _ipd{ OVR_DEFAULT_IPD }; ovrEyeRenderDesc _eyeRenderDescs[2]; + ovrVector3f _eyeOffsets[2]; ovrFovPort _eyeFovs[2]; - ovrHmdDesc _hmdDesc; - ovrLayerEyeFov _sceneLayer; + ovrHmdDesc _hmdDesc; + ovrLayerEyeFov _sceneLayer; #endif #if (OVR_MAJOR_VERSION == 7) - ovrGraphicsLuid _luid; + ovrGraphicsLuid _luid; #endif }; diff --git a/libraries/display-plugins/src/display-plugins/oculus/OculusHelpers.h b/libraries/display-plugins/src/display-plugins/oculus/OculusHelpers.h index 5a6999075b..df0a6c5228 100644 --- a/libraries/display-plugins/src/display-plugins/oculus/OculusHelpers.h +++ b/libraries/display-plugins/src/display-plugins/oculus/OculusHelpers.h @@ -79,11 +79,3 @@ inline ovrQuatf ovrFromGlm(const glm::quat & q) { return{ q.x, q.y, q.z, q.w }; } -inline ovrPosef ovrPoseFromGlm(const glm::mat4 & m) { - glm::vec3 translation = glm::vec3(m[3]) / m[3].w; - glm::quat orientation = glm::quat_cast(m); - ovrPosef result; - result.Orientation = ovrFromGlm(orientation); - result.Position = ovrFromGlm(translation); - return result; -} diff --git a/libraries/display-plugins/src/display-plugins/oculus/OculusLegacyDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/oculus/OculusLegacyDisplayPlugin.cpp index 1ad61513d6..ade34afcae 100644 --- a/libraries/display-plugins/src/display-plugins/oculus/OculusLegacyDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/oculus/OculusLegacyDisplayPlugin.cpp @@ -59,11 +59,11 @@ void OculusLegacyDisplayPlugin::resetSensors() { #endif } -glm::mat4 OculusLegacyDisplayPlugin::getEyeToHeadTransform(Eye eye) const { +glm::mat4 OculusLegacyDisplayPlugin::getEyePose(Eye eye) const { #if (OVR_MAJOR_VERSION == 5) return toGlm(_eyePoses[eye]); #else - return WindowOpenGLDisplayPlugin::getEyeToHeadTransform(eye); + return WindowOpenGLDisplayPlugin::getEyePose(eye); #endif } diff --git a/libraries/display-plugins/src/display-plugins/oculus/OculusLegacyDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/oculus/OculusLegacyDisplayPlugin.h index 9e2e47f434..5bce032948 100644 --- a/libraries/display-plugins/src/display-plugins/oculus/OculusLegacyDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/oculus/OculusLegacyDisplayPlugin.h @@ -31,7 +31,7 @@ public: virtual glm::uvec2 getRecommendedRenderSize() const override; virtual glm::uvec2 getRecommendedUiSize() const override { return uvec2(1920, 1080); } virtual void resetSensors() override; - virtual glm::mat4 getEyeToHeadTransform(Eye eye) const override; + virtual glm::mat4 getEyePose(Eye eye) const override; virtual glm::mat4 getHeadPose() const override; protected: diff --git a/libraries/display-plugins/src/display-plugins/openvr/OpenVrDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/openvr/OpenVrDisplayPlugin.cpp index faf5a7b781..fab9cc5dd4 100644 --- a/libraries/display-plugins/src/display-plugins/openvr/OpenVrDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/openvr/OpenVrDisplayPlugin.cpp @@ -160,8 +160,8 @@ void OpenVrDisplayPlugin::resetSensors() { _sensorResetMat = glm::inverse(cancelOutRollAndPitch(_trackedDevicePoseMat4[0])); } -glm::mat4 OpenVrDisplayPlugin::getEyeToHeadTransform(Eye eye) const { - return _eyesData[eye]._eyeOffset; +glm::mat4 OpenVrDisplayPlugin::getEyePose(Eye eye) const { + return getHeadPose() * _eyesData[eye]._eyeOffset; } glm::mat4 OpenVrDisplayPlugin::getHeadPose() const { diff --git a/libraries/display-plugins/src/display-plugins/openvr/OpenVrDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/openvr/OpenVrDisplayPlugin.h index 7849623552..afe024e72b 100644 --- a/libraries/display-plugins/src/display-plugins/openvr/OpenVrDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/openvr/OpenVrDisplayPlugin.h @@ -29,7 +29,7 @@ public: virtual glm::mat4 getProjection(Eye eye, const glm::mat4& baseProjection) const override; virtual void resetSensors() override; - virtual glm::mat4 getEyeToHeadTransform(Eye eye) const override; + virtual glm::mat4 getEyePose(Eye eye) const override; virtual glm::mat4 getHeadPose() const override; protected: diff --git a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp index 2ea79ed2e0..77906d1857 100644 --- a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp @@ -61,6 +61,10 @@ glm::mat4 StereoDisplayPlugin::getProjection(Eye eye, const glm::mat4& baseProje return eyeProjection; } +glm::mat4 StereoDisplayPlugin::getEyePose(Eye eye) const { + return mat4(); +} + std::vector _screenActions; void StereoDisplayPlugin::activate() { auto screens = qApp->screens(); diff --git a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h index 33b0b09b0d..86f35c1260 100644 --- a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h @@ -21,14 +21,7 @@ public: virtual float getRecommendedAspectRatio() const override; virtual glm::mat4 getProjection(Eye eye, const glm::mat4& baseProjection) const override; - - // NOTE, because Stereo displays don't include head tracking, and therefore - // can't include roll or pitch, the eye separation is embedded into the projection - // matrix. However, this eliminates the possibility of easily mainpulating - // the IPD at the Application level, the way we now allow with HMDs. - // If that becomes an issue then we'll need to break up the functionality similar - // to the HMD plugins. - // virtual glm::mat4 getEyeToHeadTransform(Eye eye) const override; + virtual glm::mat4 getEyePose(Eye eye) const override; protected: void updateScreen(); diff --git a/libraries/plugins/src/plugins/PluginContainer.cpp b/libraries/plugins/src/plugins/PluginContainer.cpp index 8afac745f3..b27f076eb6 100644 --- a/libraries/plugins/src/plugins/PluginContainer.cpp +++ b/libraries/plugins/src/plugins/PluginContainer.cpp @@ -9,17 +9,7 @@ static PluginContainer* INSTANCE{ nullptr }; -PluginContainer& PluginContainer::getInstance() { - Q_ASSERT(INSTANCE); - return *INSTANCE; -} - PluginContainer::PluginContainer() { Q_ASSERT(!INSTANCE); INSTANCE = this; }; - -PluginContainer::~PluginContainer() { - Q_ASSERT(INSTANCE == this); - INSTANCE = nullptr; -}; diff --git a/libraries/plugins/src/plugins/PluginContainer.h b/libraries/plugins/src/plugins/PluginContainer.h index f013bfe3bf..f938758161 100644 --- a/libraries/plugins/src/plugins/PluginContainer.h +++ b/libraries/plugins/src/plugins/PluginContainer.h @@ -13,13 +13,10 @@ class QAction; class QGLWidget; class QScreen; -class DisplayPlugin; class PluginContainer { public: - static PluginContainer& getInstance(); PluginContainer(); - virtual ~PluginContainer(); virtual void addMenu(const QString& menuName) = 0; virtual void removeMenu(const QString& menuName) = 0; virtual QAction* addMenuItem(const QString& path, const QString& name, std::function onClicked, bool checkable = false, bool checked = false, const QString& groupName = "") = 0; @@ -32,5 +29,4 @@ public: virtual void requestReset() = 0; virtual QGLWidget* getPrimarySurface() = 0; virtual bool isForeground() = 0; - virtual const DisplayPlugin* getActiveDisplayPlugin() const = 0; };