From 1bc8484a4b6b06b6f659222d8c8b9abd50d6aefc Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Wed, 28 Feb 2018 11:50:52 -0800 Subject: [PATCH 1/4] determine OpenVr headset namme --- .../src/plugins/InputConfiguration.cpp | 5 +++-- libraries/plugins/src/plugins/InputPlugin.h | 5 +++-- plugins/openvr/src/ViveControllerManager.cpp | 22 +++++++++++++++++++ plugins/openvr/src/ViveControllerManager.h | 4 ++++ 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/libraries/plugins/src/plugins/InputConfiguration.cpp b/libraries/plugins/src/plugins/InputConfiguration.cpp index 9234ac6585..976a9c9463 100644 --- a/libraries/plugins/src/plugins/InputConfiguration.cpp +++ b/libraries/plugins/src/plugins/InputConfiguration.cpp @@ -54,7 +54,8 @@ QStringList InputConfiguration::activeInputPlugins() { if (plugin->configurable()) { QString pluginName = plugin->getName(); if (pluginName == QString("OpenVR")) { - activePlugins << QString("Vive"); + QString headsetName = plugin->getDeviceName(); + activePlugins << headsetName; } else { activePlugins << pluginName; } @@ -74,7 +75,7 @@ QString InputConfiguration::configurationLayout(QString pluginName) { QString sourcePath; for (auto plugin : PluginManager::getInstance()->getInputPlugins()) { - if (plugin->getName() == pluginName) { + if (plugin->getName() == pluginName || plugin->getDeviceName() == pluginName) { return plugin->configurationLayout(); } } diff --git a/libraries/plugins/src/plugins/InputPlugin.h b/libraries/plugins/src/plugins/InputPlugin.h index 5d02964c97..23fbb6cac6 100644 --- a/libraries/plugins/src/plugins/InputPlugin.h +++ b/libraries/plugins/src/plugins/InputPlugin.h @@ -26,10 +26,11 @@ public: // If an input plugin is only a single device, it will only return it's primary name. virtual QStringList getSubdeviceNames() { return { getName() }; }; virtual void setConfigurationSettings(const QJsonObject configurationSettings) { } - virtual QJsonObject configurationSettings() { return QJsonObject(); } + virtual QJsonObject configurationSettings() { return QJsonObject(); } virtual QString configurationLayout() { return QString(); } + virtual QString getDeviceName() { return QString(); } virtual void calibrate() {} - virtual bool uncalibrate() { return false; } + virtual bool uncalibrate() { return false; } virtual bool configurable() { return false; } virtual bool isHandController() const { return false; } virtual bool isHeadController() const { return false; } diff --git a/plugins/openvr/src/ViveControllerManager.cpp b/plugins/openvr/src/ViveControllerManager.cpp index c58e97cc06..1f63769b22 100644 --- a/plugins/openvr/src/ViveControllerManager.cpp +++ b/plugins/openvr/src/ViveControllerManager.cpp @@ -11,6 +11,7 @@ #include "ViveControllerManager.h" #include +#include #include #include @@ -333,12 +334,33 @@ ViveControllerManager::InputDevice::InputDevice(vr::IVRSystem*& system) : _configStringMap[Config::FeetHipsChestAndShoulders] = QString("FeetHipsChestAndShoulders"); } +std::string ViveControllerManager::InputDevice::getTrackingSystemName() { + std::string trackingSystemName = ""; + if (_system) { + uint32_t HmdTrackingIndex = 0; + uint32_t bufferLength = _system->GetStringTrackedDeviceProperty(HmdTrackingIndex, vr::Prop_TrackingSystemName_String, NULL, 0, NULL); + if (bufferLength > 0) { + char* stringBuffer = new char[bufferLength]; + _system->GetStringTrackedDeviceProperty(HmdTrackingIndex, vr::Prop_ManufacturerName_String, stringBuffer, bufferLength, NULL); + trackingSystemName = stringBuffer; + delete[] stringBuffer; + } + } + return trackingSystemName; +} + void ViveControllerManager::InputDevice::update(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) { _poseStateMap.clear(); _buttonPressedMap.clear(); _validTrackedObjects.clear(); _trackedControllers = 0; + if (_headsetName == "") { + _headsetName = getTrackingSystemName(); + if (_headsetName == "HTC") { + _headsetName += " Vive"; + } + } // While the keyboard is open, we defer strictly to the keyboard values if (isOpenVrKeyboardShown()) { _axisStateMap.clear(); diff --git a/plugins/openvr/src/ViveControllerManager.h b/plugins/openvr/src/ViveControllerManager.h index 0dd13d95cb..d66db45ee9 100644 --- a/plugins/openvr/src/ViveControllerManager.h +++ b/plugins/openvr/src/ViveControllerManager.h @@ -52,6 +52,8 @@ public: bool activate() override; void deactivate() override; + QString getDeviceName() { return QString::fromStdString(_inputDevice->_headsetName); } + void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); } void pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) override; @@ -76,6 +78,7 @@ private: void calibrateOrUncalibrate(const controller::InputCalibrationData& inputCalibration); void calibrate(const controller::InputCalibrationData& inputCalibration); void uncalibrate(); + std::string getTrackingSystemName(); void sendUserActivityData(QString activity); void configureCalibrationSettings(const QJsonObject configurationSettings); QJsonObject configurationSettings(); @@ -161,6 +164,7 @@ private: HandConfig _handConfig { HandConfig::HandController }; FilteredStick _filteredLeftStick; FilteredStick _filteredRightStick; + std::string _headsetName {""}; std::vector _validTrackedObjects; std::map _pucksPostOffset; From 1bae22fed016de2a1a7ff5f454e29ddfb569fb6f Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Wed, 28 Feb 2018 16:32:53 -0800 Subject: [PATCH 2/4] get actual name for OpenVrDispayPlugin --- plugins/openvr/src/OpenVrDisplayPlugin.cpp | 10 +++++++++- plugins/openvr/src/OpenVrDisplayPlugin.h | 2 +- plugins/openvr/src/OpenVrHelpers.cpp | 16 ++++++++++++++++ plugins/openvr/src/OpenVrHelpers.h | 2 ++ plugins/openvr/src/ViveControllerManager.cpp | 17 +---------------- plugins/openvr/src/ViveControllerManager.h | 1 - 6 files changed, 29 insertions(+), 19 deletions(-) diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp index 2949e72c74..615b176527 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp +++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp @@ -410,6 +410,15 @@ void OpenVrDisplayPlugin::init() { emit deviceConnected(getName()); } +const QString OpenVrDisplayPlugin::getName() const { + std::string headsetName = getOpenVrDeviceName(); + if (headsetName == "HTC") { + headsetName += " Vive"; + } + + return QString::fromStdString(headsetName); +} + bool OpenVrDisplayPlugin::internalActivate() { if (!_system) { _system = acquireOpenVrSystem(); @@ -444,7 +453,6 @@ bool OpenVrDisplayPlugin::internalActivate() { _openVrDisplayActive = true; _container->setIsOptionChecked(StandingHMDSensorMode, true); - _system->GetRecommendedRenderTargetSize(&_renderTargetSize.x, &_renderTargetSize.y); // Recommended render target size is per-eye, so double the X size for // left + right eyes diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.h b/plugins/openvr/src/OpenVrDisplayPlugin.h index f681852cd5..e6fc6367d5 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.h +++ b/plugins/openvr/src/OpenVrDisplayPlugin.h @@ -36,7 +36,7 @@ class OpenVrDisplayPlugin : public HmdDisplayPlugin { using Parent = HmdDisplayPlugin; public: bool isSupported() const override; - const QString getName() const override { return NAME; } + const QString getName() const override; glm::mat4 getEyeProjection(Eye eye, const glm::mat4& baseProjection) const override; glm::mat4 getCullingProjection(const glm::mat4& baseProjection) const override; diff --git a/plugins/openvr/src/OpenVrHelpers.cpp b/plugins/openvr/src/OpenVrHelpers.cpp index c8a0cb5f8b..9a57413f95 100644 --- a/plugins/openvr/src/OpenVrHelpers.cpp +++ b/plugins/openvr/src/OpenVrHelpers.cpp @@ -66,6 +66,22 @@ bool oculusViaOpenVR() { return enableDebugOpenVR && isOculusPresent() && vr::VR_IsHmdPresent(); } +std::string getOpenVrDeviceName() { + auto system = acquireOpenVrSystem(); + std::string trackingSystemName = ""; + if (system) { + uint32_t HmdTrackingIndex = 0; + uint32_t bufferLength = system->GetStringTrackedDeviceProperty(HmdTrackingIndex, vr::Prop_TrackingSystemName_String, NULL, 0, NULL); + if (bufferLength > 0) { + char* stringBuffer = new char[bufferLength]; + system->GetStringTrackedDeviceProperty(HmdTrackingIndex, vr::Prop_ManufacturerName_String, stringBuffer, bufferLength, NULL); + trackingSystemName = stringBuffer; + delete[] stringBuffer; + } + } + return trackingSystemName; +} + bool openVrSupported() { static const QString DEBUG_FLAG("HIFI_DEBUG_OPENVR"); static bool enableDebugOpenVR = QProcessEnvironment::systemEnvironment().contains(DEBUG_FLAG); diff --git a/plugins/openvr/src/OpenVrHelpers.h b/plugins/openvr/src/OpenVrHelpers.h index c54f2326c2..833e5ba65d 100644 --- a/plugins/openvr/src/OpenVrHelpers.h +++ b/plugins/openvr/src/OpenVrHelpers.h @@ -14,6 +14,7 @@ #include #include +#include bool oculusViaOpenVR(); // is the user using Oculus via OpenVR bool openVrSupported(); @@ -26,6 +27,7 @@ void enableOpenVrKeyboard(PluginContainer* container); void disableOpenVrKeyboard(); bool isOpenVrKeyboardShown(); QString getVrSettingString(const char* section, const char* setting); +std::string getOpenVrDeviceName(); template diff --git a/plugins/openvr/src/ViveControllerManager.cpp b/plugins/openvr/src/ViveControllerManager.cpp index 1f63769b22..caa9fc3d70 100644 --- a/plugins/openvr/src/ViveControllerManager.cpp +++ b/plugins/openvr/src/ViveControllerManager.cpp @@ -334,21 +334,6 @@ ViveControllerManager::InputDevice::InputDevice(vr::IVRSystem*& system) : _configStringMap[Config::FeetHipsChestAndShoulders] = QString("FeetHipsChestAndShoulders"); } -std::string ViveControllerManager::InputDevice::getTrackingSystemName() { - std::string trackingSystemName = ""; - if (_system) { - uint32_t HmdTrackingIndex = 0; - uint32_t bufferLength = _system->GetStringTrackedDeviceProperty(HmdTrackingIndex, vr::Prop_TrackingSystemName_String, NULL, 0, NULL); - if (bufferLength > 0) { - char* stringBuffer = new char[bufferLength]; - _system->GetStringTrackedDeviceProperty(HmdTrackingIndex, vr::Prop_ManufacturerName_String, stringBuffer, bufferLength, NULL); - trackingSystemName = stringBuffer; - delete[] stringBuffer; - } - } - return trackingSystemName; -} - void ViveControllerManager::InputDevice::update(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) { _poseStateMap.clear(); _buttonPressedMap.clear(); @@ -356,7 +341,7 @@ void ViveControllerManager::InputDevice::update(float deltaTime, const controlle _trackedControllers = 0; if (_headsetName == "") { - _headsetName = getTrackingSystemName(); + _headsetName = getOpenVrDeviceName(); if (_headsetName == "HTC") { _headsetName += " Vive"; } diff --git a/plugins/openvr/src/ViveControllerManager.h b/plugins/openvr/src/ViveControllerManager.h index d66db45ee9..f3631ece9d 100644 --- a/plugins/openvr/src/ViveControllerManager.h +++ b/plugins/openvr/src/ViveControllerManager.h @@ -78,7 +78,6 @@ private: void calibrateOrUncalibrate(const controller::InputCalibrationData& inputCalibration); void calibrate(const controller::InputCalibrationData& inputCalibration); void uncalibrate(); - std::string getTrackingSystemName(); void sendUserActivityData(QString activity); void configureCalibrationSettings(const QJsonObject configurationSettings); QJsonObject configurationSettings(); From 95e14446dd698c771301350eb365cbffa0a68eff Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Thu, 1 Mar 2018 09:03:52 -0800 Subject: [PATCH 3/4] update qml file to show the current OpenVr headset --- .../qml/hifi/tablet/ControllerSettings.qml | 1 + .../qml/hifi/tablet/OpenVrConfiguration.qml | 20 +++++++++---------- .../src/plugins/InputConfiguration.cpp | 3 ++- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/interface/resources/qml/hifi/tablet/ControllerSettings.qml b/interface/resources/qml/hifi/tablet/ControllerSettings.qml index 4814eaf01c..78cc2c5a00 100644 --- a/interface/resources/qml/hifi/tablet/ControllerSettings.qml +++ b/interface/resources/qml/hifi/tablet/ControllerSettings.qml @@ -17,6 +17,7 @@ StackView { id: stack initialItem: inputConfiguration property alias messageVisible: imageMessageBox.visible + property alias selectedPlugin: box.currentText Rectangle { id: inputConfiguration anchors.fill: parent diff --git a/interface/resources/qml/hifi/tablet/OpenVrConfiguration.qml b/interface/resources/qml/hifi/tablet/OpenVrConfiguration.qml index 0978f23013..6f79136a49 100644 --- a/interface/resources/qml/hifi/tablet/OpenVrConfiguration.qml +++ b/interface/resources/qml/hifi/tablet/OpenVrConfiguration.qml @@ -36,7 +36,7 @@ Rectangle { readonly property bool hmdHead: headBox.checked readonly property bool headPuck: headPuckBox.checked readonly property bool handController: handBox.checked - + readonly property bool handPuck: handPuckBox.checked readonly property bool hmdDesktop: hmdInDesktop.checked @@ -107,7 +107,7 @@ Rectangle { RalewayBold { size: 12 - text: "Vive HMD" + text: stack.selectedPlugin + " HMD" color: hifi.colors.lightGrayText } @@ -145,7 +145,7 @@ Rectangle { anchors.topMargin: 5 anchors.left: openVrConfiguration.left anchors.leftMargin: leftMargin + 10 - + onClicked: { if (checked) { headBox.checked = false; @@ -778,12 +778,12 @@ Rectangle { RalewayBold { id: advanceSettings - + text: "Advanced Settings" size: 12 - + color: hifi.colors.white - + anchors.top: advanceSeperator.bottom anchors.topMargin: 10 anchors.left: parent.left @@ -801,7 +801,7 @@ Rectangle { anchors.topMargin: 5 anchors.left: openVrConfiguration.left anchors.leftMargin: leftMargin + 10 - + onClicked: { if (!checked & hmdInDesktop.checked) { headBox.checked = true; @@ -815,9 +815,9 @@ Rectangle { RalewayBold { id: viveDesktopText size: 10 - text: "Use Vive devices in desktop mode" + text: "Use " + stack.selectedPlugin + " devices in desktop mode" color: hifi.colors.white - + anchors { left: viveInDesktop.right leftMargin: 5 @@ -825,7 +825,7 @@ Rectangle { } } - + NumberAnimation { id: numberAnimation target: openVrConfiguration diff --git a/libraries/plugins/src/plugins/InputConfiguration.cpp b/libraries/plugins/src/plugins/InputConfiguration.cpp index 976a9c9463..daa8c6d08c 100644 --- a/libraries/plugins/src/plugins/InputConfiguration.cpp +++ b/libraries/plugins/src/plugins/InputConfiguration.cpp @@ -32,7 +32,8 @@ QStringList InputConfiguration::inputPlugins() { for (auto plugin : PluginManager::getInstance()->getInputPlugins()) { QString pluginName = plugin->getName(); if (pluginName == QString("OpenVR")) { - inputPlugins << QString("Vive"); + QString headsetName = plugin->getDeviceName(); + inputPlugins << headsetName; } else { inputPlugins << pluginName; } From aa985fa6826d6518c4390484d702d760fa310445 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Mon, 16 Apr 2018 15:30:28 -0700 Subject: [PATCH 4/4] add-more-hmd-data --- plugins/openvr/src/OpenVrDisplayPlugin.cpp | 1 - plugins/openvr/src/OpenVrDisplayPlugin.h | 1 - 2 files changed, 2 deletions(-) diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp index 615b176527..714cb91b3f 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp +++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp @@ -36,7 +36,6 @@ Q_DECLARE_LOGGING_CATEGORY(displayplugins) -const char* OpenVrDisplayPlugin::NAME { "OpenVR (Vive)" }; const char* StandingHMDSensorMode { "Standing HMD Sensor Mode" }; // this probably shouldn't be hardcoded here const char* OpenVrThreadedSubmit { "OpenVR Threaded Submit" }; // this probably shouldn't be hardcoded here diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.h b/plugins/openvr/src/OpenVrDisplayPlugin.h index e6fc6367d5..15a434341d 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.h +++ b/plugins/openvr/src/OpenVrDisplayPlugin.h @@ -78,7 +78,6 @@ private: vr::IVRSystem* _system { nullptr }; std::atomic _hmdActivityLevel { vr::k_EDeviceActivityLevel_Unknown }; std::atomic _keyboardSupressionCount{ 0 }; - static const char* NAME; vr::HmdMatrix34_t _lastGoodHMDPose; mat4 _sensorResetMat;