diff --git a/interface/resources/qml/hifi/tablet/ControllerSettings.qml b/interface/resources/qml/hifi/tablet/ControllerSettings.qml index 3e1a7bf139..ffd3d81b84 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 572d3a55f0..8fb49dffc0 100644 --- a/interface/resources/qml/hifi/tablet/OpenVrConfiguration.qml +++ b/interface/resources/qml/hifi/tablet/OpenVrConfiguration.qml @@ -34,7 +34,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 @@ -105,7 +105,7 @@ Rectangle { RalewayBold { size: 12 - text: "Vive HMD" + text: stack.selectedPlugin + " HMD" color: hifi.colors.lightGrayText } @@ -143,7 +143,7 @@ Rectangle { anchors.topMargin: 5 anchors.left: openVrConfiguration.left anchors.leftMargin: leftMargin + 10 - + onClicked: { if (checked) { headBox.checked = false; @@ -772,12 +772,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 @@ -795,7 +795,7 @@ Rectangle { anchors.topMargin: 5 anchors.left: openVrConfiguration.left anchors.leftMargin: leftMargin + 10 - + onClicked: { if (!checked & hmdInDesktop.checked) { headBox.checked = true; @@ -809,9 +809,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 @@ -819,7 +819,7 @@ Rectangle { } } - + NumberAnimation { id: numberAnimation target: openVrConfiguration diff --git a/libraries/plugins/src/plugins/InputConfiguration.cpp b/libraries/plugins/src/plugins/InputConfiguration.cpp index 9234ac6585..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; } @@ -54,7 +55,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 +76,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/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp index 2949e72c74..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 @@ -410,6 +409,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 +452,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..15a434341d 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; @@ -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; 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 71ded5f32d..96888a6e8b 100644 --- a/plugins/openvr/src/ViveControllerManager.cpp +++ b/plugins/openvr/src/ViveControllerManager.cpp @@ -11,6 +11,7 @@ #include "ViveControllerManager.h" #include +#include #include #include @@ -339,6 +340,12 @@ void ViveControllerManager::InputDevice::update(float deltaTime, const controlle _validTrackedObjects.clear(); _trackedControllers = 0; + if (_headsetName == "") { + _headsetName = getOpenVrDeviceName(); + 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..f3631ece9d 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; @@ -161,6 +163,7 @@ private: HandConfig _handConfig { HandConfig::HandController }; FilteredStick _filteredLeftStick; FilteredStick _filteredRightStick; + std::string _headsetName {""}; std::vector _validTrackedObjects; std::map _pucksPostOffset;