oxihuman_morph/
back_muscle_morph.rs1#![allow(dead_code)]
4
5pub struct BackMuscleMorph {
6 pub latissimus: f32,
7 pub trapezius: f32,
8 pub erector_spinae: f32,
9}
10
11pub fn new_back_muscle_morph() -> BackMuscleMorph {
12 BackMuscleMorph {
13 latissimus: 0.0,
14 trapezius: 0.0,
15 erector_spinae: 0.0,
16 }
17}
18
19pub fn back_set_latissimus(m: &mut BackMuscleMorph, v: f32) {
20 m.latissimus = v.clamp(0.0, 1.0);
21}
22
23pub fn back_is_muscular(m: &BackMuscleMorph) -> bool {
24 (m.latissimus + m.trapezius + m.erector_spinae) / 3.0 > 0.5
25}
26
27pub fn back_overall_weight(m: &BackMuscleMorph) -> f32 {
28 (m.latissimus + m.trapezius + m.erector_spinae) / 3.0
29}
30
31pub fn back_blend(a: &BackMuscleMorph, b: &BackMuscleMorph, t: f32) -> BackMuscleMorph {
32 let t = t.clamp(0.0, 1.0);
33 BackMuscleMorph {
34 latissimus: a.latissimus + (b.latissimus - a.latissimus) * t,
35 trapezius: a.trapezius + (b.trapezius - a.trapezius) * t,
36 erector_spinae: a.erector_spinae + (b.erector_spinae - a.erector_spinae) * t,
37 }
38}
39
40#[cfg(test)]
41mod tests {
42 use super::*;
43
44 #[test]
45 fn test_new_zero() {
46 let m = new_back_muscle_morph();
48 assert!((m.latissimus + m.trapezius + m.erector_spinae).abs() < 1e-5);
49 }
50
51 #[test]
52 fn test_set_latissimus() {
53 let mut m = new_back_muscle_morph();
55 back_set_latissimus(&mut m, 0.7);
56 assert!((m.latissimus - 0.7).abs() < 1e-5);
57 }
58
59 #[test]
60 fn test_not_muscular_by_default() {
61 let m = new_back_muscle_morph();
63 assert!(!back_is_muscular(&m));
64 }
65
66 #[test]
67 fn test_overall_weight_zero() {
68 let m = new_back_muscle_morph();
70 assert!((back_overall_weight(&m)).abs() < 1e-5);
71 }
72
73 #[test]
74 fn test_blend() {
75 let a = new_back_muscle_morph();
77 let b = BackMuscleMorph {
78 latissimus: 1.0,
79 trapezius: 1.0,
80 erector_spinae: 1.0,
81 };
82 let c = back_blend(&a, &b, 0.5);
83 assert!((c.latissimus - 0.5).abs() < 1e-5);
84 }
85}