From 98de801ea7b5cf3e8602cf404f1affa66fd3a535 Mon Sep 17 00:00:00 2001 From: memdmp Date: Mon, 13 Jan 2025 12:04:26 +0100 Subject: feat: sin wave 1st implementatino --- src/main.rs | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/main.rs b/src/main.rs index 659f84b..ae1cdaf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,7 +7,12 @@ use font::BakedFont; use generated::fonts::{FONT_CHERRY_BOMB_ONE, FONT_GALMURI}; use sdl2::event::Event; use sdl2::keyboard::Keycode; -use sdl2::pixels::Color; +use sdl2::pixels::{Color, PixelFormatEnum}; +use sdl2::rect::Rect; +use sdl2::render::Texture; +use sdl2::surface::Surface; +use std::ops::DerefMut; +use std::sync::Arc; use std::time::Duration; pub fn main() { @@ -15,7 +20,7 @@ pub fn main() { let video_subsystem = sdl_context.video().unwrap(); let window = &mut video_subsystem - .window("Cosin25 Invite", 320, 256) + .window("Cosin25 Invite", 512, 256) .position_centered() .build() .unwrap(); @@ -27,9 +32,18 @@ pub fn main() { canvas.present(); let mut event_pump = sdl_context.event_pump().unwrap(); let mut i = 0; + + // amount to incr sin_offset by per frame + // TODO: do not bind to framerate u silly bean + let sin_speed = 0.0025; + let mut sin_offset = 0.5; 'running: loop { i = (i + 1) % 255; + if sin_offset > 1.0 { + sin_offset -= 1.0; + } + canvas.set_draw_color(Color::RGB(12, 12, 12)); canvas.clear(); @@ -47,6 +61,44 @@ pub fn main() { .unwrap(); offset += char.advance_width; } + + { + let mut sin_surface = Surface::new(512, 256, PixelFormatEnum::RGBA32).unwrap(); + + let w = sin_surface.width(); + let h = sin_surface.height(); + let f = &mut sin_surface.deref_mut().without_lock_mut().unwrap(); + + for x in 0..w { + let f64_w = f64::from(w); + let f64_h = f64::from(h); + let sin_x = { + let mut sin_x = f64::from(x) + (sin_offset * f64_w); + if sin_x > f64_w { + sin_x = sin_x - f64_w; + } + sin_x + }; + let sin_y = + ((f64::sin(sin_x * (3.141 * 2.0) / f64_w) + 1.0) * (f64_h / 2.0)).floor() as usize; + // let sin_idx = (sin_y * w as usize + x as usize) * 4; + + for y in 0..h { + let idx = (y * w + x) as usize * 4; + f[idx] = 255; + f[idx + 1] = 255; + f[idx + 2] = 255; + f[idx + 3] = if sin_y > y as usize { 255 } else { 0 }; + } + } + sin_offset += sin_speed; + + let sin_texture = Texture::from_surface(&sin_surface, &texture_creator).unwrap(); + + canvas + .copy(&sin_texture, None, Rect::new(0, 0, 512, 256)) + .unwrap(); + } offset = 0.0; for c in "Come to Cosin25 :3".chars() { let char = FONT_GALMURI.get_char(c); @@ -73,6 +125,6 @@ pub fn main() { } // The rest of the game loop goes here... canvas.present(); - ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 60)); + ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 120)); } } -- cgit v1.2.3