From 7bd02049a2f27d5271023fda5427df58f92a9f02 Mon Sep 17 00:00:00 2001 From: ykeara Date: Tue, 8 Jan 2019 20:37:22 -0600 Subject: [PATCH] added Motion Smoothing toggle --- src/res/qml/SteamVRPage.qml | 14 ++++ src/tabcontrollers/SteamVRTabController.cpp | 75 ++++++++++++++++++++- src/tabcontrollers/SteamVRTabController.h | 13 +++- 3 files changed, 98 insertions(+), 4 deletions(-) diff --git a/src/res/qml/SteamVRPage.qml b/src/res/qml/SteamVRPage.qml index 1e619cc..6ef9b30 100644 --- a/src/res/qml/SteamVRPage.qml +++ b/src/res/qml/SteamVRPage.qml @@ -315,6 +315,14 @@ MyStackViewPage { } } + MyToggleButton { + id: steamvrMotionSmoothingToggle + text: "Motion Smoothing" + onCheckedChanged: { + SteamVRTabController.setMotionSmoothing(this.checked, false) + } + } + //No longer Valid /* MyToggleButton { @@ -389,6 +397,7 @@ MyStackViewPage { //steamvrAllowInterleavedReprojectionToggle.checked = SteamVRTabController.allowInterleavedReprojection //steamvrAllowAsyncReprojectionToggle.checked = SteamVRTabController.allowAsyncReprojection //steamvrForceReprojectionToggle.checked = SteamVRTabController.forceReprojection + steamvrMotionSmoothingToggle.checked = SteamVRTabController.allowMotionSmoothing reloadSteamVRProfiles() } @@ -422,6 +431,11 @@ MyStackViewPage { steamvrForceReprojectionToggle.checked = SteamVRTabController.forceReprojection } */ + + onMotionSmoothingChanged: { + steamvrMotionSmoothingToggle.checked = SteamVRTabController.allowMotionSmoothing + } + onSteamVRProfilesUpdated: { reloadSteamVRProfiles() } diff --git a/src/tabcontrollers/SteamVRTabController.cpp b/src/tabcontrollers/SteamVRTabController.cpp index 86aa8ec..7ae92d4 100644 --- a/src/tabcontrollers/SteamVRTabController.cpp +++ b/src/tabcontrollers/SteamVRTabController.cpp @@ -36,6 +36,7 @@ static const char* vrsettings_compositor_category = "compositor"; void SteamVRTabController::initStage1() { + initMotionSmoothing(); eventLoopTick(); reloadSteamVRProfiles(); } @@ -339,6 +340,77 @@ float SteamVRTabController::compositorSuperSampling() const { return m_compositorSuperSampling; } + + + +bool SteamVRTabController::motionSmoothing() const { + return m_motionSmoothing; +} + +/* +Name: setMotionSmoothing + +input: bool value, bool notify +output: none + +@value - value to be passed to m_motionSMoothing +@notify - whether QML is informed of change (default true) + +Description: +sets value of m_motionSmoothing AND applies changes in Steam/OpenVr +*/ + +void SteamVRTabController::setMotionSmoothing(bool value, + bool notify) +{ + if (m_motionSmoothing!= value) + { + m_motionSmoothing = value; + vr::VRSettings()->SetBool(vr::k_pch_SteamVR_Section, + vr::k_pch_SteamVR_MotionSmoothing_Bool, + m_motionSmoothing); + vr::VRSettings()->Sync(); + if (notify) + { + emit motionSmoothingChanged( + m_motionSmoothing); + } + } +} + +/* +Name: initMotionSmoothing + +input: none +output: none + +description: Gets the Value of Motion Smoothing from Steam/OpenVR. +Sets the member variable of motion smoothing for UI +Adds error to log if unable to find variable. + +OnError: +default value of true for motion smoothing is initialized, if user has disabled motion smoothing on their end, +they will have to toggle the variable twice to get it to re-sync. +*/ +void SteamVRTabController::initMotionSmoothing() { + bool temporary = false; + vr::EVRSettingsError vrSettingsError; + temporary = vr::VRSettings()->GetBool(vr::k_pch_SteamVR_Section, + vr::k_pch_SteamVR_MotionSmoothing_Bool, + &vrSettingsError); + if (vrSettingsError != vr::VRSettingsError_None) + { + LOG(WARNING) << "Could not get MotionSmoothing State \"" + << vr::k_pch_SteamVR_MotionSmoothing_Bool << "\" setting: " + << vr::VRSettings()->GetSettingsErrorNameFromEnum( + vrSettingsError); + } + vr::VRSettings()->Sync(); + setMotionSmoothing(temporary, true); + + +} + /* bool SteamVRTabController::allowInterleavedReprojection() const { @@ -527,8 +599,7 @@ void SteamVRTabController::restartSteamVR() void SteamVRTabController::addSteamVRProfile( QString name, bool includeSupersampling, - bool includeSupersampleFiltering, - bool includeReprojectionSettings ) + bool includeSupersampleFiltering) { SteamVRProfile* profile = nullptr; for ( auto& p : steamvrProfiles ) diff --git a/src/tabcontrollers/SteamVRTabController.h b/src/tabcontrollers/SteamVRTabController.h index aa4baca..17f0c01 100644 --- a/src/tabcontrollers/SteamVRTabController.h +++ b/src/tabcontrollers/SteamVRTabController.h @@ -45,6 +45,10 @@ class SteamVRTabController : public QObject Q_PROPERTY( bool forceReprojection READ forceReprojection WRITE setForceReprojection NOTIFY forceReprojectionChanged ) */ + + Q_PROPERTY(bool motionSmoothing READ motionSmoothing + WRITE setMotionSmoothing NOTIFY + motionSmoothingChanged) Q_PROPERTY( bool allowSupersampleFiltering READ allowSupersampleFiltering WRITE setAllowSupersampleFiltering NOTIFY allowSupersampleFilteringChanged ) @@ -58,8 +62,11 @@ private: //bool m_allowInterleavedReprojection = true; //bool m_allowAsyncReprojection = true; //bool m_forceReprojection = false; + bool m_motionSmoothing = true; bool m_allowSupersampleFiltering = true; + void initMotionSmoothing(); + std::vector steamvrProfiles; unsigned settingsUpdateCounter = 0; @@ -75,6 +82,7 @@ public: //bool allowInterleavedReprojection() const; //bool allowAsyncReprojection() const; //bool forceReprojection() const; + bool motionSmoothing() const; bool allowSupersampleFiltering() const; void reloadSteamVRProfiles(); @@ -89,12 +97,12 @@ public slots: //void setAllowInterleavedReprojection( bool value, bool notify = true ); //void setAllowAsyncReprojection( bool value, bool notify = true ); //void setForceReprojection( bool value, bool notify = true ); + void setMotionSmoothing(bool value, bool notify = true); void setAllowSupersampleFiltering( bool value, bool notify = true ); void addSteamVRProfile( QString name, bool includeSupersampling, - bool includeSupersampleFiltering, - bool includeReprojectionSettings ); + bool includeSupersampleFiltering); void applySteamVRProfile( unsigned index ); void deleteSteamVRProfile( unsigned index ); @@ -107,6 +115,7 @@ signals: //void allowInterleavedReprojectionChanged( bool value ); //void allowAsyncReprojectionChanged( bool value ); //void forceReprojectionChanged( bool value ); + void motionSmoothingChanged(bool value); void allowSupersampleFilteringChanged( bool value ); void steamVRProfilesUpdated();