From 39ebbe5ca3aa88dedc6c0d39b5605964714e1801 Mon Sep 17 00:00:00 2001 From: Wesley Irvin Date: Fri, 12 May 2023 21:44:37 -0400 Subject: [PATCH] WIP of doom renderer 5-12-23 WIP Implementation so far of doom renderer on 5-12-23 --- src/application.rs | 75 ++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 61 +++++-------------------------------- 2 files changed, 83 insertions(+), 53 deletions(-) create mode 100644 src/application.rs diff --git a/src/application.rs b/src/application.rs new file mode 100644 index 0000000..8576850 --- /dev/null +++ b/src/application.rs @@ -0,0 +1,75 @@ +use sdl2::{ + event::Event, keyboard::Keycode, pixels::Color, render::WindowCanvas, EventPump, Sdl, + VideoSubsystem, +}; +use std::time::Duration; + +pub struct Application { + sdl_context: Sdl, + video_subsystem: VideoSubsystem, + event_pump: EventPump, + main_window: WindowCanvas, +} + +impl Application { + pub fn new() -> Result> { + let new_sdl_context = sdl2::init()?; + let new_video_subsystem = new_sdl_context.video()?; + let new_event_subsystem = new_sdl_context.event_pump()?; + + let new_window = new_video_subsystem + .window("Doom - Oxidized", 320, 240) + .position_centered() + .build()?; + + let window_surface = new_window.into_canvas().build()?; + + Ok(Self { + sdl_context: new_sdl_context, + video_subsystem: new_video_subsystem, + event_pump: new_event_subsystem, + main_window: window_surface, + }) + } + + pub fn video_subsystem(&self) -> &VideoSubsystem { + &self.video_subsystem + } + + pub fn event_subsystem(&mut self) -> &mut EventPump { + &mut self.event_pump + } + + pub fn sdl_context(&self) -> &Sdl { + &self.sdl_context + } + + pub fn run(&mut self) -> Result<(), Box> { + self.main_window.set_draw_color(Color::RGB(0, 255, 255)); + self.main_window.clear(); + self.main_window.present(); + + let mut i = 0; + 'running: loop { + i = (i + 1) % 255; + self.main_window.set_draw_color(Color::RGB(i, 64, 255 - i)); + self.main_window.clear(); + + for event in self.event_pump.poll_iter() { + match event { + Event::Quit { .. } + | Event::KeyDown { + keycode: Some(Keycode::Escape), + .. + } => break 'running, + _ => {} + } + } + + self.main_window.present(); + ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 30)); + } + + Ok(()) + } +} diff --git a/src/main.rs b/src/main.rs index 4a845ef..95c771c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,23 +2,16 @@ extern crate log; extern crate sdl2; use env_logger::Builder; -use log::{error, info, warn, LevelFilter}; - -use sdl2::event::Event; -use sdl2::keyboard::Keycode; -use sdl2::pixels::Color; -use std::time::Duration; +use log::{debug, error, info, warn, LevelFilter}; +mod application; mod doomlevel; mod wadfile; +use application::Application; use doomlevel::DoomLevel; use wadfile::WADFile; -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" { @@ -28,7 +21,7 @@ fn find_sdl_gl_driver() -> Option { None } -fn main() -> Result<(), &'static str> { +fn main() -> Result<(), Box> { let wad_file = WADFile::from_path("WADs/doom1.wad")?; let level = DoomLevel::load_level(&wad_file, wad_file.get_index_from_name("e1m1").unwrap()); @@ -109,54 +102,16 @@ Flags: level.linedefs[test_linedef].always_automap() ); - Builder::new().filter_level(LevelFilter::Info).init(); + Builder::new().filter_level(LevelFilter::Debug).init(); + debug!("Test of the DEBUG log!"); info!("Test of INFO log!"); warn!("Test of WARN log!"); error!("Test of ERROR log!"); - let sdl_context = sdl2::init().unwrap(); - let video_subsystem = sdl_context.video().unwrap(); + let mut app = Application::new()?; - 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)); - } + app.run()?; Ok(()) }