summaryrefslogtreecommitdiffstats
path: root/src/game/shared
diff options
context:
space:
mode:
authoruntodesu <kirill@untode.su>2025-12-26 18:09:35 +0500
committeruntodesu <kirill@untode.su>2025-12-26 18:09:35 +0500
commitf755a1eeb45262fe3aea64efc3914709d572afcc (patch)
treebb08dff89a7ddd446a4363edabac8f9ee0514234 /src/game/shared
parenteebc2b776717f18e4a24af39b0209afa8eb7404f (diff)
downloadvoxelius-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.cc15
-rw-r--r--src/game/shared/entity/velocity.hh9
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