oxihuman_morph/
cellulite_morph.rs1#![allow(dead_code)]
4
5#[derive(Debug, Clone, Copy, PartialEq)]
9pub enum CelluliteGrade {
10 Grade0,
11 Grade1,
12 Grade2,
13 Grade3,
14}
15
16#[derive(Debug, Clone)]
18pub struct CelluliteMorph {
19 pub grade: CelluliteGrade,
20 pub coverage: f32,
21 pub depth: f32,
22 pub morph_count: usize,
23 pub enabled: bool,
24}
25
26impl CelluliteMorph {
27 pub fn new(morph_count: usize) -> Self {
28 CelluliteMorph {
29 grade: CelluliteGrade::Grade0,
30 coverage: 0.0,
31 depth: 0.5,
32 morph_count,
33 enabled: true,
34 }
35 }
36}
37
38pub fn new_cellulite_morph(morph_count: usize) -> CelluliteMorph {
40 CelluliteMorph::new(morph_count)
41}
42
43pub fn clm_set_grade(morph: &mut CelluliteMorph, grade: CelluliteGrade) {
45 morph.grade = grade;
46}
47
48pub fn clm_set_coverage(morph: &mut CelluliteMorph, coverage: f32) {
50 morph.coverage = coverage.clamp(0.0, 1.0);
51}
52
53pub fn clm_set_depth(morph: &mut CelluliteMorph, depth: f32) {
55 morph.depth = depth.clamp(0.0, 1.0);
56}
57
58pub fn clm_evaluate(morph: &CelluliteMorph) -> Vec<f32> {
60 if !morph.enabled || morph.morph_count == 0 {
62 return vec![];
63 }
64 vec![morph.coverage; morph.morph_count]
65}
66
67pub fn clm_set_enabled(morph: &mut CelluliteMorph, enabled: bool) {
69 morph.enabled = enabled;
70}
71
72pub fn clm_to_json(morph: &CelluliteMorph) -> String {
74 let grade = match morph.grade {
75 CelluliteGrade::Grade0 => "grade0",
76 CelluliteGrade::Grade1 => "grade1",
77 CelluliteGrade::Grade2 => "grade2",
78 CelluliteGrade::Grade3 => "grade3",
79 };
80 format!(
81 r#"{{"grade":"{}","coverage":{},"depth":{},"morph_count":{},"enabled":{}}}"#,
82 grade, morph.coverage, morph.depth, morph.morph_count, morph.enabled
83 )
84}
85
86#[cfg(test)]
87mod tests {
88 use super::*;
89
90 #[test]
91 fn test_default_grade() {
92 let m = new_cellulite_morph(4);
93 assert_eq!(
94 m.grade,
95 CelluliteGrade::Grade0 );
97 }
98
99 #[test]
100 fn test_set_grade() {
101 let mut m = new_cellulite_morph(4);
102 clm_set_grade(&mut m, CelluliteGrade::Grade3);
103 assert_eq!(m.grade, CelluliteGrade::Grade3 );
104 }
105
106 #[test]
107 fn test_coverage_clamp_high() {
108 let mut m = new_cellulite_morph(4);
109 clm_set_coverage(&mut m, 1.5);
110 assert!((m.coverage - 1.0).abs() < 1e-6 );
111 }
112
113 #[test]
114 fn test_coverage_clamp_low() {
115 let mut m = new_cellulite_morph(4);
116 clm_set_coverage(&mut m, -0.1);
117 assert!(m.coverage.abs() < 1e-6 );
118 }
119
120 #[test]
121 fn test_depth_clamp() {
122 let mut m = new_cellulite_morph(4);
123 clm_set_depth(&mut m, 2.0);
124 assert!((m.depth - 1.0).abs() < 1e-6 );
125 }
126
127 #[test]
128 fn test_evaluate_length() {
129 let mut m = new_cellulite_morph(6);
130 clm_set_coverage(&mut m, 0.5);
131 assert_eq!(
132 clm_evaluate(&m).len(),
133 6 );
135 }
136
137 #[test]
138 fn test_evaluate_disabled() {
139 let mut m = new_cellulite_morph(4);
140 clm_set_enabled(&mut m, false);
141 assert!(clm_evaluate(&m).is_empty() );
142 }
143
144 #[test]
145 fn test_to_json_has_grade() {
146 let m = new_cellulite_morph(4);
147 let j = clm_to_json(&m);
148 assert!(j.contains("\"grade\"") );
149 }
150
151 #[test]
152 fn test_enabled_default() {
153 let m = new_cellulite_morph(4);
154 assert!(m.enabled );
155 }
156}