diff --git a/Cargo.toml b/Cargo.toml index 8bf5727..24b35ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -149,6 +149,15 @@ name = "renderer-target" [[example]] name = "events" +[[example]] +name = "renderer_01_change_the_color" +path = "examples/renderer/a01_change_the_color.rs" + +[[example]] +# required-dependency = "rand" +name = "renderer_02_primitives" +path = "examples/renderer/a02_primitives.rs" + [[example]] name = "renderer-texture" diff --git a/examples/renderer/README.md b/examples/renderer/README.md new file mode 100644 index 0000000..71e13ec --- /dev/null +++ b/examples/renderer/README.md @@ -0,0 +1,11 @@ +- https://docs.rs/sdl3/latest/sdl3/#getting-started + +- https://github.com/libsdl-org/SDL/tree/main/examples/renderer + +
+ +# Run + +- `cargo r --example renderer_01_change_the_color` + +- `cargo r --example renderer_02_primitives` diff --git a/examples/renderer/a01_change_the_color.rs b/examples/renderer/a01_change_the_color.rs new file mode 100644 index 0000000..ad9f319 --- /dev/null +++ b/examples/renderer/a01_change_the_color.rs @@ -0,0 +1,57 @@ +use sdl3::{event::Event, pixels::Color}; + +use std::f64::consts::PI; +use std::time::Instant; + +const WINDOW_WIDTH: u32 = 640; +const WINDOW_HEIGHT: u32 = 480; + +fn main() -> Result<(), String> { + let sdl_context = sdl3::init()?; + let video_subsystem = sdl_context.video()?; + let window = video_subsystem + .window( + "Change the color of the rust-sdl3 screen to a sine wave pattern", + WINDOW_WIDTH, + WINDOW_HEIGHT, + ) + .position_centered() + .build() + .unwrap(); + + let mut canvas = window.into_canvas(); + + let mut event_pump = sdl_context.event_pump()?; + let start_time = Instant::now(); + + 'running: loop { + for event in event_pump.poll_iter() { + match event { + Event::Quit { .. } => break 'running, + _ => {} + } + } + + let elapsed_time = start_time.elapsed().as_secs_f64(); + + // Calculate color values using sine wave + let red = 0.5 + 0.5 * (elapsed_time * 2.0 * PI).sin(); + let green = 0.5 + 0.5 * ((elapsed_time * 2.0 * PI) + (2.0 * PI / 3.0)).sin(); + let blue = 0.5 + 0.5 * ((elapsed_time * 2.0 * PI) + (4.0 * PI / 3.0)).sin(); + + // Set render color + canvas.set_draw_color(Color::RGB( + (red * 255.0) as u8, + (green * 255.0) as u8, + (blue * 255.0) as u8, + )); + + // Clear the canvas + canvas.clear(); + + // Present the rendered frame + canvas.present(); + } + + Ok(()) +} diff --git a/examples/renderer/a02_primitives.rs b/examples/renderer/a02_primitives.rs new file mode 100644 index 0000000..7a2d3db --- /dev/null +++ b/examples/renderer/a02_primitives.rs @@ -0,0 +1,86 @@ +// https://github.com/libsdl-org/SDL/tree/main/examples/renderer +extern crate sdl3; + +use rand::Rng; +use sdl3::rect::Rect; +use sdl3::render::FRect; +use sdl3::{event::Event, pixels::Color, rect::Point}; + +const WINDOW_WIDTH: u32 = 640; +const WINDOW_HEIGHT: u32 = 480; +const NUM_POINTS: usize = 500; + +fn main() -> Result<(), String> { + let sdl_context = sdl3::init()?; + let video_subsystem = sdl_context.video()?; + let window = video_subsystem + .window( + "SDL3 Renderer Primitives Example", + WINDOW_WIDTH, + WINDOW_HEIGHT, + ) + .position_centered() + .build() + .unwrap(); + + let mut canvas = window.into_canvas(); + + let mut event_pump = sdl_context.event_pump()?; + + let mut points: Vec = Vec::with_capacity(NUM_POINTS); + let mut rng = rand::thread_rng(); // Using thread_rng instead of just rng + + for _ in 0..NUM_POINTS { + let x = rng.gen_range(100..540); // Generating random numbers within the bounds + let y = rng.gen_range(100..380); + points.push(Point::new(x, y)); + } + + loop { + for event in event_pump.poll_iter() { + match event { + Event::Quit { .. } => return Ok(()), + _ => {} + } + } + + // Clear the canvas + canvas.set_draw_color(Color::BLACK); + canvas.clear(); + + // Draw red points + canvas.set_draw_color(Color::RED); + for point in &points { + canvas.draw_point(*point)?; + } + + // Draw blue rectangle + canvas.set_draw_color(Color::BLUE); + let rect = Rect::new(100, 100, 440, 280); + canvas.fill_rect(rect)?; + + // Draw green unfilled rectangle + canvas.set_draw_color(Color::GREEN); + let inner_rect = FRect::new( + (rect.x() + 30) as f32, + (rect.y() + 30) as f32, + (rect.width() - 60) as f32, + (rect.height() - 60) as f32, + ); + let _ = canvas.draw_rect(inner_rect); + + // Draw yellow lines + canvas.set_draw_color(Color::YELLOW); + canvas.draw_line( + Point::new(0, 0), + Point::new(WINDOW_WIDTH as i32, WINDOW_HEIGHT as i32), + )?; + canvas.draw_line( + Point::new(0, WINDOW_HEIGHT as i32), + Point::new(WINDOW_WIDTH as i32, 0), + )?; + + // Present the rendered frame + canvas.present(); + } +} diff --git a/examples/spinning_cube.rs b/examples/spinning_cube.rs index f62d647..9d920b2 100644 --- a/examples/spinning_cube.rs +++ b/examples/spinning_cube.rs @@ -77,46 +77,39 @@ fn main() -> Result<(), String> { let mut canvas = window.into_canvas(); let mut event_pump = sdl_context.event_pump()?; + #[rustfmt::skip] let vertices = [ + // vertex 0 Vertex { - x: -CUBE_SIZE, - y: -CUBE_SIZE, - z: -CUBE_SIZE, + x: -CUBE_SIZE, y: -CUBE_SIZE, z: -CUBE_SIZE, }, + // vertex 1 Vertex { - x: CUBE_SIZE, - y: -CUBE_SIZE, - z: -CUBE_SIZE, + x: CUBE_SIZE, y: -CUBE_SIZE, z: -CUBE_SIZE, }, + // vertex 2 Vertex { - x: CUBE_SIZE, - y: CUBE_SIZE, - z: -CUBE_SIZE, + x: CUBE_SIZE, y: CUBE_SIZE, z: -CUBE_SIZE, }, + // vertex 3 Vertex { - x: -CUBE_SIZE, - y: CUBE_SIZE, - z: -CUBE_SIZE, + x: -CUBE_SIZE, y: CUBE_SIZE, z: -CUBE_SIZE, }, + // vertex 4 Vertex { - x: -CUBE_SIZE, - y: -CUBE_SIZE, - z: CUBE_SIZE, + x: -CUBE_SIZE, y: -CUBE_SIZE, z: CUBE_SIZE, }, + // vertex 5 Vertex { - x: CUBE_SIZE, - y: -CUBE_SIZE, - z: CUBE_SIZE, + x: CUBE_SIZE, y: -CUBE_SIZE, z: CUBE_SIZE, }, + // vertex 6 Vertex { - x: CUBE_SIZE, - y: CUBE_SIZE, - z: CUBE_SIZE, + x: CUBE_SIZE, y: CUBE_SIZE, z: CUBE_SIZE, }, + // vertex 7 Vertex { - x: -CUBE_SIZE, - y: CUBE_SIZE, - z: CUBE_SIZE, + x: -CUBE_SIZE, y: CUBE_SIZE, z: CUBE_SIZE, }, ];