From dbe2e0da8e3563739f558a20ba343886ae7e6049 Mon Sep 17 00:00:00 2001 From: tovjemam Date: Fri, 5 Jun 2026 23:30:24 +0200 Subject: [PATCH] Fix inconsistent camera/character yaw, make character speed modifiable --- src/game/character.cpp | 26 +++++++++++++------------- src/game/character.hpp | 13 +++++++++---- src/game/human_character.cpp | 2 +- src/gameview/characterview.cpp | 4 ++-- src/gameview/client_session.cpp | 2 +- 5 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/game/character.cpp b/src/game/character.cpp index 9ad36c7..b4d1d9e 100644 --- a/src/game/character.cpp +++ b/src/game/character.cpp @@ -37,9 +37,8 @@ void game::Character::Update() Super::Update(); SyncTransformFromController(); - root_.UpdateMatrix(); - UpdateMovement(); + root_.UpdateMatrix(); sync_current_ = 1 - sync_current_; UpdateSyncState(); @@ -147,22 +146,21 @@ void game::Character::SyncTransformFromController() void game::Character::UpdateMovement() { constexpr float dt = 1.0f / 25.0f; - constexpr float running_mult = 3.0f; bool walking = false; bool running = false; glm::vec2 movedir(0.0f); if (in_ & (1 << CIN_FORWARD)) - movedir.x += 1.0f; + movedir.y += 1.0f; if (in_ & (1 << CIN_BACKWARD)) - movedir.x -= 1.0f; - - if (in_ & (1 << CIN_RIGHT)) movedir.y -= 1.0f; + if (in_ & (1 << CIN_RIGHT)) + movedir.x -= 1.0f; + if (in_ & (1 << CIN_LEFT)) - movedir.y += 1.0f; + movedir.x += 1.0f; glm::vec3 walkdir(0.0f); @@ -173,17 +171,19 @@ void game::Character::UpdateMovement() if (in_ & (1 << CIN_SPRINT)) running = true; - float target_yaw = forward_yaw_ + std::atan2(movedir.y, movedir.x); - Turn(yaw_, target_yaw, 8.0f * dt); + float target_yaw = forward_yaw_ + std::atan2(movedir.x, movedir.y); + Turn(yaw_, target_yaw, turn_speed_ * dt); - glm::vec3 forward_dir(glm::cos(yaw_), glm::sin(yaw_), 0.0f); + glm::vec3 forward_dir(-glm::sin(yaw_), glm::cos(yaw_), 0.0f); walkdir = forward_dir * walk_speed_ * dt; if (running) - walkdir *= running_mult; + walkdir *= run_speed_mult_; } + root_.local.rotation = glm::angleAxis(yaw_, glm::vec3(0.0f, 0.0f, 1.0f)); + if (controller_) { auto& bt_character = controller_->GetBtController(); @@ -200,7 +200,7 @@ void game::Character::UpdateMovement() MoveToward(animstate_.loco_blend, run_blend_target, dt * 2.0f); float anim_speed = glm::mix(0.5f, 1.5f, UnMix(0.0f, 0.5f, animstate_.loco_blend)); if (running) - anim_speed *= running_mult; + anim_speed *= run_speed_mult_; animstate_.loco_phase = glm::mod(animstate_.loco_phase + anim_speed * dt, 1.0f); } diff --git a/src/game/character.hpp b/src/game/character.hpp index 72d8cb8..8277d1d 100644 --- a/src/game/character.hpp +++ b/src/game/character.hpp @@ -71,12 +71,14 @@ public: void SetPosition(const glm::vec3& position); + + ~Character() override = default; + +protected: void SetIdleAnim(const std::string& anim_name); void SetWalkAnim(const std::string& anim_name); void SetRunAnim(const std::string& anim_name); - ~Character() override = default; - private: void SyncControllerTransform(); void SyncTransformFromController(); @@ -88,6 +90,11 @@ private: assets::AnimIdx GetAnim(const std::string& name) const; +protected: + float turn_speed_ = 8.0f; + float walk_speed_ = 2.0f; + float run_speed_mult_ = 3.0f; + private: CharacterTuning tuning_; @@ -103,8 +110,6 @@ private: float yaw_ = 0.0f; float forward_yaw_ = 0.0f; - float walk_speed_ = 2.0f; - SkeletonInstance sk_; CharacterAnimState animstate_; diff --git a/src/game/human_character.cpp b/src/game/human_character.cpp index d184ace..c195137 100644 --- a/src/game/human_character.cpp +++ b/src/game/human_character.cpp @@ -29,7 +29,7 @@ void game::HumanCharacter::SetRideable(Rideable* rideable, size_t seat_idx) Attach(rideable->GetEntity().GetEntNum()); SetIdleAnim((rideable->GetRideableType() == RIDEABLE_VEHICLE && seat_idx == 0) ? "vehicle_drive" : "vehicle_passenger"); - SetYaw(rideable->GetRideableType() == RIDEABLE_VEHICLE ? 0.5f * glm::pi() : 1.0f * glm::pi()); + SetYaw(0.0f); } else { diff --git a/src/gameview/characterview.cpp b/src/gameview/characterview.cpp index 251398e..b5501a5 100644 --- a/src/gameview/characterview.cpp +++ b/src/gameview/characterview.cpp @@ -180,8 +180,8 @@ bool game::view::CharacterView::ReadState(net::InMessage* msg) return false; net::DecodePosition(sync_.pos, new_state.trans.position); - new_state.trans.rotation = glm::rotate(glm::quat(1.0f, 0.0f, 0.0f, 0.0f), - sync_.yaw.Decode() + glm::pi() * 0.5f, glm::vec3(0, 0, 1)); + new_state.trans.rotation = + glm::rotate(glm::quat(1.0f, 0.0f, 0.0f, 0.0f), sync_.yaw.Decode(), glm::vec3(0, 0, 1)); } if (fields & CSF_IDLE_ANIM) diff --git a/src/gameview/client_session.cpp b/src/gameview/client_session.cpp index dc94ecb..6c66fc4 100644 --- a/src/gameview/client_session.cpp +++ b/src/gameview/client_session.cpp @@ -131,7 +131,7 @@ void game::view::ClientSession::GetViewInfo(glm::vec3& eye, glm::mat4& view) con float yaw_sin = glm::sin(yaw_); float pitch_cos = glm::cos(pitch_); float pitch_sin = glm::sin(pitch_); - glm::vec3 dir(yaw_cos * pitch_cos, yaw_sin * pitch_cos, pitch_sin); + glm::vec3 dir(-yaw_sin * pitch_cos, yaw_cos * pitch_cos, pitch_sin); glm::vec3 end = start - dir * distance;