tarts/rain/
gradient.rs

1fn lerp(a: u8, b: u8, t: f32) -> u8 {
2    (a as f32 * (1.0 - t) + b as f32 * t).round() as u8
3}
4
5#[derive(Clone, Copy)]
6pub struct Color {
7    pub r: u8,
8    pub g: u8,
9    pub b: u8,
10}
11
12pub fn two_step_color_gradient(
13    start_color: Color,
14    middle_color: Color,
15    end_color: Color,
16    middle_point: usize,
17    length: usize,
18) -> Vec<Color> {
19    let mut gradient = vec![];
20    for i in 1..=length {
21        let (r, g, b) = if i <= middle_point {
22            let t = i as f32 / middle_point as f32;
23            (
24                lerp(start_color.r, middle_color.r, t),
25                lerp(start_color.g, middle_color.g, t),
26                lerp(start_color.b, middle_color.b, t),
27            )
28        } else {
29            let t = (i - middle_point) as f32 / middle_point as f32;
30            (
31                lerp(middle_color.r, end_color.r, t),
32                lerp(middle_color.g, end_color.g, t),
33                lerp(middle_color.b, end_color.b, t),
34            )
35        };
36        gradient.push(Color { r, g, b });
37    }
38    gradient
39}