oxihuman_morph/
muscle_definition_morph.rs1#![allow(dead_code)]
4
5pub struct MuscleDefinitionMorph {
6 pub tone: f32,
7 pub vascularity: f32,
8 pub symmetry: f32,
9}
10
11pub fn new_muscle_definition_morph() -> MuscleDefinitionMorph {
12 MuscleDefinitionMorph {
13 tone: 0.0,
14 vascularity: 0.0,
15 symmetry: 1.0,
16 }
17}
18
19pub fn muscle_def_set_tone(m: &mut MuscleDefinitionMorph, v: f32) {
20 m.tone = v.clamp(0.0, 1.0);
21}
22
23pub fn muscle_def_is_athletic(m: &MuscleDefinitionMorph) -> bool {
24 m.tone > 0.6
25}
26
27pub fn muscle_def_overall_weight(m: &MuscleDefinitionMorph) -> f32 {
28 (m.tone + m.vascularity * 0.5) * 0.5 * m.symmetry
29}
30
31pub fn muscle_def_blend(
32 a: &MuscleDefinitionMorph,
33 b: &MuscleDefinitionMorph,
34 t: f32,
35) -> MuscleDefinitionMorph {
36 let t = t.clamp(0.0, 1.0);
37 MuscleDefinitionMorph {
38 tone: a.tone + (b.tone - a.tone) * t,
39 vascularity: a.vascularity + (b.vascularity - a.vascularity) * t,
40 symmetry: a.symmetry + (b.symmetry - a.symmetry) * t,
41 }
42}
43
44#[cfg(test)]
45mod tests {
46 use super::*;
47
48 #[test]
49 fn test_new_defaults() {
50 let m = new_muscle_definition_morph();
52 assert!((m.tone).abs() < 1e-5);
53 }
54
55 #[test]
56 fn test_set_tone_clamped() {
57 let mut m = new_muscle_definition_morph();
59 muscle_def_set_tone(&mut m, 2.0);
60 assert!((m.tone - 1.0).abs() < 1e-5);
61 }
62
63 #[test]
64 fn test_is_athletic() {
65 let mut m = new_muscle_definition_morph();
67 muscle_def_set_tone(&mut m, 0.8);
68 assert!(muscle_def_is_athletic(&m));
69 }
70
71 #[test]
72 fn test_overall_weight() {
73 let m = new_muscle_definition_morph();
75 assert!(muscle_def_overall_weight(&m) >= 0.0);
76 }
77
78 #[test]
79 fn test_blend() {
80 let a = new_muscle_definition_morph();
82 let mut b = new_muscle_definition_morph();
83 muscle_def_set_tone(&mut b, 1.0);
84 let c = muscle_def_blend(&a, &b, 0.5);
85 assert!((c.tone - 0.5).abs() < 1e-5);
86 }
87}