From d05b4675786ad1f43d146e9804677d0225479329 Mon Sep 17 00:00:00 2001 From: Christine Dodrill Date: Sat, 9 May 2020 10:12:13 -0400 Subject: [PATCH] lerp it good --- gamebridge/src/au.rs | 20 +++++++-------- gamebridge/src/main.rs | 55 ++++++++++++++++++++++++++++++---------- gamebridge/src/twitch.rs | 21 +++++++-------- 3 files changed, 62 insertions(+), 34 deletions(-) diff --git a/gamebridge/src/au.rs b/gamebridge/src/au.rs index 4a71221..b47e19d 100644 --- a/gamebridge/src/au.rs +++ b/gamebridge/src/au.rs @@ -32,18 +32,18 @@ impl Lerper { let scalar = self.scalar; self.scalar = match scalar { _ if scalar == self.goal => self.goal, - _ if scalar == self.max => { - self.extended_tick = now; - scalar -1 - }, - _ if scalar == self.min => { + _ if scalar >= self.max => { self.extended_tick = now; scalar - 1 - }, + } + _ if scalar <= self.min => { + self.extended_tick = now; + scalar + 1 + } _ => { let t = (now - self.extended_tick) as f64 / self.lerp_time; lerp(self.scalar, 0, t) - }, + } }; if self.scalar >= self.max { @@ -54,7 +54,6 @@ impl Lerper { return self.min; } - log::info!("before: {}, after: {}", scalar, self.scalar); self.scalar } @@ -87,13 +86,14 @@ mod test { use super::Lerper; let mut lerper = Lerper::init(15.0, 127, -128, 0); - for case in [(127, 3, 126), (100, 8, 66)].iter() { + for case in [(127, 3, 126), (100, 8, 66), (-124, 8, -82)].iter() { let scalar = case.0; let now = case.1; let want = case.2; lerper.update(scalar); - assert_eq!(lerper.apply(now), want); + let result = lerper.apply(now); + assert_eq!(result, want); } } } diff --git a/gamebridge/src/main.rs b/gamebridge/src/main.rs index 38c1e25..53acc5b 100644 --- a/gamebridge/src/main.rs +++ b/gamebridge/src/main.rs @@ -42,7 +42,7 @@ fn main() -> Result<()> { let mut vblank = File::open("vblank")?; let mut input = OpenOptions::new().write(true).open("input")?; - const STICK_LERP_TIME: f64 = 330.0; // 330 frames to lerp stick positions down to 0 + const STICK_LERP_TIME: f64 = 270.0; // 270 frames to lerp stick positions down to 0 const BUTTON_LERP_TIME: f64 = 20.0; // 20 frames to lerp button inputs down to 0 let st = { @@ -53,7 +53,7 @@ fn main() -> Result<()> { sticky: Lerper::init(STICK_LERP_TIME, 127, -128, 0), a_button: Lerper::init(BUTTON_LERP_TIME, 64, -1, 0), b_button: Lerper::init(BUTTON_LERP_TIME, 64, -1, 0), - z_button: Lerper::init(BUTTON_LERP_TIME / 4.0, 64, -1, 0), // z button is special + z_button: Lerper::init(BUTTON_LERP_TIME, 64, -1, 0), r_button: Lerper::init(BUTTON_LERP_TIME, 64, -1, 0), start: Lerper::init(BUTTON_LERP_TIME / 4.0, 64, -1, 0), // z button is special c_left: Lerper::init(BUTTON_LERP_TIME, 64, -1, 0), @@ -93,8 +93,12 @@ fn main() -> Result<()> { //data.stickx.update(data.controller[2] as i64); //data.sticky.update(data.controller[3] as i64); + debug!("x before: {}", data.stickx.scalar); let mut stickx_scalar = data.stickx.apply(frame) as i8; + debug!("x after: {}", data.stickx.scalar); + debug!("y before: {}", data.sticky.scalar); let mut sticky_scalar = data.sticky.apply(frame) as i8; + debug!("y after: {}", data.sticky.scalar); let dist = stick_distance(stickx_scalar, sticky_scalar); if dist <= 10 { @@ -106,30 +110,53 @@ fn main() -> Result<()> { let mut hi = HiButtons::NONE; let mut lo = LoButtons::NONE; - const BUTTON_PUSH_THRESHOLD: i64 = 16; + const BUTTON_PUSH_THRESHOLD: i64 = 2; // high buttons data.a_button.apply(frame); - if data.a_button.pressed(BUTTON_PUSH_THRESHOLD) { hi = hi | HiButtons::A_BUTTON; } + if data.a_button.pressed(BUTTON_PUSH_THRESHOLD) { + hi = hi | HiButtons::A_BUTTON; + } data.b_button.apply(frame); - if data.b_button.pressed(BUTTON_PUSH_THRESHOLD) { hi = hi | HiButtons::B_BUTTON; } + if data.b_button.pressed(BUTTON_PUSH_THRESHOLD) { + hi = hi | HiButtons::B_BUTTON; + } data.z_button.apply(frame); - if data.z_button.pressed(BUTTON_PUSH_THRESHOLD) { hi = hi | HiButtons::Z_BUTTON; } + if data.z_button.pressed(BUTTON_PUSH_THRESHOLD) { + hi = hi | HiButtons::Z_BUTTON; + } data.start.apply(frame); - if data.start.pressed(BUTTON_PUSH_THRESHOLD) { hi = hi | HiButtons::START; } - info!("start: {}", data.start.scalar); - + if data.start.pressed(BUTTON_PUSH_THRESHOLD) { + hi = hi | HiButtons::START; + } data.r_button.apply(frame); - if data.r_button.pressed(BUTTON_PUSH_THRESHOLD) { lo = lo | LoButtons::R_BUTTON; } + if data.r_button.pressed(BUTTON_PUSH_THRESHOLD) { + lo = lo | LoButtons::R_BUTTON; + } data.c_up.apply(frame); - if data.c_up.pressed(BUTTON_PUSH_THRESHOLD) { lo = lo | LoButtons::C_UP; } + if data.c_up.pressed(BUTTON_PUSH_THRESHOLD) { + lo = lo | LoButtons::C_UP; + } data.c_down.apply(frame); - if data.c_down.pressed(BUTTON_PUSH_THRESHOLD) { lo = lo | LoButtons::C_DOWN; } + if data.c_down.pressed(BUTTON_PUSH_THRESHOLD) { + lo = lo | LoButtons::C_DOWN; + } data.c_left.apply(frame); - if data.c_left.pressed(BUTTON_PUSH_THRESHOLD) { lo = lo | LoButtons::C_LEFT; } + if data.c_left.pressed(BUTTON_PUSH_THRESHOLD) { + lo = lo | LoButtons::C_LEFT; + } data.c_right.apply(frame); - if data.c_right.pressed(BUTTON_PUSH_THRESHOLD) { lo = lo | LoButtons::C_RIGHT; } + if data.c_right.pressed(BUTTON_PUSH_THRESHOLD) { + lo = lo | LoButtons::C_RIGHT; + } + println!( + "[ rust] {:02x}{:02x} {:02x}{:02x}", + hi.bits(), + lo.bits(), + stickx_scalar as u8, + sticky_scalar as u8 + ); controller[0] = hi.bits() as u8; controller[1] = lo.bits() as u8; controller[2] = stickx_scalar as u8; diff --git a/gamebridge/src/twitch.rs b/gamebridge/src/twitch.rs index 068173b..620073e 100644 --- a/gamebridge/src/twitch.rs +++ b/gamebridge/src/twitch.rs @@ -80,18 +80,19 @@ async fn run_loop( let chatline = msg.data.to_string(); let chatline = chatline.to_ascii_lowercase(); let mut data = st.write().unwrap(); + const BUTTON_ADD_AMT: i64 = 64; match chatline.as_str() { - "a" => data.a_button.add(1024), - "b" => data.b_button.add(1024), - "z" => data.z_button.add(1024), - "r" => data.r_button.add(1024), - "cup" => data.c_up.add(1024), - "cdown" => data.c_down.add(1024), - "cleft" => data.c_left.add(1024), - "cright" => data.c_right.add(1024), - "start" => data.start.add(1024), - "up" => data.stickx.add(127), + "a" => data.a_button.add(BUTTON_ADD_AMT), + "b" => data.b_button.add(BUTTON_ADD_AMT), + "z" => data.z_button.add(BUTTON_ADD_AMT), + "r" => data.r_button.add(BUTTON_ADD_AMT), + "cup" => data.c_up.add(BUTTON_ADD_AMT), + "cdown" => data.c_down.add(BUTTON_ADD_AMT), + "cleft" => data.c_left.add(BUTTON_ADD_AMT), + "cright" => data.c_right.add(BUTTON_ADD_AMT), + "start" => data.start.add(BUTTON_ADD_AMT), + "up" => data.sticky.add(127), "down" => data.sticky.add(-128), "left" => data.stickx.add(-128), "right" => data.stickx.add(127),