Move the push-to-toggle y axis adjustment from the playspace page to a new Accessibility Tools tab, packaged as a new height adjustment tool. Height offset is saved and can be set via slider.

This commit is contained in:
Mel Klimushyn
2017-02-07 00:13:41 -08:00
parent 927be598d7
commit 1aa1580a90
12 changed files with 363 additions and 128 deletions
+9 -1
View File
@@ -114,6 +114,7 @@ void OverlayController::Init(QQmlEngine* qmlEngine) {
settingsTabController.initStage1();
reviveTabController.initStage1(settingsTabController.forceRevivePage());
utilitiesTabController.initStage1();
accessibilityTabController.initStage1();
// Set qml context
qmlEngine->rootContext()->setContextProperty("applicationVersion", getVersionString());
@@ -170,6 +171,11 @@ void OverlayController::Init(QQmlEngine* qmlEngine) {
QQmlEngine::setObjectOwnership(obj, QQmlEngine::CppOwnership);
return obj;
});
qmlRegisterSingletonType<SteamVRTabController>("matzman666.advsettings", 1, 0, "AccessibilityTabController", [](QQmlEngine*, QJSEngine*) {
QObject* obj = &getInstance()->accessibilityTabController;
QQmlEngine::setObjectOwnership(obj, QQmlEngine::CppOwnership);
return obj;
});
}
void OverlayController::Shutdown() {
@@ -255,6 +261,7 @@ void OverlayController::SetWidget(QQuickItem* quickItem, const std::string& name
settingsTabController.initStage2(this, m_pWindow.get());
reviveTabController.initStage2(this, m_pWindow.get());
utilitiesTabController.initStage2(this, m_pWindow.get());
accessibilityTabController.initStage2(this, m_pWindow.get());
}
@@ -298,7 +305,7 @@ void OverlayController::OnTimeoutPumpEvents() {
break;
}
}*/
vr::TrackedDevicePose_t devicePoses[vr::k_unMaxTrackedDeviceCount];
vr::VRSystem()->GetDeviceToAbsoluteTrackingPose(vr::TrackingUniverseStanding, 0.0f, devicePoses, vr::k_unMaxTrackedDeviceCount);
fixFloorTabController.eventLoopTick(devicePoses);
@@ -310,6 +317,7 @@ void OverlayController::OnTimeoutPumpEvents() {
reviveTabController.eventLoopTick();
audioTabController.eventLoopTick();
utilitiesTabController.eventLoopTick();
accessibilityTabController.eventLoopTick(vr::VRCompositor()->GetTrackingSpace());
vr::VREvent_t vrEvent;
while (vr::VROverlay()->PollNextOverlayEvent(m_ulOverlayHandle, &vrEvent, sizeof(vrEvent))) {
+2
View File
@@ -31,6 +31,7 @@
#include "tabcontrollers/SettingsTabController.h"
#include "tabcontrollers/ReviveTabController.h"
#include "tabcontrollers/UtilitiesTabController.h"
#include "tabcontrollers/AccessibilityTabController.h"
@@ -78,6 +79,7 @@ public: // I know it's an ugly hack to make them public to enable external acces
SettingsTabController settingsTabController;
ReviveTabController reviveTabController;
UtilitiesTabController utilitiesTabController;
AccessibilityTabController accessibilityTabController;
private:
OverlayController(bool desktopMode, bool noSound) : QObject(), desktopMode(desktopMode), noSound(noSound) {}
@@ -0,0 +1,97 @@
#include "AccessibilityTabController.h"
#include <QQuickWindow>
#include "../overlaycontroller.h"
// application namespace
namespace advsettings {
void AccessibilityTabController::initStage1() {
setTrackingUniverse(vr::VRCompositor()->GetTrackingSpace());
auto settings = OverlayController::appSettings();
settings->beginGroup(getSettingsName());
auto value = settings->value("heightOffset", m_heightOffset);
settings->endGroup();
if (value.isValid() && !value.isNull()) {
m_heightOffset = value.toFloat();
emit heightOffsetChanged(m_heightOffset);
}
reloadPttConfig();
}
void AccessibilityTabController::initStage2(OverlayController * parent, QQuickWindow * widget) {
this->parent = parent;
this->widget = widget;
}
void AccessibilityTabController::setTrackingUniverse(int value) {
if (m_trackingUniverse != value) {
reset();
m_trackingUniverse = value;
}
}
float AccessibilityTabController::heightOffset() const {
return m_heightOffset;
}
void AccessibilityTabController::setHeightOffset(float value, bool notify) {
if (m_heightOffset != value) {
modHeightOffset(value - m_heightOffset, notify);
}
}
void AccessibilityTabController::modHeightOffset(float value, bool notify) {
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, -value, false);
m_heightOffset += value;
auto settings = OverlayController::appSettings();
settings->beginGroup(getSettingsName());
settings->setValue("heightOffset", m_heightOffset);
settings->endGroup();
settings->sync();
if (notify) {
emit heightOffsetChanged(m_heightOffset);
}
}
void AccessibilityTabController::onPttStart() {
m_toggleHeightOffset = m_heightOffset;
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, m_toggleHeightOffset, false);
}
void AccessibilityTabController::onPttStop() {
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, -m_toggleHeightOffset, false);
}
void AccessibilityTabController::onPttDisabled() {
if (pttActive()) {
stopPtt();
}
m_toggleHeightOffset = 0;
}
void AccessibilityTabController::reset() {
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
vr::VRChaperoneSetup()->RevertWorkingCopy();
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, m_heightOffset, false, false);
vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live);
m_heightOffset = 0.0f;
emit heightOffsetChanged(m_heightOffset);
}
void AccessibilityTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe) {
if (!eventLoopMutex.try_lock()) {
return;
}
if (settingsUpdateCounter >= 50) {
setTrackingUniverse((int)universe);
settingsUpdateCounter = 0;
} else {
settingsUpdateCounter++;
}
checkPttStatus();
eventLoopMutex.unlock();
}
} // namespace advconfig
@@ -0,0 +1,50 @@
#pragma once
#include "PttController.h"
class QQuickWindow;
// application namespace
namespace advsettings {
// forward declaration
class OverlayController;
class AccessibilityTabController : public PttController {
Q_OBJECT
Q_PROPERTY(float heightOffset READ heightOffset WRITE setHeightOffset NOTIFY heightOffsetChanged)
private:
OverlayController* parent;
QQuickWindow* widget;
int m_trackingUniverse = (int)vr::TrackingUniverseStanding;
float m_heightOffset = 0.0f;
float m_toggleHeightOffset = 0.0f;
unsigned settingsUpdateCounter = 0;
QString getSettingsName() override { return "accessibilitySettings"; }
void onPttStart() override;
void onPttStop() override;
void onPttDisabled() override;
public:
void initStage1();
void initStage2(OverlayController* parent, QQuickWindow* widget);
void eventLoopTick(vr::ETrackingUniverseOrigin universe);
float heightOffset() const;
public slots:
void setTrackingUniverse(int value);
void setHeightOffset(float value, bool notify = true);
void modHeightOffset(float value, bool notify = true);
void reset();
signals:
void heightOffsetChanged(float value);
};
} // namespace advsettings
@@ -14,8 +14,6 @@ void MoveCenterTabController::initStage1() {
if (value.isValid() && !value.isNull()) {
m_adjustChaperone = value.toBool();
}
reloadPttConfig();
}
void MoveCenterTabController::initStage2(OverlayController * parent, QQuickWindow * widget) {
@@ -137,22 +135,6 @@ void MoveCenterTabController::setAdjustChaperone(bool value, bool notify) {
}
}
void MoveCenterTabController::onPttStart() {
m_toggleOffsetY = m_offsetY;
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, -m_toggleOffsetY, m_adjustChaperone);
}
void MoveCenterTabController::onPttStop() {
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, m_toggleOffsetY, m_adjustChaperone);
}
void MoveCenterTabController::onPttDisabled() {
if (pttActive()) {
stopPtt();
}
m_toggleOffsetY = 0;
}
void MoveCenterTabController::modOffsetX(float value, bool notify) {
if (m_rotation == 0) {
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, value, m_adjustChaperone);
@@ -194,7 +176,6 @@ void MoveCenterTabController::modOffsetZ(float value, bool notify) {
}
void MoveCenterTabController::reset() {
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
vr::VRChaperoneSetup()->RevertWorkingCopy();
parent->RotateUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, -m_rotation * 2 * M_PI / 360.0, m_adjustChaperone, false);
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, -m_offsetX, m_adjustChaperone, false);
@@ -203,7 +184,6 @@ void MoveCenterTabController::reset() {
vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live);
m_offsetX = 0.0f;
m_offsetY = 0.0f;
m_toggleOffsetY = 0.0f;
m_offsetZ = 0.0f;
m_rotation = 0;
emit offsetXChanged(m_offsetX);
@@ -213,17 +193,12 @@ void MoveCenterTabController::reset() {
}
void MoveCenterTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe) {
if (!eventLoopMutex.try_lock()) {
return;
}
if (settingsUpdateCounter >= 50) {
setTrackingUniverse((int)universe);
settingsUpdateCounter = 0;
} else {
settingsUpdateCounter++;
}
checkPttStatus();
eventLoopMutex.unlock();
}
} // namespace advconfig
+3 -8
View File
@@ -1,7 +1,8 @@
#pragma once
#include "PttController.h"
#include <QObject>
#include <openvr.h>
class QQuickWindow;
// application namespace
@@ -11,7 +12,7 @@ namespace advsettings {
class OverlayController;
class MoveCenterTabController : public PttController {
class MoveCenterTabController : public QObject {
Q_OBJECT
Q_PROPERTY(int trackingUniverse READ trackingUniverse WRITE setTrackingUniverse NOTIFY trackingUniverseChanged)
Q_PROPERTY(float offsetX READ offsetX WRITE setOffsetX NOTIFY offsetXChanged)
@@ -27,18 +28,12 @@ private:
int m_trackingUniverse = (int)vr::TrackingUniverseStanding;
float m_offsetX = 0.0f;
float m_offsetY = 0.0f;
float m_toggleOffsetY = 0.0f;
float m_offsetZ = 0.0f;
int m_rotation = 0;
bool m_adjustChaperone = true;
unsigned settingsUpdateCounter = 0;
QString getSettingsName() override { return "playspaceSettings"; }
void onPttStart() override;
void onPttStop() override;
void onPttDisabled() override;
public:
void initStage1();
void initStage2(OverlayController* parent, QQuickWindow* widget);