diff options
| author | untodesu <kirill@untode.su> | 2025-12-26 18:09:35 +0500 |
|---|---|---|
| committer | untodesu <kirill@untode.su> | 2025-12-26 18:09:35 +0500 |
| commit | f755a1eeb45262fe3aea64efc3914709d572afcc (patch) | |
| tree | bb08dff89a7ddd446a4363edabac8f9ee0514234 /src/game/shared | |
| parent | eebc2b776717f18e4a24af39b0209afa8eb7404f (diff) | |
| download | voxelius-f755a1eeb45262fe3aea64efc3914709d572afcc.tar.bz2 voxelius-f755a1eeb45262fe3aea64efc3914709d572afcc.zip | |
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)
Diffstat (limited to 'src/game/shared')
| -rw-r--r-- | src/game/shared/entity/collision.cc | 15 | ||||
| -rw-r--r-- | src/game/shared/entity/velocity.hh | 9 |
2 files changed, 16 insertions, 8 deletions
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<int>(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<Gravity>(entity)) { if(vertical_move == math::sign<int>(dimension->get_gravity())) { + spdlog::info("grounded"); dimension->entities.emplace_or_replace<Grounded>(entity, Grounded { surface }); } else { @@ -179,7 +180,7 @@ void Collision::fixed_update(Dimension* dimension) dimension->entities.remove<Grounded>(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 |
