Skip to main content

oxihuman_morph/
body_water_morph.rs

1// Copyright (C) 2026 COOLJAPAN OU (Team KitaSan)
2// SPDX-License-Identifier: Apache-2.0
3#![allow(dead_code)]
4
5pub struct BodyWaterMorph {
6    pub hydration: f32,
7    pub skin_turgor: f32,
8}
9
10pub fn new_body_water_morph() -> BodyWaterMorph {
11    BodyWaterMorph {
12        hydration: 0.6,
13        skin_turgor: 0.5,
14    }
15}
16
17pub fn body_water_set_hydration(m: &mut BodyWaterMorph, v: f32) {
18    m.hydration = v.clamp(0.0, 1.0);
19}
20
21pub fn body_water_is_dehydrated(m: &BodyWaterMorph) -> bool {
22    m.hydration < 0.3
23}
24
25pub fn body_water_overall_weight(m: &BodyWaterMorph) -> f32 {
26    (m.hydration + m.skin_turgor) * 0.5
27}
28
29pub fn body_water_blend(a: &BodyWaterMorph, b: &BodyWaterMorph, t: f32) -> BodyWaterMorph {
30    let t = t.clamp(0.0, 1.0);
31    BodyWaterMorph {
32        hydration: a.hydration + (b.hydration - a.hydration) * t,
33        skin_turgor: a.skin_turgor + (b.skin_turgor - a.skin_turgor) * t,
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    #[test]
42    fn test_new() {
43        /* default hydration above zero */
44        let m = new_body_water_morph();
45        assert!(m.hydration > 0.0);
46    }
47
48    #[test]
49    fn test_set_hydration() {
50        /* clamped */
51        let mut m = new_body_water_morph();
52        body_water_set_hydration(&mut m, 0.2);
53        assert!((m.hydration - 0.2).abs() < 1e-5);
54    }
55
56    #[test]
57    fn test_is_dehydrated() {
58        /* dehydrated when hydration < 0.3 */
59        let mut m = new_body_water_morph();
60        body_water_set_hydration(&mut m, 0.1);
61        assert!(body_water_is_dehydrated(&m));
62    }
63
64    #[test]
65    fn test_not_dehydrated_by_default() {
66        /* default hydration 0.6 is not dehydrated */
67        let m = new_body_water_morph();
68        assert!(!body_water_is_dehydrated(&m));
69    }
70
71    #[test]
72    fn test_blend() {
73        /* midpoint */
74        let a = BodyWaterMorph {
75            hydration: 0.0,
76            skin_turgor: 0.0,
77        };
78        let b = BodyWaterMorph {
79            hydration: 1.0,
80            skin_turgor: 1.0,
81        };
82        let c = body_water_blend(&a, &b, 0.5);
83        assert!((c.hydration - 0.5).abs() < 1e-5);
84    }
85}