mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Made collision detection cheaper, fixed snapping bug, somewhat nerfed rolling
This commit is contained in:
parent
d7af11e9c1
commit
6444ba1933
@ -38,7 +38,7 @@ pub struct DeltaTime(pub f32);
|
|||||||
/// too fast, we'd skip important physics events like collisions. This constant determines the
|
/// too fast, we'd skip important physics events like collisions. This constant determines the
|
||||||
/// upper limit. If delta time exceeds this value, the game's physics will begin to produce time
|
/// upper limit. If delta time exceeds this value, the game's physics will begin to produce time
|
||||||
/// lag. Ideally, we'd avoid such a situation.
|
/// lag. Ideally, we'd avoid such a situation.
|
||||||
const MAX_DELTA_TIME: f32 = 0.1;
|
const MAX_DELTA_TIME: f32 = 1.0;
|
||||||
|
|
||||||
pub struct Changes {
|
pub struct Changes {
|
||||||
pub new_chunks: HashSet<Vec2<i32>>,
|
pub new_chunks: HashSet<Vec2<i32>>,
|
||||||
|
@ -15,7 +15,7 @@ const HUMANOID_SPEED: f32 = 120.0;
|
|||||||
const HUMANOID_AIR_ACCEL: f32 = 10.0;
|
const HUMANOID_AIR_ACCEL: f32 = 10.0;
|
||||||
const HUMANOID_AIR_SPEED: f32 = 100.0;
|
const HUMANOID_AIR_SPEED: f32 = 100.0;
|
||||||
const HUMANOID_JUMP_ACCEL: f32 = 16.0;
|
const HUMANOID_JUMP_ACCEL: f32 = 16.0;
|
||||||
const ROLL_ACCEL: f32 = 160.0;
|
const ROLL_ACCEL: f32 = 120.0;
|
||||||
const ROLL_SPEED: f32 = 550.0;
|
const ROLL_SPEED: f32 = 550.0;
|
||||||
const GLIDE_ACCEL: f32 = 15.0;
|
const GLIDE_ACCEL: f32 = 15.0;
|
||||||
const GLIDE_SPEED: f32 = 45.0;
|
const GLIDE_SPEED: f32 = 45.0;
|
||||||
@ -28,19 +28,11 @@ const GLIDE_ANTIGRAV: f32 = 9.81 * 3.95;
|
|||||||
// damp = linear damping
|
// damp = linear damping
|
||||||
// Friction is a type of damping.
|
// Friction is a type of damping.
|
||||||
fn integrate_forces(dt: f32, mut lv: Vec3<f32>, damp: f32) -> Vec3<f32> {
|
fn integrate_forces(dt: f32, mut lv: Vec3<f32>, damp: f32) -> Vec3<f32> {
|
||||||
lv.z -= (GRAVITY * dt).max(-50.0);
|
lv.z = (lv.z - GRAVITY * dt).max(-50.0);
|
||||||
|
|
||||||
let mut linear_damp = 1.0 - dt * damp;
|
let linear_damp = (1.0 - dt * damp).max(0.0);
|
||||||
|
|
||||||
if linear_damp < 0.0
|
lv * linear_damp
|
||||||
// reached zero in the given time
|
|
||||||
{
|
|
||||||
linear_damp = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
lv *= linear_damp;
|
|
||||||
|
|
||||||
lv
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This system applies forces and calculates new positions and velocities.
|
/// This system applies forces and calculates new positions and velocities.
|
||||||
@ -189,6 +181,7 @@ impl<'a> System<'a> for Sys {
|
|||||||
false
|
false
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let was_on_ground = on_grounds.get(entity).is_some();
|
||||||
on_grounds.remove(entity); // Assume we're in the air - unless we can prove otherwise
|
on_grounds.remove(entity); // Assume we're in the air - unless we can prove otherwise
|
||||||
pos.0.z -= 0.0001; // To force collision with the floor
|
pos.0.z -= 0.0001; // To force collision with the floor
|
||||||
|
|
||||||
@ -251,7 +244,7 @@ impl<'a> System<'a> for Sys {
|
|||||||
let resolve_dir = -dir.map(|e| if e.abs() == max_axis { e } else { 0.0 });
|
let resolve_dir = -dir.map(|e| if e.abs() == max_axis { e } else { 0.0 });
|
||||||
|
|
||||||
// When the resolution direction is pointing upwards, we must be on the ground
|
// When the resolution direction is pointing upwards, we must be on the ground
|
||||||
if resolve_dir.z > 0.0 {
|
if resolve_dir.z > 0.0 && vel.0.z <= 0.0 {
|
||||||
on_ground = true;
|
on_ground = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -282,6 +275,7 @@ impl<'a> System<'a> for Sys {
|
|||||||
} else if collision_with(pos.0 - Vec3::unit_z() * 1.0, near_iter.clone())
|
} else if collision_with(pos.0 - Vec3::unit_z() * 1.0, near_iter.clone())
|
||||||
&& vel.0.z < 0.0
|
&& vel.0.z < 0.0
|
||||||
&& vel.0.z > -1.0
|
&& vel.0.z > -1.0
|
||||||
|
&& was_on_ground
|
||||||
{
|
{
|
||||||
pos.0.z = (pos.0.z - 0.05).floor();
|
pos.0.z = (pos.0.z - 0.05).floor();
|
||||||
on_grounds.insert(entity, OnGround);
|
on_grounds.insert(entity, OnGround);
|
||||||
|
Loading…
Reference in New Issue
Block a user