oxihuman_morph/
eye_spacing_morph.rs1#![allow(dead_code)]
4
5pub struct EyeSpacingMorph {
6 pub distance: f32,
7 pub convergence: f32,
8}
9
10pub fn new_eye_spacing_morph() -> EyeSpacingMorph {
11 EyeSpacingMorph {
12 distance: 0.0,
13 convergence: 0.0,
14 }
15}
16
17pub fn eye_spacing_set_distance(m: &mut EyeSpacingMorph, v: f32) {
18 m.distance = v.clamp(0.0, 1.0);
19}
20
21pub fn eye_spacing_is_wide(m: &EyeSpacingMorph) -> bool {
22 m.distance > 0.5
23}
24
25pub fn eye_spacing_overall_weight(m: &EyeSpacingMorph) -> f32 {
26 (m.distance.abs() + m.convergence.abs()) * 0.5
27}
28
29pub fn eye_spacing_blend(a: &EyeSpacingMorph, b: &EyeSpacingMorph, t: f32) -> EyeSpacingMorph {
30 let t = t.clamp(0.0, 1.0);
31 EyeSpacingMorph {
32 distance: a.distance + (b.distance - a.distance) * t,
33 convergence: a.convergence + (b.convergence - a.convergence) * t,
34 }
35}
36
37#[cfg(test)]
38mod tests {
39 use super::*;
40
41 #[test]
42 fn test_new_eye_spacing_morph() {
43 let m = new_eye_spacing_morph();
45 assert_eq!(m.distance, 0.0);
46 }
47
48 #[test]
49 fn test_eye_spacing_set_distance() {
50 let mut m = new_eye_spacing_morph();
52 eye_spacing_set_distance(&mut m, 0.3);
53 assert!((m.distance - 0.3).abs() < 1e-6);
54 }
55
56 #[test]
57 fn test_eye_spacing_is_wide_false() {
58 let m = new_eye_spacing_morph();
60 assert!(!eye_spacing_is_wide(&m));
61 }
62
63 #[test]
64 fn test_eye_spacing_is_wide_true() {
65 let mut m = new_eye_spacing_morph();
67 m.distance = 0.6;
68 assert!(eye_spacing_is_wide(&m));
69 }
70
71 #[test]
72 fn test_eye_spacing_blend() {
73 let a = new_eye_spacing_morph();
75 let b = EyeSpacingMorph {
76 distance: 1.0,
77 convergence: 1.0,
78 };
79 let r = eye_spacing_blend(&a, &b, 1.0);
80 assert!((r.distance - 1.0).abs() < 1e-6);
81 }
82}