Skip to main content

oxihuman_morph/
masseter_morph.rs

1// Copyright (C) 2026 COOLJAPAN OU (Team KitaSan)
2// SPDX-License-Identifier: Apache-2.0
3#![allow(dead_code)]
4
5pub struct MasseterMorph {
6    pub hypertrophy: f32,
7    pub width: f32,
8    pub length: f32,
9}
10
11pub fn new_masseter_morph() -> MasseterMorph {
12    MasseterMorph {
13        hypertrophy: 0.0,
14        width: 0.5,
15        length: 0.5,
16    }
17}
18
19pub fn masseter_set_hypertrophy(m: &mut MasseterMorph, v: f32) {
20    m.hypertrophy = v.clamp(0.0, 1.0);
21}
22
23pub fn masseter_is_hypertrophied(m: &MasseterMorph) -> bool {
24    m.hypertrophy > 0.6
25}
26
27pub fn masseter_overall_weight(m: &MasseterMorph) -> f32 {
28    (m.hypertrophy + m.width) * 0.5
29}
30
31pub fn masseter_blend(a: &MasseterMorph, b: &MasseterMorph, t: f32) -> MasseterMorph {
32    let t = t.clamp(0.0, 1.0);
33    MasseterMorph {
34        hypertrophy: a.hypertrophy + (b.hypertrophy - a.hypertrophy) * t,
35        width: a.width + (b.width - a.width) * t,
36        length: a.length + (b.length - a.length) * t,
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43
44    #[test]
45    fn test_new_masseter_morph() {
46        /* hypertrophy defaults to 0 */
47        let m = new_masseter_morph();
48        assert!((m.hypertrophy - 0.0).abs() < 1e-6);
49    }
50
51    #[test]
52    fn test_masseter_set_hypertrophy() {
53        /* set and retrieve hypertrophy */
54        let mut m = new_masseter_morph();
55        masseter_set_hypertrophy(&mut m, 0.7);
56        assert!((m.hypertrophy - 0.7).abs() < 1e-6);
57    }
58
59    #[test]
60    fn test_masseter_is_hypertrophied_true() {
61        /* > 0.6 is hypertrophied */
62        let mut m = new_masseter_morph();
63        masseter_set_hypertrophy(&mut m, 0.9);
64        assert!(masseter_is_hypertrophied(&m));
65    }
66
67    #[test]
68    fn test_masseter_is_hypertrophied_false() {
69        /* zero not hypertrophied */
70        let m = new_masseter_morph();
71        assert!(!masseter_is_hypertrophied(&m));
72    }
73
74    #[test]
75    fn test_masseter_blend() {
76        /* blend at t=0.5 */
77        let a = new_masseter_morph();
78        let mut b = new_masseter_morph();
79        b.hypertrophy = 1.0;
80        let mid = masseter_blend(&a, &b, 0.5);
81        assert!((mid.hypertrophy - 0.5).abs() < 1e-6);
82    }
83}