From af5ba3a90af049f116bd0f2a07a6a94b610a69e2 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 25 May 2017 15:14:10 -0700 Subject: [PATCH] ask display-plugins if they are head-controllers --- .../resources/controllers/oculus_touch.json | 2 ++ interface/src/Application.cpp | 15 +++++++++++++++ interface/src/Application.h | 1 + interface/src/avatar/MyAvatar.cpp | 18 ++++++++++-------- .../src/scripting/HMDScriptingInterface.cpp | 4 ++++ .../src/scripting/HMDScriptingInterface.h | 1 + .../impl/filters/LowVelocityFilter.h | 2 +- .../Basic2DWindowOpenGLDisplayPlugin.h | 2 ++ .../hmd/DebugHmdDisplayPlugin.h | 1 + .../src/display-plugins/hmd/HmdDisplayPlugin.h | 1 + .../stereo/InterleavedStereoDisplayPlugin.h | 2 ++ .../stereo/SideBySideStereoDisplayPlugin.h | 2 ++ .../src/input-plugins/KeyboardMouseDevice.h | 1 + .../src/input-plugins/TouchscreenDevice.h | 1 + libraries/plugins/src/plugins/DisplayPlugin.h | 1 + libraries/plugins/src/plugins/InputPlugin.h | 1 + libraries/plugins/src/plugins/PluginUtils.cpp | 14 ++++++++++++++ libraries/plugins/src/plugins/PluginUtils.h | 1 + plugins/hifiKinect/src/KinectPlugin.cpp | 16 ++++++++++++++-- plugins/hifiKinect/src/KinectPlugin.h | 1 + plugins/hifiNeuron/src/NeuronPlugin.h | 1 + plugins/hifiSdl2/src/SDL2Manager.h | 1 + plugins/hifiSixense/src/SixenseManager.h | 1 + plugins/oculus/src/OculusControllerManager.h | 1 + plugins/oculus/src/OculusDisplayPlugin.h | 2 ++ plugins/openvr/src/OpenVrDisplayPlugin.h | 4 +++- plugins/openvr/src/ViveControllerManager.h | 1 + 27 files changed, 86 insertions(+), 12 deletions(-) diff --git a/interface/resources/controllers/oculus_touch.json b/interface/resources/controllers/oculus_touch.json index aa574e36dd..544c8bd5b8 100644 --- a/interface/resources/controllers/oculus_touch.json +++ b/interface/resources/controllers/oculus_touch.json @@ -58,5 +58,7 @@ { "from": "OculusTouch.RightThumbUp", "to": "Standard.RightThumbUp" }, { "from": "OculusTouch.LeftIndexPoint", "to": "Standard.LeftIndexPoint" }, { "from": "OculusTouch.RightIndexPoint", "to": "Standard.RightIndexPoint" } + + { "from": "OculusTouch.Head", "to" : "Standard.Head", "when" : [ "Application.InHMD"] } ] } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 8761268147..6eb3aedef6 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4851,6 +4851,21 @@ bool Application::isHMDMode() const { return getActiveDisplayPlugin()->isHmd(); } +bool Application::isHeadControllerEnabled() const { + const InputPluginList& inputPlugins = PluginManager::getInstance()->getInputPlugins(); + for (auto& ip : inputPlugins) { + if (ip->isActive() && ip->isHeadController()) { + return true; + } + } + foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getDisplayPlugins()) { + if (displayPlugin->isActive() && displayPlugin->isHeadController()) { + return true; + } + } + return false; +} + float Application::getTargetFrameRate() const { return getActiveDisplayPlugin()->getTargetFrameRate(); } QRect Application::getDesirableApplicationGeometry() const { diff --git a/interface/src/Application.h b/interface/src/Application.h index e8507c39e8..aaf56ef0c2 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -248,6 +248,7 @@ public: // rendering of several elements depend on that // TODO: carry that information on the Camera as a setting virtual bool isHMDMode() const override; + bool isHeadControllerEnabled() const; glm::mat4 getHMDSensorPose() const; glm::mat4 getEyeOffset(int eye) const; glm::mat4 getEyeProjection(int eye) const; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 6cf6ef2fee..2f97cee0be 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1845,14 +1845,16 @@ void MyAvatar::updateOrientation(float deltaTime) { getHead()->setBasePitch(getHead()->getBasePitch() + getDriveKey(PITCH) * _pitchSpeed * deltaTime); - glm::quat localOrientation = getHeadControllerPoseInAvatarFrame(); - // these angles will be in radians - // ... so they need to be converted to degrees before we do math... - glm::vec3 euler = glm::eulerAngles(localOrientation) * DEGREES_PER_RADIAN; - Head* head = getHead(); - head->setBaseYaw(YAW(euler)); - head->setBasePitch(PITCH(euler)); - head->setBaseRoll(ROLL(euler)); + if (qApp->isHeadControllerEnabled()) { + glm::quat localOrientation = getHeadControllerPoseInAvatarFrame(); + // these angles will be in radians + // ... so they need to be converted to degrees before we do math... + glm::vec3 euler = glm::eulerAngles(localOrientation) * DEGREES_PER_RADIAN; + Head* head = getHead(); + head->setBaseYaw(YAW(euler)); + head->setBasePitch(PITCH(euler)); + head->setBaseRoll(ROLL(euler)); + } } void MyAvatar::updateActionMotor(float deltaTime) { diff --git a/interface/src/scripting/HMDScriptingInterface.cpp b/interface/src/scripting/HMDScriptingInterface.cpp index d0e8e74d85..d347b72d7b 100644 --- a/interface/src/scripting/HMDScriptingInterface.cpp +++ b/interface/src/scripting/HMDScriptingInterface.cpp @@ -54,6 +54,10 @@ bool HMDScriptingInterface::isHMDAvailable(const QString& name) { return PluginUtils::isHMDAvailable(name); } +bool HMDScriptingInterface::isHeadControllerAvailable(const QString& name) { + return PluginUtils::isHeadControllerAvailable(name); +} + bool HMDScriptingInterface::isHandControllerAvailable(const QString& name) { return PluginUtils::isHandControllerAvailable(name); } diff --git a/interface/src/scripting/HMDScriptingInterface.h b/interface/src/scripting/HMDScriptingInterface.h index 7ecafdcbcb..4657e61d05 100644 --- a/interface/src/scripting/HMDScriptingInterface.h +++ b/interface/src/scripting/HMDScriptingInterface.h @@ -43,6 +43,7 @@ public: Q_INVOKABLE QString preferredAudioOutput() const; Q_INVOKABLE bool isHMDAvailable(const QString& name = ""); + Q_INVOKABLE bool isHeadControllerAvailable(const QString& name = ""); Q_INVOKABLE bool isHandControllerAvailable(const QString& name = ""); Q_INVOKABLE bool isSubdeviceContainingNameAvailable(const QString& name); diff --git a/libraries/controllers/src/controllers/impl/filters/LowVelocityFilter.h b/libraries/controllers/src/controllers/impl/filters/LowVelocityFilter.h index d870a5c551..feaf7685fd 100644 --- a/libraries/controllers/src/controllers/impl/filters/LowVelocityFilter.h +++ b/libraries/controllers/src/controllers/impl/filters/LowVelocityFilter.h @@ -22,7 +22,7 @@ namespace controller { _translationConstant(translationConstant), _rotationConstant(rotationConstant) {} virtual float apply(float value) const override { return value; } - virtual Pose apply(Pose newPose) const; + virtual Pose apply(Pose newPose) const override; virtual bool parseParameters(const QJsonValue& parameters) override; private: diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h index f3dd50602c..8dc1d83c1b 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h @@ -26,6 +26,8 @@ public: virtual bool isThrottled() const override; + virtual bool isHeadController() const override { return false; } + protected: mutable bool _isThrottled = false; diff --git a/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.h index 9bb82b1836..a971c25bf6 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.h @@ -21,6 +21,7 @@ public: bool beginFrameRender(uint32_t frameIndex) override; float getTargetFrameRate() const override { return 90; } + virtual bool isHeadController() const override { return false; } protected: void updatePresentPose() override; diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h index aaa6e347e0..7dfd0fed1e 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h @@ -25,6 +25,7 @@ class HmdDisplayPlugin : public OpenGLDisplayPlugin { public: ~HmdDisplayPlugin(); bool isHmd() const override final { return true; } + bool isHeadController() const override = 0; float getIPD() const override final { return _ipd; } glm::mat4 getEyeToHeadTransform(Eye eye) const override final { return _eyeOffsets[eye]; } glm::mat4 getEyeProjection(Eye eye, const glm::mat4& baseProjection) const override final { return _eyeProjections[eye]; } diff --git a/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.h index debd340f24..4834e6c542 100644 --- a/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.h @@ -17,6 +17,8 @@ public: grouping getGrouping() const override { return ADVANCED; } glm::uvec2 getRecommendedRenderSize() const override; + virtual bool isHeadController() const override { return false; } + protected: // initialize OpenGL context settings needed by the plugin void customizeContext() override; diff --git a/libraries/display-plugins/src/display-plugins/stereo/SideBySideStereoDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/stereo/SideBySideStereoDisplayPlugin.h index 79bf2a9ecb..aa65fc37e3 100644 --- a/libraries/display-plugins/src/display-plugins/stereo/SideBySideStereoDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/stereo/SideBySideStereoDisplayPlugin.h @@ -19,6 +19,8 @@ public: virtual grouping getGrouping() const override { return ADVANCED; } virtual glm::uvec2 getRecommendedRenderSize() const override; + virtual bool isHeadController() const override { return false; } + private: static const QString NAME; }; diff --git a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h index 3570ec7193..a0e216c904 100644 --- a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h +++ b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h @@ -71,6 +71,7 @@ public: const QString getName() const override { return NAME; } bool isHandController() const override { return false; } + bool isHeadController() const override { return false; } void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); } void pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) override; diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h index 65e771e8f0..926f9dbdca 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h @@ -40,6 +40,7 @@ public: virtual const QString getName() const override { return NAME; } bool isHandController() const override { return false; } + bool isHeadController() const override { return false; } virtual void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); } virtual void pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) override; diff --git a/libraries/plugins/src/plugins/DisplayPlugin.h b/libraries/plugins/src/plugins/DisplayPlugin.h index 754c919fd4..549387b6a4 100644 --- a/libraries/plugins/src/plugins/DisplayPlugin.h +++ b/libraries/plugins/src/plugins/DisplayPlugin.h @@ -135,6 +135,7 @@ public: virtual int getRequiredThreadCount() const { return 0; } virtual bool isHmd() const { return false; } + virtual bool isHeadController() const = 0; virtual int getHmdScreen() const { return -1; } /// By default, all HMDs are stereo virtual bool isStereo() const { return isHmd(); } diff --git a/libraries/plugins/src/plugins/InputPlugin.h b/libraries/plugins/src/plugins/InputPlugin.h index 0db0b24420..0519ed776d 100644 --- a/libraries/plugins/src/plugins/InputPlugin.h +++ b/libraries/plugins/src/plugins/InputPlugin.h @@ -25,5 +25,6 @@ public: // If an input plugin is only a single device, it will only return it's primary name. virtual QStringList getSubdeviceNames() { return { getName() }; }; virtual bool isHandController() const = 0; + virtual bool isHeadController() const = 0; }; diff --git a/libraries/plugins/src/plugins/PluginUtils.cpp b/libraries/plugins/src/plugins/PluginUtils.cpp index 20dc011f25..4af77156e7 100644 --- a/libraries/plugins/src/plugins/PluginUtils.cpp +++ b/libraries/plugins/src/plugins/PluginUtils.cpp @@ -24,6 +24,20 @@ bool PluginUtils::isHMDAvailable(const QString& pluginName) { return false; } +bool PluginUtils::isHeadControllerAvailable(const QString& pluginName) { + for (auto& inputPlugin : PluginManager::getInstance()->getInputPlugins()) { + if (inputPlugin->isHeadController() && (pluginName.isEmpty() || inputPlugin->getName() == pluginName)) { + return true; + } + } + for (auto& displayPlugin : PluginManager::getInstance()->getDisplayPlugins()) { + if (displayPlugin->isHeadController() && (pluginName.isEmpty() || displayPlugin->getName() == pluginName)) { + return true; + } + } + return false; +}; + bool PluginUtils::isHandControllerAvailable(const QString& pluginName) { for (auto& inputPlugin : PluginManager::getInstance()->getInputPlugins()) { if (inputPlugin->isHandController() && (pluginName.isEmpty() || inputPlugin->getName() == pluginName)) { diff --git a/libraries/plugins/src/plugins/PluginUtils.h b/libraries/plugins/src/plugins/PluginUtils.h index 351c9e7e58..2b6206fe63 100644 --- a/libraries/plugins/src/plugins/PluginUtils.h +++ b/libraries/plugins/src/plugins/PluginUtils.h @@ -16,6 +16,7 @@ class PluginUtils { public: static bool isHMDAvailable(const QString& pluginName = ""); static bool isHandControllerAvailable(const QString& pluginName = ""); + static bool isHeadControllerAvailable(const QString& pluginName = ""); static bool isSubdeviceContainingNameAvailable(QString name); static bool isViveControllerAvailable(); static bool isOculusTouchControllerAvailable(); diff --git a/plugins/hifiKinect/src/KinectPlugin.cpp b/plugins/hifiKinect/src/KinectPlugin.cpp index 3a36be0982..834ee1ea2e 100644 --- a/plugins/hifiKinect/src/KinectPlugin.cpp +++ b/plugins/hifiKinect/src/KinectPlugin.cpp @@ -273,7 +273,19 @@ bool KinectPlugin::activate() { return false; } -bool KinectPlugin::isHandController() const { +bool KinectPlugin::isHandController() const { + bool sensorAvailable = false; +#ifdef HAVE_KINECT + if (_kinectSensor) { + BOOLEAN sensorIsAvailable = FALSE; + HRESULT hr = _kinectSensor->get_IsAvailable(&sensorIsAvailable); + sensorAvailable = SUCCEEDED(hr) && (sensorIsAvailable == TRUE); + } +#endif + return _enabled && _initialized && sensorAvailable; +} + +bool KinectPlugin::isHeadController() const { bool sensorAvailable = false; #ifdef HAVE_KINECT if (_kinectSensor) { @@ -654,4 +666,4 @@ void KinectPlugin::InputDevice::clearState() { int poseIndex = KinectJointIndexToPoseIndex((KinectJointIndex)i); _poseStateMap[poseIndex] = controller::Pose(); } -} \ No newline at end of file +} diff --git a/plugins/hifiKinect/src/KinectPlugin.h b/plugins/hifiKinect/src/KinectPlugin.h index 158e66ee62..e8f0745200 100644 --- a/plugins/hifiKinect/src/KinectPlugin.h +++ b/plugins/hifiKinect/src/KinectPlugin.h @@ -43,6 +43,7 @@ class KinectPlugin : public InputPlugin { Q_OBJECT public: bool isHandController() const override; + bool isHeadController() const override; // Plugin functions virtual void init() override; diff --git a/plugins/hifiNeuron/src/NeuronPlugin.h b/plugins/hifiNeuron/src/NeuronPlugin.h index 43b27d14dd..41c2322465 100644 --- a/plugins/hifiNeuron/src/NeuronPlugin.h +++ b/plugins/hifiNeuron/src/NeuronPlugin.h @@ -26,6 +26,7 @@ public: friend void FrameDataReceivedCallback(void* context, void* sender, _BvhDataHeaderEx* header, float* data); bool isHandController() const override { return false; } + bool isHeadController() const override { return false; } // Plugin functions virtual void init() override; diff --git a/plugins/hifiSdl2/src/SDL2Manager.h b/plugins/hifiSdl2/src/SDL2Manager.h index 4501d0792b..d2bbe8265e 100644 --- a/plugins/hifiSdl2/src/SDL2Manager.h +++ b/plugins/hifiSdl2/src/SDL2Manager.h @@ -28,6 +28,7 @@ public: QStringList getSubdeviceNames() override; bool isHandController() const override { return false; } + bool isHeadController() const override { return false; } void init() override; void deinit() override; diff --git a/plugins/hifiSixense/src/SixenseManager.h b/plugins/hifiSixense/src/SixenseManager.h index 5237dba791..889f6c3bad 100644 --- a/plugins/hifiSixense/src/SixenseManager.h +++ b/plugins/hifiSixense/src/SixenseManager.h @@ -34,6 +34,7 @@ public: // Sixense always seems to initialize even if the hydras are not present. Is there // a way we can properly detect whether the hydras are present? bool isHandController() const override { return false; } + bool isHeadController() const override { return false; } virtual bool activate() override; virtual void deactivate() override; diff --git a/plugins/oculus/src/OculusControllerManager.h b/plugins/oculus/src/OculusControllerManager.h index 11d699ca8e..77b40d3764 100644 --- a/plugins/oculus/src/OculusControllerManager.h +++ b/plugins/oculus/src/OculusControllerManager.h @@ -28,6 +28,7 @@ public: const QString getName() const override { return NAME; } bool isHandController() const override { return _touch != nullptr; } + bool isHeadController() const override { return true; } QStringList getSubdeviceNames() override; bool activate() override; diff --git a/plugins/oculus/src/OculusDisplayPlugin.h b/plugins/oculus/src/OculusDisplayPlugin.h index 9209fd373e..a4978a984e 100644 --- a/plugins/oculus/src/OculusDisplayPlugin.h +++ b/plugins/oculus/src/OculusDisplayPlugin.h @@ -24,6 +24,8 @@ public: virtual QJsonObject getHardwareStats() const; + bool isHeadController() const override { return true; } + protected: QThread::Priority getPresentPriority() override { return QThread::TimeCriticalPriority; } diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.h b/plugins/openvr/src/OpenVrDisplayPlugin.h index a60c21a606..9856c27c50 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.h +++ b/plugins/openvr/src/OpenVrDisplayPlugin.h @@ -56,7 +56,9 @@ public: bool isKeyboardVisible() override; // Possibly needs an additional thread for VR submission - int getRequiredThreadCount() const override; + int getRequiredThreadCount() const override; + + bool isHeadController() const override { return true; } protected: bool internalActivate() override; diff --git a/plugins/openvr/src/ViveControllerManager.h b/plugins/openvr/src/ViveControllerManager.h index fa2566da45..d147573d7c 100644 --- a/plugins/openvr/src/ViveControllerManager.h +++ b/plugins/openvr/src/ViveControllerManager.h @@ -39,6 +39,7 @@ public: const QString getName() const override { return NAME; } bool isHandController() const override { return true; } + bool isHeadController() const override { return true; } bool activate() override; void deactivate() override;