diff --git a/src/render.rs b/src/render.rs index 525b209..d1662e5 100644 --- a/src/render.rs +++ b/src/render.rs @@ -3,7 +3,7 @@ use ws281x_rpi::Ws2812Rpi; use crate::{DBPool, animations::Animation}; use std::error::Error; -use smart_leds::{RGB8, SmartLedsWrite}; +use smart_leds::{RGB8, SmartLedsWrite, RGB}; use std::time::{SystemTime, UNIX_EPOCH}; #[derive(Clone, Debug)] @@ -277,17 +277,33 @@ impl Render { if self.last.is_empty() || !self.last.clone().iter().eq(data.clone().iter()) { - let lerp_data = data.iter().zip(self.last).map(|(d, l)| d - ((l - d) * 0.2)); + let lerp_data: Vec> = data.iter().zip(&self.last).map(|(d, l)| d.lerp(l)).collect(); - let err = self.ws.as_mut().unwrap().write(data.clone().into_iter()); + let err = self.ws.as_mut().unwrap().write(lerp_data.clone().into_iter()); if err.is_err() || err.ok().is_none() { println!("Failed to write data"); } - self.last = data; + self.last = lerp_data; } } } +trait Lerp { + fn lerp(self, other: &Self) -> Self; +} + +impl Lerp for u8 { + fn lerp(self, other: &Self) -> Self { + ((self as f64) + (((*other as f64) - (self as f64)) * 0.2)) as u8 + } +} + +impl Lerp for RGB { + fn lerp(self, other: &Self) -> Self { + RGB::new(self.r.lerp(&other.r), self.g.lerp(&other.g), self.b.lerp(&other.b)) + } +} +