diff --git a/src/lib.rs b/src/lib.rs index 006c6cd..f4c6322 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -147,3 +147,6 @@ pub mod tmb; /// Reading SKP files pub mod skp; + +/// Reading SCHD files +pub mod schd; diff --git a/src/schd.rs b/src/schd.rs new file mode 100644 index 0000000..77d5434 --- /dev/null +++ b/src/schd.rs @@ -0,0 +1,53 @@ +// SPDX-FileCopyrightText: 2024 Joshua Goins +// SPDX-License-Identifier: GPL-3.0-or-later + +use std::io::Cursor; + +use crate::ByteSpan; +use binrw::{binread, binrw}; +use binrw::BinRead; + +#[binread] +#[derive(Debug)] +enum ShaderStage { + #[br(magic = 0u8)] + Vertex, + #[br(magic = 1u8)] + Pixel +} + +#[binread] +#[derive(Debug)] +#[brw(little)] +struct SchdHeader { + magic: i32, // TODO: what magic? + + #[br(count = 3)] + #[bw(pad_size_to = 3)] + #[bw(map = |x : &String | x.as_bytes())] + #[br(map = | x: Vec | String::from_utf8(x).unwrap().trim_matches(char::from(0)).to_string())] + version: String, + + stage: ShaderStage, + + dxc_magic: u32, // TODO: WHAT MAGIC?? + + file_length: i32, + shader_offset: u32, + parameter_offset: u32 +} + +#[derive(Debug)] +pub struct Schd { + +} + +impl Schd { + /// Reads an existing ULD file + pub fn from_existing(buffer: ByteSpan) -> Option { + let mut cursor = Cursor::new(buffer); + let header = SchdHeader::read(&mut cursor).ok()?; + + Some(Schd{}) + } +}