Skip to content

Commit

Permalink
update velocity clamping, stronger typing, more accurate physics inte…
Browse files Browse the repository at this point in the history
…gration
  • Loading branch information
swagween committed Jan 30, 2024
1 parent 4952586 commit ae4abd3
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 29 deletions.
24 changes: 9 additions & 15 deletions DogTales/src/components/physics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,22 @@

namespace component {

Physics::Physics(glm::vec2 friction, float gravity, float mass) : m_friction(friction), m_gravity(gravity), m_mass(mass) {}

void Physics::tick(bave::Seconds const dt) {
void Physics::tick(bave::Seconds dt) {
static constexpr bave::Seconds ft{0.005}; // 5ms

if (dt.count() > tick_limit) { return; } // return for unexpected dt values, particularly during the beginning of the state
if (dt.count() > tick_limit_v.count()) { return; } // return for unexpected dt values, particularly during the beginning of the state

for (bave::Seconds t{}; t <= dt; t += ft) {
integrate(t.count());
}
for (dt += m_residue; dt > ft; dt -= ft) { integrate(ft); }
m_residue = dt;
}

void Physics::integrate(float dt) {
m_acceleration.y += m_gravity * dt;
m_velocity = (m_velocity + (m_acceleration / m_mass) * dt) * m_friction;
void Physics::integrate(bave::Seconds dt) {
acceleration.y += gravity * dt.count();
velocity = (velocity + (acceleration / mass) * dt.count()) * friction;

m_velocity.x = m_velocity.x > max_velocity.x ? max_velocity.x : m_velocity.x;
m_velocity.y = m_velocity.y > max_velocity.y ? max_velocity.y : m_velocity.y;
m_velocity.x = m_velocity.x < -max_velocity.x ? -max_velocity.x : m_velocity.x;
m_velocity.y = m_velocity.y < -max_velocity.y ? -max_velocity.y : m_velocity.y;
velocity = glm::clamp(velocity, -max_velocity_v, max_velocity_v);

m_position += m_velocity * dt;
position += velocity * dt.count();
}

} // namespace component
30 changes: 18 additions & 12 deletions DogTales/src/components/physics.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,31 @@

namespace component {

static constexpr glm::vec2 max_velocity{1000.f, 1000.f};
static constexpr float tick_limit{0.03f}; //this should possibly go somewhere else and be globally accessible
constexpr glm::vec2 default_friction{0.999f};
constexpr float default_gravity{-1000.f};
constexpr float default_mass{1.f};

constexpr glm::vec2 max_velocity_v{1000.f};
constexpr bave::Seconds tick_limit_v{100ms};

class Physics {

bave::Seconds m_residue{};

public:

glm::vec2 m_position{};
glm::vec2 m_velocity{};
glm::vec2 m_acceleration{};

glm::vec2 m_friction{};
float m_gravity{};
float m_mass{};
Physics(glm::vec2 fric = default_friction, float grav = default_gravity, float m = default_mass) : friction(fric), gravity(grav), mass(m) {}

glm::vec2 position{};
glm::vec2 velocity{};
glm::vec2 acceleration{};

Physics(glm::vec2 friction, float gravity, float mass = 1.f);
glm::vec2 friction{};
float gravity{};
float mass{};

void tick(bave::Seconds const dt);
void integrate(float dt);
void tick(bave::Seconds dt);
void integrate(bave::Seconds dt);
};

} // namespace component
2 changes: 1 addition & 1 deletion DogTales/src/player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Player::Player(glm::vec2 const world_space) : m_world_space(world_space) { m_spr
void Player::tick(bave::Seconds const dt) {

m_physics.tick(dt);
m_sprite.transform.position = m_physics.m_position;
m_sprite.transform.position = m_physics.position;

handle_wall_collision();
}
Expand Down
2 changes: 1 addition & 1 deletion DogTales/src/player.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class Player {
bave::Sprite m_sprite{};

glm::vec2 m_vel{speed_v};
component::Physics m_physics{{0.999f, 0.999f}, -1000.f};
component::Physics m_physics{};

void handle_wall_collision();

Expand Down

0 comments on commit ae4abd3

Please sign in to comment.