diff options
-rw-r--r-- | src/render.rs | 85 |
1 files changed, 67 insertions, 18 deletions
diff --git a/src/render.rs b/src/render.rs index 938d1ec..dbd3761 100644 --- a/src/render.rs +++ b/src/render.rs @@ -1,6 +1,5 @@ use crate::font::BakedFont; use crate::generated::fonts::{FONT_CHERRY_BOMB_ONE, FONT_GALMURI}; -use crate::interpolation::KeyFrame; use rand::Rng; use sdl2::pixels::{Color, PixelFormatEnum}; use sdl2::rect::Rect; @@ -14,31 +13,81 @@ pub fn render( texture_creator: &TextureCreator<WindowContext>, time_seconds: f64, ) { - let i = ((time_seconds * 60.0) % 255.0).round() as u8; + let i = ((time_seconds * 60.0) % 510.0).round(); + let i = if i > 255.0 { + (255.0 - (i - 255.0)) as u8 + } else { + i as u8 + }; let sin_offset = time_seconds * 0.1; + let win_size = canvas.window().drawable_size(); + canvas.set_draw_color(Color::RGB(12, 12, 12)); canvas.clear(); let mut offset: f32 = 0.0; - for c in "UwU-Space".chars() { - let char = FONT_CHERRY_BOMB_ONE.get_char(c); - canvas - .copy( - &char - .to_texture(&texture_creator, Color::RGB(i, 64, 255 - i)) - .unwrap(), - None, - char.to_rect(offset as i32 + 16, 16), + + { + let bounce_time_offset = 1.5; + let bounce_speed = 90.0; + let padding_x = 16.0; + let padding_y = 16.0; + let (offset_x, offset_y) = if time_seconds > bounce_time_offset { + let mut uwu_width = padding_x; + let mut uwu_height: f32 = padding_y * 2.0; + for c in "UwU-Space".chars() { + let char = FONT_CHERRY_BOMB_ONE.get_char(c); + uwu_width += char.advance_width; + if f32::from(char.height) > uwu_height { + uwu_height = char.height.into(); + } + } + let virtual_screen_size = ( + f64::from(win_size.0) - f64::from(uwu_width + padding_x), + f64::from(win_size.1) - f64::from(uwu_height + padding_y), + ); + let t = (time_seconds - bounce_time_offset) * bounce_speed; + let offset_x = t % (virtual_screen_size.0 * 2.0); + let offset_x = if offset_x > virtual_screen_size.0 { + virtual_screen_size.0 * 2.0 - offset_x + } else { + offset_x + }; + + let offset_y = t % (virtual_screen_size.1 * 2.0); + let offset_y = if offset_y > virtual_screen_size.1 { + virtual_screen_size.1 * 2.0 - offset_y + } else { + offset_y + }; + + ( + (f64::from(padding_x) + offset_x).round() as i32, + (f64::from(padding_y) + offset_y).round() as i32, ) - .unwrap(); - offset += char.advance_width; + } else { + (padding_x.round() as i32, padding_y.round() as i32) + }; + for c in "UwU-Space".chars() { + let char = FONT_CHERRY_BOMB_ONE.get_char(c); + canvas + .copy( + &char + .to_texture(&texture_creator, Color::RGB(i, 64, 255 - i)) + .unwrap(), + None, + char.to_rect(offset as i32 + offset_x, offset_y), + ) + .unwrap(); + offset += char.advance_width; + } } offset = 0.0; let mut rng = rand::thread_rng(); - for c in "sorry for shit demo we have adhd".chars() { + for c in "sorry for shit invite we have adhd".chars() { let char = FONT_GALMURI.get_char(c); canvas .copy( @@ -48,7 +97,7 @@ pub fn render( None, char.to_rect( offset as i32 + 18 + rng.gen_range(-2..2), - 16 + 36 * 2 + rng.gen_range(-2..2), + 16 + 36 + rng.gen_range(-2..2), ), ) .unwrap(); @@ -96,7 +145,7 @@ pub fn render( let sin_texture = Texture::from_surface(&sin_surface, &texture_creator).unwrap(); canvas - .copy(&sin_texture, None, Rect::new(0, 0, 512, 256)) + .copy(&sin_texture, None, Rect::new(0, 0, win_size.0, win_size.1)) .unwrap(); } offset = 0.0; @@ -108,9 +157,9 @@ pub fn render( .to_texture(&texture_creator, Color::RGB(i, 64, 255 - i)) .unwrap(), None, - char.to_rect(offset as i32 + 18, 16 + 36), + char.to_rect(offset as i32 + 18, win_size.1 as i32 - 32), ) .unwrap(); - offset += char.advance_width; + offset += char.advance_width / 1.1; } } |