use crate::prelude::*;
use beet_core::prelude::*;
pub fn seek_impulse(
position: &Vec3,
velocity: &Velocity,
target_position: &Vec3,
max_speed: MaxSpeed,
arrive_radius: Option<ArriveRadius>,
) -> Impulse {
let desired_speed =
arrive_speed(position, target_position, max_speed, arrive_radius);
let delta_position = *target_position - *position;
let desired_velocity = delta_position.normalize_or_zero() * *desired_speed;
let impulse = desired_velocity - **velocity;
Impulse(impulse)
}
pub fn flee_impulse(
position: &Vec3,
velocity: &Velocity,
target_position: &Vec3,
max_speed: MaxSpeed,
) -> Impulse {
let mut impulse =
seek_impulse(position, velocity, target_position, max_speed, None);
*impulse *= -1.0;
impulse
}
pub fn pursue_impulse(
position: &Vec3,
velocity: &Velocity,
target_position: &Vec3,
target_velocity: &Velocity,
max_speed: MaxSpeed,
arrive_radius: Option<ArriveRadius>,
) -> Impulse {
let delta_position = *target_position - *position;
let distance_to_target = delta_position.length();
let next_target_position =
*target_position + **target_velocity * distance_to_target;
seek_impulse(
position,
velocity,
&next_target_position,
max_speed,
arrive_radius,
)
}
pub fn evade_impulse(
position: &Vec3,
velocity: &Velocity,
target_position: &Vec3,
target_velocity: &Velocity,
max_speed: MaxSpeed,
) -> Impulse {
let mut impulse = pursue_impulse(
position,
velocity,
target_position,
target_velocity,
max_speed,
None,
);
*impulse *= -1.0;
impulse
}
#[cfg(test)]
mod test {
use crate::prelude::*;
use beet_core::prelude::*;
#[test]
fn algo() {
seek_impulse(
&Vec3::default(),
&Velocity::default(),
&Vec3::new(1., 0., 0.),
MaxSpeed::default(),
None,
)
.0
.xpect_eq(Vec3::new(1., 0., 0.));
}
}