From cd5f05daf5d5df14accb864cb2fb792718788f93 Mon Sep 17 00:00:00 2001 From: Wesley Irvin Date: Fri, 28 Apr 2023 18:26:14 -0400 Subject: [PATCH] Vertex Loading Added the ability to load vertex data from the vertexes lump for a given level. This is to close issue #5 to get vertex data loading working. --- src/doomlevel.rs | 65 +++++++++++++++++++++++++++++++++++++++++ src/doomlevel/vertex.rs | 4 +++ src/main.rs | 15 +++++++--- 3 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 src/doomlevel.rs create mode 100644 src/doomlevel/vertex.rs diff --git a/src/doomlevel.rs b/src/doomlevel.rs new file mode 100644 index 0000000..0c59a08 --- /dev/null +++ b/src/doomlevel.rs @@ -0,0 +1,65 @@ +mod vertex; + +use std::{ + fs::File, + io::{Read, Seek, SeekFrom}, +}; + +use super::wadfile::WADFile; +use vertex::Vertex; + +enum Lumps { + THINGS = 1, + LINEDEFS, + SIDEDEFS, + VERTEXES, + SEGS, + SSECTORS, + NODES, + SECTORS, + REJECT, + BLOCKMAP, + BEHAVIOR, +} + +pub struct DoomLevel { + pub name: String, + pub vertexes: Vec, +} + +impl DoomLevel { + pub fn load_level(wad_file: &WADFile, lvl_index: u32) -> Self { + Self { + name: wad_file.get_lump_name(lvl_index), + vertexes: load_vertexes( + wad_file, + wad_file.get_lump_offset(lvl_index + Lumps::VERTEXES as u32), + wad_file.get_lump_size(lvl_index + Lumps::VERTEXES as u32), + ), + } + } +} + +fn load_vertexes(wad_file: &WADFile, offset: u32, size: u32) -> Vec { + let num_vertex: u32 = size / 4u32; + + let mut vertex_list: Vec = Vec::with_capacity(num_vertex as usize); + + let mut vertex_data = File::open(&wad_file.wad_path).unwrap(); + vertex_data.seek(SeekFrom::Start(offset as u64)).unwrap(); + + for _ in 0..num_vertex { + let mut x = [0; 2]; + let mut y = [0; 2]; + + vertex_data.read(&mut x).unwrap(); + vertex_data.read(&mut y).unwrap(); + + vertex_list.push(Vertex { + x: i16::from_le_bytes(x), + y: i16::from_le_bytes(y), + }); + } + + vertex_list +} diff --git a/src/doomlevel/vertex.rs b/src/doomlevel/vertex.rs new file mode 100644 index 0000000..f266719 --- /dev/null +++ b/src/doomlevel/vertex.rs @@ -0,0 +1,4 @@ +pub struct Vertex { + pub x: i16, + pub y: i16, +} diff --git a/src/main.rs b/src/main.rs index 7335f34..17394f5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,12 @@ +mod doomlevel; mod wadfile; +use doomlevel::DoomLevel; use wadfile::WADFile; fn main() { 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!( "WAD Path: {} @@ -32,8 +35,12 @@ Header: ); } - println!( - "Index of e1m1 is: {}", - wad_file.get_index_from_name("e1m1").unwrap() - ); + println!("\nFirst 20 Vertex Entries for E1M1:"); + + for i in 0..20 { + println!( + "\t{} - ({}, {})", + i, level.vertexes[i].x, level.vertexes[i].y + ); + } }