Skip to content

Instantly share code, notes, and snippets.

@mvlabat
Created December 18, 2018 18:27
Show Gist options
  • Save mvlabat/b8c318015fcf06968a0b5df59b77a883 to your computer and use it in GitHub Desktop.
Save mvlabat/b8c318015fcf06968a0b5df59b77a883 to your computer and use it in GitHub Desktop.
const PLAYER_SPEED: f64 = 50.0;
const TOI_DISTANCE_THRESHOLD: f64 = 0.001;
#[wasm_bindgen(js_name = processPlayersMovement)]
pub fn process_players_movement(time_delta: f64, players: &js_sys::Iterator, objects: &js_sys::Iterator) {
for player_object in players {
let player_object = player_object.unwrap();
let player = player_object.dyn_ref::<muddle_types::Player>();
if player.is_none() {
continue;
}
let player = player.unwrap();
let player_shape = object_shape(&player_object);
let player_direction: Vector2 = player.get_movement_direction().into();
if player_direction.norm() < 0.01 {
continue;
}
let player_velocity = player_direction * PLAYER_SPEED;
let player_position: Vector2 = player.placeable_object_interface().get_position().into();
let player_isometry = Isometry2::new(player_position, nalgebra::zero());
let toi = objects.into_iter().fold(::std::f64::MAX, |min_t, object| {
let object = object.unwrap();
let shape = object_shape(&object);
let placeable_object = placeable_object_interface(&object);
let position: Vector2 = placeable_object.get_position().into();
let isometry = Isometry2::new(position, nalgebra::zero());
let toi = query::time_of_impact(
&player_isometry,
&player_velocity,
&*player_shape,
&isometry,
&nalgebra::zero(),
&*shape,
);
match toi {
Some(t) if t < min_t => t,
_ => min_t,
}
});
if toi != ::std::f64::MAX {
console_log!("toi: {}", toi);
}
let new_position = if toi > time_delta + TOI_DISTANCE_THRESHOLD {
player_position + player_velocity * time_delta
} else if toi > TOI_DISTANCE_THRESHOLD {
player_position + player_velocity * (toi - TOI_DISTANCE_THRESHOLD)
} else {
player_position
};
player
.placeable_object_interface()
.set_position(new_position.into());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment