From f755a1eeb45262fe3aea64efc3914709d572afcc Mon Sep 17 00:00:00 2001 From: untodesu Date: Fri, 26 Dec 2025 18:09:35 +0500 Subject: Add interpolation to Velocity component; fixes #20 - Also disabled snapping to grid for sideways movement as it was somehow messing with player_move code and was making you slide on voxels as if you were on ice (not good) --- src/game/shared/entity/collision.cc | 15 ++++++++------- src/game/shared/entity/velocity.hh | 9 ++++++++- 2 files changed, 16 insertions(+), 8 deletions(-) (limited to 'src/game/shared') diff --git a/src/game/shared/entity/collision.cc b/src/game/shared/entity/collision.cc index 1be1ded..8da6405 100644 --- a/src/game/shared/entity/collision.cc +++ b/src/game/shared/entity/collision.cc @@ -16,7 +16,7 @@ #include "shared/globals.hh" static int vgrid_collide(const Dimension* dimension, int d, Collision& collision, Transform& transform, Velocity& velocity, - VoxelMaterial& touch_surface) + VoxelMaterial& touch_surface, bool enable_snapping_to_grid) { auto movespeed = globals::fixed_frametime * velocity.value[d]; auto movesign = math::sign(movespeed); @@ -135,15 +135,15 @@ static int vgrid_collide(const Dimension* dimension, int d, Collision& collision snap_to_closest_vbox = true; } - if(snap_to_closest_vbox) { + if(snap_to_closest_vbox && enable_snapping_to_grid) { auto vbox_center = 0.5f * closest_vbox.min[d] + 0.5f * closest_vbox.max[d]; auto vbox_halfsize = 0.5f * closest_vbox.max[d] - 0.5f * closest_vbox.min[d]; if(movesign < 0) { - transform.local[d] = vbox_center + vbox_halfsize + ref_halfsize[d] - ref_center[d] + 0.01f; + transform.local[d] = vbox_center + vbox_halfsize + ref_halfsize[d] - ref_center[d] + 0.01f * globals::fixed_frametime; } else { - transform.local[d] = vbox_center - vbox_halfsize - ref_halfsize[d] - ref_center[d] - 0.01f; + transform.local[d] = vbox_center - vbox_halfsize - ref_halfsize[d] - ref_center[d] - 0.01f * globals::fixed_frametime; } } @@ -162,10 +162,11 @@ void Collision::fixed_update(Dimension* dimension) for(auto [entity, collision, transform, velocity] : group.each()) { auto surface = VMAT_UNKNOWN; - auto vertical_move = vgrid_collide(dimension, 1, collision, transform, velocity, surface); + auto vertical_move = vgrid_collide(dimension, 1, collision, transform, velocity, surface, true); if(dimension->entities.any_of(entity)) { if(vertical_move == math::sign(dimension->get_gravity())) { + spdlog::info("grounded"); dimension->entities.emplace_or_replace(entity, Grounded { surface }); } else { @@ -179,7 +180,7 @@ void Collision::fixed_update(Dimension* dimension) dimension->entities.remove(entity); } - vgrid_collide(dimension, 0, collision, transform, velocity, surface); - vgrid_collide(dimension, 2, collision, transform, velocity, surface); + vgrid_collide(dimension, 0, collision, transform, velocity, surface, false); + vgrid_collide(dimension, 2, collision, transform, velocity, surface, false); } } diff --git a/src/game/shared/entity/velocity.hh b/src/game/shared/entity/velocity.hh index 69fce9e..0266bd0 100644 --- a/src/game/shared/entity/velocity.hh +++ b/src/game/shared/entity/velocity.hh @@ -2,7 +2,7 @@ class Dimension; -struct Velocity final { +struct Velocity { glm::fvec3 value; public: @@ -11,3 +11,10 @@ public: // NOTE: This system was previously called inertial static void fixed_update(Dimension* dimension); }; + +namespace client +{ +// Client-side only - interpolated and previous velocity +struct VelocityIntr final : public Velocity {}; +struct VelocityPrev final : public Velocity {}; +} // namespace client -- cgit