From 5d98aa866b9d99e20dbd07421fe69f723be58caf Mon Sep 17 00:00:00 2001 From: Andre Henriques Date: Wed, 15 Mar 2023 23:27:37 +0000 Subject: [PATCH] Lerppppppp Squashed commit of the following: commit 11c776c2a9059cd073d376632c829e0c6156b085 Author: Andre Henriques Date: Wed Mar 15 23:23:08 2023 +0000 update to have diff abs commit 92fb1478b73f0b226798b54fc0d4a58095cd6bf5 Author: Andre Henriques Date: Wed Mar 15 23:21:40 2023 +0000 speed up commit 5418a139f29e7dbd4077bd502d5481b8592101e7 Author: Andre Henriques Date: Wed Mar 15 23:20:09 2023 +0000 fix diff commit f96fc9b48d235f100aa1afc1015441bf95d689c5 Author: Andre Henriques Date: Wed Mar 15 23:18:34 2023 +0000 update check commit 788b705c87893af901c0cacbc333635837394d6f Author: Andre Henriques Date: Wed Mar 15 23:16:50 2023 +0000 update check commit 29efa6be830e711485bae44b905b151facc57ea6 Author: Andre Henriques Date: Wed Mar 15 23:14:41 2023 +0000 change values to u128 commit 100f782aeaf281a27c2dd419552b3966ca29f549 Author: Andre Henriques Date: Wed Mar 15 23:10:03 2023 +0000 addjust for diff values commit f31bc45947fff40125d259bd53282399509715dd Author: Andre Henriques Date: Wed Mar 15 23:07:51 2023 +0000 account for 0 diff commit b31c967ca04fc41e876bb7cf3b545246866b4b1d Author: Andre Henriques Date: Wed Mar 15 23:05:17 2023 +0000 update lerp functionn commit 81930f35ebeb2567218b429a58ce5b560a0a175b Author: Andre Henriques Date: Wed Mar 15 23:03:51 2023 +0000 update lerp functionn commit cb9eb57a2c525827a1ef2f58199d0063e208059e Author: Andre Henriques Date: Wed Mar 15 23:00:06 2023 +0000 update diff target commit 0bce36f41debff1046359e503c5120f5035ef45f Author: Andre Henriques Date: Wed Mar 15 22:58:46 2023 +0000 update diff target commit be35ecb310bfd6b0d58d3c43de6b33ff9784898f Author: Andre Henriques Date: Wed Mar 15 22:57:28 2023 +0000 fix render commit 0a721463629132b97080ba39ad2add5340f0cfcc Author: Andre Henriques Date: Wed Mar 15 22:55:56 2023 +0000 update render commit 16ea28557e1c1ce76cfa6fe1236adac1c956c982 Author: Andre Henriques Date: Wed Mar 15 22:52:45 2023 +0000 update delta diff commit 540af201742cbac04ea85fa8b7843d405dc58dd9 Author: Andre Henriques Date: Wed Mar 15 22:51:15 2023 +0000 update delta diff commit 0fdba152d6402438cb893c115266e5d8b995a59b Author: Andre Henriques Date: Wed Mar 15 22:49:41 2023 +0000 changed to render to f64 commit c49d3380b49e13d6be5c832679077b98b66c9ac7 Author: Andre Henriques Date: Wed Mar 15 22:35:16 2023 +0000 added delta commit af2b8e55aedc6aea0d1fb4951f44d3c1b4502373 Author: Andre Henriques Date: Wed Mar 15 22:28:55 2023 +0000 init last if empty commit 02f261a85a2112ed1f47ceae97d7ebb631b41275 Author: Andre Henriques Date: Wed Mar 15 22:23:05 2023 +0000 added more logs to test commit b6d0cca501c21245738d80746ef81bbb5228d479 Author: Andre Henriques Date: Wed Mar 15 22:21:53 2023 +0000 added more logs to test commit 81b4de369006513a1c95436a0735e80c9ccc19ec Author: Andre Henriques Date: Wed Mar 15 22:19:48 2023 +0000 added more logs to test commit 8c4c736555ad653f02b4aee2ef527b2a478c2d13 Author: Andre Henriques Date: Wed Mar 15 22:16:14 2023 +0000 added more logs commit d82df637e03d9e86849357b75f39ee88f23dfe5e Author: Andre Henriques Date: Wed Mar 15 22:14:02 2023 +0000 added logs commit fbfbd232a9ed5b830706e5d24d0c8e89bc8ec4db Author: Andre Henriques Date: Wed Mar 15 22:02:56 2023 +0000 finished lerp commit 8e615a31d161e09ff4f18af19f17dd9989feb84e Author: Andre Henriques Date: Tue Mar 14 23:25:15 2023 +0000 started working --- src/animations.rs | 4 +-- src/render.rs | 90 ++++++++++++++++++++++++++++++++++++++++------- src/utils.rs | 2 +- 3 files changed, 81 insertions(+), 15 deletions(-) diff --git a/src/animations.rs b/src/animations.rs index 2c454e7..01a2811 100644 --- a/src/animations.rs +++ b/src/animations.rs @@ -301,7 +301,7 @@ pub fn get_animation(name: &str, db: &State) -> Result struct AnimationId { animation: Animation, id: u8 - }; + } let next = stmt.query_map([name], |row| { Ok(AnimationId { @@ -370,7 +370,7 @@ pub fn get_animation(name: &str, db: &State) -> Result * */ #[get("/delete/")] -pub async fn delete(name: &str, start_sender: &State>, db: &State) -> String { +pub async fn delete(name: &str, db: &State) -> String { let animation = remove_animation(name, db); diff --git a/src/render.rs b/src/render.rs index 4aacf86..f5de026 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)] @@ -23,7 +23,7 @@ pub struct LigthSetting { #[derive(Clone)] pub struct KeyFrame { - duration: u64, + duration: u128, settings: Vec } @@ -34,16 +34,18 @@ pub struct RenderAnimation { name: String, current_frame: usize, - start_time: u64, + start_time: u128, reset: bool, } pub struct Render { conn: DBPool, num_leds: u32, + + last_render: u128, ws: Option, - last: Vec, + last: Vec>, animations: Vec, @@ -65,6 +67,7 @@ impl Render { let mut render = Render { conn, num_leds: 0, + last_render: 0, ws: None, animations: vec![], local_led_config: vec![], @@ -173,7 +176,7 @@ impl Render { }); } - key_frames.push(KeyFrame { duration: frame.get_duration().into(), settings: light_settings }) + key_frames.push(KeyFrame { duration: (frame.get_duration() as u128) * (1000 as u128), settings: light_settings }) } let new_animation = RenderAnimation { @@ -198,10 +201,14 @@ impl Render { self.animations = self.animations.clone().into_iter().filter(|ani| !ani.name.eq(&animation_name)).collect::>(); } - pub fn proccess_settings (&mut self, data: &mut Vec, settings: &Vec) { - fn load_led_into_light (data: &mut Vec, color: RGB8, start: usize, end: usize) { + pub fn proccess_settings (&mut self, data: &mut Vec>, settings: &Vec) { + fn load_led_into_light (data: &mut Vec>, color: RGB8, start: usize, end: usize) { for i in start..=end { - data[i] = color; + data[i] = RGB::new( + color.r as f64, + color.g as f64, + color.b as f64 + ); } } @@ -227,9 +234,17 @@ impl Render { if self.ws.is_none() { return; } - let mut data = vec![RGB8::default(); self.num_leds.try_into().unwrap()]; + let mut data: Vec> = vec![RGB::default(); self.num_leds.try_into().unwrap()]; - let time = SystemTime::now().duration_since(UNIX_EPOCH).expect("Time went backwards").as_secs(); + let time = SystemTime::now().duration_since(UNIX_EPOCH).expect("Time went backwards").as_millis(); + + if self.last_render == 0 { + self.last_render = time; + } + + let delta = time - self.last_render; + + self.last_render = time; let mut to_clean: Vec = Vec::new(); @@ -276,15 +291,66 @@ impl Render { to_clean.iter().for_each(|i| self.remove_animation(i.to_string())); if self.last.is_empty() || !self.last.clone().iter().eq(data.clone().iter()) { - let err = self.ws.as_mut().unwrap().write(data.clone().into_iter()); + + if self.last.len() == 0 { + self.last = data.clone(); + } + + + let lerp_data: Vec> = data.iter().zip(&self.last).map(|(d, l)| l.lerp(d, delta as f64)).collect(); + + //println!("d:{:?}\n l:{:?}", data, lerp_data); + + let to_set_data: Vec> = rgbs_f64_to_u8(&lerp_data); + + let err = self.ws.as_mut().unwrap().write(to_set_data.into_iter()); if err.is_err() || err.ok().is_none() { println!("Failed to write data"); } - self.last = data; + self.last = lerp_data; } } } +pub fn rgbs_f64_to_u8(data: &Vec>) -> Vec>{ + data.clone().iter().map(|a| { + RGB::new( + a.r as u8, + a.g as u8, + a.b as u8 + ) + }).collect() +} + +pub trait Lerp { + fn lerp(self, other: &Self, diff: f64) -> Self; +} + +impl Lerp for f64 { + fn lerp(self, other: &Self, diff: f64) -> Self { + let delta = diff / 1000.0; + + let change = (*other - self) * 0.8 * delta; + + let lerped = self + change; + + if *other != self && diff != 0.0 { + println!("c: {} target:{} lerp: {} move: {}", self, other, lerped, change); + } + + if (*other - self).abs() < 2.0 && diff != 0.0 { + return *other; + } + + lerped + } +} + +impl Lerp for RGB { + fn lerp(self, other: &Self, diff: f64) -> Self { + RGB::new(self.r.lerp(&other.r, diff), self.g.lerp(&other.g, diff), self.b.lerp(&other.b, diff)) + } +} diff --git a/src/utils.rs b/src/utils.rs index 1901568..ef736c9 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,4 +1,4 @@ -use rocket::{serde::{Deserialize, Serialize}, Responder, http::{ContentType, Header}}; +use rocket::{serde::{Deserialize, Serialize}, Responder}; #[derive(Deserialize, Serialize)] #[serde(crate="rocket::serde")]