Collision fixes, better camera in build mode

This commit is contained in:
Joshua Barretto 2019-08-06 16:00:14 +01:00
parent cbae0d753f
commit 73a44d0fb1
2 changed files with 23 additions and 4 deletions

View File

@ -146,8 +146,10 @@ impl<'a> System<'a> for Sys {
for _ in 0..increments as usize {
pos.0 += pos_delta / increments;
const MAX_ATTEMPTS: usize = 16;
// While the player is colliding with the terrain...
while collision_with(pos.0, near_iter.clone()) && attempts < 16 {
while collision_with(pos.0, near_iter.clone()) && attempts < MAX_ATTEMPTS {
// Calculate the player's AABB
let player_aabb = Aabb {
min: pos.0 + Vec3::new(-player_rad, -player_rad, 0.0),
@ -180,9 +182,11 @@ impl<'a> System<'a> for Sys {
})
// Find the maximum of the minimum collision axes (this bit is weird, trust me that it works)
.max_by_key(|(_, block_aabb)| {
((player_aabb.collision_vector_with_aabb(*block_aabb) / vel.0)
((player_aabb
.collision_vector_with_aabb(*block_aabb)
.map(|e| e.abs())
.reduce_partial_min()
.product()
+ block_aabb.min.z)
* 1_000_000.0) as i32
})
.expect("Collision detected, but no colliding blocks found!");
@ -240,6 +244,11 @@ impl<'a> System<'a> for Sys {
attempts += 1;
}
if attempts == MAX_ATTEMPTS {
pos.0 = old_pos;
break;
}
}
if on_ground {

View File

@ -127,8 +127,18 @@ impl Scene {
// Alter camera position to match player.
let tilt = self.camera.get_orientation().y;
let dist = self.camera.get_distance();
let up = if client
.state()
.read_storage::<comp::CanBuild>()
.get(client.entity())
.is_some()
{
1.5
} else {
1.2
};
self.camera.set_focus_pos(
player_pos + Vec3::unit_z() * (1.2 + dist * 0.15 - tilt.min(0.0) * dist * 0.75),
player_pos + Vec3::unit_z() * (up + dist * 0.15 - tilt.min(0.0) * dist * 0.75),
);
// Tick camera for interpolation.