From 51d63a4152509b2fb0924cbb2185952f71d8eed1 Mon Sep 17 00:00:00 2001 From: Petr Mikheev Date: Thu, 24 Dec 2020 03:39:59 +0100 Subject: [PATCH] Fix minor bug: mSmoothedSpeed is not updating in first person mode, that leads to an incorrect value after switching to first person mode and back. Additional refactoring: move `setSideMovementAngle` from camera.cpp to character.cpp as this logic shouldn't belong to Camera. --- apps/openmw/mwmechanics/character.cpp | 9 +++++++-- apps/openmw/mwrender/camera.cpp | 3 --- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 1784869651..8d27d78ef6 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -1965,7 +1965,7 @@ void CharacterController::update(float duration, bool animationOnly) movementSettings.mSpeedFactor *= 2.f; static const bool smoothMovement = Settings::Manager::getBool("smooth movement", "Game"); - if (smoothMovement && !isFirstPersonPlayer) + if (smoothMovement) { static const float playerTurningCoef = 1.0 / std::max(0.01f, Settings::Manager::getFloat("smooth movement player turning delay", "Game")); float angle = mPtr.getRefData().getPosition().rot[2]; @@ -1975,7 +1975,9 @@ void CharacterController::update(float duration, bool animationOnly) float deltaLen = delta.length(); float maxDelta; - if (std::abs(speedDelta) < deltaLen / 2) + if (isFirstPersonPlayer) + maxDelta = 1; + else if (std::abs(speedDelta) < deltaLen / 2) // Turning is smooth for player and less smooth for NPCs (otherwise NPC can miss a path point). maxDelta = duration * (isPlayer ? playerTurningCoef : 6.f); else if (isPlayer && speedDelta < -deltaLen / 2) @@ -2013,7 +2015,10 @@ void CharacterController::update(float duration, bool animationOnly) bool canMove = cls.getMaxSpeed(mPtr) > 0; static const bool turnToMovementDirection = Settings::Manager::getBool("turn to movement direction", "Game"); if (!turnToMovementDirection || isFirstPersonPlayer) + { movementSettings.mIsStrafing = std::abs(vec.x()) > std::abs(vec.y()) * 2; + stats.setSideMovementAngle(0); + } else if (canMove) { float targetMovementAngle = vec.y() >= 0 ? std::atan2(-vec.x(), vec.y()) : std::atan2(vec.x(), -vec.y()); diff --git a/apps/openmw/mwrender/camera.cpp b/apps/openmw/mwrender/camera.cpp index b964eacffb..12e6ef3ce9 100644 --- a/apps/openmw/mwrender/camera.cpp +++ b/apps/openmw/mwrender/camera.cpp @@ -356,9 +356,6 @@ namespace MWRender else mViewModeToggleQueued = false; - if (mTrackingPtr.getClass().isActor()) - mTrackingPtr.getClass().getCreatureStats(mTrackingPtr).setSideMovementAngle(0); - mFirstPersonView = !mFirstPersonView; updateStandingPreviewMode(); instantTransition();