230 lines
7.3 KiB
C++
230 lines
7.3 KiB
C++
#include "MoveCenterTabController.h"
|
|
#include <QQuickWindow>
|
|
#include "../overlaycontroller.h"
|
|
|
|
// application namespace
|
|
namespace advsettings {
|
|
|
|
void MoveCenterTabController::initStage1() {
|
|
setTrackingUniverse(vr::VRCompositor()->GetTrackingSpace());
|
|
auto settings = OverlayController::appSettings();
|
|
settings->beginGroup("playspaceSettings");
|
|
auto value = settings->value("adjustChaperone", m_adjustChaperone);
|
|
settings->endGroup();
|
|
if (value.isValid() && !value.isNull()) {
|
|
m_adjustChaperone = value.toBool();
|
|
}
|
|
|
|
reloadPttConfig();
|
|
}
|
|
|
|
void MoveCenterTabController::initStage2(OverlayController * parent, QQuickWindow * widget) {
|
|
this->parent = parent;
|
|
this->widget = widget;
|
|
}
|
|
|
|
|
|
int MoveCenterTabController::trackingUniverse() const {
|
|
return (int)m_trackingUniverse;
|
|
}
|
|
|
|
void MoveCenterTabController::setTrackingUniverse(int value, bool notify) {
|
|
if (m_trackingUniverse != value) {
|
|
reset();
|
|
m_trackingUniverse = value;
|
|
if (notify) {
|
|
emit trackingUniverseChanged(m_trackingUniverse);
|
|
}
|
|
}
|
|
}
|
|
|
|
float MoveCenterTabController::offsetX() const {
|
|
return m_offsetX;
|
|
}
|
|
|
|
void MoveCenterTabController::setOffsetX(float value, bool notify) {
|
|
if (m_offsetX != value) {
|
|
modOffsetX(value - m_offsetX, notify);
|
|
}
|
|
}
|
|
|
|
float MoveCenterTabController::offsetY() const {
|
|
return m_offsetY;
|
|
}
|
|
|
|
void MoveCenterTabController::setOffsetY(float value, bool notify) {
|
|
if (m_offsetY != value) {
|
|
modOffsetY(value - m_offsetY, notify);
|
|
}
|
|
}
|
|
|
|
float MoveCenterTabController::offsetZ() const {
|
|
return m_offsetZ;
|
|
}
|
|
|
|
void MoveCenterTabController::setOffsetZ(float value, bool notify) {
|
|
if (m_offsetZ != value) {
|
|
modOffsetZ(value - m_offsetZ, notify);
|
|
}
|
|
}
|
|
|
|
int MoveCenterTabController::rotation() const {
|
|
return m_rotation;
|
|
}
|
|
|
|
void MoveCenterTabController::setRotation(int value, bool notify) {
|
|
if (m_rotation != value) {
|
|
float angle = (value - m_rotation) * 2 * M_PI / 360.0;
|
|
parent->RotateUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, angle, m_adjustChaperone);
|
|
m_rotation = value;
|
|
if (notify) {
|
|
emit rotationChanged(m_rotation);
|
|
}
|
|
}
|
|
}
|
|
|
|
bool MoveCenterTabController::adjustChaperone() const {
|
|
return m_adjustChaperone;
|
|
}
|
|
|
|
void MoveCenterTabController::setAdjustChaperone(bool value, bool notify) {
|
|
if (m_adjustChaperone != value) {
|
|
m_adjustChaperone = value;
|
|
if (m_trackingUniverse == vr::TrackingUniverseStanding) {
|
|
vr::VRChaperoneSetup()->RevertWorkingCopy();
|
|
float offsetdir;
|
|
if (m_adjustChaperone) {
|
|
offsetdir = -1.0;
|
|
} else {
|
|
offsetdir = 1.0;
|
|
}
|
|
|
|
if (m_offsetX != 0.0f) {
|
|
if (m_adjustChaperone || m_rotation == 0) {
|
|
parent->AddOffsetToCollisionBounds(0, offsetdir * m_offsetX, false);
|
|
} else {
|
|
auto angle = m_rotation * 2 * M_PI / 360.0;
|
|
parent->AddOffsetToCollisionBounds(0, offsetdir * m_offsetX * std::cos(angle), false);
|
|
parent->AddOffsetToCollisionBounds(2, offsetdir * m_offsetX * std::sin(angle), false);
|
|
}
|
|
}
|
|
if (m_offsetY != 0.0f) {
|
|
parent->AddOffsetToCollisionBounds(1, offsetdir * m_offsetY, false);
|
|
}
|
|
if (m_offsetZ != 0.0f) {
|
|
if (m_adjustChaperone || m_rotation == 0) {
|
|
parent->AddOffsetToCollisionBounds(2, offsetdir * m_offsetZ, false);
|
|
} else {
|
|
auto angle = m_rotation * 2 * M_PI / 360.0;
|
|
parent->AddOffsetToCollisionBounds(2, offsetdir * m_offsetZ * std::cos(angle), false);
|
|
parent->AddOffsetToCollisionBounds(0, -offsetdir * m_offsetZ * std::sin(angle), false);
|
|
}
|
|
}
|
|
if (m_rotation != 0) {
|
|
float angle = m_rotation * 2 * M_PI / 360.0;
|
|
parent->RotateCollisionBounds(offsetdir * angle, false);
|
|
}
|
|
vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live);
|
|
}
|
|
auto settings = OverlayController::appSettings();
|
|
settings->beginGroup("playspaceSettings");
|
|
settings->setValue("adjustChaperone", m_adjustChaperone);
|
|
settings->endGroup();
|
|
settings->sync();
|
|
if (notify) {
|
|
emit adjustChaperoneChanged(m_adjustChaperone);
|
|
}
|
|
}
|
|
}
|
|
|
|
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);
|
|
} else {
|
|
auto angle = m_rotation * 2 * M_PI / 360.0;
|
|
vr::VRChaperoneSetup()->RevertWorkingCopy();
|
|
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, value * std::cos(angle), m_adjustChaperone, false);
|
|
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 2, value * std::sin(angle), m_adjustChaperone, false);
|
|
vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live);
|
|
}
|
|
m_offsetX += value;
|
|
if (notify) {
|
|
emit offsetXChanged(m_offsetX);
|
|
}
|
|
}
|
|
|
|
void MoveCenterTabController::modOffsetY(float value, bool notify) {
|
|
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, value, m_adjustChaperone);
|
|
m_offsetY += value;
|
|
if (notify) {
|
|
emit offsetYChanged(m_offsetY);
|
|
}
|
|
}
|
|
|
|
void MoveCenterTabController::modOffsetZ(float value, bool notify) {
|
|
if (m_rotation == 0) {
|
|
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 2, value, m_adjustChaperone);
|
|
} else {
|
|
auto angle = m_rotation * 2 * M_PI / 360.0;
|
|
vr::VRChaperoneSetup()->RevertWorkingCopy();
|
|
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 2, value * std::cos(angle), m_adjustChaperone, false);
|
|
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, -value * std::sin(angle), m_adjustChaperone, false);
|
|
vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live);
|
|
}
|
|
m_offsetZ += value;
|
|
if (notify) {
|
|
emit offsetZChanged(m_offsetZ);
|
|
}
|
|
}
|
|
|
|
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);
|
|
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, -m_offsetY, m_adjustChaperone, false);
|
|
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 2, -m_offsetZ, m_adjustChaperone, false);
|
|
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);
|
|
emit offsetYChanged(m_offsetY);
|
|
emit offsetZChanged(m_offsetZ);
|
|
emit rotationChanged(m_rotation);
|
|
}
|
|
|
|
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
|