Skip to main content

oxihuman_morph/
back_muscle_morph.rs

1// Copyright (C) 2026 COOLJAPAN OU (Team KitaSan)
2// SPDX-License-Identifier: Apache-2.0
3#![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        /* all zero by default */
47        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        /* clamped */
54        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        /* default isn't muscular */
62        let m = new_back_muscle_morph();
63        assert!(!back_is_muscular(&m));
64    }
65
66    #[test]
67    fn test_overall_weight_zero() {
68        /* zero by default */
69        let m = new_back_muscle_morph();
70        assert!((back_overall_weight(&m)).abs() < 1e-5);
71    }
72
73    #[test]
74    fn test_blend() {
75        /* blend midpoint */
76        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}