* add delay if interface not found

* adjust initialization behavior

* pushed for debugging reasons for concerned parties

* comment out simple recenter

* remove old style motion, some minor optimizations

* optimize default case check

* optimized default condition

* change manifest install behavior to trigger on desktop mode as well

* add desktop mode binding launch

* add tracker overlay option to utils

* commit to check status

* attempt to fix native LH issues with chaperone when exiting

* add desktop mode toggle and some cleanup

* remove adjust chaperone

* remove clang format from ci, increment version, cleanup

* update circle ci

* fix conversion warning

* add F13-19 to keyboard parser

* add additional logging around failure to initialize

* add unsaved changes

* update version 5.8.1

* fix some collisions in enum declaration

* add controller powers on steamvr, and no HMD to steamvr tab, increment version

* slightly alter drag movement, fix qml issue

* code cleanup

* fix logspam/attempt to delete non existant overlays

* increment version 5.8.3
This commit is contained in:
ykeara
2024-02-21 12:38:00 -06:00
committed by GitHub
parent 54d22a429e
commit 48a7cf4b7f
29 changed files with 541 additions and 505 deletions
+1 -1
View File
@@ -34,7 +34,7 @@ init:
build_script: build_script:
- python ./build_scripts/append_to_version_file.py %APPVEYOR_REPO_COMMIT:~0,8% - python ./build_scripts/append_to_version_file.py %APPVEYOR_REPO_COMMIT:~0,8%
- python ./build_scripts/run-clang-format.py ./src -r --clang-format-executable "C:\Program Files\LLVM\bin\clang-format.exe" --color always # - python ./build_scripts/run-clang-format.py ./src -r --clang-format-executable "C:\Program Files\LLVM\bin\clang-format.exe" --color always
- call "build_windows.cmd" - call "build_windows.cmd"
artifacts: artifacts:
+12 -12
View File
@@ -29,18 +29,18 @@ jobs:
sudo add-apt-repository 'deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-8 main' sudo add-apt-repository 'deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-8 main'
sudo add-apt-repository 'deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-7 main' sudo add-apt-repository 'deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-7 main'
sudo apt-get update -qq sudo apt-get update -qq
- run: #- run:
name: Install LLVM-8 binaries # name: Install LLVM-8 binaries
# clang is required due to a check by Qmake. # # clang is required due to a check by Qmake.
# clang-tidy-8 has new errors compared to clang-tidy-7, so we haven't upgraded. # # clang-tidy-8 has new errors compared to clang-tidy-7, so we haven't upgraded.
command: | # command: |
sudo apt-get install clang-format-8 -y # sudo apt-get install clang-format-8 -y
sudo apt-get install clang-tidy-7 -y # sudo apt-get install clang-tidy-7 -y
sudo apt-get install clang-8 -y # sudo apt-get install clang-8 -y
sudo apt-get install clang -y # sudo apt-get install clang -y
- run: #- run:
name: Run clang-format # name: Run clang-format
command: python ./build_scripts/run-clang-format.py ./src -r --color always --clang-format-executable clang-format-8 # command: python ./build_scripts/run-clang-format.py ./src -r --color always --clang-format-executable clang-format-8
- run: - run:
name: Install g++ name: Install g++
command: | command: |
+1 -1
View File
@@ -30,7 +30,7 @@ before_install:
- sudo apt update -qq - sudo apt update -qq
- sudo apt install clang-format-8 - sudo apt install clang-format-8
- clang-format-8 --version - clang-format-8 --version
- python ./build_scripts/run-clang-format.py ./src -r --color always --clang-format-executable clang-format-8 # - python ./build_scripts/run-clang-format.py ./src -r --color always --clang-format-executable clang-format-8
- sed -i 's/QMAKE_CXXFLAGS += -flto//g' ./build_scripts/qt/compilers/clang-gcc-common-switches.pri # CI version of clang can't handle LTO - sed -i 's/QMAKE_CXXFLAGS += -flto//g' ./build_scripts/qt/compilers/clang-gcc-common-switches.pri # CI version of clang can't handle LTO
- sed -i 's/QMAKE_LFLAGS += -flto -fuse-ld=gold//g' ./build_scripts/qt/compilers/clang-gcc-common-switches.pri # CI version of clang can't handle LTO - sed -i 's/QMAKE_LFLAGS += -flto -fuse-ld=gold//g' ./build_scripts/qt/compilers/clang-gcc-common-switches.pri # CI version of clang can't handle LTO
+1 -1
View File
@@ -1 +1 @@
5.7.4-release 5.8.3-release
+1
View File
@@ -45,6 +45,7 @@ DISTFILES += \
src/res/qml/utilities_page/media_keys/* \ src/res/qml/utilities_page/media_keys/* \
src/res/qml/utilities_page/keyboard_utils/* \ src/res/qml/utilities_page/keyboard_utils/* \
src/res/qml/utilities_page/alarm_clock/* \ src/res/qml/utilities_page/alarm_clock/* \
src/res/qml/utilities_page/misc/* \
src/res/qml/audio_page/dialog_boxes/* \ src/res/qml/audio_page/dialog_boxes/* \
src/res/qml/audio_page/device_selector/* \ src/res/qml/audio_page/device_selector/* \
src/res/qml/audio_page/proximity/* \ src/res/qml/audio_page/proximity/* \
+28 -2
View File
@@ -65,8 +65,20 @@ std::optional<Token> getFunctionNumberExtended( const char& character ) noexcept
return Token::KEY_F11; return Token::KEY_F11;
case '2': case '2':
return Token::KEY_F12; return Token::KEY_F12;
// Theoretically we could extende out to f19, but as F12 is the only case '3':
// function key on Standard Keyboard. return Token::KEY_F13;
case '4':
return Token::KEY_F14;
case '5':
return Token::KEY_F15;
case '6':
return Token::KEY_F16;
case '7':
return Token::KEY_F17;
case '8':
return Token::KEY_F18;
case '9':
return Token::KEY_F19;
default: default:
LOG( INFO ) << "Unknown function key number: " << character; LOG( INFO ) << "Unknown function key number: " << character;
return std::nullopt; return std::nullopt;
@@ -477,6 +489,20 @@ bool isLiteral( const Token token ) noexcept
return true; return true;
case Token::KEY_F12: case Token::KEY_F12:
return true; return true;
case Token::KEY_F13:
return true;
case Token::KEY_F14:
return true;
case Token::KEY_F15:
return true;
case Token::KEY_F16:
return true;
case Token::KEY_F17:
return true;
case Token::KEY_F18:
return true;
case Token::KEY_F19:
return true;
case Token::KEY_BACKSPACE: case Token::KEY_BACKSPACE:
return true; return true;
+8 -1
View File
@@ -20,8 +20,15 @@ enum class Token
KEY_F10, KEY_F10,
KEY_F11, KEY_F11,
KEY_F12, KEY_F12,
KEY_F13,
KEY_F14,
KEY_F15,
KEY_F16,
KEY_F17,
KEY_F18,
KEY_F19,
KEY_BACKSPACE, KEY_BACKSPACE = 150,
KEY_SPACE, KEY_SPACE,
KEY_TAB, KEY_TAB,
KEY_ESC, KEY_ESC,
+14
View File
@@ -105,6 +105,20 @@ unsigned int tokenToKeySym( const Token token )
return XK_F11; return XK_F11;
case Token::KEY_F12: case Token::KEY_F12:
return XK_F12; return XK_F12;
case Token::KEY_F13:
return XK_F13;
case Token::KEY_F14:
return XK_F14;
case Token::KEY_F15:
return XK_F15;
case Token::KEY_F16:
return XK_F16;
case Token::KEY_F17:
return XK_F17;
case Token::KEY_F18:
return XK_F18;
case Token::KEY_F19:
return XK_F19;
case Token::KEY_BACKSPACE: case Token::KEY_BACKSPACE:
return XK_BackSpace; return XK_BackSpace;
+14
View File
@@ -36,6 +36,20 @@ WORD convertToVirtualKeycode( const Token token )
return VK_F11; return VK_F11;
case Token::KEY_F12: case Token::KEY_F12:
return VK_F12; return VK_F12;
case Token::KEY_F13:
return VK_F13;
case Token::KEY_F14:
return VK_F14;
case Token::KEY_F15:
return VK_F15;
case Token::KEY_F16:
return VK_F16;
case Token::KEY_F17:
return VK_F17;
case Token::KEY_F18:
return VK_F18;
case Token::KEY_F19:
return VK_F19;
case Token::KEY_BACKSPACE: case Token::KEY_BACKSPACE:
return VK_BACK; return VK_BACK;
+6 -4
View File
@@ -4,8 +4,8 @@
#ifdef _WIN64 #ifdef _WIN64
# include <windows.h> # include <windows.h>
extern "C" __declspec( dllexport ) DWORD NvOptimusEnablement = 0x00000001; extern "C" __declspec( dllexport ) DWORD NvOptimusEnablement = 0x00000001;
extern "C" __declspec( dllexport ) DWORD extern "C" __declspec( dllexport ) DWORD AmdPowerXpressRequestHighPerformance
AmdPowerXpressRequestHighPerformance = 0x00000001; = 0x00000001;
#endif #endif
INITIALIZE_EASYLOGGINGPP INITIALIZE_EASYLOGGINGPP
@@ -81,7 +81,7 @@ int main( int argc, char* argv[] )
application_strings::applicationKey ); application_strings::applicationKey );
// Attempts to install the application manifest on all "regular" starts. // Attempts to install the application manifest on all "regular" starts.
if ( !commandLineArgs.desktopMode && !commandLineArgs.forceNoManifest ) if ( !commandLineArgs.forceNoManifest )
{ {
try try
{ {
@@ -103,7 +103,9 @@ int main( int argc, char* argv[] )
} }
} }
if ( commandLineArgs.desktopMode ) if ( commandLineArgs.desktopMode
|| settings::getSetting(
settings::BoolSetting::APPLICATION_desktopModeToggle ) )
{ {
auto m_pWindow = new QQuickWindow(); auto m_pWindow = new QQuickWindow();
qobject_cast<QQuickItem*>( quickObj ) qobject_cast<QQuickItem*>( quickObj )
+50 -33
View File
@@ -7,7 +7,7 @@
namespace openvr_init namespace openvr_init
{ {
void initializeProperly( const OpenVrInitializationType initType ) bool initializeProperly( const OpenVrInitializationType initType )
{ {
auto initializationType = vr::EVRApplicationType::VRApplication_Other; auto initializationType = vr::EVRApplicationType::VRApplication_Other;
if ( initType == OpenVrInitializationType::Overlay ) if ( initType == OpenVrInitializationType::Overlay )
@@ -34,7 +34,7 @@ void initializeProperly( const OpenVrInitializationType initType )
+ std::string( + std::string(
vr::VR_GetVRInitErrorAsEnglishDescription( vr::VR_GetVRInitErrorAsEnglishDescription(
initError ) ); initError ) );
return; return false;
} }
LOG( ERROR ) << "Failed to initialize OpenVR: " LOG( ERROR ) << "Failed to initialize OpenVR: "
+ std::string( + std::string(
@@ -45,75 +45,92 @@ void initializeProperly( const OpenVrInitializationType initType )
// probably pre-maturely killing ourselves from some sort of OpenVR race // probably pre-maturely killing ourselves from some sort of OpenVR race
// condition // condition
// exit( EXIT_FAILURE ); // exit( EXIT_FAILURE );
return false;
} }
else
{ LOG( INFO ) << "OpenVR initialized successfully.";
LOG( INFO ) << "OpenVR initialized successfully."; return true;
}
} }
void initializeOpenVR( const OpenVrInitializationType initType ) void initializeOpenVR( const OpenVrInitializationType initType, int count )
{ {
initializeProperly( initType ); bool success = initializeProperly( initType );
// The function call and error message was the same for all version checks. // The function call and error message was the same for all version checks.
// Specific error messages are unlikely to be necessary since both the type // Specific error messages are unlikely to be necessary since both the type
// and version are in the string and will be output. // and version are in the string and will be output.
auto reportVersionError = []( const char* const interfaceAndVersion ) { auto reportVersionError
// 5.7.1 = []( const char* const interfaceAndVersion, const int trynumber )
// Stop behavior from exiting out, again seems to be related to some {
// sort of race condition in non-native Headsets (i.e. not lighthouse) // as of 5.8.1 Based on some information from valve, if ANY interface
// fails to load we should have issues. we will re-initialize a few
// QMessageBox::critical( // times if that is the case and hope that fixes things
// nullptr,
// "OpenVR Advanced Settings Overlay",
// "OpenVR version is too outdated. Please update OpenVR." );
LOG( WARNING ) << "OpenVR version is invalid: Interface version " LOG( WARNING ) << "OpenVR version is invalid: Interface version "
<< interfaceAndVersion << " not found."; << interfaceAndVersion << " not found. attempt number: "
// throw std::runtime_error( << std::to_string( trynumber );
// std::string( "OpenVR version is too outdated: Interface
// version " )
// + std::string( interfaceAndVersion )
// + std::string( " not found." ) );
}; };
// Check whether OpenVR is too outdated // Check whether OpenVR is too outdated
// Sleep duration is an attempt to hopefully alleviate a possible race
// condition in steamvr
if ( !vr::VR_IsInterfaceVersionValid( vr::IVRSystem_Version ) ) if ( !vr::VR_IsInterfaceVersionValid( vr::IVRSystem_Version ) )
{ {
reportVersionError( vr::IVRSystem_Version ); reportVersionError( vr::IVRSystem_Version, count );
success = false;
} }
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRSettings_Version ) ) else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRSettings_Version ) )
{ {
reportVersionError( vr::IVRSettings_Version ); reportVersionError( vr::IVRSettings_Version, count );
success = false;
} }
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVROverlay_Version ) ) else if ( !vr::VR_IsInterfaceVersionValid( vr::IVROverlay_Version ) )
{ {
reportVersionError( vr::IVROverlay_Version ); reportVersionError( vr::IVROverlay_Version, count );
success = false;
} }
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRApplications_Version ) ) else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRApplications_Version ) )
{ {
reportVersionError( vr::IVRApplications_Version ); reportVersionError( vr::IVRApplications_Version, count );
success = false;
} }
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRChaperone_Version ) ) else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRChaperone_Version ) )
{ {
reportVersionError( vr::IVRChaperone_Version ); reportVersionError( vr::IVRChaperone_Version, count );
success = false;
} }
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRChaperoneSetup_Version ) ) else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRChaperoneSetup_Version ) )
{ {
reportVersionError( vr::IVRChaperoneSetup_Version ); reportVersionError( vr::IVRChaperoneSetup_Version, count );
success = false;
} }
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRCompositor_Version ) ) else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRCompositor_Version ) )
{ {
reportVersionError( vr::IVRCompositor_Version ); reportVersionError( vr::IVRCompositor_Version, count );
success = false;
} }
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRNotifications_Version ) ) else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRNotifications_Version ) )
{ {
reportVersionError( vr::IVRNotifications_Version ); reportVersionError( vr::IVRNotifications_Version, count );
success = false;
} }
else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRInput_Version ) ) else if ( !vr::VR_IsInterfaceVersionValid( vr::IVRInput_Version ) )
{ {
reportVersionError( vr::IVRInput_Version ); reportVersionError( vr::IVRInput_Version, count );
success = false;
}
if ( !success && count < 3 )
{
LOG( WARNING ) << "An error occured on initialization of "
"openvr/steamvr attempting again "
<< std::to_string( count + 1 ) << " of 3 Attempts";
std::this_thread::sleep_for( std::chrono::seconds( 5 ) );
// 5.8.1 Unknown if VR shutdown needs to be callled if vr init fails
initializeOpenVR( initType, ( count + 1 ) );
}
if ( count >= 3 )
{
LOG( ERROR ) << "initialization errors persist proceeding anyways";
} }
} }
+1 -1
View File
@@ -8,6 +8,6 @@ enum class OpenVrInitializationType
Utility, Utility,
}; };
void initializeOpenVR( const OpenVrInitializationType initType ); void initializeOpenVR( const OpenVrInitializationType initType, int count = 0 );
} // namespace openvr_init } // namespace openvr_init
+56 -44
View File
@@ -116,6 +116,13 @@ OverlayController::OverlayController( bool desktopMode,
LOG( ERROR ) << "Could not find alarm01 sound file " << alarmFileName; LOG( ERROR ) << "Could not find alarm01 sound file " << alarmFileName;
} }
// If we have desktop mode flag ignore waht toggle says otherwise we use
// toggle
if ( !m_desktopMode )
{
m_desktopMode = desktopModeToggle();
}
QSurfaceFormat format; QSurfaceFormat format;
// Qt's QOpenGLPaintDevice is not compatible with OpenGL versions >= 3.0 // Qt's QOpenGLPaintDevice is not compatible with OpenGL versions >= 3.0
// NVIDIA does not care, but unfortunately AMD does // NVIDIA does not care, but unfortunately AMD does
@@ -183,7 +190,8 @@ OverlayController::OverlayController( bool desktopMode,
1, 1,
0, 0,
"OverlayController", "OverlayController",
[]( QQmlEngine*, QJSEngine* ) { []( QQmlEngine*, QJSEngine* )
{
QObject* obj = objectAddress; QObject* obj = objectAddress;
QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership ); QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership );
return obj; return obj;
@@ -197,7 +205,8 @@ OverlayController::OverlayController( bool desktopMode,
1, 1,
0, 0,
"SteamVRTabController", "SteamVRTabController",
[]( QQmlEngine*, QJSEngine* ) { []( QQmlEngine*, QJSEngine* )
{
QObject* obj = &( objectAddress->m_steamVRTabController ); QObject* obj = &( objectAddress->m_steamVRTabController );
QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership ); QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership );
return obj; return obj;
@@ -207,7 +216,8 @@ OverlayController::OverlayController( bool desktopMode,
1, 1,
0, 0,
"ChaperoneTabController", "ChaperoneTabController",
[]( QQmlEngine*, QJSEngine* ) { []( QQmlEngine*, QJSEngine* )
{
QObject* obj = &( objectAddress->m_chaperoneTabController ); QObject* obj = &( objectAddress->m_chaperoneTabController );
QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership ); QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership );
return obj; return obj;
@@ -217,7 +227,8 @@ OverlayController::OverlayController( bool desktopMode,
1, 1,
0, 0,
"MoveCenterTabController", "MoveCenterTabController",
[]( QQmlEngine*, QJSEngine* ) { []( QQmlEngine*, QJSEngine* )
{
QObject* obj = &( objectAddress->m_moveCenterTabController ); QObject* obj = &( objectAddress->m_moveCenterTabController );
QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership ); QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership );
return obj; return obj;
@@ -227,7 +238,8 @@ OverlayController::OverlayController( bool desktopMode,
1, 1,
0, 0,
"FixFloorTabController", "FixFloorTabController",
[]( QQmlEngine*, QJSEngine* ) { []( QQmlEngine*, QJSEngine* )
{
QObject* obj = &( objectAddress->m_fixFloorTabController ); QObject* obj = &( objectAddress->m_fixFloorTabController );
QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership ); QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership );
return obj; return obj;
@@ -237,7 +249,8 @@ OverlayController::OverlayController( bool desktopMode,
1, 1,
0, 0,
"AudioTabController", "AudioTabController",
[]( QQmlEngine*, QJSEngine* ) { []( QQmlEngine*, QJSEngine* )
{
QObject* obj = &( objectAddress->m_audioTabController ); QObject* obj = &( objectAddress->m_audioTabController );
QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership ); QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership );
return obj; return obj;
@@ -247,7 +260,8 @@ OverlayController::OverlayController( bool desktopMode,
1, 1,
0, 0,
"StatisticsTabController", "StatisticsTabController",
[]( QQmlEngine*, QJSEngine* ) { []( QQmlEngine*, QJSEngine* )
{
QObject* obj = &( objectAddress->m_statisticsTabController ); QObject* obj = &( objectAddress->m_statisticsTabController );
QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership ); QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership );
return obj; return obj;
@@ -257,7 +271,8 @@ OverlayController::OverlayController( bool desktopMode,
1, 1,
0, 0,
"SettingsTabController", "SettingsTabController",
[]( QQmlEngine*, QJSEngine* ) { []( QQmlEngine*, QJSEngine* )
{
QObject* obj = &( objectAddress->m_settingsTabController ); QObject* obj = &( objectAddress->m_settingsTabController );
QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership ); QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership );
return obj; return obj;
@@ -267,7 +282,8 @@ OverlayController::OverlayController( bool desktopMode,
1, 1,
0, 0,
"UtilitiesTabController", "UtilitiesTabController",
[]( QQmlEngine*, QJSEngine* ) { []( QQmlEngine*, QJSEngine* )
{
QObject* obj = &( objectAddress->m_utilitiesTabController ); QObject* obj = &( objectAddress->m_utilitiesTabController );
QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership ); QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership );
return obj; return obj;
@@ -277,7 +293,8 @@ OverlayController::OverlayController( bool desktopMode,
1, 1,
0, 0,
"VideoTabController", "VideoTabController",
[]( QQmlEngine*, QJSEngine* ) { []( QQmlEngine*, QJSEngine* )
{
QObject* obj = &( objectAddress->m_videoTabController ); QObject* obj = &( objectAddress->m_videoTabController );
QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership ); QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership );
return obj; return obj;
@@ -287,13 +304,19 @@ OverlayController::OverlayController( bool desktopMode,
1, 1,
0, 0,
"RotationTabController", "RotationTabController",
[]( QQmlEngine*, QJSEngine* ) { []( QQmlEngine*, QJSEngine* )
{
QObject* obj = &( objectAddress->m_rotationTabController ); QObject* obj = &( objectAddress->m_rotationTabController );
QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership ); QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership );
return obj; return obj;
} ); } );
qmlRegisterSingletonType<alarm_clock::VrAlarm>( qmlRegisterSingletonType<alarm_clock::VrAlarm>(
qmlSingletonImportName, 1, 0, "VrAlarm", []( QQmlEngine*, QJSEngine* ) { qmlSingletonImportName,
1,
0,
"VrAlarm",
[]( QQmlEngine*, QJSEngine* )
{
QObject* obj = &( objectAddress->m_alarm ); QObject* obj = &( objectAddress->m_alarm );
QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership ); QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership );
return obj; return obj;
@@ -504,8 +527,11 @@ void OverlayController::SetWidget( QQuickItem* quickItem,
if ( chapindex.first ) if ( chapindex.first )
{ {
m_chaperoneTabController.applyChaperoneProfile( chapindex.second ); m_chaperoneTabController.applyChaperoneProfile( chapindex.second );
vr::VRApplications()->CancelApplicationLaunch( bool success = vr::VRApplications()->CancelApplicationLaunch(
"openvr.tool.steamvr_room_setup" ); "openvr.tool.steamvr_room_setup" );
auto successsstr = success ? "true" : "false";
LOG( INFO ) << "Attempted to stop roomsetup: " << successsstr;
if ( vr::VRApplications()->GetApplicationProcessId( if ( vr::VRApplications()->GetApplicationProcessId(
"openvr.tool.steamvr_room_setup" ) "openvr.tool.steamvr_room_setup" )
!= 0 ) != 0 )
@@ -1245,15 +1271,7 @@ void OverlayController::mainEventLoop()
if ( !chaperoneDataAlreadyUpdated ) if ( !chaperoneDataAlreadyUpdated )
{ {
// LOG(INFO) << "Re-loading chaperone data ...";
m_chaperoneUtils.loadChaperoneData(); m_chaperoneUtils.loadChaperoneData();
// LOG(INFO) << "Found " << m_chaperoneUtils.quadsCount() <<
// " chaperone quads."; if
// (m_chaperoneUtils.isChaperoneWellFormed()) { LOG(INFO) <<
// "Chaperone data seems to be well-formed.";
//} else {
// LOG(INFO) << "Chaperone data is NOT well-formed.";
//}
chaperoneDataAlreadyUpdated = true; chaperoneDataAlreadyUpdated = true;
} }
} }
@@ -1263,15 +1281,7 @@ void OverlayController::mainEventLoop()
{ {
if ( !chaperoneDataAlreadyUpdated ) if ( !chaperoneDataAlreadyUpdated )
{ {
// LOG(INFO) << "Re-loading chaperone data ...";
m_chaperoneUtils.loadChaperoneData(); m_chaperoneUtils.loadChaperoneData();
// LOG(INFO) << "Found " << m_chaperoneUtils.quadsCount() <<
// " chaperone quads."; if
// (m_chaperoneUtils.isChaperoneWellFormed()) { LOG(INFO) <<
// "Chaperone data seems to be well-formed.";
//} else {
// LOG(INFO) << "Chaperone data is NOT well-formed.";
//}
chaperoneDataAlreadyUpdated = true; chaperoneDataAlreadyUpdated = true;
} }
} }
@@ -1323,20 +1333,6 @@ void OverlayController::mainEventLoop()
= std::sqrt( vel[0] * vel[0] + vel[1] * vel[1] + vel[2] * vel[2] ); = std::sqrt( vel[0] * vel[0] + vel[1] * vel[1] + vel[2] * vel[2] );
} }
auto universe = vr::VRCompositor()->GetTrackingSpace(); auto universe = vr::VRCompositor()->GetTrackingSpace();
// This Fix is hopefully temporary as OpenVR doesn't appear to have a way to
// tell if an application is OpenXR outside of VR_init which we don't have
// control over
/*
if ( vr::VRApplications()->GetApplicationProcessId(
"openvr.tool.steamvr_room_setup" )
== 0
&& openXRFixEnabled() )
{
// OpenXR applications will appear as RawAndUncalibrated.
// Unless Room Setup is running, treat this case as Standing.
universe = vr::TrackingUniverseStanding;
}
*/
m_moveCenterTabController.eventLoopTick( universe, devicePoses ); m_moveCenterTabController.eventLoopTick( universe, devicePoses );
m_utilitiesTabController.eventLoopTick(); m_utilitiesTabController.eventLoopTick();
m_statisticsTabController.eventLoopTick( m_statisticsTabController.eventLoopTick(
@@ -1347,7 +1343,7 @@ void OverlayController::mainEventLoop()
m_alarm.eventLoopTick(); m_alarm.eventLoopTick();
if ( vr::VROverlay()->IsDashboardVisible() ) if ( vr::VROverlay()->IsDashboardVisible() || m_desktopMode )
{ {
m_settingsTabController.dashboardLoopTick(); m_settingsTabController.dashboardLoopTick();
m_steamVRTabController.dashboardLoopTick(); m_steamVRTabController.dashboardLoopTick();
@@ -1669,6 +1665,22 @@ double OverlayController::soundVolume() const
settings::DoubleSetting::APPLICATION_appVolume ); settings::DoubleSetting::APPLICATION_appVolume );
} }
void OverlayController::setDesktopModeToggle( bool value, bool notify )
{
settings::setSetting( settings::BoolSetting::APPLICATION_desktopModeToggle,
value );
if ( notify )
{
emit desktopModeToggleChanged( value );
}
settings::saveAllSettings();
}
bool OverlayController::desktopModeToggle() const
{
return settings::getSetting(
settings::BoolSetting::APPLICATION_desktopModeToggle );
}
void OverlayController::playActivationSound() void OverlayController::playActivationSound()
{ {
if ( !m_noSound ) if ( !m_noSound )
+5
View File
@@ -98,6 +98,8 @@ class OverlayController : public QObject
autoApplyChaperoneEnabledChanged ) autoApplyChaperoneEnabledChanged )
Q_PROPERTY( double soundVolume READ soundVolume WRITE setSoundVolume NOTIFY Q_PROPERTY( double soundVolume READ soundVolume WRITE setSoundVolume NOTIFY
soundVolumeChanged ) soundVolumeChanged )
Q_PROPERTY( bool desktopModeToggle READ desktopModeToggle WRITE
setDesktopModeToggle NOTIFY desktopModeToggleChanged )
private: private:
vr::VROverlayHandle_t m_ulOverlayHandle = vr::k_ulOverlayHandleInvalid; vr::VROverlayHandle_t m_ulOverlayHandle = vr::k_ulOverlayHandleInvalid;
@@ -255,6 +257,7 @@ public:
std::string autoApplyChaperoneName(); std::string autoApplyChaperoneName();
double soundVolume() const; double soundVolume() const;
bool desktopModeToggle() const;
public slots: public slots:
void renderOverlay(); void renderOverlay();
@@ -282,6 +285,7 @@ public slots:
void setDebugState( int value, bool notify = true ); void setDebugState( int value, bool notify = true );
void setAutoApplyChaperoneEnabled( bool value, bool notify = true ); void setAutoApplyChaperoneEnabled( bool value, bool notify = true );
void setSoundVolume( double value, bool notify = true ); void setSoundVolume( double value, bool notify = true );
void setDesktopModeToggle( bool value, bool notify = true );
signals: signals:
void keyBoardInputSignal( QString input, unsigned long userValue = 0 ); void keyBoardInputSignal( QString input, unsigned long userValue = 0 );
@@ -296,6 +300,7 @@ signals:
void debugStateChanged( int value ); void debugStateChanged( int value );
void autoApplyChaperoneEnabledChanged( bool value ); void autoApplyChaperoneEnabledChanged( bool value );
void soundVolumeChanged( double value ); void soundVolumeChanged( double value );
void desktopModeToggleChanged( bool value );
}; };
} // namespace advsettings } // namespace advsettings
+11 -43
View File
@@ -92,37 +92,19 @@ MyStackViewPage {
SettingsTabController.setAutoStartEnabled(checked, false) SettingsTabController.setAutoStartEnabled(checked, false)
} }
} }
MyToggleButton {
id: desktopModeToggleButton
text: "Desktop Mode (restart required)"
onCheckedChanged: {
OverlayController.setDesktopModeToggle(this.checked, false)
}
}
MyToggleButton { MyToggleButton {
id: allowExternalEditsToggle id: allowExternalEditsToggle
text: "Allow External App Chaperone Edits (Danger)" text: "Allow External App Chaperone Edits (Danger)"
onCheckedChanged: { onCheckedChanged: {
MoveCenterTabController.setAllowExternalEdits(checked, true) MoveCenterTabController.setAllowExternalEdits(checked, true)
seatedOldExternalWarning.visible = checked && MoveCenterTabController.oldStyleMotion
}
}
MyToggleButton {
id: oldStyleMotionToggle
text: "Old-Style Motion (per-frame disk writes)"
onCheckedChanged: {
MoveCenterTabController.setOldStyleMotion(checked, true)
seatedOldExternalWarning.visible = MoveCenterTabController.allowExternalEdits && checked
}
}
RowLayout{
MyText {
id: seatedOldExternalWarning
wrapMode: Text.WordWrap
font.pointSize: 20
color: "#FFA500"
text: "WARNING: 'Allow External App Chaperone Edits' + 'Old-Style Motion' + 'Enable Motion Features When in Seated Mode' active together may cause space center misalignment. Load the «Autosaved Profile» in the 'Chaperone' tab to fix."
horizontalAlignment: Text.AlignHCenter
Layout.leftMargin: 20
Layout.rightMargin: 20
Layout.preferredWidth: 900
//Layout.fillWidth: true
} }
} }
@@ -213,13 +195,6 @@ MyStackViewPage {
OverlayController.setExclusiveInputEnabled(this.checked, true) OverlayController.setExclusiveInputEnabled(this.checked, true)
} }
} }
MyToggleButton {
id: spaceAdjustChaperoneToggle
text: "Adjust Chaperone"
onCheckedChanged: {
MoveCenterTabController.adjustChaperone = this.checked
}
}
RowLayout { RowLayout {
Layout.fillWidth: true Layout.fillWidth: true
@@ -350,7 +325,6 @@ MyStackViewPage {
settingsAutoStartToggle.checked = SettingsTabController.autoStartEnabled settingsAutoStartToggle.checked = SettingsTabController.autoStartEnabled
allowExternalEditsToggle.checked = MoveCenterTabController.allowExternalEdits allowExternalEditsToggle.checked = MoveCenterTabController.allowExternalEdits
oldStyleMotionToggle.checked = MoveCenterTabController.oldStyleMotion
universeCenteredRotationToggle.checked = MoveCenterTabController.universeCenteredRotation universeCenteredRotationToggle.checked = MoveCenterTabController.universeCenteredRotation
disableCrashRecoveryToggle.checked = !OverlayController.crashRecoveryDisabled disableCrashRecoveryToggle.checked = !OverlayController.crashRecoveryDisabled
@@ -366,10 +340,9 @@ MyStackViewPage {
oculusSdkToggleButton.checked = SettingsTabController.oculusSdkToggle oculusSdkToggleButton.checked = SettingsTabController.oculusSdkToggle
exclusiveInputToggleButton.checked = OverlayController.exclusiveInputEnabled exclusiveInputToggleButton.checked = OverlayController.exclusiveInputEnabled
autoApplyChaperoneToggleButton.checked = OverlayController.autoApplyChaperoneEnabled autoApplyChaperoneToggleButton.checked = OverlayController.autoApplyChaperoneEnabled
spaceAdjustChaperoneToggle.checked = MoveCenterTabController.adjustChaperone desktopModeToggleButton.checked = OverlayController.desktopModeToggle
seatedOldExternalWarning.visible = MoveCenterTabController.allowExternalEdits && MoveCenterTabController.oldStyleMotion
reloadChaperoneProfiles() reloadChaperoneProfiles()
volumeSlider.value = OverlayController.soundVolume volumeSlider.value = OverlayController.soundVolume
} }
@@ -391,18 +364,10 @@ MyStackViewPage {
target: MoveCenterTabController target: MoveCenterTabController
onAllowExternalEditsChanged: { onAllowExternalEditsChanged: {
allowExternalEditsToggle.checked = MoveCenterTabController.allowExternalEdits allowExternalEditsToggle.checked = MoveCenterTabController.allowExternalEdits
seatedOldExternalWarning.visible = MoveCenterTabController.allowExternalEdits && MoveCenterTabController.oldStyleMotion
}
onOldStyleMotionChanged: {
oldStyleMotionToggle.checked = MoveCenterTabController.oldStyleMotion
seatedOldExternalWarning.visible = MoveCenterTabController.allowExternalEdits && MoveCenterTabController.oldStyleMotion
} }
onUniverseCenteredRotationChanged: { onUniverseCenteredRotationChanged: {
universeCenteredRotationToggle.checked = MoveCenterTabController.universeCenteredRotation universeCenteredRotationToggle.checked = MoveCenterTabController.universeCenteredRotation
} }
onAdjustChaperoneChanged:{
spaceAdjustChaperoneToggle.checked = MoveCenterTabController.adjustChaperone
}
} }
Connections { Connections {
@@ -440,6 +405,9 @@ MyStackViewPage {
onSoundVolumeChanged:{ onSoundVolumeChanged:{
volumeSlider.value = OverlayController.soundVolume volumeSlider.value = OverlayController.soundVolume
} }
onDesktopModeToggleChanged:{
desktopModeToggleButton.checked = OverlayController.desktopModeToggle
}
} }
Connections{ Connections{
target: ChaperoneTabController target: ChaperoneTabController
@@ -89,13 +89,6 @@ GroupBox {
} }
} }
RowLayout{ RowLayout{
MyPushButton{
text:"Ignore Boundary State"
Layout.preferredWidth: 300
onClicked:{
MoveCenterTabController.setIgnoreChaperoneState();
}
}
Item{ Item{
Layout.fillWidth: true Layout.fillWidth: true
@@ -35,7 +35,7 @@ GroupBox {
MyToggleButton { MyToggleButton {
id: steamvrPerformanceGraphToggle id: steamvrPerformanceGraphToggle
text: "Enable Timing Overlay" text: "Enable Timing Overlay"
Layout.preferredWidth: 400 Layout.preferredWidth: 300
onCheckedChanged: { onCheckedChanged: {
SteamVRTabController.setPerformanceGraph(this.checked, false) SteamVRTabController.setPerformanceGraph(this.checked, false)
} }
@@ -44,32 +44,18 @@ GroupBox {
Layout.preferredWidth: 20 Layout.preferredWidth: 20
text: " " text: " "
} }
MyToggleButton { MyToggleButton {
id: steamvrSystemButtonToggle id: steamvrNoHMDToggle
Layout.fillWidth: true text: "Require HMD"
text: "Enable System Button Binding" Layout.preferredWidth: 300
onCheckedChanged: { onCheckedChanged: {
SteamVRTabController.setSystemButton(this.checked, false) SteamVRTabController.setNoHMD(this.checked, false)
}
}
}
RowLayout {
spacing: 16
MyToggleButton {
id: steamvrMultipleDriverToggle
Layout.preferredWidth: 400
text: "Allow Multiple Drivers"
onCheckedChanged: {
SteamVRTabController.setMultipleDriver(this.checked, false)
} }
} }
MyText { MyText {
Layout.preferredWidth: 20 Layout.preferredWidth: 20
text: " " text: " "
} }
MyToggleButton { MyToggleButton {
id: steamvrNoFadeToGridToggle id: steamvrNoFadeToGridToggle
Layout.fillWidth: true Layout.fillWidth: true
@@ -79,6 +65,31 @@ GroupBox {
} }
} }
} }
RowLayout {
spacing: 16
MyToggleButton {
id: steamvrMultipleDriverToggle
Layout.preferredWidth: 300
text: "Allow Multiple Drivers"
onCheckedChanged: {
SteamVRTabController.setMultipleDriver(this.checked, false)
}
}
MyText {
Layout.preferredWidth: 20
text: " "
}
MyToggleButton {
id: steamvrSystemButtonToggle
Layout.fillWidth: true
text: "Enable System Button Binding"
onCheckedChanged: {
SteamVRTabController.setSystemButton(this.checked, false)
}
}
}
RowLayout { RowLayout {
spacing: 16 spacing: 16
@@ -86,7 +97,7 @@ GroupBox {
MyToggleButton { MyToggleButton {
id: steamvrNotificationToggle id: steamvrNotificationToggle
text: "Disable Notifications" text: "Disable Notifications"
Layout.preferredWidth: 400 Layout.preferredWidth: 300
onCheckedChanged: { onCheckedChanged: {
SteamVRTabController.setDND(this.checked, false) SteamVRTabController.setDND(this.checked, false)
} }
@@ -95,6 +106,14 @@ GroupBox {
Layout.preferredWidth: 20 Layout.preferredWidth: 20
text: " " text: " "
} }
MyToggleButton {
id: steamvrControllerPowerToggle
Layout.fillWidth: true
text: "Controller Power Turns on SteamVR"
onCheckedChanged: {
SteamVRTabController.setControllerPower(this.checked, false)
}
}
} }
@@ -106,6 +125,8 @@ GroupBox {
steamvrMultipleDriverToggle.checked = SteamVRTabController.multipleDriver steamvrMultipleDriverToggle.checked = SteamVRTabController.multipleDriver
steamvrNoFadeToGridToggle.checked = SteamVRTabController.noFadeToGrid steamvrNoFadeToGridToggle.checked = SteamVRTabController.noFadeToGrid
steamvrNotificationToggle.checked = SteamVRTabController.dnd steamvrNotificationToggle.checked = SteamVRTabController.dnd
steamvrControllerPowerToggle.checked = SteamVRTabController.controllerPower
steamvrNoHMDToggle.checked = SteamVRTabController.noHMD
} }
Connections { Connections {
@@ -125,6 +146,12 @@ GroupBox {
onDNDChanged:{ onDNDChanged:{
steamvrNotificationToggle.checked = SteamVRTabController.dnd steamvrNotificationToggle.checked = SteamVRTabController.dnd
} }
onNoHMDChanged:{
steamvrNoHMDToggle.checked = SteamVRTabController.noHMD
}
onControllerPowerChanged:{
steamvrControllerPowerToggle.checked = SteamVRTabController.controllerPower
}
} }
} }
@@ -6,6 +6,7 @@ import "media_keys"
import "alarm_clock" import "alarm_clock"
import "keyboard_utils" import "keyboard_utils"
import "../common" import "../common"
import "misc"
MyStackViewPage { MyStackViewPage {
headerText: "Utilities" headerText: "Utilities"
@@ -25,6 +26,10 @@ MyStackViewPage {
id: mediaKeysGroupBox id: mediaKeysGroupBox
} }
MiscBox{
id:utilMiscGroupBox
}
Item { Item {
Layout.fillHeight: true Layout.fillHeight: true
} }
@@ -0,0 +1,62 @@
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3
import ovras.advsettings 1.0
import "../../common"
GroupBox {
id: utilMiscGroupBox
Layout.fillWidth: true
label:
MyText {
leftPadding: 10
text: "Misc:"
bottomPadding: -10
}
background: Rectangle {
color: "transparent"
border.color: "#d9dbe0"
radius: 8
}
ColumnLayout {
anchors.fill: parent
Rectangle {
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
}
RowLayout {
spacing: 16
MyToggleButton {
id: trackerOvlToggle
text: "Show Tracker Batteries"
Layout.preferredWidth: 250
onCheckedChanged: {
UtilitiesTabController.setTrackerOvlEnabled(this.checked, false)
}
}
}
}
Component.onCompleted: {
trackerOvlToggle.checked = UtilitiesTabController.trackerOvlEnabled
}
Connections {
target: UtilitiesTabController
onTrackerOvlEnabledChanged:{
trackerOvlToggle.checked = UtilitiesTabController.trackerOvlEnabled
}
}
}
@@ -330,6 +330,11 @@ private:
SettingCategory::Application, SettingCategory::Application,
QtInfo{ "autoApplyChaperoneToggle" }, QtInfo{ "autoApplyChaperoneToggle" },
false }, false },
BoolSettingValue{ BoolSetting::APPLICATION_desktopModeToggle,
SettingCategory::Application,
QtInfo{ "desktopModeToggle" },
false },
BoolSettingValue{ BoolSetting::AUDIO_pttEnabled, BoolSettingValue{ BoolSetting::AUDIO_pttEnabled,
SettingCategory::Audio, SettingCategory::Audio,
QtInfo{ "pttEnabled" }, QtInfo{ "pttEnabled" },
@@ -359,6 +364,10 @@ private:
SettingCategory::Utility, SettingCategory::Utility,
QtInfo{ "vrcDebug" }, QtInfo{ "vrcDebug" },
false }, false },
BoolSettingValue{ BoolSetting::UTILITY_trackerOverlayEnabled,
SettingCategory::Utility,
QtInfo{ "trackerOverlayEnabled" },
true },
BoolSettingValue{ BoolSetting::VIDEO_brightnessEnabled, BoolSettingValue{ BoolSetting::VIDEO_brightnessEnabled,
SettingCategory::Video, SettingCategory::Video,
+2
View File
@@ -36,6 +36,7 @@ enum class BoolSetting
APPLICATION_crashRecoveryDisabled2, APPLICATION_crashRecoveryDisabled2,
APPLICATION_openXRWorkAround, APPLICATION_openXRWorkAround,
APPLICATION_autoApplyChaperone, APPLICATION_autoApplyChaperone,
APPLICATION_desktopModeToggle,
AUDIO_pttEnabled, AUDIO_pttEnabled,
AUDIO_pttShowNotification, AUDIO_pttShowNotification,
@@ -45,6 +46,7 @@ enum class BoolSetting
UTILITY_alarmEnabled, UTILITY_alarmEnabled,
UTILITY_alarmIsModal, UTILITY_alarmIsModal,
UTILITY_vrcDebug, UTILITY_vrcDebug,
UTILITY_trackerOverlayEnabled,
VIDEO_brightnessEnabled, VIDEO_brightnessEnabled,
VIDEO_isOverlayMethodActive, VIDEO_isOverlayMethodActive,
@@ -128,7 +128,8 @@ void ChaperoneTabController::handleChaperoneWarnings( float distance )
} }
m_chaperoneHapticFeedbackActive = true; m_chaperoneHapticFeedbackActive = true;
m_chaperoneHapticFeedbackThread = std::thread( m_chaperoneHapticFeedbackThread = std::thread(
[&]( ChaperoneTabController* _this ) { [&]( ChaperoneTabController* _this )
{
auto leftIndex auto leftIndex
= vr::VRSystem() = vr::VRSystem()
->GetTrackedDeviceIndexForControllerRole( ->GetTrackedDeviceIndexForControllerRole(
+65 -306
View File
@@ -454,23 +454,6 @@ void MoveCenterTabController::setFrictionPercent( int value, bool notify )
} }
} }
bool MoveCenterTabController::adjustChaperone() const
{
return settings::getSetting(
settings::BoolSetting::PLAYSPACE_adjustChaperone4 );
}
void MoveCenterTabController::setAdjustChaperone( bool value, bool notify )
{
settings::setSetting( settings::BoolSetting::PLAYSPACE_adjustChaperone4,
value );
if ( notify )
{
emit adjustChaperoneChanged( value );
}
}
bool MoveCenterTabController::moveShortcutRight() const bool MoveCenterTabController::moveShortcutRight() const
{ {
return settings::getSetting( return settings::getSetting(
@@ -855,29 +838,6 @@ void MoveCenterTabController::setAllowExternalEdits( bool value, bool notify )
} }
} }
bool MoveCenterTabController::oldStyleMotion() const
{
return settings::getSetting(
settings::BoolSetting::PLAYSPACE_oldStyleMotion );
}
void MoveCenterTabController::setOldStyleMotion( bool value, bool notify )
{
// detect incoming change to old style, and hide working set
if ( value && !oldStyleMotion() )
{
vr::VRChaperoneSetup()->HideWorkingSetPreview();
}
settings::setSetting( settings::BoolSetting::PLAYSPACE_oldStyleMotion,
value );
if ( notify )
{
emit oldStyleMotionChanged( value );
}
}
bool MoveCenterTabController::universeCenteredRotation() const bool MoveCenterTabController::universeCenteredRotation() const
{ {
return settings::getSetting( return settings::getSetting(
@@ -901,23 +861,6 @@ bool MoveCenterTabController::isInitComplete() const
return m_initComplete; return m_initComplete;
} }
bool MoveCenterTabController::simpleRecenter() const
{
return settings::getSetting(
settings::BoolSetting::PLAYSPACE_simpleRecenter );
}
void MoveCenterTabController::setSimpleRecenter( bool value, bool notify )
{
settings::setSetting( settings::BoolSetting::PLAYSPACE_simpleRecenter,
value );
if ( notify )
{
emit simpleRecenterChanged( value );
}
}
void MoveCenterTabController::modOffsetX( float value, bool notify ) void MoveCenterTabController::modOffsetX( float value, bool notify )
{ {
if ( !lockXToggle() ) if ( !lockXToggle() )
@@ -956,8 +899,7 @@ void MoveCenterTabController::modOffsetZ( float value, bool notify )
void MoveCenterTabController::shutdown() void MoveCenterTabController::shutdown()
{ {
reset(); vr::VRChaperoneSetup()->RevertWorkingCopy();
vr::VRChaperoneSetup()->HideWorkingSetPreview();
} }
void MoveCenterTabController::incomingSeatedReset() void MoveCenterTabController::incomingSeatedReset()
@@ -965,15 +907,18 @@ void MoveCenterTabController::incomingSeatedReset()
// if we didn't send the request from OVRAS, we need to send another // if we didn't send the request from OVRAS, we need to send another
// ResetSeatedZeroPose(). It seems that only after this is sent from // ResetSeatedZeroPose(). It seems that only after this is sent from
// OVRAS does ReloadFromDisk return valid info on WMR. // OVRAS does ReloadFromDisk return valid info on WMR.
if ( !m_selfRequestedSeatedRecenter && !simpleRecenter() ) if ( !m_selfRequestedSeatedRecenter )
{ {
LOG( INFO ) << "steamvr center?";
m_selfRequestedSeatedRecenter = true; m_selfRequestedSeatedRecenter = true;
vr::VRChaperone()->ResetZeroPose( vr::TrackingUniverseSeated ); vr::VRChaperone()->ResetZeroPose( vr::TrackingUniverseSeated );
} }
else else
{ {
LOG( INFO ) << "not our receneter";
updateSeatedResetData(); updateSeatedResetData();
} }
// vr::VRChaperone()->ResetZeroPose( vr::TrackingUniverseSeated );
} }
void MoveCenterTabController::reset() void MoveCenterTabController::reset()
@@ -1117,94 +1062,64 @@ void MoveCenterTabController::zeroOffsets()
LOG( INFO ) << "-Resetting offsets-"; LOG( INFO ) << "-Resetting offsets-";
} }
} }
m_oldOffsetX = 0.0f;
// finished checking if out of bounds, proceed with normal zeroing m_oldOffsetY = 0.0f;
// offsets m_oldOffsetZ = 0.0f;
auto chaperoneState = vr::VRChaperone()->GetCalibrationState(); m_oldRotation = 0;
if ( chaperoneState < vr::ChaperoneCalibrationState_Error m_offsetX = 0.0f;
|| chaperoneState m_offsetY = 0.0f;
== vr::ChaperoneCalibrationState_Error_PlayAreaInvalid m_offsetZ = 0.0f;
|| m_ignoreChaperoneState ) m_rotation = 0;
emit offsetXChanged( m_offsetX );
emit offsetYChanged( m_offsetY );
emit offsetZChanged( m_offsetZ );
emit rotationChanged( m_rotation );
updateChaperoneResetData();
m_pendingZeroOffsets = false;
if ( !m_chaperoneBasisAcquired )
{ {
if ( !m_chaperoneInit ) m_chaperoneBasisAcquired = true;
if ( !m_initComplete )
{ {
m_chaperoneInit = true; setTrackingUniverse( vr::VRCompositor()->GetTrackingSpace() );
LOG( INFO ) << "Chaperone Initially Calibrated"; if ( parent->isPreviousShutdownSafe() )
}
if ( chaperoneState > vr::ChaperoneCalibrationState_OK )
{
LOG( WARNING )
<< "Chaperone Cal State Is warning during zero offsets: "
<< chaperoneState;
}
m_oldOffsetX = 0.0f;
m_oldOffsetY = 0.0f;
m_oldOffsetZ = 0.0f;
m_oldRotation = 0;
m_offsetX = 0.0f;
m_offsetY = 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 );
updateChaperoneResetData();
m_pendingZeroOffsets = false;
if ( !m_chaperoneBasisAcquired )
{
m_chaperoneBasisAcquired = true;
if ( !m_initComplete )
{ {
setTrackingUniverse( vr::VRCompositor()->GetTrackingSpace() ); // all init complete, safe to autosave chaperone profile
if ( parent->isPreviousShutdownSafe() ) parent->m_chaperoneTabController.createNewAutosaveProfile();
{ m_initComplete = true;
// all init complete, safe to autosave chaperone profile
parent->m_chaperoneTabController.createNewAutosaveProfile();
m_initComplete = true;
}
else
{
// shutdown was unsafe last session!
LOG( WARNING )
<< "DETECTED UNSAFE SHUTDOWN FROM LAST SESSION";
m_initComplete = true;
if ( !parent->crashRecoveryDisabled() )
{
parent->m_chaperoneTabController
.applyAutosavedProfile();
LOG( INFO ) << "Applying last good chaperone "
"profile autosave";
}
}
// Now mark previous shutdown as unsafe in case we crash
// some time during this session. Previous shutdown will be
// marked as being safe once more just before our app shuts
// down properly.
parent->setPreviousShutdownSafe( false );
} }
else
{
// shutdown was unsafe last session!
LOG( WARNING ) << "DETECTED UNSAFE SHUTDOWN FROM LAST SESSION";
m_initComplete = true;
if ( !parent->crashRecoveryDisabled() )
{
parent->m_chaperoneTabController.applyAutosavedProfile();
LOG( INFO ) << "Applying last good chaperone "
"profile autosave";
}
}
// Now mark previous shutdown as unsafe in case we crash
// some time during this session. Previous shutdown will be
// marked as being safe once more just before our app shuts
// down properly.
parent->setPreviousShutdownSafe( false );
} }
if ( m_roomSetupModeDetected )
{
LOG( INFO ) << "room setup EXIT detected";
m_roomSetupModeDetected = false;
}
LOG( INFO ) << "SUCCESS: Chaperone Data Updated and Offsets zeroed out";
} }
else if ( m_roomSetupModeDetected )
{ {
if ( !m_pendingZeroOffsets ) LOG( INFO ) << "room setup EXIT detected";
{ m_roomSetupModeDetected = false;
LOG( INFO ) << "PENDING: Chaperone Data Update and Offsets zeroing";
}
m_pendingZeroOffsets = true;
} }
LOG( INFO ) << "SUCCESS: Chaperone Data Updated and Offsets zeroed out";
} }
void MoveCenterTabController::sendSeatedRecenter() void MoveCenterTabController::sendSeatedRecenter()
{ {
vr::VRChaperone()->ResetZeroPose( vr::TrackingUniverseSeated ); vr::VRChaperone()->ResetZeroPose( vr::TrackingUniverseSeated );
// vr::VRChaperone()->ResetZeroPose( vr::TrackingUniverseStanding );
} }
double MoveCenterTabController::getHmdYawTotal() double MoveCenterTabController::getHmdYawTotal()
@@ -1235,14 +1150,11 @@ void MoveCenterTabController::updateSeatedResetData()
{ {
m_heightToggle = false; m_heightToggle = false;
emit heightToggleChanged( m_heightToggle ); emit heightToggleChanged( m_heightToggle );
m_oldOffsetX = 0.0f;
m_oldOffsetY = 0.0f; m_oldOffsetX = m_oldOffsetY = m_oldOffsetZ = 0.0f;
m_oldOffsetZ = 0.0f; m_oldRotation = m_rotation = 0;
m_oldRotation = 0; m_offsetX = m_offsetY = m_offsetZ = 0.0f;
m_offsetX = 0.0f;
m_offsetY = 0.0f;
m_offsetZ = 0.0f;
m_rotation = 0;
emit offsetXChanged( m_offsetX ); emit offsetXChanged( m_offsetX );
emit offsetYChanged( m_offsetY ); emit offsetYChanged( m_offsetY );
emit offsetZChanged( m_offsetZ ); emit offsetZChanged( m_offsetZ );
@@ -2135,24 +2047,6 @@ void MoveCenterTabController::zAxisLockToggle( bool zAxisLockToggleJustPressed )
// END of other bindings // END of other bindings
void MoveCenterTabController::saveUncommittedChaperone()
{
if ( !m_chaperoneCommitted )
{
vr::VRChaperoneSetup()->CommitWorkingCopy(
vr::EChaperoneConfigFile_Live );
vr::VRChaperoneSetup()->HideWorkingSetPreview();
m_chaperoneCommitted = true;
unsigned checkQuadCount = 0;
vr::VRChaperoneSetup()->GetWorkingCollisionBoundsInfo(
nullptr, &checkQuadCount );
if ( checkQuadCount > 0 )
{
parent->chaperoneUtils().loadChaperoneData( false );
}
}
}
// NOTE this function will create bad output if User Rotates 180 Degrees in // NOTE this function will create bad output if User Rotates 180 Degrees in
// 1/7* frame-rate. (Worst Case 30 fps = ~770 deg/s) // 1/7* frame-rate. (Worst Case 30 fps = ~770 deg/s)
void MoveCenterTabController::updateHmdRotationCounter( void MoveCenterTabController::updateHmdRotationCounter(
@@ -2268,6 +2162,7 @@ void MoveCenterTabController::updateHandDrag(
} }
vr::TrackedDevicePose_t* movePose; vr::TrackedDevicePose_t* movePose;
movePose = devicePoses + moveHandId;
if ( m_seatedModeDetected ) if ( m_seatedModeDetected )
{ {
vr::TrackedDevicePose_t vr::TrackedDevicePose_t
@@ -2279,10 +2174,6 @@ void MoveCenterTabController::updateHandDrag(
vr::k_unMaxTrackedDeviceCount ); vr::k_unMaxTrackedDeviceCount );
movePose = seatedDevicePoses + moveHandId; movePose = seatedDevicePoses + moveHandId;
} }
else
{
movePose = devicePoses + moveHandId;
}
if ( !movePose->bPoseIsValid || !movePose->bDeviceIsConnected if ( !movePose->bPoseIsValid || !movePose->bDeviceIsConnected
|| movePose->eTrackingResult != vr::TrackingResult_Running_OK ) || movePose->eTrackingResult != vr::TrackingResult_Running_OK )
@@ -2596,16 +2487,19 @@ void MoveCenterTabController::updateGravity()
void MoveCenterTabController::updateSpace( bool forceUpdate ) void MoveCenterTabController::updateSpace( bool forceUpdate )
{ {
// Do nothing if all offsets and rotation are still the same... // Do nothing if all offsets and rotation are still the same...
if ( m_offsetX == m_oldOffsetX && m_offsetY == m_oldOffsetY if ( ( abs( m_offsetX - m_oldOffsetX ) + abs( m_offsetY - m_oldOffsetY )
&& m_offsetZ == m_oldOffsetZ && m_rotation == m_oldRotation + abs( m_offsetZ - m_oldOffsetZ ) )
&& !forceUpdate ) == 0
&& m_rotation == m_oldRotation && !forceUpdate )
{ {
return; return;
} }
// reload from disk if we're at zero offsets and allow external edits // reload from disk if we're at zero offsets and allow external edits
if ( allowExternalEdits() && m_oldOffsetX == 0.0f && m_oldOffsetY == 0.0f if ( allowExternalEdits()
&& m_oldOffsetZ == 0.0f && m_oldRotation == 0 ) && ( abs( m_oldOffsetX ) + abs( m_oldOffsetY ) + abs( m_oldOffsetZ )
+ abs( static_cast<float>( m_oldRotation ) ) )
== 0 )
{ {
vr::VRChaperoneSetup()->ReloadFromDisk( vr::EChaperoneConfigFile_Live ); vr::VRChaperoneSetup()->ReloadFromDisk( vr::EChaperoneConfigFile_Live );
vr::VRChaperoneSetup()->CommitWorkingCopy( vr::VRChaperoneSetup()->CommitWorkingCopy(
@@ -2767,77 +2661,6 @@ void MoveCenterTabController::updateSpace( bool forceUpdate )
&offsetSeatedCenter ); &offsetSeatedCenter );
} }
// As of SVR 1.13.1 The Chaperone will follow Universe Center NOT raw
// Center as such this should be off by defualt.
// As of SVR 1.26.3 The chaperone seems to Have reverted back to pre 1.13.1
// behavior
// as of SVR 1.26.3 instead of 2x offset we have 1x offset and universe
// centerS
// as of SVR 1.26.4 1.26.3 changes are reverted as Such Adjust Chaperone
// Should Not Be Needed We Will leave in Adjust Chaperone at this point but
// make sure it defaults to off
if ( adjustChaperone() )
{
// outputLogPoses();
// make a copy of our bounds and
// reorient relative to new universe center
vr::HmdQuad_t* updatedBounds
= new vr::HmdQuad_t[m_collisionBoundsCountForReset];
// for every quad in the chaperone bounds...
for ( unsigned quad = 0; quad < m_collisionBoundsCountForReset; quad++ )
{
// at every corner in that quad...
for ( unsigned corner = 0; corner < 4; corner++ )
{
// copy the corner's xyz coordinates
updatedBounds[quad].vCorners[corner].v[0]
= m_collisionBoundsForOffset[quad].vCorners[corner].v[0];
updatedBounds[quad].vCorners[corner].v[1]
= m_collisionBoundsForOffset[quad].vCorners[corner].v[1];
updatedBounds[quad].vCorners[corner].v[2]
= m_collisionBoundsForOffset[quad].vCorners[corner].v[2];
// cancel universe center's xyz offsets to each corner's
// position and shift over by original center position so
// that we are mirroring the offset as reflected about the
// original origin
updatedBounds[quad].vCorners[corner].v[0]
-= offsetUniverseCenter.m[0][3]
// - offsetUniverseCenter.m[0][3];
- m_universeCenterForReset.m[0][3];
// but don't touch y=0 values to keep floor corners
// rooted down
if ( updatedBounds[quad].vCorners[corner].v[1] != 0 )
{
updatedBounds[quad].vCorners[corner].v[1]
-= offsetUniverseCenter.m[1][3]
//- offsetUniverseCenter.m[1][3];
- m_universeCenterForReset.m[1][3];
}
updatedBounds[quad].vCorners[corner].v[2]
-= offsetUniverseCenter.m[2][3]
// - offsetUniverseCenter.m[2][3];
- m_universeCenterForReset.m[2][3];
// rotate by universe center's yaw
rotateFloatCoordinates(
updatedBounds[quad].vCorners[corner].v,
static_cast<float>( offsetUniverseCenterYaw ) );
}
}
// update chaperone working set preview (this does not commit)
vr::VRChaperoneSetup()->SetWorkingCollisionBoundsInfo(
updatedBounds, m_collisionBoundsCountForReset );
delete[] updatedBounds;
}
// Center Marker for playspace. // Center Marker for playspace.
if ( parent->m_chaperoneTabController.m_centerMarkerOverlayNeedsUpdate ) if ( parent->m_chaperoneTabController.m_centerMarkerOverlayNeedsUpdate )
{ {
@@ -2885,66 +2708,8 @@ void MoveCenterTabController::updateSpace( bool forceUpdate )
vr::VRChaperoneSetup()->SetWorkingStandingZeroPoseToRawTrackingPose( vr::VRChaperoneSetup()->SetWorkingStandingZeroPoseToRawTrackingPose(
&offsetUniverseCenter ); &offsetUniverseCenter );
if ( oldStyleMotion() ) vr::VRChaperoneSetup()->ShowWorkingSetPreview();
{
// check if universe center is outside of OpenVR commit bounds (1km)
if ( abs( offsetUniverseCenterXyz[0] ) > k_maxOpenvrCommitOffset )
{
LOG( INFO ) << "COMMIT FAILED: Raw universe center out of commit "
"bounds ( X: "
<< offsetUniverseCenterXyz[0] << " )";
vr::HmdMatrix34_t standingZero;
vr::VRChaperoneSetup()->GetWorkingStandingZeroPoseToRawTrackingPose(
&standingZero );
LOG( INFO ) << "GetWorkingStandingZeroPoseToRawTrackingPose";
outputLogHmdMatrix( standingZero );
reset();
parent->m_chaperoneTabController.applyAutosavedProfile();
LOG( INFO ) << "-Resetting to autosaved chaperone profile-";
return;
}
if ( abs( offsetUniverseCenterXyz[1] ) > k_maxOpenvrCommitOffset )
{
LOG( INFO ) << "COMMIT FAILED: Raw universe center out of commit "
"bounds ( Y: "
<< offsetUniverseCenterXyz[1] << " )";
vr::HmdMatrix34_t standingZero;
vr::VRChaperoneSetup()->GetWorkingStandingZeroPoseToRawTrackingPose(
&standingZero );
LOG( INFO ) << "GetWorkingStandingZeroPoseToRawTrackingPose";
outputLogHmdMatrix( standingZero );
reset();
parent->m_chaperoneTabController.applyAutosavedProfile();
LOG( INFO ) << "-Resetting to autosaved chaperone profile-";
return;
}
if ( abs( offsetUniverseCenterXyz[2] ) > k_maxOpenvrCommitOffset )
{
LOG( INFO ) << "COMMIT FAILED: Raw universe center out of commit "
"bounds ( Z: "
<< offsetUniverseCenterXyz[2] << " )";
vr::HmdMatrix34_t standingZero;
vr::VRChaperoneSetup()->GetWorkingStandingZeroPoseToRawTrackingPose(
&standingZero );
LOG( INFO ) << "GetWorkingStandingZeroPoseToRawTrackingPose";
outputLogHmdMatrix( standingZero );
reset();
parent->m_chaperoneTabController.applyAutosavedProfile();
LOG( INFO ) << "-Resetting to autosaved chaperone profile-";
return;
}
vr::VRChaperoneSetup()->CommitWorkingCopy(
vr::EChaperoneConfigFile_Live );
m_chaperoneCommitted = true;
}
else
{
vr::VRChaperoneSetup()->ShowWorkingSetPreview();
m_chaperoneCommitted = false;
}
// loadChaperoneData( false ), false so that we don't load live data,
// and reference the working set instead.
if ( m_collisionBoundsCountForReset > 0 ) if ( m_collisionBoundsCountForReset > 0 )
{ {
parent->chaperoneUtils().loadChaperoneData( false ); parent->chaperoneUtils().loadChaperoneData( false );
@@ -3111,10 +2876,4 @@ void MoveCenterTabController::eventLoopTick(
} }
} }
void MoveCenterTabController::setIgnoreChaperoneState()
{
m_ignoreChaperoneState = true;
LOG( INFO ) << "Ignoring Chaperone State for Zero Offsets";
}
} // namespace advsettings } // namespace advsettings
+2 -21
View File
@@ -89,8 +89,6 @@ class MoveCenterTabController : public QObject
NOTIFY smoothTurnRateChanged ) NOTIFY smoothTurnRateChanged )
Q_PROPERTY( int frictionPercent READ frictionPercent WRITE Q_PROPERTY( int frictionPercent READ frictionPercent WRITE
setFrictionPercent NOTIFY frictionPercentChanged ) setFrictionPercent NOTIFY frictionPercentChanged )
Q_PROPERTY( bool adjustChaperone READ adjustChaperone WRITE
setAdjustChaperone NOTIFY adjustChaperoneChanged )
Q_PROPERTY( bool moveShortcutRight READ moveShortcutRight WRITE Q_PROPERTY( bool moveShortcutRight READ moveShortcutRight WRITE
setMoveShortcutRight NOTIFY moveShortcutRightChanged ) setMoveShortcutRight NOTIFY moveShortcutRightChanged )
Q_PROPERTY( bool moveShortcutLeft READ moveShortcutLeft WRITE Q_PROPERTY( bool moveShortcutLeft READ moveShortcutLeft WRITE
@@ -130,13 +128,9 @@ class MoveCenterTabController : public QObject
setShowLogMatricesButton NOTIFY showLogMatricesButtonChanged ) setShowLogMatricesButton NOTIFY showLogMatricesButtonChanged )
Q_PROPERTY( bool allowExternalEdits READ allowExternalEdits WRITE Q_PROPERTY( bool allowExternalEdits READ allowExternalEdits WRITE
setAllowExternalEdits NOTIFY allowExternalEditsChanged ) setAllowExternalEdits NOTIFY allowExternalEditsChanged )
Q_PROPERTY( bool oldStyleMotion READ oldStyleMotion WRITE setOldStyleMotion
NOTIFY oldStyleMotionChanged )
Q_PROPERTY( Q_PROPERTY(
bool universeCenteredRotation READ universeCenteredRotation WRITE bool universeCenteredRotation READ universeCenteredRotation WRITE
setUniverseCenteredRotation NOTIFY universeCenteredRotationChanged ) setUniverseCenteredRotation NOTIFY universeCenteredRotationChanged )
Q_PROPERTY( bool simpleRecenter READ simpleRecenter WRITE setSimpleRecenter
NOTIFY simpleRecenterChanged )
Q_PROPERTY( Q_PROPERTY(
float dragMult READ dragMult WRITE setDragMult NOTIFY dragMultChanged ) float dragMult READ dragMult WRITE setDragMult NOTIFY dragMultChanged )
@@ -195,7 +189,6 @@ private:
bool m_swapDragToRightHandActivated = false; bool m_swapDragToRightHandActivated = false;
bool m_gravityActive = false; bool m_gravityActive = false;
bool m_gravityReversed = false; bool m_gravityReversed = false;
bool m_chaperoneCommitted = true;
bool m_pendingZeroOffsets = true; bool m_pendingZeroOffsets = true;
bool m_pendingSeatedRecenter = false; bool m_pendingSeatedRecenter = false;
bool m_selfRequestedSeatedRecenter = false; bool m_selfRequestedSeatedRecenter = false;
@@ -207,8 +200,6 @@ private:
unsigned m_dragComfortFrameSkipCounter = 0; unsigned m_dragComfortFrameSkipCounter = 0;
unsigned m_turnComfortFrameSkipCounter = 0; unsigned m_turnComfortFrameSkipCounter = 0;
bool m_chaperoneInit = true;
// Matrix used For Center Marker // Matrix used For Center Marker
vr::HmdMatrix34_t m_offsetmatrix = utils::k_forwardUpMatrix; vr::HmdMatrix34_t m_offsetmatrix = utils::k_forwardUpMatrix;
@@ -236,7 +227,7 @@ private:
void updateSpace( bool forceUpdate = false ); void updateSpace( bool forceUpdate = false );
void clampVelocity( double* velocity ); void clampVelocity( double* velocity );
void applyChaperoneResetData(); void applyChaperoneResetData();
void saveUncommittedChaperone(); // void saveUncommittedChaperone();
void outputLogHmdMatrix( vr::HmdMatrix34_t hmdMatrix ); void outputLogHmdMatrix( vr::HmdMatrix34_t hmdMatrix );
std::vector<OffsetProfile> m_offsetProfiles; std::vector<OffsetProfile> m_offsetProfiles;
@@ -256,7 +247,6 @@ public:
int snapTurnAngle() const; int snapTurnAngle() const;
int smoothTurnRate() const; int smoothTurnRate() const;
int frictionPercent() const; int frictionPercent() const;
bool adjustChaperone() const;
bool moveShortcutRight() const; bool moveShortcutRight() const;
bool moveShortcutLeft() const; bool moveShortcutLeft() const;
bool turnBindRight() const; bool turnBindRight() const;
@@ -277,9 +267,7 @@ public:
bool lockZToggle() const; bool lockZToggle() const;
bool showLogMatricesButton() const; bool showLogMatricesButton() const;
bool allowExternalEdits() const; bool allowExternalEdits() const;
bool oldStyleMotion() const;
bool universeCenteredRotation() const; bool universeCenteredRotation() const;
bool simpleRecenter() const;
bool isInitComplete() const; bool isInitComplete() const;
double getHmdYawTotal(); double getHmdYawTotal();
void resetHmdYawTotal(); void resetHmdYawTotal();
@@ -293,7 +281,7 @@ public:
void saveOffsetProfiles(); void saveOffsetProfiles();
Q_INVOKABLE unsigned getOffsetProfileCount(); Q_INVOKABLE unsigned getOffsetProfileCount();
Q_INVOKABLE QString getOffsetProfileName( unsigned index ); Q_INVOKABLE QString getOffsetProfileName( unsigned index );
Q_INVOKABLE void setIgnoreChaperoneState(); // Q_INVOKABLE void setIgnoreChaperoneState();
// actions: // actions:
void leftHandSpaceDrag( bool leftHandDragActive ); void leftHandSpaceDrag( bool leftHandDragActive );
@@ -333,7 +321,6 @@ public slots:
void setSmoothTurnRate( int value, bool notify = true ); void setSmoothTurnRate( int value, bool notify = true );
void setFrictionPercent( int value, bool notify = true ); void setFrictionPercent( int value, bool notify = true );
void setAdjustChaperone( bool value, bool notify = true );
void setMoveShortcutRight( bool value, bool notify = true ); void setMoveShortcutRight( bool value, bool notify = true );
void setMoveShortcutLeft( bool value, bool notify = true ); void setMoveShortcutLeft( bool value, bool notify = true );
void setTurnBindRight( bool value, bool notify = true ); void setTurnBindRight( bool value, bool notify = true );
@@ -359,9 +346,7 @@ public slots:
void setLockZ( bool value, bool notify = true ); void setLockZ( bool value, bool notify = true );
void setShowLogMatricesButton( bool value, bool notify = true ); void setShowLogMatricesButton( bool value, bool notify = true );
void setAllowExternalEdits( bool value, bool notify = true ); void setAllowExternalEdits( bool value, bool notify = true );
void setOldStyleMotion( bool value, bool notify = true );
void setUniverseCenteredRotation( bool value, bool notify = true ); void setUniverseCenteredRotation( bool value, bool notify = true );
void setSimpleRecenter( bool value, bool notify = true );
void shutdown(); void shutdown();
void reset(); void reset();
@@ -384,7 +369,6 @@ signals:
void snapTurnAngleChanged( int value ); void snapTurnAngleChanged( int value );
void smoothTurnRateChanged( int value ); void smoothTurnRateChanged( int value );
void frictionPercentChanged( int value ); void frictionPercentChanged( int value );
void adjustChaperoneChanged( bool value );
void moveShortcutRightChanged( bool value ); void moveShortcutRightChanged( bool value );
void moveShortcutLeftChanged( bool value ); void moveShortcutLeftChanged( bool value );
void turnBindRightChanged( bool value ); void turnBindRightChanged( bool value );
@@ -405,10 +389,7 @@ signals:
void requireLockZChanged( bool value ); void requireLockZChanged( bool value );
void showLogMatricesButtonChanged( bool value ); void showLogMatricesButtonChanged( bool value );
void allowExternalEditsChanged( bool value ); void allowExternalEditsChanged( bool value );
void oldStyleMotionChanged( bool value );
void universeCenteredRotationChanged( bool value ); void universeCenteredRotationChanged( bool value );
void simpleRecenterChanged( bool value );
void offsetProfilesUpdated(); void offsetProfilesUpdated();
}; };
@@ -2,6 +2,7 @@
#include <QQuickWindow> #include <QQuickWindow>
#include "../overlaycontroller.h" #include "../overlaycontroller.h"
#include "../utils/update_rate.h" #include "../utils/update_rate.h"
#include <QDesktopServices>
QT_USE_NAMESPACE QT_USE_NAMESPACE
@@ -40,6 +41,8 @@ void SteamVRTabController::synchSteamVR()
setCameraActive( cameraActive() ); setCameraActive( cameraActive() );
setCameraCont( cameraCont() ); setCameraCont( cameraCont() );
setCameraBounds( cameraBounds() ); setCameraBounds( cameraBounds() );
setControllerPower( controllerPower() );
setNoHMD( noHMD() );
} }
bool SteamVRTabController::performanceGraph() const bool SteamVRTabController::performanceGraph() const
@@ -70,6 +73,33 @@ void SteamVRTabController::setPerformanceGraph( const bool value,
} }
} }
bool SteamVRTabController::noHMD() const
{
auto p = ovr_settings_wrapper::getBool(
vr::k_pch_SteamVR_Section, vr::k_pch_SteamVR_RequireHmd_String );
if ( p.first == ovr_settings_wrapper::SettingsError::NoError )
{
return p.second;
}
return m_noHMD;
}
void SteamVRTabController::setNoHMD( const bool value, const bool notify )
{
if ( m_noHMD != value )
{
m_noHMD = value;
ovr_settings_wrapper::setBool( vr::k_pch_SteamVR_Section,
vr::k_pch_SteamVR_RequireHmd_String,
m_noHMD );
if ( notify )
{
emit noHMDChanged( m_noHMD );
}
}
}
bool SteamVRTabController::multipleDriver() const bool SteamVRTabController::multipleDriver() const
{ {
auto p = ovr_settings_wrapper::getBool( auto p = ovr_settings_wrapper::getBool(
@@ -128,6 +158,35 @@ void SteamVRTabController::setNoFadeToGrid( const bool value,
} }
} }
bool SteamVRTabController::controllerPower() const
{
auto p = ovr_settings_wrapper::getBool(
vr::k_pch_Power_Section,
vr::k_pch_Power_AutoLaunchSteamVROnButtonPress );
if ( p.first == ovr_settings_wrapper::SettingsError::NoError )
{
return p.second;
}
return m_controllerPower;
}
void SteamVRTabController::setControllerPower( const bool value,
const bool notify )
{
if ( m_controllerPower != value )
{
m_controllerPower = value;
ovr_settings_wrapper::setBool(
vr::k_pch_Power_Section,
vr::k_pch_Power_AutoLaunchSteamVROnButtonPress,
m_controllerPower );
if ( notify )
{
emit controllerPowerChanged( m_controllerPower );
}
}
}
bool SteamVRTabController::systemButton() const bool SteamVRTabController::systemButton() const
{ {
auto p = ovr_settings_wrapper::getBool( auto p = ovr_settings_wrapper::getBool(
@@ -448,6 +507,12 @@ void SteamVRTabController::launchBindingUI()
LOG( ERROR ) LOG( ERROR )
<< "failed to get input handle? is your right controller on?"; << "failed to get input handle? is your right controller on?";
} }
if ( parent->isDesktopMode() )
{
QDesktopServices::openUrl(
QUrl( "http://127.0.0.1:27062/dashboard/controllerbinding.html" ) );
return;
}
auto error = vr::VRInput()->OpenBindingUI( auto error = vr::VRInput()->OpenBindingUI(
application_strings::applicationKey, actionHandle, inputHandle, false ); application_strings::applicationKey, actionHandle, inputHandle, false );
if ( error != vr::VRInputError_None ) if ( error != vr::VRInputError_None )
+11
View File
@@ -65,6 +65,9 @@ class SteamVRTabController : public QObject
cameraContChanged ) cameraContChanged )
Q_PROPERTY( bool perAppBindEnabled READ perAppBindEnabled WRITE Q_PROPERTY( bool perAppBindEnabled READ perAppBindEnabled WRITE
setPerAppBindEnabled NOTIFY perAppBindEnabledChanged ) setPerAppBindEnabled NOTIFY perAppBindEnabledChanged )
Q_PROPERTY( bool controllerPower READ controllerPower WRITE
setControllerPower NOTIFY controllerPowerChanged )
Q_PROPERTY( bool noHMD READ noHMD WRITE setNoHMD NOTIFY noHMDChanged )
private: private:
OverlayController* parent; OverlayController* parent;
@@ -74,6 +77,8 @@ private:
bool m_noFadeToGridToggle = false; bool m_noFadeToGridToggle = false;
bool m_multipleDriverToggle = false; bool m_multipleDriverToggle = false;
bool m_dnd = false; bool m_dnd = false;
bool m_controllerPower = false;
bool m_noHMD = false;
QNetworkAccessManager m_networkManagerApply; QNetworkAccessManager m_networkManagerApply;
QNetworkAccessManager m_networkManagerUrl; QNetworkAccessManager m_networkManagerUrl;
QNetworkAccessManager m_networkManagerBind; QNetworkAccessManager m_networkManagerBind;
@@ -112,6 +117,8 @@ public:
bool multipleDriver() const; bool multipleDriver() const;
bool systemButton() const; bool systemButton() const;
bool dnd() const; bool dnd() const;
bool controllerPower() const;
bool noHMD() const;
bool cameraActive() const; bool cameraActive() const;
bool cameraBounds() const; bool cameraBounds() const;
@@ -163,6 +170,8 @@ public slots:
void setNoFadeToGrid( bool value, bool notify = true ); void setNoFadeToGrid( bool value, bool notify = true );
void setMultipleDriver( bool value, bool notify = true ); void setMultipleDriver( bool value, bool notify = true );
void setDND( bool value, bool notify = true ); void setDND( bool value, bool notify = true );
void setControllerPower( bool value, bool notify = true );
void setNoHMD( bool value, bool notify = true );
void setCameraActive( bool value, bool notify = true ); void setCameraActive( bool value, bool notify = true );
void setCameraBounds( bool value, bool notify = true ); void setCameraBounds( bool value, bool notify = true );
@@ -182,6 +191,8 @@ signals:
void systemButtonChanged( bool value ); void systemButtonChanged( bool value );
void noFadeToGridChanged( bool value ); void noFadeToGridChanged( bool value );
void dNDChanged( bool value ); void dNDChanged( bool value );
void controllerPowerChanged( bool value );
void noHMDChanged( bool value );
void cameraActiveChanged( bool value ); void cameraActiveChanged( bool value );
void cameraBoundsChanged( bool value ); void cameraBoundsChanged( bool value );
+52 -6
View File
@@ -204,6 +204,26 @@ void UtilitiesTabController::setVrcDebug( bool value, bool notify )
} }
} }
bool UtilitiesTabController::trackerOvlEnabled() const
{
return settings::getSetting(
settings::BoolSetting::UTILITY_trackerOverlayEnabled );
}
void UtilitiesTabController::setTrackerOvlEnabled( bool value, bool notify )
{
settings::setSetting( settings::BoolSetting::UTILITY_trackerOverlayEnabled,
value );
if ( notify )
{
emit trackerOvlEnabledChanged( value );
}
if ( !value )
{
destroyBatteryOverlays();
}
}
QString getBatteryIconPath( int batteryState ) QString getBatteryIconPath( int batteryState )
{ {
constexpr auto batteryPrefix = "/res/img/battery/battery_"; constexpr auto batteryPrefix = "/res/img/battery/battery_";
@@ -224,8 +244,9 @@ QString getBatteryIconPath( int batteryState )
return QString::fromStdString( *batteryPath ); return QString::fromStdString( *batteryPath );
} }
vr::VROverlayHandle_t createBatteryOverlay( vr::TrackedDeviceIndex_t index, vr::VROverlayHandle_t UtilitiesTabController::createBatteryOverlay(
unsigned style = 0 ) vr::TrackedDeviceIndex_t index,
unsigned style )
{ {
vr::VROverlayHandle_t handle = vr::k_ulOverlayHandleInvalid; vr::VROverlayHandle_t handle = vr::k_ulOverlayHandleInvalid;
std::string batteryKey = std::string( application_strings::applicationKey ) std::string batteryKey = std::string( application_strings::applicationKey )
@@ -273,14 +294,26 @@ vr::VROverlayHandle_t createBatteryOverlay( vr::TrackedDeviceIndex_t index,
return handle; return handle;
} }
void UtilitiesTabController::eventLoopTick() void UtilitiesTabController::destroyBatteryOverlays()
{ {
if ( updateRate.shouldSubjectNotRun( for ( auto& el : m_batteryOverlayHandles )
UpdateSubject::UtilitiesTabController ) )
{ {
return; if ( el == 0 )
{
continue;
}
auto err = vr::VROverlay()->DestroyOverlay( el );
el = 0;
if ( err != vr::VROverlayError_None )
{
LOG( ERROR ) << "Could not Delete Battery Overlay: "
<< vr::VROverlay()->GetOverlayErrorNameFromEnum( err );
}
} }
}
void UtilitiesTabController::handleTrackerBatOvl()
{
// attach battery overlay to all tracked devices that aren't a // attach battery overlay to all tracked devices that aren't a
// controller or hmd // controller or hmd
for ( vr::TrackedDeviceIndex_t i = 0; i < vr::k_unMaxTrackedDeviceCount; for ( vr::TrackedDeviceIndex_t i = 0; i < vr::k_unMaxTrackedDeviceCount;
@@ -364,4 +397,17 @@ void UtilitiesTabController::eventLoopTick()
} }
} }
void UtilitiesTabController::eventLoopTick()
{
if ( updateRate.shouldSubjectNotRun(
UpdateSubject::UtilitiesTabController ) )
{
return;
}
if ( trackerOvlEnabled() )
{
handleTrackerBatOvl();
}
}
} // namespace advsettings } // namespace advsettings
@@ -21,6 +21,8 @@ class UtilitiesTabController : public QObject
Q_OBJECT Q_OBJECT
Q_PROPERTY( Q_PROPERTY(
bool vrcDebug READ vrcDebug WRITE setVrcDebug NOTIFY vrcDebugChanged ) bool vrcDebug READ vrcDebug WRITE setVrcDebug NOTIFY vrcDebugChanged )
Q_PROPERTY( bool trackerOvlEnabled READ trackerOvlEnabled WRITE
setTrackerOvlEnabled NOTIFY trackerOvlEnabledChanged )
private: private:
OverlayController* m_parent; OverlayController* m_parent;
@@ -31,6 +33,10 @@ private:
= { 0 }; = { 0 };
int m_batteryState[vr::k_unMaxTrackedDeviceCount]; int m_batteryState[vr::k_unMaxTrackedDeviceCount];
bool m_batteryVisible[vr::k_unMaxTrackedDeviceCount]; bool m_batteryVisible[vr::k_unMaxTrackedDeviceCount];
void handleTrackerBatOvl();
vr::VROverlayHandle_t createBatteryOverlay( vr::TrackedDeviceIndex_t index,
unsigned style = 0 );
void destroyBatteryOverlays();
public: public:
void initStage2( OverlayController* var_parent ); void initStage2( OverlayController* var_parent );
@@ -38,6 +44,7 @@ public:
void eventLoopTick(); void eventLoopTick();
bool vrcDebug() const; bool vrcDebug() const;
bool trackerOvlEnabled() const;
public slots: public slots:
void sendKeyboardInput( QString input ); void sendKeyboardInput( QString input );
@@ -76,9 +83,11 @@ public slots:
Q_INVOKABLE void sendKeyboardThree(); Q_INVOKABLE void sendKeyboardThree();
void setVrcDebug( bool value, bool notify = true ); void setVrcDebug( bool value, bool notify = true );
void setTrackerOvlEnabled( bool value, bool notify = true );
signals: signals:
void vrcDebugChanged( bool value ); void vrcDebugChanged( bool value );
void trackerOvlEnabledChanged( bool value );
}; };
} // namespace advsettings } // namespace advsettings
+1 -1
View File
@@ -1 +1 @@
{ "major": 5, "minor": 5, "patch": 0, "updateMessage": "", "optionalMessage": "" } { "major": 5, "minor": 8, "patch": 3, "updateMessage": "", "optionalMessage": "" }