From 997cff04d164963fa0e07ba1934938eb92dc76f0 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 19 May 2024 09:17:43 +0300 Subject: [PATCH] physics-related fixes --- src/objects/Player.cpp | 13 +++++++------ src/physics/PhysicsSolver.cpp | 12 +++++++----- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/objects/Player.cpp b/src/objects/Player.cpp index edd8acec..ba8ccce5 100644 --- a/src/objects/Player.cpp +++ b/src/objects/Player.cpp @@ -35,9 +35,10 @@ Player::~Player() { } void Player::updateInput( - Level* level, - PlayerInput& input, - float delta) { + Level* level, + PlayerInput& input, + float delta +) { bool crouch = input.shift && hitbox->grounded && !input.sprint; float speed = this->speed; if (flight){ @@ -76,9 +77,9 @@ void Player::updateInput( hitbox->velocity.z += dir.z * speed * delta * 9; } - float vel = std::max(glm::length(hitbox->velocity * 0.25f), 1.0f); - int substeps = int(delta * vel * 1000); - substeps = std::min(100, std::max(1, substeps)); + float vel = glm::length(hitbox->velocity); + int substeps = int(delta * vel * 20); + substeps = std::min(100, std::max(2, substeps)); level->physics->step( level->chunks.get(), hitbox.get(), diff --git a/src/physics/PhysicsSolver.cpp b/src/physics/PhysicsSolver.cpp index 7c704196..6760aa89 100644 --- a/src/physics/PhysicsSolver.cpp +++ b/src/physics/PhysicsSolver.cpp @@ -21,16 +21,17 @@ void PhysicsSolver::step( float gravityScale, bool collisions ) { - float dt = delta / float(substeps); + float dt = delta / static_cast(substeps); float linear_damping = hitbox->linear_damping; float s = 2.0f/BLOCK_AABB_GRID; + + const glm::vec3& half = hitbox->halfsize; + glm::vec3& pos = hitbox->position; + glm::vec3& vel = hitbox->velocity; bool prevGrounded = hitbox->grounded; hitbox->grounded = false; for (uint i = 0; i < substeps; i++) { - glm::vec3& pos = hitbox->position; - glm::vec3& half = hitbox->halfsize; - glm::vec3& vel = hitbox->velocity; float px = pos.x; float pz = pos.z; @@ -41,7 +42,8 @@ void PhysicsSolver::step( } vel.x *= glm::max(0.0f, 1.0f - dt * linear_damping); vel.z *= glm::max(0.0f, 1.0f - dt * linear_damping); - pos += vel * dt; + + pos += vel * dt + gravity * gravityScale * dt * dt * 0.5f; if (shifting && hitbox->grounded){ float y = (pos.y-half.y-E);