diff -r 259175ab7e8c -r 2ebd505e62c1 rust/theme-editor/src/main.rs --- a/rust/theme-editor/src/main.rs Mon Oct 29 23:40:17 2018 +0300 +++ b/rust/theme-editor/src/main.rs Tue Oct 30 02:14:00 2018 +0300 @@ -1,10 +1,17 @@ use sdl2::{ keyboard::Scancode, - event::EventType + event::EventType, + surface::Surface, + pixels::{ + PixelFormatEnum, Color + } }; +use integral_geometry::Point; + use rand::{ - thread_rng, RngCore + thread_rng, RngCore, Rng, + distributions::uniform::SampleUniform }; use landgen::{ @@ -33,6 +40,31 @@ } } +fn fill_pixels(pixels: &mut [u8], land: &Land2D) { + for (surf_row, land_row) in pixels.chunks_mut(land.width() * 4).zip(land.rows()) { + for (surf_pixel, land_pixel) in surf_row.chunks_mut(4).zip(land_row) { + if let [b, g, r, a] = surf_pixel { + *a = 255; *r = *land_pixel as u8; + } + } + } +} + +fn fill_texture(surface: &mut Surface, land: &Land2D) { + if surface.must_lock() { + surface.with_lock_mut(|data| fill_pixels(data, land)); + } else { + surface.without_lock_mut().map(|data| fill_pixels(data, land)); + } +} + +fn rnd(max: T) -> T { + thread_rng().gen_range(T::default(), max) +} + +const WIDTH: u32 = 512; +const HEIGHT: u32 = 512; + fn main() { let sdl = sdl2::init().unwrap(); let _image = sdl2::image::init(sdl2::image::INIT_PNG).unwrap(); @@ -40,10 +72,28 @@ let mut pump = sdl.event_pump().unwrap(); let video = sdl.video().unwrap(); - let _window = video.window("Theme Editor", 640, 480) + let window = video.window("Theme Editor", WIDTH, HEIGHT) .position_centered() .build().unwrap(); + let mut land_surf = Surface::new(WIDTH, HEIGHT, PixelFormatEnum::ARGB8888).unwrap(); + + fn point() -> Point { + Point::new(rnd(WIDTH as i32), rnd(HEIGHT as i32)) + } + + let mut land = Land2D::new(WIDTH as usize, HEIGHT as usize, 0); + for i in 0..64 { + land.draw_thick_line(point(), point(), rnd(5), u32::max_value()); + } + + fill_texture(&mut land_surf, &land); + + let mut win_surf = window.surface(&pump).unwrap(); + let win_rect = win_surf.rect(); + land_surf.blit(land_surf.rect(), &mut win_surf, win_rect).unwrap(); + win_surf.update_window(); + 'pool: loop { use sdl2::event::Event::*; pump.pump_events(); @@ -53,8 +103,6 @@ Quit{ .. } => break 'pool, _ => () } - } + } } -} - - +} \ No newline at end of file