diff --git a/Cargo.toml b/Cargo.toml index 3596e38..42b27e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,5 @@ name = "doom-oxidized" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] +sdl2 = "0.35.2" diff --git a/src/main.rs b/src/main.rs index 087828c..164d92c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,31 @@ +extern crate sdl2; + +use sdl2::event::Event; +use sdl2::keyboard::Keycode; +use sdl2::pixels::Color; +use std::time::Duration; + mod doomlevel; mod wadfile; use doomlevel::DoomLevel; use wadfile::WADFile; -fn main() { - let wad_file = WADFile::from_path("WADs/doom1.wad").unwrap(); +static WIDTH: u32 = 320; +static HEIGHT: u32 = 200; +static SCALING: u32 = 4; + +fn find_sdl_gl_driver() -> Option { + for (index, item) in sdl2::render::drivers().enumerate() { + if item.name == "opengl" { + return Some(index as u32); + } + } + None +} + +fn main() -> Result<(), &'static str> { + let wad_file = WADFile::from_path("WADs/doom1.wad")?; let level = DoomLevel::load_level(&wad_file, wad_file.get_index_from_name("e1m1").unwrap()); println!( @@ -84,4 +104,49 @@ Flags: level.linedefs[test_linedef].never_automap(), level.linedefs[test_linedef].always_automap() ); + + let sdl_context = sdl2::init().unwrap(); + let video_subsystem = sdl_context.video().unwrap(); + + let window = video_subsystem + .window("Doom - Oxidized", WIDTH * SCALING, HEIGHT * SCALING) + .position_centered() + .opengl() + .build() + .unwrap(); + + let mut canvas = window + .into_canvas() + .index(find_sdl_gl_driver().unwrap()) + .build() + .unwrap(); + + canvas.set_draw_color(Color::RGB(0, 255, 255)); + canvas.clear(); + canvas.present(); + + let mut event_pump = sdl_context.event_pump().unwrap(); + + let mut i = 0; + 'running: loop { + i = (i + 1) % 255; + canvas.set_draw_color(Color::RGB(i, 64, 255 - i)); + canvas.clear(); + + for event in event_pump.poll_iter() { + match event { + Event::Quit { .. } + | Event::KeyDown { + keycode: Some(Keycode::Escape), + .. + } => break 'running, + _ => {} + } + } + + canvas.present(); + ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 30)); + } + + Ok(()) }