use crate::{component, object};
pub trait Integrator : Clone {
fn integrate_dt <O : object::Temporal> (object : &mut O, dt : f64);
fn integrate_position_dt <O : object::Temporal> (object : &mut O, dt : f64);
fn integrate_velocity_dt <O : object::Temporal> (object : &mut O, dt : f64);
fn integrate <O : object::Temporal> (object : &mut O) {
Self::integrate_dt (object, 1.0)
}
fn integrate_position <O : object::Temporal> (object : &mut O) {
Self::integrate_position_dt (object, 1.0)
}
fn integrate_velocity <O : object::Temporal> (object : &mut O) {
Self::integrate_velocity_dt (object, 1.0)
}
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct SemiImplicitEuler;
impl Integrator for SemiImplicitEuler {
fn integrate_velocity_dt <O : object::Temporal> (object : &mut O, dt : f64) {
let acceleration = object.derivatives().acceleration;
object.derivatives_mut().velocity += dt * acceleration;
}
fn integrate_position_dt <O : object::Temporal> (object : &mut O, dt : f64) {
let velocity = object.derivatives().velocity;
let component::Position (position) = object.position_mut();
*position += dt * velocity;
}
fn integrate_dt <O : object::Temporal> (object : &mut O, dt : f64) {
Self::integrate_velocity_dt (object, dt);
Self::integrate_position_dt (object, dt);
}
}