#![allow(dead_code)]
#[derive(Debug, Clone, Default)]
pub struct LipStretchState {
pub left: f32,
pub right: f32,
pub upper_retract: f32,
pub lower_retract: f32,
}
pub fn ls_set_both(state: &mut LipStretchState, amount: f32) {
let a = amount.clamp(0.0, 1.0);
state.left = a;
state.right = a;
}
pub fn ls_set_left(state: &mut LipStretchState, amount: f32) {
state.left = amount.clamp(0.0, 1.0);
}
pub fn ls_set_right(state: &mut LipStretchState, amount: f32) {
state.right = amount.clamp(0.0, 1.0);
}
pub fn ls_upper_retract(state: &LipStretchState) -> f32 {
let mean = (state.left + state.right) * 0.5;
mean * state.upper_retract.max(0.2)
}
pub fn ls_lower_retract(state: &LipStretchState) -> f32 {
let mean = (state.left + state.right) * 0.5;
mean * state.lower_retract.max(0.15)
}
pub fn ls_asymmetry(state: &LipStretchState) -> f32 {
state.left - state.right
}
pub fn ls_reset(state: &mut LipStretchState) {
state.left = 0.0;
state.right = 0.0;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_zero() {
let s = LipStretchState::default();
assert_eq!(s.left, 0.0);
assert_eq!(s.right, 0.0);
}
#[test]
fn test_set_both() {
let mut s = LipStretchState::default();
ls_set_both(&mut s, 0.6);
assert!((s.left - 0.6).abs() < 1e-6);
assert!((s.right - 0.6).abs() < 1e-6);
}
#[test]
fn test_set_left_only() {
let mut s = LipStretchState::default();
ls_set_left(&mut s, 0.4);
assert_eq!(s.right, 0.0);
}
#[test]
fn test_set_right_only() {
let mut s = LipStretchState::default();
ls_set_right(&mut s, 0.5);
assert_eq!(s.left, 0.0);
}
#[test]
fn test_upper_retract_nonzero() {
let mut s = LipStretchState::default();
ls_set_both(&mut s, 1.0);
assert!(ls_upper_retract(&s) > 0.0);
}
#[test]
fn test_lower_retract_nonzero() {
let mut s = LipStretchState::default();
ls_set_both(&mut s, 1.0);
assert!(ls_lower_retract(&s) > 0.0);
}
#[test]
fn test_asymmetry() {
let mut s = LipStretchState::default();
ls_set_left(&mut s, 0.8);
ls_set_right(&mut s, 0.2);
assert!((ls_asymmetry(&s) - 0.6).abs() < 1e-6);
}
#[test]
fn test_reset() {
let mut s = LipStretchState::default();
ls_set_both(&mut s, 0.9);
ls_reset(&mut s);
assert_eq!(s.left, 0.0);
assert_eq!(s.right, 0.0);
}
#[test]
fn test_clamp_negative() {
let mut s = LipStretchState::default();
ls_set_both(&mut s, -1.0);
assert_eq!(s.left, 0.0);
}
}