#![allow(dead_code)]
#[derive(Debug, Clone)]
pub struct AthleticBuildConfig {
pub muscle_definition: f32,
pub shoulder_width: f32,
pub waist_taper: f32,
}
impl Default for AthleticBuildConfig {
fn default() -> Self {
AthleticBuildConfig {
muscle_definition: 0.8,
shoulder_width: 0.7,
waist_taper: 0.6,
}
}
}
#[derive(Debug, Clone)]
pub struct AthleticBuildMorph {
pub intensity: f32,
pub config: AthleticBuildConfig,
pub enabled: bool,
}
pub fn new_athletic_build_morph() -> AthleticBuildMorph {
AthleticBuildMorph {
intensity: 0.0,
config: AthleticBuildConfig::default(),
enabled: true,
}
}
pub fn ab_set_intensity(m: &mut AthleticBuildMorph, v: f32) {
m.intensity = v.clamp(0.0, 1.0);
}
pub fn ab_muscle_weight(m: &AthleticBuildMorph) -> f32 {
m.intensity * m.config.muscle_definition
}
pub fn ab_shoulder_delta(m: &AthleticBuildMorph) -> f32 {
m.intensity * m.config.shoulder_width
}
pub fn ab_waist_taper(m: &AthleticBuildMorph) -> f32 {
m.intensity * m.config.waist_taper
}
pub fn ab_to_json(m: &AthleticBuildMorph) -> String {
format!(
r#"{{"intensity":{:.3},"muscle":{:.3},"enabled":{}}}"#,
m.intensity,
ab_muscle_weight(m),
m.enabled
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_intensity_zero() {
let m = new_athletic_build_morph();
assert!((m.intensity - 0.0).abs() < 1e-6 );
}
#[test]
fn clamp_intensity() {
let mut m = new_athletic_build_morph();
ab_set_intensity(&mut m, 5.0);
assert!((m.intensity - 1.0).abs() < 1e-6 );
ab_set_intensity(&mut m, -1.0);
assert!((m.intensity - 0.0).abs() < 1e-6 );
}
#[test]
fn muscle_weight_scales_with_intensity() {
let mut m = new_athletic_build_morph();
ab_set_intensity(&mut m, 0.5);
let w = ab_muscle_weight(&m);
assert!(w > 0.0 && w < 1.0 );
}
#[test]
fn shoulder_delta_nonzero_at_full() {
let mut m = new_athletic_build_morph();
ab_set_intensity(&mut m, 1.0);
assert!(ab_shoulder_delta(&m) > 0.0 );
}
#[test]
fn waist_taper_zero_at_zero_intensity() {
let m = new_athletic_build_morph();
assert!((ab_waist_taper(&m) - 0.0).abs() < 1e-6 );
}
#[test]
fn json_contains_intensity() {
let mut m = new_athletic_build_morph();
ab_set_intensity(&mut m, 0.75);
assert!(ab_to_json(&m).contains("0.750") );
}
#[test]
fn enabled_default() {
let m = new_athletic_build_morph();
assert!(m.enabled );
}
#[test]
fn config_values_valid() {
let m = new_athletic_build_morph();
assert!(m.config.muscle_definition > 0.0 );
}
}