fere_common/
light.rs

1const LINEAR1_END: u8 = 127;
2const LINEAR1_END_WEIGHT: f32 = 32.0;
3const LINEAR2_END_WEIGHT: f32 = 4096.0;
4
5/// [0, 255] -> [0.0, 64.0]
6pub fn intensity_to_weight(intensity: u8) -> f32 {
7    if intensity <= LINEAR1_END {
8        intensity as f32 / LINEAR1_END as f32 * LINEAR1_END_WEIGHT
9    } else {
10        ((intensity - LINEAR1_END) as f32 / (255 - LINEAR1_END) as f32)
11            * (LINEAR2_END_WEIGHT - LINEAR1_END_WEIGHT)
12            + LINEAR1_END_WEIGHT
13    }
14}
15/// [0.0, 64.0] -> [0, 255]
16pub fn weight_to_intensity(weight: f32) -> u8 {
17    if weight >= LINEAR1_END_WEIGHT {
18        ((weight - LINEAR1_END_WEIGHT) / (LINEAR2_END_WEIGHT - LINEAR1_END_WEIGHT)
19            * ((255 - LINEAR1_END) as f32)) as u8
20    } else {
21        (weight / LINEAR1_END_WEIGHT * LINEAR1_END as f32).round() as u8
22    }
23}
24
25#[test]
26fn check_intensity_to_weight() {
27    for i in 0..=255 {
28        println!("{}", intensity_to_weight(i));
29    }
30}