From ca17b93872fcc8aa422bd7cb132f8b30868c7b2a Mon Sep 17 00:00:00 2001 From: Kung-vr Date: Sat, 6 Jul 2019 02:24:46 +0900 Subject: [PATCH] Implement "Add Left/Right Haptic Click" binds Addresses #244 --- src/openvr/ivrinput.cpp | 12 ++++ src/openvr/ivrinput.h | 7 +++ src/overlaycontroller.cpp | 4 ++ src/package_files/action_manifest.json | 12 ++++ src/tabcontrollers/ChaperoneTabController.cpp | 56 +++++++++++++++++++ src/tabcontrollers/ChaperoneTabController.h | 6 ++ 6 files changed, 97 insertions(+) diff --git a/src/openvr/ivrinput.cpp b/src/openvr/ivrinput.cpp index 4e1994c..f8bf076 100644 --- a/src/openvr/ivrinput.cpp +++ b/src/openvr/ivrinput.cpp @@ -140,6 +140,8 @@ SteamIVRInput::SteamIVRInput() m_pushToTalk( action_keys::pushToTalk ), m_leftHaptic( action_keys::hapticsLeft ), m_rightHaptic( action_keys::hapticsRight ), + m_addLeftHapticClick( action_keys::addLeftHapticClick ), + m_addRightHapticClick( action_keys::addRightHapticClick ), m_proxSensor( action_keys::proxSensor ), m_leftHand( input_keys::leftHand ), m_rightHand( input_keys::rightHand ), m_sets( { m_mainSet.activeActionSet(), @@ -317,6 +319,16 @@ bool SteamIVRInput::proxState() return isDigitalActionActivatedConstant( m_proxSensor ); } +bool SteamIVRInput::addLeftHapticClick() +{ + return isDigitalActionActivatedConstant( m_addLeftHapticClick ); +} + +bool SteamIVRInput::addRightHapticClick() +{ + return isDigitalActionActivatedConstant( m_addRightHapticClick ); +} + bool SteamIVRInput::keyboardOne() { return isDigitalActionActivatedOnce( m_keyboardOne ); diff --git a/src/openvr/ivrinput.h b/src/openvr/ivrinput.h index 2838be1..30a2ce9 100644 --- a/src/openvr/ivrinput.h +++ b/src/openvr/ivrinput.h @@ -58,6 +58,9 @@ namespace action_keys constexpr auto hapticsLeft = "/actions/haptic/out/HapticsLeft"; constexpr auto hapticsRight = "/actions/haptic/out/HapticsRight"; constexpr auto proxSensor = "/actions/haptic/in/ProxSensor"; + constexpr auto addLeftHapticClick = "/actions/haptic/in/AddLeftHapticClick"; + constexpr auto addRightHapticClick + = "/actions/haptic/in/AddRightHapticClick"; constexpr auto chaperoneToggle = "/actions/misc/in/ChaperoneToggle"; @@ -144,6 +147,8 @@ public: bool zAxisLockToggle(); bool chaperoneToggle(); bool proxState(); + bool addLeftHapticClick(); + bool addRightHapticClick(); bool pushToTalk(); @@ -225,6 +230,8 @@ private: // haptic bindings DigitalAction m_leftHaptic; DigitalAction m_rightHaptic; + DigitalAction m_addLeftHapticClick; + DigitalAction m_addRightHapticClick; // prox Sensor DigitalAction m_proxSensor; diff --git a/src/overlaycontroller.cpp b/src/overlaycontroller.cpp index 219d02a..772f71f 100644 --- a/src/overlaycontroller.cpp +++ b/src/overlaycontroller.cpp @@ -608,6 +608,10 @@ void OverlayController::processChaperoneBindings() !( m_chaperoneTabController.disableChaperone() ), true ); } m_chaperoneTabController.setProxState( m_actions.proxState() ); + m_chaperoneTabController.addLeftHapticClick( + m_actions.addLeftHapticClick() ); + m_chaperoneTabController.addRightHapticClick( + m_actions.addRightHapticClick() ); } void OverlayController::processPushToTalkBindings() diff --git a/src/package_files/action_manifest.json b/src/package_files/action_manifest.json index 7a4798f..a42a173 100644 --- a/src/package_files/action_manifest.json +++ b/src/package_files/action_manifest.json @@ -47,6 +47,16 @@ "name": "/actions/haptic/out/HapticsRight", "type": "vibration" }, + { + "name": "/actions/haptic/in/AddLeftHapticClick", + "requirement": "optional", + "type": "boolean" + }, + { + "name": "/actions/haptic/in/AddRightHapticClick", + "requirement": "optional", + "type": "boolean" + }, { "name": "/actions/motion/in/LeftHandSpaceTurn", @@ -222,6 +232,8 @@ "/actions/haptic/out/HapticsLeft" : "Haptics Left", "/actions/haptic/out/HapticsRight" : " Haptics Right", + "/actions/haptic/in/AddLeftHapticClick" : " Add Left Haptic Click", + "/actions/haptic/in/AddRightHapticClick" : " Add Right Haptic Click", "/actions/motion/in/LeftHandSpaceTurn" : "Left Hand Space Turn", "/actions/motion/in/RightHandSpaceTurn" : "Right Hand Space Turn", diff --git a/src/tabcontrollers/ChaperoneTabController.cpp b/src/tabcontrollers/ChaperoneTabController.cpp index 575873c..4fcf8f2 100644 --- a/src/tabcontrollers/ChaperoneTabController.cpp +++ b/src/tabcontrollers/ChaperoneTabController.cpp @@ -1740,6 +1740,62 @@ void ChaperoneTabController::setLeftInputHandle( m_leftInputHandle = handle; } +void ChaperoneTabController::addLeftHapticClick( bool leftHapticClickPressed ) +{ + // detect new press + if ( leftHapticClickPressed && !m_leftHapticClickActivated ) + { + // play activation haptic sequence + vr::VRInput()->TriggerHapticVibrationAction( + m_leftActionHandle, 0.0f, 0.08f, 300.0f, 0.7f, m_leftInputHandle ); + m_leftHapticClickActivated = true; + return; + } + + // detect new release + if ( !leftHapticClickPressed && m_leftHapticClickActivated ) + { + // play deactivation haptic sequence + vr::VRInput()->TriggerHapticVibrationAction( + m_leftActionHandle, 0.0f, 0.08f, 120.0f, 0.7f, m_leftInputHandle ); + + m_leftHapticClickActivated = false; + return; + } +} + +void ChaperoneTabController::addRightHapticClick( bool rightHapticClickPressed ) +{ + // detect new press + if ( rightHapticClickPressed && !m_rightHapticClickActivated ) + { + // play activation haptic sequence + vr::VRInput()->TriggerHapticVibrationAction( m_rightActionHandle, + 0.0f, + 0.08f, + 300.0f, + 0.7f, + m_rightInputHandle ); + m_rightHapticClickActivated = true; + return; + } + + // detect new release + if ( !rightHapticClickPressed && m_rightHapticClickActivated ) + { + // play deactivation haptic sequence + vr::VRInput()->TriggerHapticVibrationAction( m_rightActionHandle, + 0.0f, + 0.08f, + 120.0f, + 0.7f, + m_rightInputHandle ); + + m_rightHapticClickActivated = false; + return; + } +} + void ChaperoneTabController::setProxState( bool value ) { if ( value ) diff --git a/src/tabcontrollers/ChaperoneTabController.h b/src/tabcontrollers/ChaperoneTabController.h index 167d4e6..7ac59d7 100644 --- a/src/tabcontrollers/ChaperoneTabController.h +++ b/src/tabcontrollers/ChaperoneTabController.h @@ -177,6 +177,8 @@ private: bool m_isHMDActive = false; bool m_isProxActive = false; bool m_HMDHasProx = false; + bool m_leftHapticClickActivated = false; + bool m_rightHapticClickActivated = false; int m_updateTicksChaperoneReload = 0; @@ -239,6 +241,10 @@ public: float getBoundsMaxY(); + // actions + void addLeftHapticClick( bool leftHapticClickPressed ); + void addRightHapticClick( bool rightHapticClickPressed ); + public slots: void setBoundsVisibility( float value, bool notify = true ); void setFadeDistance( float value, bool notify = true );