From bce80130bd0a6a11d45aa68880518c4f21d8c9af Mon Sep 17 00:00:00 2001 From: Saracen Date: Tue, 9 Apr 2019 20:57:57 +0100 Subject: [PATCH] Allow players to disable automatic falling to flight threshold. --- interface/src/avatar/MyAvatar.cpp | 4 ++++ interface/src/avatar/MyAvatar.h | 14 ++++++++++++++ interface/src/ui/PreferencesDialog.cpp | 6 ++++++ libraries/physics/src/CharacterController.cpp | 2 +- libraries/physics/src/CharacterController.h | 2 ++ 5 files changed, 27 insertions(+), 1 deletion(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 568b492b46..3e615eb6eb 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -168,6 +168,7 @@ MyAvatar::MyAvatar(QThread* thread) : _displayNameSetting(QStringList() << AVATAR_SETTINGS_GROUP_NAME << "displayName", ""), _collisionSoundURLSetting(QStringList() << AVATAR_SETTINGS_GROUP_NAME << "collisionSoundURL", QUrl(_collisionSoundURL)), _useSnapTurnSetting(QStringList() << AVATAR_SETTINGS_GROUP_NAME << "useSnapTurn", _useSnapTurn), + _useFallHeightThresholdSetting(QStringList() << AVATAR_SETTINGS_GROUP_NAME << "useFallHeightThreshold", _useFallHeightThreshold), _userHeightSetting(QStringList() << AVATAR_SETTINGS_GROUP_NAME << "userHeight", DEFAULT_AVATAR_HEIGHT), _flyingHMDSetting(QStringList() << AVATAR_SETTINGS_GROUP_NAME << "flyingHMD", _flyingPrefHMD), _movementReferenceSetting(QStringList() << AVATAR_SETTINGS_GROUP_NAME << "movementReference", _movementReference), @@ -956,6 +957,7 @@ void MyAvatar::simulate(float deltaTime, bool inView) { bool collisionlessAllowed = zoneInteractionProperties.second; _characterController.setZoneFlyingAllowed(zoneAllowsFlying || !isPhysicsEnabled); _characterController.setComfortFlyingAllowed(_enableFlying); + _characterController.setUseFallHeightThreshold(_useFallHeightThreshold); _characterController.setCollisionlessAllowed(collisionlessAllowed); } @@ -1296,6 +1298,7 @@ void MyAvatar::saveData() { _displayNameSetting.set(_displayName); _collisionSoundURLSetting.set(_collisionSoundURL); _useSnapTurnSetting.set(_useSnapTurn); + _useFallHeightThresholdSetting.set(_useFallHeightThreshold); _userHeightSetting.set(getUserHeight()); _flyingHMDSetting.set(getFlyingHMDPref()); _movementReferenceSetting.set(getMovementReference()); @@ -1898,6 +1901,7 @@ void MyAvatar::loadData() { setDisplayName(_displayNameSetting.get()); setCollisionSoundURL(_collisionSoundURLSetting.get(QUrl(DEFAULT_AVATAR_COLLISION_SOUND_URL)).toString()); setSnapTurn(_useSnapTurnSetting.get()); + setUseFallHeightThreshold(_useFallHeightThresholdSetting.get()); setDominantHand(_dominantHandSetting.get(DOMINANT_RIGHT_HAND).toLower()); setStrafeEnabled(_strafeEnabledSetting.get(DEFAULT_STRAFE_ENABLED)); setHmdAvatarAlignmentType(_hmdAvatarAlignmentTypeSetting.get(DEFAULT_HMD_AVATAR_ALIGNMENT_TYPE).toLower()); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 804e2687e7..ab9e1c194d 100755 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -759,6 +759,18 @@ public: * @param {number} index */ Q_INVOKABLE void setControlScheme(int index) { _controlSchemeIndex = (index >= 0 && index <= 2) ? index : 0; } + + /**jsdoc + * @function MyAvatar.useFallHeightThreshold + * @returns {boolean} + */ + Q_INVOKABLE bool useFallHeightThreshold() const { return _useFallHeightThreshold; } + /**jsdoc + * @function MyAvatar.setUseFallHeightThreshold + * @param {boolean} on + */ + Q_INVOKABLE void setUseFallHeightThreshold(bool on) { _useFallHeightThreshold = on; } + /**jsdoc * Sets the avatar's dominant hand. * @function MyAvatar.setDominantHand @@ -2442,6 +2454,7 @@ private: ThreadSafeValueCache _prefOverrideAnimGraphUrl; QUrl _fstAnimGraphOverrideUrl; bool _useSnapTurn { true }; + bool _useFallHeightThreshold{ true }; ThreadSafeValueCache _dominantHand { DOMINANT_RIGHT_HAND }; ThreadSafeValueCache _hmdAvatarAlignmentType { DEFAULT_HMD_AVATAR_ALIGNMENT_TYPE }; ThreadSafeValueCache _strafeEnabled{ DEFAULT_STRAFE_ENABLED }; @@ -2637,6 +2650,7 @@ private: Setting::Handle _displayNameSetting; Setting::Handle _collisionSoundURLSetting; Setting::Handle _useSnapTurnSetting; + Setting::Handle _useFallHeightThresholdSetting; Setting::Handle _userHeightSetting; Setting::Handle _flyingHMDSetting; Setting::Handle _movementReferenceSetting; diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index 75279ef889..4b610cdb73 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -304,6 +304,12 @@ void setupPreferences() { preference->setItems(items); preferences->addPreference(preference); } + { + auto getter = [myAvatar]() -> bool { return myAvatar->useFallHeightThreshold(); }; + auto setter = [myAvatar](bool value) { myAvatar->setUseFallHeightThreshold(value); }; + auto preference = new CheckPreference(VR_MOVEMENT, "Use Fall Height Threshold", getter, setter); + preferences->addPreference(preference); + } { auto getter = [myAvatar]()->int { return myAvatar->getControlScheme(); }; auto setter = [myAvatar](int index) { myAvatar->setControlScheme(index); }; diff --git a/libraries/physics/src/CharacterController.cpp b/libraries/physics/src/CharacterController.cpp index 247550a9d0..9e5b7f8336 100755 --- a/libraries/physics/src/CharacterController.cpp +++ b/libraries/physics/src/CharacterController.cpp @@ -791,7 +791,7 @@ void CharacterController::updateState() { SET_STATE(State::Hover, "double jump button"); } else if (_comfortFlyingAllowed && (jumpButtonHeld || vertTargetSpeedIsNonZero) && (now - _jumpButtonDownStartTime) > JUMP_TO_HOVER_PERIOD) { SET_STATE(State::Hover, "jump button held"); - } else if ((!rayHasHit && !_hasSupport) || _floorDistance > _scaleFactor * DEFAULT_AVATAR_FALL_HEIGHT) { + } else if (_useFallHeightThreshold && ((!rayHasHit && !_hasSupport) || _floorDistance > _scaleFactor * DEFAULT_AVATAR_FALL_HEIGHT)) { // Transition to hover if there's no ground beneath us or we are above the fall threshold, regardless of _comfortFlyingAllowed SET_STATE(State::Hover, "above fall threshold"); } diff --git a/libraries/physics/src/CharacterController.h b/libraries/physics/src/CharacterController.h index c46c9c8361..c1831fa7ec 100755 --- a/libraries/physics/src/CharacterController.h +++ b/libraries/physics/src/CharacterController.h @@ -131,6 +131,7 @@ public: void setZoneFlyingAllowed(bool value) { _zoneFlyingAllowed = value; } void setComfortFlyingAllowed(bool value) { _comfortFlyingAllowed = value; } + void setUseFallHeightThreshold(bool value) { _useFallHeightThreshold = value; } void setCollisionlessAllowed(bool value); void setPendingFlagsUpdateCollisionMask(){ _pendingFlags |= PENDING_FLAG_UPDATE_COLLISION_MASK; } @@ -215,6 +216,7 @@ protected: bool _zoneFlyingAllowed { true }; bool _comfortFlyingAllowed { true }; + bool _useFallHeightThreshold{ true }; bool _collisionlessAllowed { true }; bool _collisionless { false };