use std::ops::Range;
use bevy_tnua_physics_integration_layer::data_for_backends::{TnuaProximitySensor, TnuaVelChange};
use crate::TnuaBasis;
use crate::basis_action_traits::TnuaBasisAccess;
use crate::{TnuaBasisContext, math::*};
pub trait TnuaBasisWithFrameOfReferenceSurface: TnuaBasis {
fn effective_velocity(access: &TnuaBasisAccess<Self>) -> Vector3;
fn vertical_velocity(access: &TnuaBasisAccess<Self>) -> Float;
}
pub trait TnuaBasisWithDisplacement: TnuaBasis {
fn displacement(access: &TnuaBasisAccess<Self>) -> Option<Vector3>;
}
pub trait TnuaBasisWithGround: TnuaBasis {
fn is_airborne(access: &TnuaBasisAccess<Self>) -> bool;
fn violate_coyote_time(memory: &mut Self::Memory);
fn ground_sensor<'a>(sensors: &Self::Sensors<'a>) -> &'a TnuaProximitySensor;
}
pub trait TnuaBasisWithHeadroom: TnuaBasis {
fn headroom_intrusion<'a>(
access: &TnuaBasisAccess<Self>,
sensors: &Self::Sensors<'a>,
) -> Option<Range<Float>>;
fn set_extra_headroom(memory: &mut Self::Memory, extra_headroom: Float);
}
pub trait TnuaBasisWithFloating: TnuaBasis {
fn float_height(access: &TnuaBasisAccess<Self>) -> Float;
}
pub trait TnuaBasisWithSpring: TnuaBasis {
fn spring_force(
access: &TnuaBasisAccess<Self>,
ctx: &TnuaBasisContext,
spring_offset: Float,
) -> TnuaVelChange;
}